/ Hex Artifact Content
Login

Artifact 4adc5e18ab6d0648faeb18f18a89d6aec57d77be:


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 23 64 65 66 69 6e  s..**.*/..#defin
0680: 65 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f  e FTS5_OPT_WORK_
0690: 55 4e 49 54 20 20 31 30 30 30 20 20 2f 2a 20 4e  UNIT  1000  /* N
06a0: 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
06b0: 67 65 73 20 70 65 72 20 6f 70 74 69 6d 69 7a 65  ges per optimize
06c0: 20 73 74 65 70 20 2a 2f 0a 23 64 65 66 69 6e 65   step */.#define
06d0: 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 20   FTS5_WORK_UNIT 
06e0: 20 20 20 20 20 36 34 20 20 20 20 2f 2a 20 4e 75       64    /* Nu
06f0: 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
0700: 65 73 20 69 6e 20 75 6e 69 74 20 6f 66 20 77 6f  es in unit of wo
0710: 72 6b 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46  rk */..#define F
0720: 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
0730: 5a 45 20 34 20 20 20 20 20 2f 2a 20 41 64 64 20  ZE 4     /* Add 
0740: 64 6c 69 64 78 20 69 66 20 74 68 69 73 20 6d 61  dlidx if this ma
0750: 6e 79 20 65 6d 70 74 79 20 70 61 67 65 73 20 2a  ny empty pages *
0760: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73  /../*.** Details
0770: 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61  :.**.** The %_da
0780: 74 61 20 74 61 62 6c 65 20 6d 61 6e 61 67 65 64  ta table managed
0790: 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c   by this module,
07a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54  .**.**     CREAT
07b0: 45 20 54 41 42 4c 45 20 25 5f 64 61 74 61 28 69  E TABLE %_data(i
07c0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
07d0: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f  Y KEY, block BLO
07e0: 42 29 3b 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74  B);.**.** , cont
07f0: 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ains the followi
0800: 6e 67 20 35 20 74 79 70 65 73 20 6f 66 20 72 65  ng 5 types of re
0810: 63 6f 72 64 73 2e 20 53 65 65 20 74 68 65 20 63  cords. See the c
0820: 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64  omments surround
0830: 69 6e 67 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f  ing.** the FTS5_
0840: 2a 5f 52 4f 57 49 44 20 6d 61 63 72 6f 73 20 62  *_ROWID macros b
0850: 65 6c 6f 77 20 66 6f 72 20 61 20 64 65 73 63 72  elow for a descr
0860: 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f  iption of how %_
0870: 64 61 74 61 20 72 6f 77 69 64 73 20 61 72 65 20  data rowids are 
0880: 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20 74 6f 20  .** assigned to 
0890: 65 61 63 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a  each fo them..**
08a0: 0a 2a 2a 20 31 2e 20 53 74 72 75 63 74 75 72 65  .** 1. Structure
08b0: 20 52 65 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20   Records:.**.** 
08c0: 20 20 54 68 65 20 73 65 74 20 6f 66 20 73 65 67    The set of seg
08d0: 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 6b 65 20  ments that make 
08e0: 75 70 20 61 6e 20 69 6e 64 65 78 20 2d 20 74 68  up an index - th
08f0: 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
0900: 65 20 2d 20 61 72 65 0a 2a 2a 20 20 20 72 65 63  e - are.**   rec
0910: 6f 72 64 65 64 20 69 6e 20 61 20 73 69 6e 67 6c  orded in a singl
0920: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0930: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0940: 2e 20 54 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  . The record con
0950: 73 69 73 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20  sists.**   of a 
0960: 73 69 6e 67 6c 65 20 33 32 2d 62 69 74 20 63 6f  single 32-bit co
0970: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
0980: 69 65 20 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65  ie value followe
0990: 64 20 62 79 20 61 20 6c 69 73 74 20 6f 66 20 0a  d by a list of .
09a0: 2a 2a 20 20 20 53 51 4c 69 74 65 20 76 61 72 69  **   SQLite vari
09b0: 6e 74 73 2e 20 49 66 20 74 68 65 20 46 54 53 20  nts. If the FTS 
09c0: 74 61 62 6c 65 20 66 65 61 74 75 72 65 73 20 6d  table features m
09d0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64  ore than one ind
09e0: 65 78 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 20  ex (because.**  
09f0: 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20 6f   there are one o
0a00: 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20 69 6e  r more prefix in
0a10: 64 65 78 65 73 29 2c 20 69 74 20 69 73 20 67 75  dexes), it is gu
0a20: 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 61 6c  aranteed that al
0a30: 6c 20 73 68 61 72 65 0a 2a 2a 20 20 20 74 68 65  l share.**   the
0a40: 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c   same cookie val
0a50: 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65  ue..**.**   Imme
0a60: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
0a70: 67 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  g the configurat
0a80: 69 6f 6e 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20  ion cookie, the 
0a90: 72 65 63 6f 72 64 20 62 65 67 69 6e 73 20 77 69  record begins wi
0aa0: 74 68 0a 2a 2a 20 20 20 74 68 72 65 65 20 76 61  th.**   three va
0ab0: 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rints:.**.**    
0ac0: 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76   + number of lev
0ad0: 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f  els,.**     + to
0ae0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
0af0: 67 6d 65 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65  gments on all le
0b00: 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76  vels,.**     + v
0b10: 61 6c 75 65 20 6f 66 20 77 72 69 74 65 20 63 6f  alue of write co
0b20: 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  unter..**.**   T
0b30: 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 6c 65  hen, for each le
0b40: 76 65 6c 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d  vel from 0 to nM
0b50: 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ax:.**.**     + 
0b60: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  number of input 
0b70: 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f  segments in ongo
0b80: 69 6e 67 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20  ing merge..**   
0b90: 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72    + total number
0ba0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
0bb0: 6c 65 76 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20  level..**     + 
0bc0: 66 6f 72 20 65 61 63 68 20 73 65 67 6d 65 6e 74  for each segment
0bd0: 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20   from oldest to 
0be0: 6e 65 77 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20  newest:.**      
0bf0: 20 20 20 2b 20 73 65 67 6d 65 6e 74 20 69 64 20     + segment id 
0c00: 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20  (always > 0).** 
0c10: 20 20 20 20 20 20 20 20 2b 20 62 2d 74 72 65 65          + b-tree
0c20: 20 68 65 69 67 68 74 20 28 31 20 2d 3e 20 72 6f   height (1 -> ro
0c30: 6f 74 20 69 73 20 6c 65 61 66 2c 20 32 20 2d 3e  ot is leaf, 2 ->
0c40: 20 72 6f 6f 74 20 69 73 20 70 61 72 65 6e 74 20   root is parent 
0c50: 6f 66 20 6c 65 61 66 20 65 74 63 2e 29 0a 2a 2a  of leaf etc.).**
0c60: 20 20 20 20 20 20 20 20 20 2b 20 66 69 72 73 74           + first
0c70: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
0c80: 72 20 28 6f 66 74 65 6e 20 31 2c 20 61 6c 77 61  r (often 1, alwa
0c90: 79 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ys greater than 
0ca0: 30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20  0).**         + 
0cb0: 66 69 6e 61 6c 20 6c 65 61 66 20 70 61 67 65 20  final leaf page 
0cc0: 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20  number.**.** 2. 
0cd0: 54 68 65 20 41 76 65 72 61 67 65 73 20 52 65 63  The Averages Rec
0ce0: 6f 72 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73  ord:.**.**   A s
0cf0: 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 69 74  ingle record wit
0d00: 68 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74  hin the %_data t
0d10: 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 20 69  able. The data i
0d20: 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69  s a list of vari
0d30: 6e 74 73 2e 0a 2a 2a 20 20 20 54 68 65 20 66 69  nts..**   The fi
0d40: 72 73 74 20 76 61 6c 75 65 20 69 73 20 74 68 65  rst value is the
0d50: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
0d60: 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54 68  in the index. Th
0d70: 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  en, for each col
0d80: 75 6d 6e 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c 65  umn.**   from le
0d90: 66 74 20 74 6f 20 72 69 67 68 74 2c 20 74 68 65  ft to right, the
0da0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0db0: 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 63   tokens in the c
0dc0: 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a 2a  olumn for all .*
0dd0: 2a 20 20 20 72 6f 77 73 20 6f 66 20 74 68 65 20  *   rows of the 
0de0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20  table..**.** 3. 
0df0: 53 65 67 6d 65 6e 74 20 6c 65 61 76 65 73 3a 0a  Segment leaves:.
0e00: 2a 2a 0a 2a 2a 20 20 20 54 45 52 4d 20 44 4f 43  **.**   TERM DOC
0e10: 4c 49 53 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a  LIST FORMAT:.**.
0e20: 2a 2a 20 20 20 20 20 4d 6f 73 74 20 6f 66 20 65  **     Most of e
0e30: 61 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66  ach segment leaf
0e40: 20 69 73 20 74 61 6b 65 6e 20 75 70 20 62 79 20   is taken up by 
0e50: 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74  term/doclist dat
0e60: 61 2e 20 54 68 65 20 0a 2a 2a 20 20 20 20 20 67  a. The .**     g
0e70: 65 6e 65 72 61 6c 20 66 6f 72 6d 61 74 20 6f 66  eneral format of
0e80: 20 74 68 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73   the term/doclis
0e90: 74 20 64 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a 2a  t data is:.**.**
0ea0: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 20           varint 
0eb0: 3a 20 73 69 7a 65 20 6f 66 20 66 69 72 73 74 20  : size of first 
0ec0: 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20  term.**         
0ed0: 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74  blob:    first t
0ee0: 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20  erm data.**     
0ef0: 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 66 69 72      doclist: fir
0f00: 73 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20  st doclist.**   
0f10: 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f        zero-or-mo
0f20: 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20  re {.**         
0f30: 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65    varint:  numbe
0f40: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 6f  r of bytes in co
0f50: 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65 76 69 6f  mmon with previo
0f60: 75 73 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20  us term.**      
0f70: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 6e 75       varint:  nu
0f80: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
0f90: 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 20 28   new term data (
0fa0: 6e 4e 65 77 29 0a 2a 2a 20 20 20 20 20 20 20 20  nNew).**        
0fb0: 20 20 20 62 6c 6f 62 3a 20 20 20 20 6e 4e 65 77     blob:    nNew
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20  rm data.**      
0fe0: 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 6e 65       doclist: ne
0ff0: 78 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20  xt doclist.**   
1000: 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20        }.**.**   
1010: 20 20 64 6f 63 6c 69 73 74 20 66 6f 72 6d 61 74    doclist format
1020: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1030: 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74 20 72  varint:  first r
1040: 6f 77 69 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  owid.**         
1050: 70 6f 73 6c 69 73 74 3a 20 66 69 72 73 74 20 70  poslist: first p
1060: 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20  oslist.**       
1070: 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b    zero-or-more {
1080: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
1090: 72 69 6e 74 3a 20 20 72 6f 77 69 64 20 64 65 6c  rint:  rowid del
10a0: 74 61 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a  ta (always > 0).
10b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 70 6f 73  **           pos
10c0: 6c 69 73 74 3a 20 6e 65 78 74 20 70 6f 73 6c 69  list: next posli
10d0: 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a  st.**         }.
10e0: 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30 30 20  **         0x00 
10f0: 62 79 74 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  byte.**.**     p
1100: 6f 73 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a  oslist format:.*
1110: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72  *.**         var
1120: 69 6e 74 3a 20 73 69 7a 65 20 6f 66 20 70 6f 73  int: size of pos
1130: 6c 69 73 74 20 69 6e 20 62 79 74 65 73 2e 20 6e  list in bytes. n
1140: 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 69  ot including thi
1150: 73 20 66 69 65 6c 64 2e 0a 2a 2a 20 20 20 20 20  s field..**     
1160: 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c      collist: col
1170: 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  list for column 
1180: 30 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72  0.**         zer
1190: 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20  o-or-more {.**  
11a0: 20 20 20 20 20 20 20 20 20 30 78 30 31 20 62 79           0x01 by
11b0: 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  te.**           
11c0: 76 61 72 69 6e 74 3a 20 63 6f 6c 75 6d 6e 20 6e  varint: column n
11d0: 75 6d 62 65 72 20 28 49 29 0a 2a 2a 20 20 20 20  umber (I).**    
11e0: 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20         collist: 
11f0: 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75  collist for colu
1200: 6d 6e 20 49 0a 2a 2a 20 20 20 20 20 20 20 20 20  mn I.**         
1210: 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 6c 6c  }.**.**     coll
1220: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
1230: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
1240: 3a 20 66 69 72 73 74 20 6f 66 66 73 65 74 20 2b  : first offset +
1250: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65   2.**         ze
1260: 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20  ro-or-more {.** 
1270: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
1280: 3a 20 6f 66 66 73 65 74 20 64 65 6c 74 61 20 2b  : offset delta +
1290: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a   2.**         }.
12a0: 2a 2a 0a 2a 2a 20 20 20 50 41 47 49 4e 41 54 49  **.**   PAGINATI
12b0: 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65  ON.**.**     The
12c0: 20 66 6f 72 6d 61 74 20 64 65 73 63 72 69 62 65   format describe
12d0: 64 20 61 62 6f 76 65 20 69 73 20 6f 6e 6c 79 20  d above is only 
12e0: 61 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20  accurate if the 
12f0: 65 6e 74 69 72 65 20 74 65 72 6d 2f 64 6f 63 6c  entire term/docl
1300: 69 73 74 0a 2a 2a 20 20 20 20 20 64 61 74 61 20  ist.**     data 
1310: 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  fits on a single
1320: 20 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74   leaf page. If t
1330: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
1340: 61 73 65 2c 20 74 68 65 20 66 6f 72 6d 61 74 0a  ase, the format.
1350: 2a 2a 20 20 20 20 20 69 73 20 63 68 61 6e 67 65  **     is change
1360: 64 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a  d in two ways:.*
1370: 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20  *.**       + if 
1380: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
1390: 6f 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73  on a page occurs
13a0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
13b0: 74 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20  t term, it.**   
13c0: 20 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20        is stored 
13d0: 61 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  as a literal val
13e0: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ue:.**.**       
13f0: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66        varint:  f
1400: 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a  irst rowid.**.**
1410: 20 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72         + the fir
1420: 73 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20  st term on each 
1430: 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
1440: 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
1450: 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  s the.**        
1460: 20 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d   very first term
1470: 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a   of the segment:
1480: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1490: 20 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65     varint : size
14a0: 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a   of first term.*
14b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c  *             bl
14c0: 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72  ob:    first ter
14d0: 6d 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 20 20 20  m data.**.**    
14e0: 20 45 61 63 68 20 6c 65 61 66 20 70 61 67 65 20   Each leaf page 
14f0: 62 65 67 69 6e 73 20 77 69 74 68 3a 0a 2a 2a 0a  begins with:.**.
1500: 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74  **       + 2-byt
1510: 65 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61  e unsigned conta
1520: 69 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20  ining offset to 
1530: 66 69 72 73 74 20 72 6f 77 69 64 20 28 6f 72 20  first rowid (or 
1540: 30 29 2e 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32  0)..**       + 2
1550: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63  -byte unsigned c
1560: 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74  ontaining offset
1570: 20 74 6f 20 66 69 72 73 74 20 74 65 72 6d 20 28   to first term (
1580: 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 46  or 0)..**.**   F
1590: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 72 6d 2f  ollowed by term/
15a0: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 0a 2a 2a  doclist data..**
15b0: 0a 2a 2a 20 34 2e 20 53 65 67 6d 65 6e 74 20 69  .** 4. Segment i
15c0: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 3a 0a 2a  nterior nodes:.*
15d0: 2a 0a 2a 2a 20 20 20 54 68 65 20 69 6e 74 65 72  *.**   The inter
15e0: 69 6f 72 20 6e 6f 64 65 73 20 74 75 72 6e 20 74  ior nodes turn t
15f0: 68 65 20 6c 69 73 74 20 6f 66 20 6c 65 61 76 65  he list of leave
1600: 73 20 69 6e 74 6f 20 61 20 62 2b 74 72 65 65 2e  s into a b+tree.
1610: 20 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63 68 20 69   .**.**   Each i
1620: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 62 65 67  nterior node beg
1630: 69 6e 73 20 77 69 74 68 20 61 20 76 61 72 69 6e  ins with a varin
1640: 74 20 2d 20 74 68 65 20 70 61 67 65 20 6e 75 6d  t - the page num
1650: 62 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 0a  ber of the left.
1660: 2a 2a 20 20 20 6d 6f 73 74 20 63 68 69 6c 64 20  **   most child 
1670: 6e 6f 64 65 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  node. Following 
1680: 74 68 69 73 2c 20 66 6f 72 20 65 61 63 68 20 6c  this, for each l
1690: 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20  eaf page except 
16a0: 74 68 65 20 66 69 72 73 74 2c 0a 2a 2a 20 20 20  the first,.**   
16b0: 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
16c0: 65 73 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a  es contain:.**.*
16d0: 2a 20 20 20 20 20 61 29 20 49 66 20 74 68 65 20  *     a) If the 
16e0: 6c 65 61 66 20 70 61 67 65 20 63 6f 6e 74 61 69  leaf page contai
16f0: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
1700: 74 65 72 6d 2c 20 74 68 65 6e 20 61 20 74 65 72  term, then a ter
1710: 6d 2d 70 72 65 66 69 78 20 74 68 61 74 0a 2a 2a  m-prefix that.**
1720: 20 20 20 20 20 20 20 20 69 73 20 67 72 65 61 74          is great
1730: 65 72 20 74 68 61 6e 20 61 6c 6c 20 70 72 65 76  er than all prev
1740: 69 6f 75 73 20 74 65 72 6d 73 2c 20 61 6e 64 20  ious terms, and 
1750: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1760: 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  al to the.**    
1770: 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 6f      first term o
1780: 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e  n the leaf page.
1790: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20 49 66  .**.**     b) If
17a0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e   the leaf page n
17b0: 6f 20 74 65 72 6d 73 2c 20 61 20 72 65 63 6f 72  o terms, a recor
17c0: 64 20 69 6e 64 69 63 61 74 69 6e 67 20 68 6f 77  d indicating how
17d0: 20 6d 61 6e 79 20 63 6f 6e 73 65 63 75 74 69 76   many consecutiv
17e0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65 61 76  e.**        leav
17f0: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  es contain no te
1800: 72 6d 73 2c 20 61 6e 64 20 77 68 65 74 68 65 72  rms, and whether
1810: 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 69 73   or not there is
1820: 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a   an associated.*
1830: 2a 20 20 20 20 20 20 20 20 62 79 2d 72 6f 77 69  *        by-rowi
1840: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a  d index record..
1850: 2a 2a 0a 2a 2a 20 20 20 42 79 20 64 65 66 69 6e  **.**   By defin
1860: 69 74 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20  ition, there is 
1870: 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
1880: 6f 6e 65 20 74 79 70 65 20 28 62 29 20 72 65 63  one type (b) rec
1890: 6f 72 64 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a  ord in a row..**
18a0: 20 20 20 54 79 70 65 20 28 62 29 20 72 65 63 6f     Type (b) reco
18b0: 72 64 73 20 6f 6e 6c 79 20 65 76 65 72 20 61 70  rds only ever ap
18c0: 70 65 61 72 20 6f 6e 20 68 65 69 67 68 74 3d 31  pear on height=1
18d0: 20 70 61 67 65 73 20 2d 20 69 6d 6d 65 64 69 61   pages - immedia
18e0: 74 65 20 70 61 72 65 6e 74 73 0a 2a 2a 20 20 20  te parents.**   
18f0: 6f 66 20 6c 65 61 76 65 73 2e 20 4f 6e 6c 79 20  of leaves. Only 
1900: 74 79 70 65 20 28 61 29 20 72 65 63 6f 72 64 73  type (a) records
1910: 20 61 72 65 20 70 75 73 68 65 64 20 74 6f 20 68   are pushed to h
1920: 69 67 68 65 72 20 6c 65 76 65 6c 73 2e 0a 2a 2a  igher levels..**
1930: 0a 2a 2a 20 20 20 54 65 72 6d 20 66 6f 72 6d 61  .**   Term forma
1940: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e  t:.**.**     * N
1950: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1960: 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72  n common with pr
1970: 65 76 69 6f 75 73 20 74 65 72 6d 20 70 6c 75 73  evious term plus
1980: 20 32 2c 20 61 73 20 61 20 76 61 72 69 6e 74 2e   2, as a varint.
1990: 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72  .**     * Number
19a0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77   of bytes of new
19b0: 20 74 65 72 6d 20 64 61 74 61 2c 20 61 73 20 61   term data, as a
19c0: 20 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20   varint..**     
19d0: 2a 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2e  * new term data.
19e0: 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d 74 65 72 6d  .**.**   No-term
19f0: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
1a00: 20 20 20 2a 20 65 69 74 68 65 72 20 61 6e 20 30     * either an 0
1a10: 78 30 30 20 6f 72 20 30 78 30 31 20 62 79 74 65  x00 or 0x01 byte
1a20: 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 30  . If the value 0
1a30: 78 30 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  x01 is used, the
1a40: 6e 20 74 68 65 72 65 20 0a 2a 2a 20 20 20 20 20  n there .**     
1a50: 20 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74    is an associat
1a60: 65 64 20 69 6e 64 65 78 2d 62 79 2d 72 6f 77 69  ed index-by-rowi
1a70: 64 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 20 20 20  d record..**    
1a80: 20 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   * the number of
1a90: 20 7a 65 72 6f 2d 74 65 72 6d 20 6c 65 61 76 65   zero-term leave
1aa0: 73 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  s as a varint..*
1ab0: 2a 0a 2a 2a 20 35 2e 20 53 65 67 6d 65 6e 74 20  *.** 5. Segment 
1ac0: 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 3a  doclist indexes:
1ad0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 6c 69 73 74 20  .**.**   A list 
1ae0: 6f 66 20 76 61 72 69 6e 74 73 2e 20 49 66 20 74  of varints. If t
1af0: 68 65 20 66 69 72 73 74 20 74 65 72 6d 6c 65 73  he first termles
1b00: 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  s page contains 
1b10: 61 74 20 6c 65 61 73 74 20 6f 6e 65 0a 2a 2a 20  at least one.** 
1b20: 20 20 64 6f 63 69 64 2c 20 74 68 65 20 6c 69 73    docid, the lis
1b30: 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  t begins with th
1b40: 61 74 20 64 6f 63 69 64 20 61 73 20 61 20 76 61  at docid as a va
1b50: 72 69 6e 74 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rint followed by
1b60: 20 74 68 65 0a 2a 2a 20 20 20 76 61 6c 75 65 20   the.**   value 
1b70: 31 20 28 30 78 30 31 29 2e 20 4f 72 2c 20 69 66  1 (0x01). Or, if
1b80: 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 6c   the first terml
1b90: 65 73 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  ess page contain
1ba0: 73 20 6e 6f 20 64 6f 63 69 64 73 2c 0a 2a 2a 20  s no docids,.** 
1bb0: 20 20 61 20 76 61 72 69 6e 74 20 63 6f 6e 74 61    a varint conta
1bc0: 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 64  ining the last d
1bd0: 6f 63 69 64 20 73 74 6f 72 65 64 20 6f 6e 20 74  ocid stored on t
1be0: 68 65 20 74 65 72 6d 20 70 61 67 65 20 66 6f 6c  he term page fol
1bf0: 6c 6f 77 65 64 0a 2a 2a 20 20 20 62 79 20 61 20  lowed.**   by a 
1c00: 30 20 28 30 78 30 30 29 20 76 61 6c 75 65 2e 0a  0 (0x00) value..
1c10: 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20 65 61 63 68  **.**   For each
1c20: 20 73 75 62 73 65 71 75 65 6e 74 20 70 61 67 65   subsequent page
1c30: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2c   in the doclist,
1c40: 20 65 69 74 68 65 72 20 61 20 30 78 30 30 20 62   either a 0x00 b
1c50: 79 74 65 20 69 66 20 74 68 65 0a 2a 2a 20 20 20  yte if the.**   
1c60: 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
1c70: 20 74 65 72 6d 73 2c 20 6f 72 20 61 20 64 65 6c   terms, or a del
1c80: 74 61 2d 65 6e 63 6f 64 65 64 20 64 6f 63 69 64  ta-encoded docid
1c90: 20 28 61 6c 77 61 79 73 20 2b 76 65 29 20 0a 2a   (always +ve) .*
1ca0: 2a 20 20 20 72 65 70 72 65 73 65 6e 74 69 6e 67  *   representing
1cb0: 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64   the first docid
1cc0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 6f 74 68   on the page oth
1cd0: 65 72 77 69 73 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  erwise..*/../*.*
1ce0: 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74 68 65  * Rowids for the
1cf0: 20 61 76 65 72 61 67 65 73 20 61 6e 64 20 73 74   averages and st
1d00: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 73 20  ructure records 
1d10: 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  in the %_data ta
1d20: 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ble..*/.#define 
1d30: 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
1d40: 57 49 44 20 20 20 20 20 31 20 20 20 20 2f 2a 20  WID     1    /* 
1d50: 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72 20 74  Rowid used for t
1d60: 68 65 20 61 76 65 72 61 67 65 73 20 72 65 63 6f  he averages reco
1d70: 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  rd */.#define FT
1d80: 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57  S5_STRUCTURE_ROW
1d90: 49 44 28 69 49 64 78 29 20 28 31 30 20 2b 20 28  ID(iIdx) (10 + (
1da0: 69 49 64 78 29 29 20 20 20 20 20 2f 2a 20 46 6f  iIdx))     /* Fo
1db0: 72 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  r structure reco
1dc0: 72 64 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  rds */../*.** Ma
1dd0: 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e 67  cros determining
1de0: 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65 64   the rowids used
1df0: 20 62 79 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65   by segment node
1e00: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 69 6e 20  s. All nodes in 
1e10: 61 6c 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20  all.** segments 
1e20: 66 6f 72 20 61 6c 6c 20 69 6e 64 65 78 65 73 20  for all indexes 
1e30: 28 74 68 65 20 72 65 67 75 6c 61 72 20 46 54 53  (the regular FTS
1e40: 20 69 6e 64 65 78 20 61 6e 64 20 61 6e 79 20 70   index and any p
1e50: 72 65 66 69 78 20 69 6e 64 65 78 65 73 29 0a 2a  refix indexes).*
1e60: 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  * are stored in 
1e70: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
1e80: 20 77 69 74 68 20 6c 61 72 67 65 20 70 6f 73 69   with large posi
1e90: 74 69 76 65 20 72 6f 77 69 64 73 2e 0a 2a 2a 0a  tive rowids..**.
1ea0: 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74 61  ** The %_data ta
1eb0: 62 6c 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ble may contain 
1ec0: 75 70 20 74 6f 20 28 31 3c 3c 46 54 53 35 5f 53  up to (1<<FTS5_S
1ed0: 45 47 4d 45 4e 54 5f 49 4e 44 45 58 5f 42 49 54  EGMENT_INDEX_BIT
1ee0: 53 29 20 0a 2a 2a 20 69 6e 64 65 78 65 73 20 2d  S) .** indexes -
1ef0: 20 6f 6e 65 20 72 65 67 75 6c 61 72 20 74 65 72   one regular ter
1f00: 6d 20 69 6e 64 65 78 20 61 6e 64 20 7a 65 72 6f  m index and zero
1f10: 20 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20   or more prefix 
1f20: 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  indexes..**.** E
1f30: 61 63 68 20 73 65 67 6d 65 6e 74 20 69 6e 20 61  ach segment in a
1f40: 6e 20 69 6e 64 65 78 20 68 61 73 20 61 20 75 6e  n index has a un
1f50: 69 71 75 65 20 69 64 20 67 72 65 61 74 65 72 20  ique id greater 
1f60: 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  than zero..**.**
1f70: 20 45 61 63 68 20 6e 6f 64 65 20 69 6e 20 61 20   Each node in a 
1f80: 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69  segment b-tree i
1f90: 73 20 61 73 73 69 67 6e 65 64 20 61 20 22 70 61  s assigned a "pa
1fa0: 67 65 20 6e 75 6d 62 65 72 22 20 74 68 61 74 20  ge number" that 
1fb0: 69 73 20 75 6e 69 71 75 65 0a 2a 2a 20 77 69 74  is unique.** wit
1fc0: 68 69 6e 20 6e 6f 64 65 73 20 6f 66 20 69 74 73  hin nodes of its
1fd0: 20 68 65 69 67 68 74 20 77 69 74 68 69 6e 20 74   height within t
1fe0: 68 65 20 73 65 67 6d 65 6e 74 20 28 6c 65 61 66  he segment (leaf
1ff0: 20 6e 6f 64 65 73 20 68 61 76 65 20 61 20 68 65   nodes have a he
2000: 69 67 68 74 20 0a 2a 2a 20 6f 66 20 30 2c 20 70  ight .** of 0, p
2010: 61 72 65 6e 74 73 20 31 2c 20 65 74 63 2e 29 2e  arents 1, etc.).
2020: 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 61 72   Page numbers ar
2030: 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 65 71 75  e allocated sequ
2040: 65 6e 74 69 61 6c 6c 79 20 73 6f 20 74 68 61 74  entially so that
2050: 0a 2a 2a 20 61 20 6e 6f 64 65 73 20 70 61 67 65  .** a nodes page
2060: 20 6e 75 6d 62 65 72 20 69 73 20 61 6c 77 61 79   number is alway
2070: 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20  s one more than 
2080: 69 74 73 20 6c 65 66 74 20 73 69 62 6c 69 6e 67  its left sibling
2090: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 69  ..**.** The rowi
20a0: 64 20 66 6f 72 20 61 20 6e 6f 64 65 20 69 73 20  d for a node is 
20b0: 74 68 65 6e 20 66 6f 75 6e 64 20 75 73 69 6e 67  then found using
20c0: 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d 45 4e   the FTS5_SEGMEN
20d0: 54 5f 52 4f 57 49 44 28 29 20 6d 61 63 72 6f 0a  T_ROWID() macro.
20e0: 2a 2a 20 62 65 6c 6f 77 2e 20 54 68 65 20 46 54  ** below. The FT
20f0: 53 35 5f 53 45 47 4d 45 4e 54 5f 2a 5f 42 49 54  S5_SEGMENT_*_BIT
2100: 53 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20  S macros define 
2110: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  the number of bi
2120: 74 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 65 6e  ts used.** to en
2130: 63 6f 64 65 20 74 68 65 20 74 68 72 65 65 20 46  code the three F
2140: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2150: 44 28 29 20 61 72 67 75 6d 65 6e 74 73 2e 20 54  D() arguments. T
2160: 68 69 73 20 6d 6f 64 75 6c 65 20 72 65 74 75 72  his module retur
2170: 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  ns.** SQLITE_FUL
2180: 4c 20 61 6e 64 20 66 61 69 6c 73 20 74 68 65 20  L and fails the 
2190: 63 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f  current operatio
21a0: 6e 20 69 66 20 74 68 65 79 20 65 76 65 72 20 70  n if they ever p
21b0: 72 6f 76 65 20 74 6f 6f 20 73 6d 61 6c 6c 2e 0a  rove too small..
21c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
21d0: 44 41 54 41 5f 49 44 58 5f 42 20 20 20 20 20 35  DATA_IDX_B     5
21e0: 20 20 20 20 20 2f 2a 20 4d 61 78 20 6f 66 20 33       /* Max of 3
21f0: 31 20 70 72 65 66 69 78 20 69 6e 64 65 78 65 73  1 prefix indexes
2200: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
2210: 5f 44 41 54 41 5f 49 44 5f 42 20 20 20 20 20 31  _DATA_ID_B     1
2220: 36 20 20 20 20 20 2f 2a 20 4d 61 78 20 73 65 67  6     /* Max seg
2230: 20 69 64 20 6e 75 6d 62 65 72 20 36 35 35 33 35   id number 65535
2240: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
2250: 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 20 20  _DATA_HEIGHT_B  
2260: 35 20 20 20 20 20 2f 2a 20 4d 61 78 20 62 2d 74  5     /* Max b-t
2270: 72 65 65 20 68 65 69 67 68 74 20 6f 66 20 33 32  ree height of 32
2280: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
2290: 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 20 20 33  _DATA_PAGE_B   3
22a0: 31 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 61 67  1     /* Max pag
22b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 32 31 34 37  e number of 2147
22c0: 34 38 33 36 34 38 20 2a 2f 0a 0a 23 64 65 66 69  483648 */..#defi
22d0: 6e 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ne FTS5_SEGMENT_
22e0: 52 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69 64  ROWID(idx, segid
22f0: 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20  , height, pgno) 
2300: 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (               
2310: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69            \. ((i
2320: 36 34 29 28 69 64 78 29 20 20 20 20 3c 3c 20 28  64)(idx)    << (
2330: 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 2b  FTS5_DATA_ID_B +
2340: 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
2350: 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 48 45  B + FTS5_DATA_HE
2360: 49 47 48 54 5f 42 29 29 20 2b 20 5c 0a 20 28 28  IGHT_B)) + \. ((
2370: 69 36 34 29 28 73 65 67 69 64 29 20 20 3c 3c 20  i64)(segid)  << 
2380: 28 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f  (FTS5_DATA_PAGE_
2390: 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 48 45  B + FTS5_DATA_HE
23a0: 49 47 48 54 5f 42 29 29 20 2b 20 20 20 20 20 20  IGHT_B)) +      
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 28              \. (
23c0: 28 69 36 34 29 28 68 65 69 67 68 74 29 20 3c 3c  (i64)(height) <<
23d0: 20 28 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45   (FTS5_DATA_PAGE
23e0: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2410: 28 28 69 36 34 29 28 70 67 6e 6f 29 29 20 20 20  ((i64)(pgno))   
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a                \.
2460: 29 0a 0a 23 69 66 20 46 54 53 35 5f 4d 41 58 5f  )..#if FTS5_MAX_
2470: 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20 3e  PREFIX_INDEXES >
2480: 20 28 28 31 3c 3c 46 54 53 35 5f 44 41 54 41 5f   ((1<<FTS5_DATA_
2490: 49 44 58 5f 42 29 2d 31 29 20 0a 23 20 65 72 72  IDX_B)-1) .# err
24a0: 6f 72 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45  or "FTS5_MAX_PRE
24b0: 46 49 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74  FIX_INDEXES is t
24c0: 6f 6f 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66  oo large".#endif
24d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 69 67  ../*.** The heig
24e0: 68 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d  ht of segment b-
24f0: 74 72 65 65 73 20 69 73 20 61 63 74 75 61 6c 6c  trees is actuall
2500: 79 20 6c 69 6d 69 74 65 64 20 74 6f 20 6f 6e 65  y limited to one
2510: 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 28   less than .** (
2520: 31 3c 3c 48 45 49 47 48 54 5f 42 49 54 53 29 2e  1<<HEIGHT_BITS).
2530: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
2540: 20 74 68 65 20 72 6f 77 69 64 20 61 64 64 72 65   the rowid addre
2550: 73 73 20 73 70 61 63 65 20 66 6f 72 20 6e 6f 64  ss space for nod
2560: 65 73 0a 2a 2a 20 77 69 74 68 20 73 75 63 68 20  es.** with such 
2570: 61 20 68 65 69 67 68 74 20 69 73 20 75 73 65 64  a height is used
2580: 20 62 79 20 64 6f 63 6c 69 73 74 20 69 6e 64 65   by doclist inde
2590: 78 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  xes..*/.#define 
25a0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58  FTS5_SEGMENT_MAX
25b0: 5f 48 45 49 47 48 54 20 28 28 31 20 3c 3c 20 46  _HEIGHT ((1 << F
25c0: 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f  TS5_DATA_HEIGHT_
25d0: 42 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  B)-1)../*.** The
25e0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 64   rowid for the d
25f0: 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 61 73 73  oclist index ass
2600: 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 65 61  ociated with lea
2610: 66 20 70 61 67 65 20 70 67 6e 6f 20 6f 66 20 73  f page pgno of s
2620: 65 67 6d 65 6e 74 0a 2a 2a 20 73 65 67 69 64 20  egment.** segid 
2630: 69 6e 20 69 6e 64 65 78 20 69 64 78 2e 0a 2a 2f  in index idx..*/
2640: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 4f  .#define FTS5_DO
2650: 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57 49 44 28  CLIST_IDX_ROWID(
2660: 69 64 78 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f  idx, segid, pgno
2670: 29 20 5c 0a 20 20 20 20 20 20 20 20 46 54 53 35  ) \.        FTS5
2680: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
2690: 64 78 2c 20 73 65 67 69 64 2c 20 46 54 53 35 5f  dx, segid, FTS5_
26a0: 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47  SEGMENT_MAX_HEIG
26b0: 48 54 2c 20 70 67 6e 6f 29 0a 0a 23 69 66 64 65  HT, pgno)..#ifde
26c0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
26d0: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f  nt sqlite3Fts5Co
26e0: 72 72 75 70 74 28 29 20 7b 20 72 65 74 75 72 6e  rrupt() { return
26f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2700: 56 54 41 42 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a  VTAB; }.#endif..
2710: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65  ./*.** Each time
2720: 20 61 20 62 6c 6f 62 20 69 73 20 72 65 61 64 20   a blob is read 
2730: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
2740: 74 61 62 6c 65 2c 20 69 74 20 69 73 20 70 61 64  table, it is pad
2750: 64 65 64 20 77 69 74 68 20 74 68 69 73 0a 2a 2a  ded with this.**
2760: 20 6d 61 6e 79 20 7a 65 72 6f 20 62 79 74 65 73   many zero bytes
2770: 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 69 74 20  . This makes it 
2780: 65 61 73 69 65 72 20 74 6f 20 64 65 63 6f 64 65  easier to decode
2790: 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 65 63   the various rec
27a0: 6f 72 64 20 66 6f 72 6d 61 74 73 0a 2a 2a 20 77  ord formats.** w
27b0: 69 74 68 6f 75 74 20 6f 76 65 72 72 65 61 64 69  ithout overreadi
27c0: 6e 67 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ng if the record
27d0: 73 20 61 72 65 20 63 6f 72 72 75 70 74 2e 0a 2a  s are corrupt..*
27e0: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  /.#define FTS5_D
27f0: 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
2800: 20 38 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75   8..typedef stru
2810: 63 74 20 46 74 73 35 42 74 72 65 65 49 74 65 72  ct Fts5BtreeIter
2820: 20 46 74 73 35 42 74 72 65 65 49 74 65 72 3b 0a   Fts5BtreeIter;.
2830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2840: 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
2850: 6c 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c  l Fts5BtreeIterL
2860: 65 76 65 6c 3b 0a 74 79 70 65 64 65 66 20 73 74  evel;.typedef st
2870: 72 75 63 74 20 46 74 73 35 43 68 75 6e 6b 49 74  ruct Fts5ChunkIt
2880: 65 72 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72  er Fts5ChunkIter
2890: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
28a0: 20 46 74 73 35 44 61 74 61 20 46 74 73 35 44 61   Fts5Data Fts5Da
28b0: 74 61 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  ta;.typedef stru
28c0: 63 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  ct Fts5DlidxIter
28d0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 3b 0a   Fts5DlidxIter;.
28e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
28f0: 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
2900: 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
2910: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2920: 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 46 74   Fts5NodeIter Ft
2930: 73 35 4e 6f 64 65 49 74 65 72 3b 0a 74 79 70 65  s5NodeIter;.type
2940: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50  def struct Fts5P
2950: 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50 61  ageWriter Fts5Pa
2960: 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65  geWriter;.typede
2970: 66 20 73 74 72 75 63 74 20 46 74 73 35 50 6f 73  f struct Fts5Pos
2980: 49 74 65 72 20 46 74 73 35 50 6f 73 49 74 65 72  Iter Fts5PosIter
2990: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
29a0: 20 46 74 73 35 53 65 67 49 74 65 72 20 46 74 73   Fts5SegIter Fts
29b0: 35 53 65 67 49 74 65 72 3b 0a 74 79 70 65 64 65  5SegIter;.typede
29c0: 66 20 73 74 72 75 63 74 20 46 74 73 35 44 6f 63  f struct Fts5Doc
29d0: 6c 69 73 74 49 74 65 72 20 46 74 73 35 44 6f 63  listIter Fts5Doc
29e0: 6c 69 73 74 49 74 65 72 3b 0a 74 79 70 65 64 65  listIter;.typede
29f0: 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65 67  f struct Fts5Seg
2a00: 57 72 69 74 65 72 20 46 74 73 35 53 65 67 57 72  Writer Fts5SegWr
2a10: 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  iter;.typedef st
2a20: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
2a30: 72 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  re Fts5Structure
2a40: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2a50: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
2a60: 76 65 6c 20 46 74 73 35 53 74 72 75 63 74 75 72  vel Fts5Structur
2a70: 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66 20  eLevel;.typedef 
2a80: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2a90: 74 75 72 65 53 65 67 6d 65 6e 74 20 46 74 73 35  tureSegment Fts5
2aa0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2ab0: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 61  ;..struct Fts5Da
2ac0: 74 61 20 7b 0a 20 20 75 38 20 2a 70 3b 20 20 20  ta {.  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 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2af0: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
2b00: 61 69 6e 69 6e 67 20 72 65 63 6f 72 64 20 2a 2f  aining record */
2b10: 0a 20 20 69 6e 74 20 6e 3b 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 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
2b40: 63 6f 72 64 20 69 6e 20 62 79 74 65 73 20 2a 2f  cord in bytes */
2b50: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 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 20 2f 2a 20 52 65 66 20 63 6f 75 6e 74 20     /* Ref count 
2b80: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65  */.};../*.** One
2b90: 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61   object per %_da
2ba0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72  ta table..*/.str
2bb0: 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a  uct Fts5Index {.
2bc0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
2bd0: 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20  onfig;          
2be0: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
2bf0: 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  le configuration
2c00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74   */.  char *zDat
2c10: 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20  aTbl;           
2c20: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2c30: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
2c40: 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74  .  int nWorkUnit
2c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c60: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73     /* Leaf pages
2c70: 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20   in a "unit" of 
2c80: 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  work */..  /*.  
2c90: 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c  ** Variables rel
2ca0: 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75  ated to the accu
2cb0: 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  mulation of toke
2cc0: 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20  ns and doclists 
2cd0: 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20  within the.  ** 
2ce0: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
2cf0: 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65  ables before the
2d00: 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f  y are flushed to
2d10: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74   disk..  */.  Ft
2d20: 73 35 48 61 73 68 20 2a 2a 61 70 48 61 73 68 3b  s5Hash **apHash;
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d40: 20 41 72 72 61 79 20 6f 66 20 68 61 73 68 20 74   Array of hash t
2d50: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ables */.  int n
2d60: 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 3b 20  MaxPendingData; 
2d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2d80: 78 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 62  x pending data b
2d90: 65 66 6f 72 65 20 66 6c 75 73 68 20 74 6f 20 64  efore flush to d
2da0: 69 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65  isk */.  int nPe
2db0: 6e 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20 20  ndingData;      
2dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
2dd0: 65 6e 74 20 62 79 74 65 73 20 6f 66 20 70 65 6e  ent bytes of pen
2de0: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 69  ding data */.  i
2df0: 36 34 20 69 57 72 69 74 65 52 6f 77 69 64 3b 20  64 iWriteRowid; 
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e10: 2a 20 52 6f 77 69 64 20 66 6f 72 20 63 75 72 72  * Rowid for curr
2e20: 65 6e 74 20 64 6f 63 20 62 65 69 6e 67 20 77 72  ent doc being wr
2e30: 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 45  itten */..  /* E
2e40: 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
2e50: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f   /* Current erro
2e80: 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  r code */..  /* 
2e90: 53 74 61 74 65 20 75 73 65 64 20 62 79 20 74 68  State used by th
2ea0: 65 20 66 74 73 35 44 61 74 61 58 58 58 28 29 20  e fts5DataXXX() 
2eb0: 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  functions. */.  
2ec0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52  sqlite3_blob *pR
2ed0: 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20 20  eader;          
2ee0: 2f 2a 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20  /* RO incr-blob 
2ef0: 6f 70 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74  open on %_data t
2f00: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
2f10: 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b  3_stmt *pWriter;
2f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e            /* "IN
2f30: 53 45 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20  SERT ... %_data 
2f40: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a  VALUES(?,?)" */.
2f50: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2f60: 70 44 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20  pDeleter;       
2f70: 20 20 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f    /* "DELETE FRO
2f80: 4d 20 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e  M %_data ... id>
2f90: 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f  =? AND id<=?" */
2fa0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
2fd0: 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61  er of blocks rea
2fe0: 64 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  d */.};..struct 
2ff0: 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
3000: 7b 0a 20 20 69 6e 74 20 62 44 65 73 63 3b 20 20  {.  int bDesc;  
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3030: 44 45 53 43 20 6f 72 64 65 72 2c 20 66 61 6c 73  DESC order, fals
3040: 65 20 66 6f 72 20 41 53 43 20 2a 2f 0a 20 20 75  e for ASC */.  u
3050: 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  8 *a;.  int n;. 
3060: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4f 75   int i;..  /* Ou
3070: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20  tput variables. 
3080: 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74 20 45  aPoslist==0 at E
3090: 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  OF */.  i64 iRow
30a0: 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73 6c 69  id;.  u8 *aPosli
30b0: 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69  st;.  int nPosli
30c0: 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61  st;.};../*.** Ea
30d0: 63 68 20 69 74 65 72 61 74 6f 72 20 75 73 65 64  ch iterator used
30e0: 20 62 79 20 65 78 74 65 72 6e 61 6c 20 6d 6f 64   by external mod
30f0: 75 6c 65 73 20 69 73 20 61 6e 20 69 6e 73 74 61  ules is an insta
3100: 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65  nce of this type
3110: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3120: 49 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 46 74  IndexIter {.  Ft
3130: 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b  s5Index *pIndex;
3140: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3150: 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
3160: 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
3170: 4d 75 6c 74 69 3b 0a 20 20 46 74 73 35 44 6f 63  Multi;.  Fts5Doc
3180: 6c 69 73 74 49 74 65 72 20 2a 70 44 6f 63 6c 69  listIter *pDocli
3190: 73 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  st;.  Fts5Buffer
31a0: 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20   poslist;       
31b0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
31c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65  containing curre
31d0: 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 7d 3b  nt poslist */.};
31e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ../*.** The cont
31f0: 65 6e 74 73 20 6f 66 20 74 68 65 20 22 73 74 72  ents of the "str
3200: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20 66  ucture" record f
3210: 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 61 72  or each index ar
3220: 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a 2a 2a  e represented.**
3230: 20 75 73 69 6e 67 20 61 6e 20 46 74 73 35 53 74   using an Fts5St
3240: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 69  ructure record i
3250: 6e 20 6d 65 6d 6f 72 79 2e 20 57 68 69 63 68 20  n memory. Which 
3260: 75 73 65 73 20 69 6e 73 74 61 6e 63 65 73 20 6f  uses instances o
3270: 66 20 74 68 65 20 0a 2a 2a 20 6f 74 68 65 72 20  f the .** other 
3280: 46 74 73 35 53 74 72 75 63 74 75 72 65 58 58 58  Fts5StructureXXX
3290: 20 74 79 70 65 73 20 61 73 20 63 6f 6d 70 6f 6e   types as compon
32a0: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ents..*/.struct 
32b0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
32c0: 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20 69 53 65  ment {.  int iSe
32d0: 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  gid;            
32e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
32f0: 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
3300: 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 20  nHeight;        
3310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3320: 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e 74  eight of segment
3330: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
3340: 20 70 67 6e 6f 46 69 72 73 74 3b 20 20 20 20 20   pgnoFirst;     
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3360: 46 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  First leaf page 
3370: 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e  number in segmen
3380: 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 4c  t */.  int pgnoL
3390: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
33a0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c         /* Last l
33b0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
33c0: 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d 3b  in segment */.};
33d0: 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75  .struct Fts5Stru
33e0: 63 74 75 72 65 4c 65 76 65 6c 20 7b 0a 20 20 69  ctureLevel {.  i
33f0: 6e 74 20 6e 4d 65 72 67 65 3b 20 20 20 20 20 20  nt nMerge;      
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3410: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
3420: 65 6e 74 73 20 69 6e 20 69 6e 63 72 2d 6d 65 72  ents in incr-mer
3430: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  ge */.  int nSeg
3440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3450: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3460: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
3470: 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f 0a  nts on level */.
3480: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
3490: 65 67 6d 65 6e 74 20 2a 61 53 65 67 3b 20 20 20  egment *aSeg;   
34a0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65    /* Array of se
34b0: 67 6d 65 6e 74 73 2e 20 61 53 65 67 5b 30 5d 20  gments. aSeg[0] 
34c0: 69 73 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d 3b  is oldest. */.};
34d0: 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75  .struct Fts5Stru
34e0: 63 74 75 72 65 20 7b 0a 20 20 75 36 34 20 6e 57  cture {.  u64 nW
34f0: 72 69 74 65 43 6f 75 6e 74 65 72 3b 20 20 20 20  riteCounter;    
3500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3510: 61 6c 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  al leaves writte
3520: 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f 0a  n to level 0 */.
3530: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20    int nLevel;   
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3550: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
3560: 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e  evels in this in
3570: 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  dex */.  Fts5Str
3580: 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76  uctureLevel aLev
3590: 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20 41 72 72 61  el[0];   /* Arra
35a0: 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65  y of nLevel leve
35b0: 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a  l objects */.};.
35c0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
35d0: 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65 67   of type Fts5Seg
35e0: 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20 74  Writer is used t
35f0: 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65  o write to segme
3600: 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  nts..*/.struct F
3610: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a  ts5PageWriter {.
3620: 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20    int pgno;     
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
3650: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
3660: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
3670: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
3680: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3690: 6e 74 61 69 6e 69 6e 67 20 70 61 67 65 20 64 61  ntaining page da
36a0: 74 61 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ta */.  Fts5Buff
36b0: 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  er term;        
36c0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
36d0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  r containing pre
36e0: 76 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61  vious term on pa
36f0: 67 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  ge */.};.struct 
3700: 46 74 73 35 53 65 67 57 72 69 74 65 72 20 7b 0a  Fts5SegWriter {.
3710: 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20    int iIdx;     
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
3740: 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
3750: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
3760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3770: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3780: 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   */.  int nWrite
3790: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
37a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
37b0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 57  of entries in aW
37c0: 72 69 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 50  riter */.  Fts5P
37d0: 61 67 65 57 72 69 74 65 72 20 2a 61 57 72 69 74  ageWriter *aWrit
37e0: 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  er;        /* Ar
37f0: 72 61 79 20 6f 66 20 50 61 67 65 57 72 69 74 65  ray of PageWrite
3800: 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69  r objects */.  i
3810: 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20  64 iPrevRowid;  
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3830: 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64  * Previous docid
3840: 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72   written to curr
3850: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38  ent leaf */.  u8
3860: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f   bFirstRowidInDo
3870: 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  clist;        /*
3880: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3890: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
38a0: 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20  doclist */.  u8 
38b0: 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
38c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
38d0: 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77  True if next row
38e0: 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 70  id is first in p
38f0: 61 67 65 20 2a 2f 0a 20 20 75 38 20 62 46 69 72  age */.  u8 bFir
3900: 73 74 54 65 72 6d 49 6e 50 61 67 65 3b 20 20 20  stTermInPage;   
3910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3920: 20 69 66 20 6e 65 78 74 20 74 65 72 6d 20 77 69   if next term wi
3930: 6c 6c 20 62 65 20 66 69 72 73 74 20 69 6e 20 6c  ll be first in l
3940: 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  eaf */.  int nLe
3950: 61 66 57 72 69 74 74 65 6e 3b 20 20 20 20 20 20  afWritten;      
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3970: 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73  er of leaf pages
3980: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
3990: 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20  t nEmpty;       
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74 69   Number of conti
39c0: 67 75 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73 20  guous term-less 
39d0: 6e 6f 64 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  nodes */.  Fts5B
39e0: 75 66 66 65 72 20 63 64 6c 69 64 78 3b 20 20 20  uffer cdlidx;   
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3a00: 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a  oclist index */.
3a10: 20 20 69 36 34 20 69 44 6c 69 64 78 50 72 65 76    i64 iDlidxPrev
3a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a30: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
3a40: 77 69 64 20 61 70 70 65 6e 64 65 64 20 74 6f 20  wid appended to 
3a50: 64 6c 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  dlidx */.  int b
3a60: 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 3b 20  DlidxPrevValid; 
3a70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3a80: 75 65 20 69 66 20 69 44 6c 69 64 78 50 72 65 76  ue if iDlidxPrev
3a90: 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b 0a   is valid */.};.
3aa0: 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f  ./*.** Object fo
3ab0: 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
3ac0: 75 67 68 20 74 68 65 20 6d 65 72 67 65 64 20 72  ugh the merged r
3ad0: 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72  esults of one or
3ae0: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a   more segments,.
3af0: 2a 2a 20 76 69 73 69 74 69 6e 67 20 65 61 63 68  ** visiting each
3b00: 20 74 65 72 6d 2f 64 6f 63 69 64 20 70 61 69 72   term/docid pair
3b10: 20 69 6e 20 74 68 65 20 6d 65 72 67 65 64 20 64   in the merged d
3b20: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20  ata..**.** nSeg 
3b30: 69 73 20 61 6c 77 61 79 73 20 61 20 70 6f 77 65  is always a powe
3b40: 72 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72  r of two greater
3b50: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
3b60: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
3b70: 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74  ** segments that
3b80: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
3b90: 6d 65 72 67 69 6e 67 20 64 61 74 61 20 66 72 6f  merging data fro
3ba0: 6d 2e 20 42 6f 74 68 20 74 68 65 20 61 53 65 67  m. Both the aSeg
3bb0: 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74  [] and.** aFirst
3bc0: 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20 73 69  [] arrays are si
3bd0: 7a 65 64 20 61 74 20 6e 53 65 67 20 65 6e 74 72  zed at nSeg entr
3be0: 69 65 73 2e 20 54 68 65 20 61 53 65 67 5b 5d 20  ies. The aSeg[] 
3bf0: 61 72 72 61 79 20 69 73 20 70 61 64 64 65 64 0a  array is padded.
3c00: 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65 64 20 6f  ** with zeroed o
3c10: 62 6a 65 63 74 73 20 2d 20 74 68 65 73 65 20 61  bjects - these a
3c20: 72 65 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  re handled as if
3c30: 20 74 68 65 79 20 77 65 72 65 20 69 74 65 72 61   they were itera
3c40: 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  tors opened.** o
3c50: 6e 20 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 73  n empty segments
3c60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
3c70: 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  lts of comparing
3c80: 20 73 65 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e   segments aSeg[N
3c90: 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c  ] and aSeg[N+1],
3ca0: 20 77 68 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a   where N is an.*
3cb0: 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69  * even number, i
3cc0: 73 20 73 74 6f 72 65 64 20 69 6e 20 61 46 69 72  s stored in aFir
3cd0: 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20  st[(nSeg+N)/2]. 
3ce0: 54 68 65 20 22 72 65 73 75 6c 74 22 20 6f 66 20  The "result" of 
3cf0: 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73  the .** comparis
3d00: 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65  on in this conte
3d10: 78 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  xt is the index 
3d20: 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  of the iterator 
3d30: 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a  that currently.*
3d40: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
3d50: 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77  smaller term/row
3d60: 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20  id combination. 
3d70: 49 74 65 72 61 74 6f 72 73 20 61 74 20 45 4f 46  Iterators at EOF
3d80: 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72   are.** consider
3d90: 65 64 20 74 6f 20 62 65 20 67 72 65 61 74 65 72  ed to be greater
3da0: 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20   than all other 
3db0: 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a  iterators..**.**
3dc0: 20 61 46 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61   aFirst[1] conta
3dd0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ins the index in
3de0: 20 61 53 65 67 5b 5d 20 6f 66 20 74 68 65 20 69   aSeg[] of the i
3df0: 74 65 72 61 74 6f 72 20 74 68 61 74 20 70 6f 69  terator that poi
3e00: 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d  nts to.** the sm
3e10: 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76 65 72 61  allest key overa
3e20: 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d 20 69 73  ll. aFirst[0] is
3e30: 20 75 6e 75 73 65 64 2e 20 0a 2a 2f 0a 0a 74 79   unused. .*/..ty
3e40: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
3e50: 35 43 52 65 73 75 6c 74 20 46 74 73 35 43 52 65  5CResult Fts5CRe
3e60: 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46 74 73  sult;.struct Fts
3e70: 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75 31 36  5CResult {.  u16
3e80: 20 69 46 69 72 73 74 3b 20 20 20 20 20 20 20 20   iFirst;        
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3ea0: 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f 66 20  aSeg[] index of 
3eb0: 66 69 72 73 74 65 73 74 20 69 74 65 72 61 74 6f  firstest iterato
3ec0: 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72 6d 45  r */.  u8 bTermE
3ed0: 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
3ee0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3ef0: 66 20 74 68 65 20 74 65 72 6d 73 20 61 72 65 20  f the terms are 
3f00: 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 73 74 72  equal */.};..str
3f10: 75 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67  uct Fts5MultiSeg
3f20: 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65  Iter {.  int nSe
3f30: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
3f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
3f50: 20 6f 66 20 61 53 65 67 5b 5d 20 61 72 72 61 79   of aSeg[] array
3f60: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
3f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
3f90: 20 69 74 65 72 61 74 65 20 69 6e 20 72 65 76 65   iterate in reve
3fa0: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69  rse order */.  i
3fb0: 6e 74 20 62 53 6b 69 70 45 6d 70 74 79 3b 20 20  nt bSkipEmpty;  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3fd0: 2a 20 54 72 75 65 20 74 6f 20 73 6b 69 70 20 64  * True to skip d
3fe0: 65 6c 65 74 65 64 20 65 6e 74 72 69 65 73 20 2a  eleted entries *
3ff0: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
4000: 2a 61 53 65 67 3b 20 20 20 20 20 20 20 20 20 20  *aSeg;          
4010: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
4020: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
4030: 73 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73 75  s */.  Fts5CResu
4040: 6c 74 20 2a 61 46 69 72 73 74 3b 20 20 20 20 20  lt *aFirst;     
4050: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4060: 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28 73  t merge state (s
4070: 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a  ee above) */.};.
4080: 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f  ./*.** Object fo
4090: 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
40a0: 75 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67  ugh a single seg
40b0: 6d 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65  ment, visiting e
40c0: 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a  ach term/docid.*
40d0: 2a 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65  * pair in the se
40e0: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65  gment..**.** pSe
40f0: 67 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d  g:.**   The segm
4100: 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ent to iterate t
4110: 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c  hrough..**.** iL
4120: 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75  eafPgno:.**   Cu
4130: 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20  rrent leaf page 
4140: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65  number within se
4150: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  gment..**.** iLe
4160: 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42  afOffset:.**   B
4170: 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69  yte offset withi
4180: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  n the current le
4190: 61 66 20 74 68 61 74 20 69 73 20 6f 6e 65 20 62  af that is one b
41a0: 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
41b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 72 6f 77   of the.**   row
41c0: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
41d0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
41e0: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
41f0: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
4200: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
4210: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
4220: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
4230: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
4240: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
4250: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
4260: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
4270: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
4280: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
4290: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
42a0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
42b0: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
42c0: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
42d0: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
42e0: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
42f0: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
4300: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
4310: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
4320: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
4330: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
4340: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
4350: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
4360: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
4370: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
4380: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
4390: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
43a0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
43b0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
43c0: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
43d0: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
43e0: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
43f0: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
4400: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
4410: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
4420: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
4430: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
4440: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
4450: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
4460: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
4470: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
4480: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
4490: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
44a0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
44b0: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
44c0: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
44d0: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
44e0: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
44f0: 65 20 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73  e through docids
4500: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   in descending o
4510: 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20  rder instead of 
4520: 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75  the.**     defau
4530: 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  lt ascending ord
4540: 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64  er..**.** iRowid
4550: 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66  Offset/nRowidOff
4560: 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74  set/aRowidOffset
4570: 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61  :.**     These a
4580: 72 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46  re used if the F
4590: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
45a0: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
45b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 45 61 63 68 20  .**.**     Each 
45c0: 74 69 6d 65 20 61 20 6e 65 77 20 70 61 67 65 20  time a new page 
45d0: 69 73 20 6c 6f 61 64 65 64 2c 20 74 68 65 20 69  is loaded, the i
45e0: 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  terator is set t
45f0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a  o point to the.*
4600: 2a 20 20 20 20 20 66 69 6e 61 6c 20 72 6f 77 69  *     final rowi
4610: 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  d. Additionally,
4620: 20 74 68 65 20 61 52 6f 77 69 64 4f 66 66 73 65   the aRowidOffse
4630: 74 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70  t[] array is pop
4640: 75 6c 61 74 65 64 20 0a 2a 2a 20 20 20 20 20 77  ulated .**     w
4650: 69 74 68 20 74 68 65 20 62 79 74 65 20 6f 66 66  ith the byte off
4660: 73 65 74 73 20 6f 66 20 61 6c 6c 20 72 65 6c 65  sets of all rele
4670: 76 61 6e 74 20 72 6f 77 69 64 20 66 69 65 6c 64  vant rowid field
4680: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a  s on the page. .
4690: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  */.struct Fts5Se
46a0: 67 49 74 65 72 20 7b 0a 20 20 46 74 73 35 53 74  gIter {.  Fts5St
46b0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
46c0: 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 53 65 67  pSeg;     /* Seg
46d0: 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20  ment to iterate 
46e0: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74  through */.  int
46f0: 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   iIdx;          
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4710: 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68  Byte offset with
4720: 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  in current leaf 
4730: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20  */.  int flags; 
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4750: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
4760: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c  configuration fl
4770: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  ags */.  int iLe
4780: 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  afPgno;         
4790: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
47a0: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
47b0: 6d 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61  mber */.  Fts5Da
47c0: 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
47d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
47e0: 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a  rent leaf data *
47f0: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66  /.  int iLeafOff
4800: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4810: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
4820: 65 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e  et within curren
4830: 74 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20  t leaf */..  /* 
4840: 54 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66  The page and off
4850: 73 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74  set from which t
4860: 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
4870: 77 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66  was read. The of
4880: 66 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68  fset .  ** is th
4890: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
48a0: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74  first rowid in t
48b0: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
48c0: 73 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54  st.  */.  int iT
48d0: 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69  ermLeafPgno;.  i
48e0: 6e 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  nt iTermLeafOffs
48f0: 65 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  et;..  /* The fo
4900: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79  llowing are only
4910: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
4920: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4930: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a  E flag is set. *
4940: 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  /.  int iRowidOf
4950: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
4960: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65      /* Current e
4970: 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66  ntry in aRowidOf
4980: 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  fset[] */.  int 
4990: 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  nRowidOffset;   
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
49b0: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
49c0: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
49d0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
49e0: 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  aRowidOffset;   
49f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4a00: 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f  ray of offset to
4a10: 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f   rowid fields */
4a20: 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ..  Fts5DlidxIte
4a30: 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20  r *pDlidx;      
4a40: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
4a50: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
4a60: 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69  ex */..  /* Vari
4a70: 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20  ables populated 
4a80: 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74  based on current
4a90: 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73   entry. */.  Fts
4aa0: 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ac0: 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  Current term */.
4ad0: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
4b00: 69 64 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  id */.};..#defin
4b10: 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  e FTS5_SEGITER_O
4b20: 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65 66  NETERM 0x01.#def
4b30: 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  ine FTS5_SEGITER
4b40: 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a 0a  _REVERSE 0x02...
4b50: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
4b60: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
4b70: 67 68 20 70 61 67 69 6e 61 74 65 64 20 64 61 74  gh paginated dat
4b80: 61 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  a..*/.struct Fts
4b90: 35 43 68 75 6e 6b 49 74 65 72 20 7b 0a 20 20 46  5ChunkIter {.  F
4ba0: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20  ts5Data *pLeaf; 
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4bc0: 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
4bd0: 61 74 61 2e 20 4e 55 4c 4c 20 2d 3e 20 45 4f 46  ata. NULL -> EOF
4be0: 2e 20 2a 2f 0a 20 20 69 36 34 20 69 4c 65 61 66  . */.  i64 iLeaf
4bf0: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
4c00: 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
4c10: 74 65 20 72 6f 77 69 64 20 6f 66 20 63 75 72 72  te rowid of curr
4c20: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e  ent leaf */.  in
4c30: 74 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20  t nRem;         
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4c50: 20 52 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73   Remaining bytes
4c60: 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65 61 64   of data to read
4c70: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
4c80: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
4c90: 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20   u8 *p;         
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
4cc0: 68 75 6e 6b 20 6f 66 20 64 61 74 61 20 2a 2f 0a  hunk of data */.
4cd0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
4d00: 66 65 72 20 70 20 69 6e 20 62 79 74 65 73 20 2a  fer p in bytes *
4d10: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  /.};../*.** Obje
4d20: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
4d30: 20 74 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c   through a singl
4d40: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
4d50: 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 72 75  on disk..*/.stru
4d60: 63 74 20 46 74 73 35 50 6f 73 49 74 65 72 20 7b  ct Fts5PosIter {
4d70: 0a 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72  .  Fts5ChunkIter
4d80: 20 63 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20   chunk;         
4d90: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 63 68     /* Current ch
4da0: 75 6e 6b 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  unk of data */. 
4db0: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69   /* Offset withi
4de0: 6e 20 63 68 75 6e 6b 20 64 61 74 61 20 2a 2f 0a  n chunk data */.
4df0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
4e00: 6e 74 20 69 50 6f 73 3b 0a 7d 3b 0a 0a 2f 2a 0a  nt iPos;.};../*.
4e10: 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74  ** Object for it
4e20: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
4e30: 74 68 65 20 63 6f 6e 65 6e 74 73 20 6f 66 20 61  the conents of a
4e40: 20 73 69 6e 67 6c 65 20 69 6e 74 65 72 6e 61 6c   single internal
4e50: 20 6e 6f 64 65 20 69 6e 20 0a 2a 2a 20 6d 65 6d   node in .** mem
4e60: 6f 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ory..*/.struct F
4e70: 74 73 35 4e 6f 64 65 49 74 65 72 20 7b 0a 20 20  ts5NodeIter {.  
4e80: 2f 2a 20 49 6e 74 65 72 6e 61 6c 2e 20 53 65 74  /* Internal. Set
4e90: 20 61 6e 64 20 6d 61 6e 61 67 65 64 20 62 79 20   and managed by 
4ea0: 66 74 73 35 4e 6f 64 65 49 74 65 72 58 58 58 28  fts5NodeIterXXX(
4eb0: 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 45 78 63  ) functions. Exc
4ec0: 65 70 74 2c 20 0a 20 20 2a 2a 20 74 68 65 20 45  ept, .  ** the E
4ed0: 4f 46 20 74 65 73 74 20 66 6f 72 20 74 68 65 20  OF test for the 
4ee0: 69 74 65 72 61 74 6f 72 20 69 73 20 28 46 74 73  iterator is (Fts
4ef0: 35 4e 6f 64 65 49 74 65 72 2e 61 44 61 74 61 3d  5NodeIter.aData=
4f00: 3d 30 29 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  =0).  */.  const
4f10: 20 75 38 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e   u8 *aData;.  in
4f20: 74 20 6e 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  t nData;.  int i
4f30: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  Off;..  /* Outpu
4f40: 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  t variables */. 
4f50: 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
4f60: 3b 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 0a  ;.  int nEmpty;.
4f70: 20 20 69 6e 74 20 69 43 68 69 6c 64 3b 0a 20 20    int iChild;.  
4f80: 69 6e 74 20 62 44 6c 69 64 78 3b 0a 7d 3b 0a 0a  int bDlidx;.};..
4f90: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
4fa0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
4fb0: 6e 67 20 74 79 70 65 20 69 73 20 75 73 65 64 20  ng type is used 
4fc0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
4fd0: 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  gh the contents.
4fe0: 2a 2a 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2d  ** of a doclist-
4ff0: 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a  index record..**
5000: 0a 2a 2a 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20  .** pData:.**   
5010: 52 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 69 6e  Record containin
5020: 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  g the doclist-in
5030: 64 65 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  dex data..**.** 
5040: 62 45 6f 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74  bEof:.**   Set t
5050: 6f 20 74 72 75 65 20 6f 6e 63 65 20 69 74 65 72  o true once iter
5060: 61 74 6f 72 20 68 61 73 20 72 65 61 63 68 65 64  ator has reached
5070: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66 66   EOF..**.** iOff
5080: 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 68  :.**   Set to th
5090: 65 20 63 75 72 72 65 6e 74 20 6f 66 66 73 65 74  e current offset
50a0: 20 77 69 74 68 69 6e 20 72 65 63 6f 72 64 20 70   within record p
50b0: 44 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Data..*/.struct 
50c0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 7b 0a  Fts5DlidxIter {.
50d0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
50e0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
50f0: 2f 2a 20 44 61 74 61 20 66 6f 72 20 64 6f 63 6c  /* Data for docl
5100: 69 73 74 20 69 6e 64 65 78 2c 20 69 66 20 61 6e  ist index, if an
5110: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b  y */.  int iOff;
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
5140: 6f 66 66 73 65 74 20 69 6e 74 6f 20 70 44 6c 69  offset into pDli
5150: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66  dx */.  int bEof
5160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5170: 20 20 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20        /* At EOF 
5180: 61 6c 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74  already */.  int
5190: 20 69 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20   iFirstOff;     
51a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
51b0: 65 64 20 62 79 20 72 65 76 65 72 73 65 20 69 74  ed by reverse it
51c0: 65 72 61 74 6f 72 73 20 6f 6e 6c 79 20 2a 2f 0a  erators only */.
51d0: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
51e0: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  iables */.  int 
51f0: 69 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20  iLeafPgno;      
5200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5210: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  e number of curr
5220: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f  ent leaf page */
5230: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20  .  i64 iRowid;  
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5250: 20 2f 2a 20 46 69 72 73 74 20 72 6f 77 69 64 20   /* First rowid 
5260: 6f 6e 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e  on leaf iLeafPgn
5270: 6f 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  o */.};.../*.** 
5280: 41 6e 20 46 74 73 35 42 74 72 65 65 49 74 65 72  An Fts5BtreeIter
5290: 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20   object is used 
52a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
52b0: 67 68 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  gh all entries i
52c0: 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65 20  n the.** b-tree 
52d0: 68 69 65 72 61 72 63 68 79 20 62 65 6c 6f 6e 67  hierarchy belong
52e0: 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ing to a single 
52f0: 66 74 73 35 20 73 65 67 6d 65 6e 74 2e 20 49 6e  fts5 segment. In
5300: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 0a 2a   this case the.*
5310: 2a 20 22 62 2d 74 72 65 65 20 68 69 65 72 61 72  * "b-tree hierar
5320: 63 68 79 22 20 69 73 20 61 6c 6c 20 62 2d 74 72  chy" is all b-tr
5330: 65 65 20 6e 6f 64 65 73 20 65 78 63 65 70 74 20  ee nodes except 
5340: 6c 65 61 76 65 73 2e 20 45 61 63 68 20 65 6e 74  leaves. Each ent
5350: 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74  ry in the.** b-t
5360: 72 65 65 20 68 69 65 72 61 72 63 68 79 20 63 6f  ree hierarchy co
5370: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 66 6f  nsists of the fo
5380: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
5390: 20 69 4c 65 61 66 3a 20 20 54 68 65 20 70 61 67   iLeaf:  The pag
53a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
53b0: 6c 65 61 66 20 70 61 67 65 20 74 68 65 20 65 6e  leaf page the en
53c0: 74 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  try points to..*
53d0: 2a 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20 20 41  *.**   term:   A
53e0: 20 73 70 6c 69 74 2d 6b 65 79 20 74 68 61 74 20   split-key that 
53f0: 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c 65 61  all terms on lea
5400: 66 20 70 61 67 65 20 24 69 4c 65 61 66 20 6d 75  f page $iLeaf mu
5410: 73 74 20 62 65 20 67 72 65 61 74 65 72 0a 2a 2a  st be greater.**
5420: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 6e 20             than 
5430: 6f 72 20 65 71 75 61 6c 20 74 6f 2e 20 54 68 65  or equal to. The
5440: 20 22 74 65 72 6d 22 20 61 73 73 6f 63 69 61 74   "term" associat
5450: 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
5460: 74 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 20  t b-tree.**     
5470: 20 20 20 20 20 20 68 69 65 72 61 72 63 68 79 20        hierarchy 
5480: 65 6e 74 72 79 20 28 74 68 65 20 6f 6e 65 20 74  entry (the one t
5490: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 6c 65  hat points to le
54a0: 61 66 20 70 61 67 65 20 31 29 20 69 73 20 61 6c  af page 1) is al
54b0: 77 61 79 73 20 0a 2a 2a 20 20 20 20 20 20 20 20  ways .**        
54c0: 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69     an empty stri
54d0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45 6d 70  ng..**.**   nEmp
54e0: 74 79 3a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ty: The number o
54f0: 66 20 65 6d 70 74 79 20 28 74 65 72 6d 6c 65 73  f empty (termles
5500: 73 29 20 6c 65 61 66 20 70 61 67 65 73 20 74 68  s) leaf pages th
5510: 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  at immediately.*
5520: 2a 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c 6c  *           foll
5530: 6f 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a 2a 0a  owing iLeaf..**.
5540: 2a 2a 20 54 68 65 20 46 74 73 35 42 74 72 65 65  ** The Fts5Btree
5550: 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  Iter object is o
5560: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
5570: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
5580: 79 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a 2a 2f  y-check code..*/
5590: 0a 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65  .struct Fts5Btre
55a0: 65 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20 20 46  eIterLevel {.  F
55b0: 74 73 35 4e 6f 64 65 49 74 65 72 20 73 3b 20 20  ts5NodeIter s;  
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55d0: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 74  * Iterator for t
55e0: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
55f0: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
5600: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
5610: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5620: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
5630: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  e */.};.struct F
5640: 74 73 35 42 74 72 65 65 49 74 65 72 20 7b 0a 20  ts5BtreeIter {. 
5650: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20   Fts5Index *p;  
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
5680: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
5690: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
56a0: 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
56b0: 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
56c0: 74 68 69 73 20 73 65 67 6d 65 6e 74 27 73 20 62  this segment's b
56d0: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  -tree */.  int i
56e0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
56f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
5700: 64 65 78 20 70 53 65 67 20 62 65 6c 6f 6e 67 73  dex pSeg belongs
5710: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 76   to */.  int nLv
5720: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
5730: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
5740: 20 6f 66 20 61 4c 76 6c 5b 5d 20 61 72 72 61 79   of aLvl[] array
5750: 20 2a 2f 0a 20 20 46 74 73 35 42 74 72 65 65 49   */.  Fts5BtreeI
5760: 74 65 72 4c 65 76 65 6c 20 2a 61 4c 76 6c 3b 20  terLevel *aLvl; 
5770: 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 66        /* Level f
5780: 6f 72 20 65 61 63 68 20 74 69 65 72 20 6f 66 20  or each tier of 
5790: 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 2f 2a 20  b-tree */..  /* 
57a0: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
57b0: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
57c0: 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20   term;          
57d0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
57e0: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   term */.  int i
57f0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
5800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
5810: 61 66 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65  af containing te
5820: 72 6d 73 20 3e 3d 20 63 75 72 72 65 6e 74 20 74  rms >= current t
5830: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d  erm */.  int nEm
5840: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
5850: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5860: 65 72 20 6f 66 20 22 65 6d 70 74 79 22 20 6c 65  er of "empty" le
5870: 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  aves following i
5880: 4c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 62 45  Leaf */.  int bE
5890: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
58a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
58b0: 20 74 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20   to true at EOF 
58c0: 2a 2f 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b  */.  int bDlidx;
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
58f0: 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 64  there exists a d
5900: 6c 69 64 78 20 2a 2f 0a 7d 3b 0a 0a 0a 73 74 61  lidx */.};...sta
5910: 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74  tic void fts5Put
5920: 55 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31  U16(u8 *aOut, u1
5930: 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b  6 iVal){.  aOut[
5940: 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a  0] = (iVal>>8);.
5950: 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61    aOut[1] = (iVa
5960: 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74  l&0xFF);.}..stat
5970: 69 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31  ic u16 fts5GetU1
5980: 36 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29  6(const u8 *aIn)
5990: 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36  {.  return ((u16
59a0: 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20  )aIn[0] << 8) + 
59b0: 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  aIn[1];.}../*.**
59c0: 20 54 68 69 73 20 69 73 20 61 20 63 6f 70 79 20   This is a copy 
59d0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 47 65  of the sqlite3Ge
59e0: 74 56 61 72 69 6e 74 33 32 28 29 20 72 6f 75 74  tVarint32() rout
59f0: 69 6e 65 20 66 72 6f 6d 20 74 68 65 20 53 51 4c  ine from the SQL
5a00: 69 74 65 20 63 6f 72 65 2e 0a 2a 2a 20 45 78 63  ite core..** Exc
5a10: 65 70 74 2c 20 74 68 69 73 20 76 65 72 73 69 6f  ept, this versio
5a20: 6e 20 64 6f 65 73 20 68 61 6e 64 6c 65 20 74 68  n does handle th
5a30: 65 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  e single byte ca
5a40: 73 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 65  se that the core
5a50: 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 64 65 70 65  .** version depe
5a60: 6e 64 73 20 6f 6e 20 62 65 69 6e 67 20 68 61 6e  nds on being han
5a70: 64 6c 65 64 20 62 65 66 6f 72 65 20 69 74 73 20  dled before its 
5a80: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
5a90: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5aa0: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 33  e3Fts5GetVarint3
5ab0: 32 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  2(const unsigned
5ac0: 20 63 68 61 72 20 2a 70 2c 20 75 33 32 20 2a 76   char *p, u32 *v
5ad0: 29 7b 0a 20 20 75 33 32 20 61 2c 62 3b 0a 0a 20  ){.  u32 a,b;.. 
5ae0: 20 2f 2a 20 54 68 65 20 31 2d 62 79 74 65 20 63   /* The 1-byte c
5af0: 61 73 65 2e 20 4f 76 65 72 77 68 65 6c 6d 69 6e  ase. Overwhelmin
5b00: 67 6c 79 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d  gly the most com
5b10: 6d 6f 6e 2e 20 2a 2f 0a 20 20 61 20 3d 20 2a 70  mon. */.  a = *p
5b20: 3b 0a 20 20 2f 2a 20 61 3a 20 70 30 20 28 75 6e  ;.  /* a: p0 (un
5b30: 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20  masked) */.  if 
5b40: 28 21 28 61 26 30 78 38 30 29 29 0a 20 20 7b 0a  (!(a&0x80)).  {.
5b50: 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65      /* Values be
5b60: 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 37 20  tween 0 and 127 
5b70: 2a 2f 0a 20 20 20 20 2a 76 20 3d 20 61 3b 0a 20  */.    *v = a;. 
5b80: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
5b90: 0a 0a 20 20 2f 2a 20 54 68 65 20 32 2d 62 79 74  ..  /* The 2-byt
5ba0: 65 20 63 61 73 65 20 2a 2f 0a 20 20 70 2b 2b 3b  e case */.  p++;
5bb0: 0a 20 20 62 20 3d 20 2a 70 3b 0a 20 20 2f 2a 20  .  b = *p;.  /* 
5bc0: 62 3a 20 70 31 20 28 75 6e 6d 61 73 6b 65 64 29  b: p1 (unmasked)
5bd0: 20 2a 2f 0a 20 20 69 66 20 28 21 28 62 26 30 78   */.  if (!(b&0x
5be0: 38 30 29 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20  80)).  {.    /* 
5bf0: 56 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31  Values between 1
5c00: 32 38 20 61 6e 64 20 31 36 33 38 33 20 2a 2f 0a  28 and 16383 */.
5c10: 20 20 20 20 61 20 26 3d 20 30 78 37 66 3b 0a 20      a &= 0x7f;. 
5c20: 20 20 20 61 20 3d 20 61 3c 3c 37 3b 0a 20 20 20     a = a<<7;.   
5c30: 20 2a 76 20 3d 20 61 20 7c 20 62 3b 0a 20 20 20   *v = a | b;.   
5c40: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 0a   return 2;.  }..
5c50: 20 20 2f 2a 20 54 68 65 20 33 2d 62 79 74 65 20    /* The 3-byte 
5c60: 63 61 73 65 20 2a 2f 0a 20 20 70 2b 2b 3b 0a 20  case */.  p++;. 
5c70: 20 61 20 3d 20 61 3c 3c 31 34 3b 0a 20 20 61 20   a = a<<14;.  a 
5c80: 7c 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70  |= *p;.  /* a: p
5c90: 30 3c 3c 31 34 20 7c 20 70 32 20 28 75 6e 6d 61  0<<14 | p2 (unma
5ca0: 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21  sked) */.  if (!
5cb0: 28 61 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20  (a&0x80)).  {.  
5cc0: 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77    /* Values betw
5cd0: 65 65 6e 20 31 36 33 38 34 20 61 6e 64 20 32 30  een 16384 and 20
5ce0: 39 37 31 35 31 20 2a 2f 0a 20 20 20 20 61 20 26  97151 */.    a &
5cf0: 3d 20 28 30 78 37 66 3c 3c 31 34 29 7c 28 30 78  = (0x7f<<14)|(0x
5d00: 37 66 29 3b 0a 20 20 20 20 62 20 26 3d 20 30 78  7f);.    b &= 0x
5d10: 37 66 3b 0a 20 20 20 20 62 20 3d 20 62 3c 3c 37  7f;.    b = b<<7
5d20: 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20 62  ;.    *v = a | b
5d30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a  ;.    return 3;.
5d40: 20 20 7d 0a 0a 20 20 2f 2a 20 41 20 33 32 2d 62    }..  /* A 32-b
5d50: 69 74 20 76 61 72 69 6e 74 20 69 73 20 75 73 65  it varint is use
5d60: 64 20 74 6f 20 73 74 6f 72 65 20 73 69 7a 65 20  d to store size 
5d70: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 62  information in b
5d80: 74 72 65 65 73 2e 0a 20 20 2a 2a 20 4f 62 6a 65  trees..  ** Obje
5d90: 63 74 73 20 61 72 65 20 72 61 72 65 6c 79 20 6c  cts are rarely l
5da0: 61 72 67 65 72 20 74 68 61 6e 20 32 4d 69 42 20  arger than 2MiB 
5db0: 6c 69 6d 69 74 20 6f 66 20 61 20 33 2d 62 79 74  limit of a 3-byt
5dc0: 65 20 76 61 72 69 6e 74 2e 0a 20 20 2a 2a 20 41  e varint..  ** A
5dd0: 20 33 2d 62 79 74 65 20 76 61 72 69 6e 74 20 69   3-byte varint i
5de0: 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 66 6f  s sufficient, fo
5df0: 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 72 65  r example, to re
5e00: 63 6f 72 64 20 74 68 65 20 73 69 7a 65 0a 20 20  cord the size.  
5e10: 2a 2a 20 6f 66 20 61 20 31 30 34 38 35 36 39 2d  ** of a 1048569-
5e20: 62 79 74 65 20 42 4c 4f 42 20 6f 72 20 73 74 72  byte BLOB or str
5e30: 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ing..  **.  ** W
5e40: 65 20 6f 6e 6c 79 20 75 6e 72 6f 6c 6c 20 74 68  e only unroll th
5e50: 65 20 66 69 72 73 74 20 31 2d 2c 20 32 2d 2c 20  e first 1-, 2-, 
5e60: 61 6e 64 20 33 2d 20 62 79 74 65 20 63 61 73 65  and 3- byte case
5e70: 73 2e 20 20 54 68 65 20 76 65 72 79 0a 20 20 2a  s.  The very.  *
5e80: 2a 20 72 61 72 65 20 6c 61 72 67 65 72 20 63 61  * rare larger ca
5e90: 73 65 73 20 63 61 6e 20 62 65 20 68 61 6e 64 6c  ses can be handl
5ea0: 65 64 20 62 79 20 74 68 65 20 73 6c 6f 77 65 72  ed by the slower
5eb0: 20 36 34 2d 62 69 74 20 76 61 72 69 6e 74 0a 20   64-bit varint. 
5ec0: 20 2a 2a 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a   ** routine..  *
5ed0: 2f 0a 20 20 7b 0a 20 20 20 20 75 36 34 20 76 36  /.  {.    u64 v6
5ee0: 34 3b 0a 20 20 20 20 75 38 20 6e 3b 0a 20 20 20  4;.    u8 n;.   
5ef0: 20 70 20 2d 3d 20 32 3b 0a 20 20 20 20 6e 20 3d   p -= 2;.    n =
5f00: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
5f10: 74 28 70 2c 20 26 76 36 34 29 3b 0a 20 20 20 20  t(p, &v64);.    
5f20: 2a 76 20 3d 20 28 75 33 32 29 76 36 34 3b 0a 20  *v = (u32)v64;. 
5f30: 20 20 20 61 73 73 65 72 74 28 20 6e 3e 33 20 26     assert( n>3 &
5f40: 26 20 6e 3c 3d 39 20 29 3b 0a 20 20 20 20 72 65  & n<=9 );.    re
5f50: 74 75 72 6e 20 6e 3b 0a 20 20 7d 0a 7d 0a 0a 69  turn n;.  }.}..i
5f60: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 47 65  nt sqlite3Fts5Ge
5f70: 74 56 61 72 69 6e 74 4c 65 6e 28 75 33 32 20 69  tVarintLen(u32 i
5f80: 56 61 6c 29 7b 0a 20 20 69 66 28 20 69 56 61 6c  Val){.  if( iVal
5f90: 3c 28 31 20 3c 3c 20 37 20 29 20 29 20 72 65 74  <(1 << 7 ) ) ret
5fa0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 56 61  urn 1;.  if( iVa
5fb0: 6c 3c 28 31 20 3c 3c 20 31 34 29 20 29 20 72 65  l<(1 << 14) ) re
5fc0: 74 75 72 6e 20 32 3b 0a 20 20 69 66 28 20 69 56  turn 2;.  if( iV
5fd0: 61 6c 3c 28 31 20 3c 3c 20 32 31 29 20 29 20 72  al<(1 << 21) ) r
5fe0: 65 74 75 72 6e 20 33 3b 0a 20 20 69 66 28 20 69  eturn 3;.  if( i
5ff0: 56 61 6c 3c 28 31 20 3c 3c 20 32 38 29 20 29 20  Val<(1 << 28) ) 
6000: 72 65 74 75 72 6e 20 34 3b 0a 20 20 72 65 74 75  return 4;.  retu
6010: 72 6e 20 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 5;.}../*.** A
6020: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
6030: 72 6e 20 61 20 62 75 66 66 65 72 20 61 74 20 6c  rn a buffer at l
6040: 65 61 73 74 20 6e 42 79 74 65 20 62 79 74 65 73  east nByte bytes
6050: 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
6060: 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
6070: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
6080: 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20  return NULL and 
6090: 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f  set the error co
60a0: 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74 73  de in.** the Fts
60b0: 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70 61  5Index handle pa
60c0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
60d0: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  t argument..*/.s
60e0: 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73 35  tatic void *fts5
60f0: 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49 6e  IdxMalloc(Fts5In
6100: 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  dex *p, int nByt
6110: 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  e){.  void *pRet
6120: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
6130: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6140: 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74      pRet = sqlit
6150: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
6160: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d  ;.    if( pRet==
6170: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
6180: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
6190: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
61a0: 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
61b0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
61c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
61d0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  t;.}../*.** Comp
61e0: 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
61f0: 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75   of the pLeft bu
6200: 66 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52  ffer with the pR
6210: 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62  ight/nRight blob
6220: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d  ..**.** Return -
6230: 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73  ve if pLeft is s
6240: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67  maller than pRig
6250: 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72  ht, 0 if they ar
6260: 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76  e equal or.** +v
6270: 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73  e if pRight is s
6280: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66  maller than pLef
6290: 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  t. In other word
62a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73  s:.**.**     res
62b0: 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69   = *pLeft - *pRi
62c0: 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ght.*/.static in
62d0: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
62e0: 61 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42  areBlob(.  Fts5B
62f0: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20  uffer *pLeft,   
6300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6310: 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft hand side of 
6320: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
6330: 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74  const u8 *pRight
6340: 2c 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20  , int nRight    
6350: 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73 69  /* Right hand si
6360: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
6370: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
6380: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
6390: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
63a0: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
63b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20  eft->p, pRight, 
63c0: 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  nCmp);.  return 
63d0: 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74  (res==0 ? (pLeft
63e0: 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20  ->n - nRight) : 
63f0: 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 73  res);.}..#if 0.s
6400: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f  tatic int fts5Co
6410: 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 63 6f 6e  mpareBlob(.  con
6420: 73 74 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e  st u8 *pLeft, in
6430: 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74  t nLeft,.  const
6440: 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74   u8 *pRight, int
6450: 20 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74   nRight.){.  int
6460: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66   nCmp = MIN(nLef
6470: 74 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e  t, nRight);.  in
6480: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
6490: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43  Left, pRight, nC
64a0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
64b0: 65 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d  es==0 ? (nLeft -
64c0: 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b   nRight) : res);
64d0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
64e0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   Compare the con
64f0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74 77 6f  tents of the two
6500: 20 62 75 66 66 65 72 73 20 75 73 69 6e 67 20 6d   buffers using m
6510: 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65 20  emcmp(). If one 
6520: 62 75 66 66 65 72 0a 2a 2a 20 69 73 20 61 20 70  buffer.** is a p
6530: 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68  refix of the oth
6540: 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69 64  er, it is consid
6550: 65 72 65 64 20 74 68 65 20 6c 65 73 73 65 72 2e  ered the lesser.
6560: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
6570: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
6580: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
6590: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
65a0: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
65b0: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
65c0: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
65d0: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
65e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
65f0: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
6600: 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ht.*/.static int
6610: 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
6620: 72 65 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  re(Fts5Buffer *p
6630: 4c 65 66 74 2c 20 46 74 73 35 42 75 66 66 65 72  Left, Fts5Buffer
6640: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 6e 74   *pRight){.  int
6650: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66   nCmp = MIN(pLef
6660: 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d 3e 6e 29  t->n, pRight->n)
6670: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
6680: 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70  mcmp(pLeft->p, p
6690: 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d 70 29 3b  Right->p, nCmp);
66a0: 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d  .  return (res==
66b0: 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20  0 ? (pLeft->n - 
66c0: 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20 72 65 73  pRight->n) : res
66d0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  );.}.../*.** Clo
66e0: 73 65 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c 79  se the read-only
66f0: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c 20 69 66   blob handle, if
6700: 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a   it is open..*/.
6710: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6720: 43 6c 6f 73 65 52 65 61 64 65 72 28 46 74 73 35  CloseReader(Fts5
6730: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28  Index *p){.  if(
6740: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
6750: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20     sqlite3_blob 
6760: 2a 70 52 65 61 64 65 72 20 3d 20 70 2d 3e 70 52  *pReader = p->pR
6770: 65 61 64 65 72 3b 0a 20 20 20 20 70 2d 3e 70 52  eader;.    p->pR
6780: 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 73  eader = 0;.    s
6790: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
67a0: 65 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d 0a  e(pReader);.  }.
67b0: 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44 61  }..static Fts5Da
67c0: 74 61 20 2a 66 74 73 35 44 61 74 61 52 65 61 64  ta *fts5DataRead
67d0: 4f 72 42 75 66 66 65 72 28 0a 20 20 46 74 73 35  OrBuffer(.  Fts5
67e0: 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
67f0: 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a  5Buffer *pBuf, .
6800: 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a    i64 iRowid.){.
6810: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
6820: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
6830: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6840: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
6850: 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 20 30 0a 46  ITE_OK;..#if 0.F
6860: 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20  ts5Buffer buf = 
6870: 7b 30 2c 30 2c 30 7d 3b 0a 66 74 73 35 44 65 62  {0,0,0};.fts5Deb
6880: 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 62 75  ugRowid(&rc, &bu
6890: 66 2c 20 69 52 6f 77 69 64 29 3b 0a 66 70 72 69  f, iRowid);.fpri
68a0: 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72 65 61  ntf(stdout, "rea
68b0: 64 3a 20 25 73 5c 6e 22 2c 20 62 75 66 2e 70 29  d: %s\n", buf.p)
68c0: 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ;.fflush(stdout)
68d0: 3b 0a 73 71 6c 69 74 65 33 5f 66 72 65 65 28 62  ;.sqlite3_free(b
68e0: 75 66 2e 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  uf.p);.#endif.  
68f0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
6900: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
6910: 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72  s call may retur
6920: 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69  n SQLITE_ABORT i
6930: 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
6940: 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20   a savepoint.   
6950: 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73     ** rollback s
6960: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
6970: 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63   used. In this c
6980: 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68  ase a new blob h
6990: 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69  andle.      ** i
69a0: 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
69b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
69c0: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70  e3_blob_reopen(p
69d0: 2d 3e 70 52 65 61 64 65 72 2c 20 69 52 6f 77 69  ->pReader, iRowi
69e0: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  d);.      if( rc
69f0: 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 29  ==SQLITE_ABORT )
6a00: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 6c  {.        fts5Cl
6a10: 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
6a20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6a30: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
6a40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
6a50: 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69  he blob handle i
6a60: 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20  s not yet open, 
6a70: 6f 70 65 6e 20 61 6e 64 20 73 65 65 6b 20 69 74  open and seek it
6a80: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
6a90: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6c 6f 62  .    ** the blob
6aa0: 5f 72 65 6f 70 65 6e 28 29 20 41 50 49 20 74 6f  _reopen() API to
6ab0: 20 72 65 73 65 65 6b 20 74 68 65 20 65 78 69 73   reseek the exis
6ac0: 74 69 6e 67 20 62 6c 6f 62 20 68 61 6e 64 6c 65  ting blob handle
6ad0: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
6ae0: 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 7b 0a 20  >pReader==0 ){. 
6af0: 20 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20       Fts5Config 
6b00: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
6b10: 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20 72 63 20  onfig;.      rc 
6b20: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
6b30: 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  pen(pConfig->db,
6b40: 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
6b50: 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61  fig->zDb, p->zDa
6b60: 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20  taTbl, "block", 
6b70: 69 52 6f 77 69 64 2c 20 30 2c 20 26 70 2d 3e 70  iRowid, 0, &p->p
6b80: 52 65 61 64 65 72 0a 20 20 20 20 20 20 29 3b 0a  Reader.      );.
6b90: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
6ba0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6bb0: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 3b 20        u8 *aOut; 
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6be0: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6bf0: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
6c00: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
6c10: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
6c20: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
6c30: 69 66 28 20 70 42 75 66 20 29 7b 0a 20 20 20 20  if( pBuf ){.    
6c40: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
6c50: 72 6f 28 70 42 75 66 29 3b 0a 20 20 20 20 20 20  ro(pBuf);.      
6c60: 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77    fts5BufferGrow
6c70: 28 26 72 63 2c 20 70 42 75 66 2c 20 6e 42 79 74  (&rc, pBuf, nByt
6c80: 65 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74  e);.        aOut
6c90: 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 20 20   = pBuf->p;.    
6ca0: 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42      pBuf->n = nB
6cb0: 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  yte;.      }else
6cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  {.        int nS
6cd0: 70 61 63 65 20 3d 20 6e 42 79 74 65 20 2b 20 46  pace = nByte + F
6ce0: 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
6cf0: 44 44 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 70  DDING;.        p
6d00: 52 65 74 20 3d 20 28 46 74 73 35 44 61 74 61 2a  Ret = (Fts5Data*
6d10: 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
6d20: 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61  ocZero(&rc, nSpa
6d30: 63 65 2b 73 69 7a 65 6f 66 28 46 74 73 35 44 61  ce+sizeof(Fts5Da
6d40: 74 61 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ta));.        if
6d50: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
6d60: 20 20 20 20 70 52 65 74 2d 3e 6e 20 3d 20 6e 42      pRet->n = nB
6d70: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61  yte;.          a
6d80: 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20  Out = pRet->p = 
6d90: 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20  (u8*)&pRet[1];. 
6da0: 20 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e           pRet->n
6db0: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Ref = 1;.       
6dc0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
6dd0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6de0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
6df0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
6e00: 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72  _read(p->pReader
6e10: 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30  , aOut, nByte, 0
6e20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6e30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6e40: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
6e50: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
6e60: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
6e70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
6e80: 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63  }.    p->rc = rc
6e90: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b  ;.    p->nRead++
6ea0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
6eb0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
6ec0: 65 74 72 69 65 76 65 20 61 20 72 65 63 6f 72 64  etrieve a record
6ed0: 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
6ee0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
6ef0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
6f00: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
6f10: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
6f20: 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20  left in the .** 
6f30: 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74  Fts5Index object
6f40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
6f50: 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52 65  Data *fts5DataRe
6f60: 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ad(Fts5Index *p,
6f70: 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20   i64 iRowid){.  
6f80: 46 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d  Fts5Data *pRet =
6f90: 20 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42   fts5DataReadOrB
6fa0: 75 66 66 65 72 28 70 2c 20 30 2c 20 69 52 6f 77  uffer(p, 0, iRow
6fb0: 69 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  id);.  assert( (
6fc0: 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63  pRet==0)==(p->rc
6fd0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  !=SQLITE_OK) );.
6fe0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
6ff0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 72  ../*.** Read a r
7000: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25  ecord from the %
7010: 5f 64 61 74 61 20 74 61 62 6c 65 20 69 6e 74 6f  _data table into
7020: 20 74 68 65 20 62 75 66 66 65 72 20 73 75 70 70   the buffer supp
7030: 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73  lied as the.** s
7040: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
7050: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
7060: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
7070: 6f 72 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68  or is left in th
7080: 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  e Fts5Index obje
7090: 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  ct. If an.** err
70a0: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
70b0: 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
70c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
70d0: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 0a 2a  lled, it is a .*
70e0: 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  * no-op..*/.stat
70f0: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
7100: 42 75 66 66 65 72 28 46 74 73 35 49 6e 64 65 78  Buffer(Fts5Index
7110: 20 2a 70 2c 20 46 74 73 35 42 75 66 66 65 72 20   *p, Fts5Buffer 
7120: 2a 70 42 75 66 2c 20 69 36 34 20 69 52 6f 77 69  *pBuf, i64 iRowi
7130: 64 29 7b 0a 20 20 28 76 6f 69 64 29 66 74 73 35  d){.  (void)fts5
7140: 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72  DataReadOrBuffer
7150: 28 70 2c 20 70 42 75 66 2c 20 69 52 6f 77 69 64  (p, pBuf, iRowid
7160: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
7170: 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
7180: 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64 20 72  to data record r
7190: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
71a0: 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a  rlier call to.**
71b0: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 29 2e   fts5DataRead().
71c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
71d0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
71e0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29  Fts5Data *pData)
71f0: 7b 0a 20 20 69 66 28 20 70 44 61 74 61 20 29 7b  {.  if( pData ){
7200: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 61  .    assert( pDa
7210: 74 61 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  ta->nRef>0 );.  
7220: 20 20 70 44 61 74 61 2d 3e 6e 52 65 66 2d 2d 3b    pData->nRef--;
7230: 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
7240: 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65  nRef==0 ) sqlite
7250: 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20  3_free(pData);. 
7260: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
7270: 64 20 66 74 73 35 44 61 74 61 52 65 66 65 72 65  d fts5DataRefere
7280: 6e 63 65 28 46 74 73 35 44 61 74 61 20 2a 70 44  nce(Fts5Data *pD
7290: 61 74 61 29 7b 0a 20 20 70 44 61 74 61 2d 3e 6e  ata){.  pData->n
72a0: 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ref++;.}../*.** 
72b0: 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43  INSERT OR REPLAC
72c0: 45 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  E a record into 
72d0: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
72e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
72f0: 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46   fts5DataWrite(F
7300: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
7310: 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75   iRowid, const u
7320: 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
7330: 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ata){.  if( p->r
7340: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
7350: 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d  eturn;..  if( p-
7360: 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20  >pWriter==0 ){. 
7370: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46     int rc;.    F
7380: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
7390: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
73a0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  .    char *zSql 
73b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
73c0: 66 28 0a 20 20 20 20 20 20 20 20 22 52 45 50 4c  f(.        "REPL
73d0: 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 25 51  ACE INTO '%q'.%Q
73e0: 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55  (id, block) VALU
73f0: 45 53 28 3f 2c 3f 29 22 2c 20 70 43 6f 6e 66 69  ES(?,?)", pConfi
7400: 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
7410: 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Tbl.    );.    i
7420: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
7430: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7440: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
7450: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
7460: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
7470: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
7480: 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 57 72 69 74  l, -1, &p->pWrit
7490: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
74a0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
74b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
74c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
74d0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  .      p->rc = r
74e0: 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
74f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
7500: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
7510: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20  (p->pWriter, 1, 
7520: 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  iRowid);.  sqlit
7530: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e  e3_bind_blob(p->
7540: 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74  pWriter, 2, pDat
7550: 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45  a, nData, SQLITE
7560: 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
7570: 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69  te3_step(p->pWri
7580: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
7590: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
75a0: 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  >pWriter);.}../*
75b0: 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20  .** Execute the 
75c0: 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a  following SQL:.*
75d0: 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  *.**     DELETE 
75e0: 46 52 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52  FROM %_data WHER
75f0: 45 20 69 64 20 42 45 54 57 45 45 4e 20 24 69 46  E id BETWEEN $iF
7600: 69 72 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a  irst AND $iLast.
7610: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7620: 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 46 74  ts5DataDelete(Ft
7630: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
7640: 69 46 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73  iFirst, i64 iLas
7650: 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  t){.  if( p->rc!
7660: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7670: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  urn;..  if( p->p
7680: 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20  Deleter==0 ){.  
7690: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74    int rc;.    Ft
76a0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
76b0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
76c0: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
76d0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
76e0: 28 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  (.        "DELET
76f0: 45 20 46 52 4f 4d 20 27 25 71 27 2e 25 51 20 57  E FROM '%q'.%Q W
7700: 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69  HERE id>=? AND i
7710: 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66 69 67 2d 3e  d<=?", pConfig->
7720: 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
7730: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
7740: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
7750: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
7760: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
7770: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7780: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f  3_prepare_v2(pCo
7790: 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  nfig->db, zSql, 
77a0: 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72  -1, &p->pDeleter
77b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
77c0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
77d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
77e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
77f0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
7800: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
7810: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
7820: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
7830: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  ->pDeleter, 1, i
7840: 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  First);.  sqlite
7850: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
7860: 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61  pDeleter, 2, iLa
7870: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
7880: 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  tep(p->pDeleter)
7890: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
78a0: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65  te3_reset(p->pDe
78b0: 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  leter);.}../*.**
78c0: 20 43 6c 6f 73 65 20 74 68 65 20 73 71 6c 69 74   Close the sqlit
78d0: 65 33 5f 62 6c 6f 62 20 68 61 6e 64 6c 65 20 75  e3_blob handle u
78e0: 73 65 64 20 74 6f 20 72 65 61 64 20 72 65 63 6f  sed to read reco
78f0: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  rds from the %_d
7900: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 41 6e  ata table..** An
7910: 64 20 64 69 73 63 61 72 64 20 61 6e 79 20 63 61  d discard any ca
7920: 63 68 65 64 20 72 65 61 64 73 2e 20 54 68 69 73  ched reads. This
7930: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7940: 6c 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  led at the end o
7950: 66 0a 2a 2a 20 61 20 72 65 61 64 20 74 72 61 6e  f.** a read tran
7960: 73 61 63 74 69 6f 6e 20 6f 72 20 77 68 65 6e 20  saction or when 
7970: 61 6e 79 20 73 75 62 2d 74 72 61 6e 73 61 63 74  any sub-transact
7980: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
7990: 63 6b 2e 0a 2a 2f 0a 23 69 66 20 30 0a 73 74 61  ck..*/.#if 0.sta
79a0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
79b0: 61 52 65 73 65 74 28 46 74 73 35 49 6e 64 65 78  aReset(Fts5Index
79c0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
79d0: 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71  Reader ){.    sq
79e0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
79f0: 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20  (p->pReader);.  
7a00: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
7a10: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
7a20: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c  /*.** Remove all
7a30: 20 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61   records associa
7a40: 74 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74  ted with segment
7a50: 20 69 53 65 67 69 64 20 69 6e 20 69 6e 64 65 78   iSegid in index
7a60: 20 69 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   iIdx..*/.static
7a70: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
7a80: 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35  moveSegment(Fts5
7a90: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49  Index *p, int iI
7aa0: 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  dx, int iSegid){
7ab0: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
7ac0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
7ad0: 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c  ID(iIdx, iSegid,
7ae0: 20 30 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c   0, 0);.  i64 iL
7af0: 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  ast = FTS5_SEGME
7b00: 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69  NT_ROWID(iIdx, i
7b10: 53 65 67 69 64 2b 31 2c 20 30 2c 20 30 29 2d 31  Segid+1, 0, 0)-1
7b20: 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65  ;.  fts5DataDele
7b30: 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c  te(p, iFirst, iL
7b40: 61 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ast);.}../*.** R
7b50: 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
7b60: 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72  ce to an Fts5Str
7b70: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65  ucture object re
7b80: 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72  turned by an ear
7b90: 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f  lier .** call to
7ba0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7bb0: 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75  ad() or fts5Stru
7bc0: 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a  ctureDecode()..*
7bd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7be0: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
7bf0: 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65  se(Fts5Structure
7c00: 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66   *pStruct){.  if
7c10: 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
7c20: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
7c30: 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e  i=0; i<pStruct->
7c40: 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
7c50: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7c60: 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
7c70: 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d  [i].aSeg);.    }
7c80: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7c90: 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  e(pStruct);.  }.
7ca0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
7cb0: 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20  lize and return 
7cc0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  the structure re
7cd0: 63 6f 72 64 20 63 75 72 72 65 6e 74 6c 79 20 73  cord currently s
7ce0: 74 6f 72 65 64 20 69 6e 20 73 65 72 69 61 6c 69  tored in seriali
7cf0: 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68  zed.** form with
7d00: 69 6e 20 62 75 66 66 65 72 20 70 44 61 74 61 2f  in buffer pData/
7d10: 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nData..**.** The
7d20: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61   Fts5Structure.a
7d30: 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68  Level[] and each
7d40: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7d50: 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79  vel.aSeg[] array
7d60: 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c  .** are over-all
7d70: 6f 63 61 74 65 64 20 62 79 20 6f 6e 65 20 73 6c  ocated by one sl
7d80: 6f 74 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ot. This allows 
7d90: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  the structure co
7da0: 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20  ntents.** to be 
7db0: 6d 6f 72 65 20 65 61 73 69 6c 79 20 65 64 69 74  more easily edit
7dc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
7dd0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
7de0: 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 4e  pOut is set to N
7df0: 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74  ULL and an SQLit
7e00: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
7e10: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
7e20: 69 73 65 2c 20 2a 70 70 4f 75 74 20 69 73 20 73  ise, *ppOut is s
7e30: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
7e40: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e  he new object an
7e50: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
7e60: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
7e70: 69 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63  ic int fts5Struc
7e80: 74 75 72 65 44 65 63 6f 64 65 28 0a 20 20 63 6f  tureDecode(.  co
7e90: 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 20  nst u8 *pData,  
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7eb0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
7ec0: 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 73 74  ng serialized st
7ed0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
7ee0: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f00: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
7f10: 44 61 74 61 20 69 6e 20 62 79 74 65 73 20 2a 2f  Data in bytes */
7f20: 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65  .  int *piCookie
7f30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7f40: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
7f50: 69 6f 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ion cookie value
7f60: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
7f70: 75 72 65 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ure **ppOut     
7f80: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65        /* OUT: De
7f90: 73 65 72 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63  serialized objec
7fa0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
7fb0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7fc0: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
7fd0: 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65   iLvl;.  int nLe
7fe0: 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vel = 0;.  int n
7ff0: 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69  Segment = 0;.  i
8000: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
8010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8020: 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
8030: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 74 20   to allocate at 
8040: 70 52 65 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  pRet */.  Fts5St
8050: 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20  ructure *pRet = 
8060: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  0;        /* Str
8070: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 74 6f  ucture object to
8080: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
8090: 20 47 72 61 62 20 74 68 65 20 63 6f 6f 6b 69 65   Grab the cookie
80a0: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20   value */.  if( 
80b0: 70 69 43 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f  piCookie ) *piCo
80c0: 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 46 74  okie = sqlite3Ft
80d0: 73 35 47 65 74 33 32 28 70 44 61 74 61 29 3b 0a  s5Get32(pData);.
80e0: 20 20 69 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52    i = 4;..  /* R
80f0: 65 61 64 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ead the total nu
8100: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 61  mber of levels a
8110: 6e 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nd segments from
8120: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
8130: 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
8140: 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69   record.  */.  i
8150: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
8160: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
8170: 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66  Level);.  i += f
8180: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
8190: 70 44 61 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65  pData[i], nSegme
81a0: 6e 74 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28  nt);.  nByte = (
81b0: 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
81c0: 73 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20  s5Structure) +  
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74    /* Main struct
81f0: 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a  ure */.      siz
8200: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8210: 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65  eLevel) * (nLeve
8220: 6c 29 20 20 20 20 20 20 2f 2a 20 61 4c 65 76 65  l)      /* aLeve
8230: 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 29  l[] array */.  )
8240: 3b 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73 35  ;.  pRet = (Fts5
8250: 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74  Structure*)sqlit
8260: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
8270: 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20  (&rc, nByte);.. 
8280: 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
8290: 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pRet->nLevel = 
82a0: 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 20 2b 3d  nLevel;.    i +=
82b0: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
82c0: 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52  t(&pData[i], &pR
82d0: 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  et->nWriteCounte
82e0: 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76  r);..    for(iLv
82f0: 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l=0; rc==SQLITE_
8300: 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65  OK && iLvl<nLeve
8310: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
8320: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
8330: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52  evel *pLvl = &pR
8340: 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  et->aLevel[iLvl]
8350: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74  ;.      int nTot
8360: 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  al;.      int iS
8370: 65 67 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20  eg;..      i += 
8380: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
8390: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
83a0: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
83b0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
83c0: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
83d0: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61  nTotal);.      a
83e0: 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70  ssert( nTotal>=p
83f0: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20  Lvl->nMerge );. 
8400: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
8410: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
8420: 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33  Segment*)sqlite3
8430: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
8440: 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e  rc, .          n
8450: 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46  Total * sizeof(F
8460: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
8470: 65 6e 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20  ent).      );.. 
8480: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
8490: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
84a0: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
84b0: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
84c0: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
84d0: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
84e0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
84f0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
8500: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
8510: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
8520: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  id);.          i
8530: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
8540: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
8550: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8560: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20  nHeight);.      
8570: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8580: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8590: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
85a0: 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg].pgnoFirst);
85b0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
85c0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
85d0: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
85e0: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
85f0: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Last);.        }
8600: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8610: 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
8620: 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29  ureRelease(pRet)
8630: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
8640: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
8650: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20  }.  }..  *ppOut 
8660: 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e  = pRet;.  return
8670: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f   rc;.}../*.**.*/
8680: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8690: 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
86a0: 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  el(int *pRc, Fts
86b0: 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
86c0: 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70  truct){.  if( *p
86d0: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
86e0: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
86f0: 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
8700: 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74  pStruct;.    int
8710: 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63   nLevel = pStruc
8720: 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69  t->nLevel;.    i
8730: 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20  nt nByte = (.   
8740: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
8750: 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20  Structure) +    
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8770: 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20   Main structure 
8780: 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f  */.        sizeo
8790: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
87a0: 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b  evel) * (nLevel+
87b0: 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20  1)  /* aLevel[] 
87c0: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a  array */.    );.
87d0: 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 73  .    pStruct = s
87e0: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
87f0: 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a  Struct, nByte);.
8800: 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20      if( pStruct 
8810: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
8820: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
8830: 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a  [nLevel], 0, siz
8840: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8850: 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20  eLevel));.      
8860: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
8870: 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75  +;.      *ppStru
8880: 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20  ct = pStruct;.  
8890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
88a0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
88b0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  EM;.    }.  }.}.
88c0: 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65  ./*.** Extend le
88d0: 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74  vel iLvl so that
88e0: 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66   there is room f
88f0: 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74  or at least nExt
8900: 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65  ra more.** segme
8910: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
8920: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
8930: 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20  eExtendLevel(.  
8940: 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73  int *pRc, .  Fts
8950: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8960: 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c  uct, .  int iLvl
8970: 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  , .  int nExtra,
8980: 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a   .  int bInsert.
8990: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
89a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
89b0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
89c0: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
89d0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
89e0: 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ];.    Fts5Struc
89f0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65  tureSegment *aNe
8a00: 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  w;.    int nByte
8a10: 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ;..    nByte = (
8a20: 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78  pLvl->nSeg + nEx
8a30: 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  tra) * sizeof(Ft
8a40: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8a50: 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  nt);.    aNew = 
8a60: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
8a70: 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74  pLvl->aSeg, nByt
8a80: 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  e);.    if( aNew
8a90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49   ){.      if( bI
8aa0: 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nsert==0 ){.    
8ab0: 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
8ac0: 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c  [pLvl->nSeg], 0,
8ad0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8ae0: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20  ctureSegment) * 
8af0: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
8b00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
8b10: 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e  t nMove = pLvl->
8b20: 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74  nSeg * sizeof(Ft
8b30: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8b40: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  nt);.        mem
8b50: 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72  move(&aNew[nExtr
8b60: 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29  a], aNew, nMove)
8b70: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
8b80: 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (aNew, 0, sizeof
8b90: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
8ba0: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
8bb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8bc0: 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65  pLvl->aSeg = aNe
8bd0: 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  w;.    }else{.  
8be0: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
8bf0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
8c00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
8c10: 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e  , deserialize an
8c20: 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72  d return the str
8c30: 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 66 6f  ucture record fo
8c40: 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2a  r index iIdx..**
8c50: 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75  .** The Fts5Stru
8c60: 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61  cture.aLevel[] a
8c70: 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75  nd each Fts5Stru
8c80: 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b  ctureLevel.aSeg[
8c90: 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f  ] array.** are o
8ca0: 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73  ver-allocated as
8cb0: 20 64 65 73 63 72 69 62 65 64 20 66 6f 72 20 66   described for f
8cc0: 75 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75  unction fts5Stru
8cd0: 63 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a  ctureDecode() .*
8ce0: 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49  * above..**.** I
8cf0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8d00: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
8d10: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
8d20: 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68   code left in th
8d30: 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68  e.** Fts5Index h
8d40: 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72  andle. If an err
8d50: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
8d60: 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
8d70: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
8d80: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
8d90: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
8da0: 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  c Fts5Structure 
8db0: 2a 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65  *fts5StructureRe
8dc0: 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ad(Fts5Index *p,
8dd0: 20 69 6e 74 20 69 49 64 78 29 7b 0a 20 20 46 74   int iIdx){.  Ft
8de0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
8df0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
8e00: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
8e10: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
8e20: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72    /* Object to r
8e30: 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73 35 44  eturn */.  Fts5D
8e40: 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20  ata *pData;     
8e50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 25 5f             /* %_
8e60: 64 61 74 61 20 65 6e 74 72 79 20 63 6f 6e 74 61  data entry conta
8e70: 69 6e 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  ining structure 
8e80: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
8e90: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8eb0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
8ec0: 6b 69 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  kie */..  assert
8ed0: 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ( iIdx<=pConfig-
8ee0: 3e 6e 50 72 65 66 69 78 20 29 3b 0a 20 20 70 44  >nPrefix );.  pD
8ef0: 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
8f00: 61 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43  ad(p, FTS5_STRUC
8f10: 54 55 52 45 5f 52 4f 57 49 44 28 69 49 64 78 29  TURE_ROWID(iIdx)
8f20: 29 3b 0a 20 20 69 66 28 20 21 70 44 61 74 61 20  );.  if( !pData 
8f30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d  ) return 0;.  p-
8f40: 3e 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74  >rc = fts5Struct
8f50: 75 72 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d  ureDecode(pData-
8f60: 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26 69  >p, pData->n, &i
8f70: 43 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a  Cookie, &pRet);.
8f80: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
8f90: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66  LITE_OK && pConf
8fa0: 69 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f  ig->iCookie!=iCo
8fb0: 6f 6b 69 65 20 29 7b 0a 20 20 20 20 70 2d 3e 72  okie ){.    p->r
8fc0: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43  c = sqlite3Fts5C
8fd0: 6f 6e 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69  onfigLoad(pConfi
8fe0: 67 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d  g, iCookie);.  }
8ff0: 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
9000: 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 69 66  ase(pData);.  if
9010: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
9020: 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74  OK ){.    fts5St
9030: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
9040: 52 65 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  Ret);.    pRet =
9050: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
9060: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
9070: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
9080: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
9090: 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72  nts in index str
90a0: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a  ucture pStruct..
90b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
90c0: 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
90d0: 53 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72  Segments(Fts5Str
90e0: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
90f0: 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  {.  int nSegment
9100: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9110: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
9120: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
9130: 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  */.  if( pStruct
9140: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
9150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9160: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
9170: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
9180: 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66   levels */.    f
9190: 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
91a0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
91b0: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
91c0: 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72  nSegment += pStr
91d0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
91e0: 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ].nSeg;.    }.  
91f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67  }..  return nSeg
9200: 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ment;.}../*.** S
9210: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f  erialize and sto
9220: 72 65 20 74 68 65 20 22 73 74 72 75 63 74 75 72  re the "structur
9230: 65 22 20 72 65 63 6f 72 64 20 66 6f 72 20 69 6e  e" record for in
9240: 64 65 78 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20  dex iIdx..**.** 
9250: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
9260: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
9270: 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 46  or code in the F
9280: 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  ts5Index object.
9290: 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   If an.** error 
92a0: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
92b0: 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
92c0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
92d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
92e0: 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
92f0: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
9300: 69 6e 74 20 69 49 64 78 2c 20 46 74 73 35 53 74  int iIdx, Fts5St
9310: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
9320: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
9330: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9340: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b 20 20   int nSegment;  
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9360: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
9370: 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  f segments */.  
9380: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
9390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
93a0: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65 72  /* Buffer to ser
93b0: 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69 6e  ialize record in
93c0: 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  to */.    int iL
93d0: 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
93e0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
93f0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
9400: 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
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 2f                 /
9430: 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20 74  * Cookie value t
9440: 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20 20  o store */..    
9450: 6e 53 65 67 6d 65 6e 74 20 3d 20 66 74 73 35 53  nSegment = fts5S
9460: 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67  tructureCountSeg
9470: 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 3b 0a  ments(pStruct);.
9480: 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c      memset(&buf,
9490: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
94a0: 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a  uffer));..    /*
94b0: 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72 72   Append the curr
94c0: 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ent configuratio
94d0: 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20  n cookie */.    
94e0: 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f  iCookie = p->pCo
94f0: 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20  nfig->iCookie;. 
9500: 20 20 20 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30     if( iCookie<0
9510: 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a   ) iCookie = 0;.
9520: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9530: 70 65 6e 64 33 32 28 26 70 2d 3e 72 63 2c 20 26  pend32(&p->rc, &
9540: 62 75 66 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 0a  buf, iCookie);..
9550: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9560: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9570: 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74  c, &buf, pStruct
9580: 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 66  ->nLevel);.    f
9590: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
95a0: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
95b0: 75 66 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20  uf, nSegment);. 
95c0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
95d0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
95e0: 2c 20 26 62 75 66 2c 20 28 69 36 34 29 70 53 74  , &buf, (i64)pSt
95f0: 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
9600: 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  ter);..    for(i
9610: 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
9620: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
9630: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l++){.      int 
9640: 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
9650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
9660: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
9670: 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
9680: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
9690: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
96a0: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
96b0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
96c0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
96d0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
96e0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  buf, pLvl->nMerg
96f0: 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  e);.      fts5Bu
9700: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
9710: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
9720: 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20  Lvl->nSeg);.    
9730: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
9740: 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53  nMerge<=pLvl->nS
9750: 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  eg );..      for
9760: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c  (iSeg=0; iSeg<pL
9770: 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl->nSeg; iSeg++
9780: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
9790: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
97a0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
97b0: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
97c0: 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20  .iSegid);.      
97d0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
97e0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
97f0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
9800: 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74 29  g[iSeg].nHeight)
9810: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
9820: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
9830: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
9840: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
9850: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20  pgnoFirst);.    
9860: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9870: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9880: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61  c, &buf, pLvl->a
9890: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61  Seg[iSeg].pgnoLa
98a0: 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
98b0: 20 7d 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61   }..    fts5Data
98c0: 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54  Write(p, FTS5_ST
98d0: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69 49  RUCTURE_ROWID(iI
98e0: 64 78 29 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  dx), buf.p, buf.
98f0: 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  n);.    fts5Buff
9900: 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20  erFree(&buf);.  
9910: 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69  }.}..#if 0.stati
9920: 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
9930: 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46  Structure(int*,F
9940: 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53  ts5Buffer*,Fts5S
9950: 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74  tructure*);.stat
9960: 69 63 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e  ic void fts5Prin
9970: 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74  tStructure(const
9980: 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c   char *zCaption,
9990: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
99a0: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
99b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
99c0: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
99d0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c  ;.  memset(&buf,
99e0: 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29   0, sizeof(buf))
99f0: 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72  ;.  fts5DebugStr
9a00: 75 63 74 75 72 65 28 26 72 63 2c 20 26 62 75 66  ucture(&rc, &buf
9a10: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70  , pStruct);.  fp
9a20: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25  rintf(stdout, "%
9a30: 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69  s: %s\n", zCapti
9a40: 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66  on, buf.p);.  ff
9a50: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
9a60: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
9a70: 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  buf);.}.#else.# 
9a80: 64 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74  define fts5Print
9a90: 53 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23  Structure(x,y).#
9aa0: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e  endif..static in
9ab0: 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a  t fts5SegmentSiz
9ac0: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  e(Fts5StructureS
9ad0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20  egment *pSeg){. 
9ae0: 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67   return 1 + pSeg
9af0: 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65  ->pgnoLast - pSe
9b00: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a  g->pgnoFirst;.}.
9b10: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
9b20: 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74  copy of index st
9b30: 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
9b40: 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65   Except, promote
9b50: 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67   as many .** seg
9b60: 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c  ments as possibl
9b70: 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d  e to level iProm
9b80: 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f  ote. If an OOM o
9b90: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a  ccurs, NULL is .
9ba0: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
9bb0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9bc0: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9bd0: 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  To(.  Fts5Index 
9be0: 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f  *p,.  int iPromo
9bf0: 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d  te,.  int szProm
9c00: 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63  ote,.  Fts5Struc
9c10: 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b  ture *pStruct.){
9c20: 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20  .  int il, is;. 
9c30: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9c40: 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74  vel *pOut = &pSt
9c50: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72  ruct->aLevel[iPr
9c60: 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70  omote];..  if( p
9c70: 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29  Out->nMerge==0 )
9c80: 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72  {.    for(il=iPr
9c90: 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72  omote+1; il<pStr
9ca0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b  uct->nLevel; il+
9cb0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
9cc0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
9cd0: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
9ce0: 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20  Level[il];.     
9cf0: 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
9d00: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
9d10: 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e    for(is=pLvl->n
9d20: 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73  Seg-1; is>=0; is
9d30: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  --){.        int
9d40: 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e   sz = fts5Segmen
9d50: 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65  tSize(&pLvl->aSe
9d60: 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20  g[is]);.        
9d70: 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65  if( sz>szPromote
9d80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
9d90: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
9da0: 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
9db0: 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72  rc, pStruct, iPr
9dc0: 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  omote, 1, 1);.  
9dd0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
9de0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
9df0: 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61    memcpy(pOut->a
9e00: 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Seg, &pLvl->aSeg
9e10: 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73  [is], sizeof(Fts
9e20: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
9e30: 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75  t));.        pOu
9e40: 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20  t->nSeg++;.     
9e50: 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b     pLvl->nSeg--;
9e60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9e70: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65   }.}../*.** A ne
9e80: 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75  w segment has ju
9e90: 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  st been written 
9ea0: 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66  to level iLvl of
9eb0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
9ec0: 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69  .** pStruct. Thi
9ed0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
9ee0: 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67  mines if any seg
9ef0: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
9f00: 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61  promoted.** as a
9f10: 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74   result. Segment
9f20: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69  s are promoted i
9f30: 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
9f40: 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74  .**.**   a) If t
9f50: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
9f60: 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c  written is small
9f70: 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d  er than one or m
9f80: 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20  ore segments.** 
9f90: 20 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20       within the 
9fa0: 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74  previous populat
9fb0: 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20  ed level, it is 
9fc0: 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20  promoted to the 
9fd0: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20  previous.**     
9fe0: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
9ff0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20  ..**.**   b) If 
a000: 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74  the segment just
a010: 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67   written is larg
a020: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65  er than the newe
a030: 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a  st segment on.**
a040: 20 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70        the next p
a050: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20  opulated level, 
a060: 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e  then that segmen
a070: 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  t, and any other
a080: 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20   adjacent.**    
a090: 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20    segments that 
a0a0: 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72  are also smaller
a0b0: 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75   than the one ju
a0c0: 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20  st written, are 
a0d0: 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65  .**      promote
a0e0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  d. .**.** If one
a0f0: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
a100: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20  s are promoted, 
a110: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62  the structure ob
a120: 6a 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a  ject is updated.
a130: 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ** to reflect th
a140: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  is..*/.static vo
a150: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
a160: 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49  Promote(.  Fts5I
a170: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
a180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
a190: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
a1a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  t */.  int iLvl,
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a1d0: 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74  level just updat
a1e0: 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ed */.  Fts5Stru
a1f0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20  cture *pStruct  
a200: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
a210: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
a220: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
a230: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
a240: 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74  nt iTst;.    int
a250: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a   iPromote = -1;.
a260: 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74      int szPromot
a270: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
a280: 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79    /* Promote any
a290: 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20  thing this size 
a2a0: 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  or smaller */.  
a2b0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
a2c0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
a2d0: 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20  /* Segment just 
a2e0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
a2f0: 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20  nt szSeg;       
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a310: 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20  Size of segment 
a320: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
a330: 0a 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 53  ..    pSeg = &pS
a340: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
a350: 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74  vl].aSeg[pStruct
a360: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
a370: 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65  Seg-1];.    szSe
a380: 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70  g = (1 + pSeg->p
a390: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
a3a0: 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20  pgnoFirst);..   
a3b0: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f   /* Check for co
a3c0: 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20  ndition (a) */. 
a3d0: 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c     for(iTst=iLvl
a3e0: 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70  -1; iTst>=0 && p
a3f0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a400: 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54  Tst].nSeg==0; iT
a410: 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20 69  st--);.    if( i
a420: 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tst>=0 ){.      
a430: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
a440: 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20   szMax = 0;.    
a450: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
a460: 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70 53  evel *pTst = &pS
a470: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54  truct->aLevel[iT
a480: 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st];.      asser
a490: 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d  t( pTst->nMerge=
a4a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
a4b0: 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65  i=0; i<pTst->nSe
a4c0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
a4d0: 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e   int sz = pTst->
a4e0: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74  aSeg[i].pgnoLast
a4f0: 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   - pTst->aSeg[i]
a500: 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a  .pgnoFirst + 1;.
a510: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
a520: 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73  zMax ) szMax = s
a530: 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
a540: 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65   if( szMax>=szSe
a550: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g ){.        /* 
a560: 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  Condition (a) is
a570: 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74   true. Promote t
a580: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
a590: 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20  t on level .    
a5a0: 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c      ** iLvl to l
a5b0: 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20  evel iTst.  */. 
a5c0: 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20         iPromote 
a5d0: 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20  = iTst;.        
a5e0: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61  szPromote = szMa
a5f0: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
a600: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e 64  ..    /* If cond
a610: 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f 74  ition (a) is not
a620: 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62 29   met, assume (b)
a630: 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63 74   is true. Struct
a640: 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a 20  urePromoteTo(). 
a650: 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70     ** is a no-op
a660: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 20   if it is not.  
a670: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d  */.    if( iProm
a680: 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ote<0 ){.      i
a690: 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a  Promote = iLvl;.
a6a0: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
a6b0: 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a 20  = szSeg;.    }. 
a6c0: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
a6d0: 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50 72  PromoteTo(p, iPr
a6e0: 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74 65  omote, szPromote
a6f0: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
a700: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
a710: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 6f 66 66   pIter->iOff off
a720: 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  set currently po
a730: 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
a740: 20 69 6e 64 69 63 61 74 69 6e 67 20 6f 6e 65 0a   indicating one.
a750: 2a 2a 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 2d  ** or more term-
a760: 6c 65 73 73 20 6e 6f 64 65 73 2c 20 61 64 76 61  less nodes, adva
a770: 6e 63 65 20 70 61 73 74 20 69 74 20 61 6e 64 20  nce past it and 
a780: 73 65 74 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74  set pIter->nEmpt
a790: 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  y to.** the numb
a7a0: 65 72 20 6f 66 20 65 6d 70 74 79 20 63 68 69 6c  er of empty chil
a7b0: 64 20 6e 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74  d nodes..*/.stat
a7c0: 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65  ic void fts5Node
a7d0: 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79  IterGobbleNEmpty
a7e0: 28 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70  (Fts5NodeIter *p
a7f0: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
a800: 65 72 2d 3e 69 4f 66 66 3c 70 49 74 65 72 2d 3e  er->iOff<pIter->
a810: 6e 44 61 74 61 20 26 26 20 30 3d 3d 28 70 49 74  nData && 0==(pIt
a820: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
a830: 3e 69 4f 66 66 5d 20 26 20 30 78 66 65 29 20 29  >iOff] & 0xfe) )
a840: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c  {.    pIter->bDl
a850: 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 44 61  idx = pIter->aDa
a860: 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20  ta[pIter->iOff] 
a870: 26 20 30 78 30 31 3b 0a 20 20 20 20 70 49 74 65  & 0x01;.    pIte
a880: 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 70  r->iOff++;.    p
a890: 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74  Iter->iOff += ft
a8a0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
a8b0: 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65  Iter->aData[pIte
a8c0: 72 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72 2d  r->iOff], pIter-
a8d0: 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c 73  >nEmpty);.  }els
a8e0: 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 45  e{.    pIter->nE
a8f0: 6d 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 49  mpty = 0;.    pI
a900: 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30 3b  ter->bDlidx = 0;
a910: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
a920: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
a930: 74 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20 74  t entry within t
a940: 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  he node..*/.stat
a950: 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65  ic void fts5Node
a960: 49 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70 52  IterNext(int *pR
a970: 63 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20  c, Fts5NodeIter 
a980: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
a990: 49 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65  Iter->iOff>=pIte
a9a0: 72 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  r->nData ){.    
a9b0: 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30  pIter->aData = 0
a9c0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68  ;.    pIter->iCh
a9d0: 69 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 45  ild += pIter->nE
a9e0: 6d 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mpty;.  }else{. 
a9f0: 20 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e 65     int nPre, nNe
aa00: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f  w;.    pIter->iO
aa10: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
aa20: 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44  int32(&pIter->aD
aa30: 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d  ata[pIter->iOff]
aa40: 2c 20 6e 50 72 65 29 3b 0a 20 20 20 20 70 49 74  , nPre);.    pIt
aa50: 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  er->iOff += fts5
aa60: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
aa70: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
aa80: 3e 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20  >iOff], nNew);. 
aa90: 20 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e     pIter->term.n
aaa0: 20 3d 20 6e 50 72 65 2d 32 3b 0a 20 20 20 20 66   = nPre-2;.    f
aab0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
aac0: 6c 6f 62 28 70 52 63 2c 20 26 70 49 74 65 72 2d  lob(pRc, &pIter-
aad0: 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 70 49 74  >term, nNew, pIt
aae0: 65 72 2d 3e 61 44 61 74 61 2b 70 49 74 65 72 2d  er->aData+pIter-
aaf0: 3e 69 4f 66 66 29 3b 0a 20 20 20 20 70 49 74 65  >iOff);.    pIte
ab00: 72 2d 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  r->iOff += nNew;
ab10: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69  .    pIter->iChi
ab20: 6c 64 20 2b 3d 20 28 31 20 2b 20 70 49 74 65 72  ld += (1 + pIter
ab30: 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 66  ->nEmpty);.    f
ab40: 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c  ts5NodeIterGobbl
ab50: 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a  eNEmpty(pIter);.
ab60: 20 20 20 20 69 66 28 20 2a 70 52 63 20 29 20 70      if( *pRc ) p
ab70: 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b  Iter->aData = 0;
ab80: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
ab90: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74  nitialize the it
aba0: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49  erator object pI
abb0: 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  ter to iterate t
abc0: 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72  hrough the inter
abd0: 6e 61 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6e  nal.** segment n
abe0: 6f 64 65 20 69 6e 20 70 44 61 74 61 2e 0a 2a 2f  ode in pData..*/
abf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ac00: 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 63 6f  5NodeIterInit(co
ac10: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 69  nst u8 *aData, i
ac20: 6e 74 20 6e 44 61 74 61 2c 20 46 74 73 35 4e 6f  nt nData, Fts5No
ac30: 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  deIter *pIter){.
ac40: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
ac50: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
ac60: 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 44 61  ));.  pIter->aDa
ac70: 74 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 49  ta = aData;.  pI
ac80: 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61  ter->nData = nDa
ac90: 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4f 66  ta;.  pIter->iOf
aca0: 66 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  f = fts5GetVarin
acb0: 74 33 32 28 61 44 61 74 61 2c 20 70 49 74 65 72  t32(aData, pIter
acc0: 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20 66 74 73  ->iChild);.  fts
acd0: 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e  5NodeIterGobbleN
ace0: 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a 7d 0a  Empty(pIter);.}.
acf0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
ad00: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
ad10: 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72   by the iterator
ad20: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
ad30: 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65  ic void fts5Node
ad40: 49 74 65 72 46 72 65 65 28 46 74 73 35 4e 6f 64  IterFree(Fts5Nod
ad50: 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  eIter *pIter){. 
ad60: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
ad70: 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d  &pIter->term);.}
ad80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
ad90: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
ada0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
adb0: 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  t has the follow
adc0: 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a  ing fields set.*
add0: 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68  * as follows. Th
ade0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
adf0: 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20   up the rest of 
ae00: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20  the iterator so 
ae10: 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74  that it.** point
ae20: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
ae30: 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
ae40: 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ist-index..**.**
ae50: 20 20 20 70 44 61 74 61 3a 20 70 6f 69 6e 74 65     pData: pointe
ae60: 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64  r to doclist-ind
ae70: 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 20 20  ex record, .**  
ae80: 20 69 4c 65 61 66 50 67 6e 6f 3a 20 70 61 67 65   iLeafPgno: page
ae90: 20 6e 75 6d 62 65 72 20 74 68 61 74 20 74 68 69   number that thi
aea0: 73 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  s doclist-index 
aeb0: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
aec0: 74 68 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  th..**.** When t
aed0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
aee0: 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c  called pIter->iL
aef0: 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70  eafPgno is the p
af00: 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a  age number the.*
af10: 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73  * doclist is ass
af20: 6f 63 69 61 74 65 64 20 77 69 74 68 20 28 74 68  ociated with (th
af30: 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20  e one featuring 
af40: 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74  the term)..*/.st
af50: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
af60: 64 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35  dxIterFirst(Fts5
af70: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
af80: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
af90: 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44  Data = pIter->pD
afa0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ata;.  int i;.  
afb0: 69 6e 74 20 62 50 72 65 73 65 6e 74 3b 0a 0a 20  int bPresent;.. 
afc0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
afd0: 70 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  pData );.  asser
afe0: 74 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  t( pIter->iLeafP
aff0: 67 6e 6f 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 52  gno>0 );..  /* R
b000: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 72 6f  ead the first ro
b010: 77 69 64 20 76 61 6c 75 65 2e 20 41 6e 64 20 74  wid value. And t
b020: 68 65 20 22 70 72 65 73 65 6e 74 22 20 66 6c 61  he "present" fla
b030: 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  g that follows i
b040: 74 2e 20 2a 2f 0a 20 20 70 49 74 65 72 2d 3e 69  t. */.  pIter->i
b050: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
b060: 28 26 70 44 61 74 61 2d 3e 70 5b 30 5d 2c 20 28  (&pData->p[0], (
b070: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
b080: 77 69 64 29 3b 0a 20 20 62 50 72 65 73 65 6e 74  wid);.  bPresent
b090: 20 3d 20 70 44 61 74 61 2d 3e 70 5b 70 49 74 65   = pData->p[pIte
b0a0: 72 2d 3e 69 4f 66 66 2b 2b 5d 3b 0a 20 20 69 66  r->iOff++];.  if
b0b0: 28 20 62 50 72 65 73 65 6e 74 20 29 7b 0a 20 20  ( bPresent ){.  
b0c0: 20 20 69 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65    i = 0;.  }else
b0d0: 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74  {.    /* Count t
b0e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  he number of lea
b0f0: 64 69 6e 67 20 30 78 30 30 20 62 79 74 65 73 2e  ding 0x00 bytes.
b100: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   */.    for(i=1;
b110: 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 44 61   pIter->iOff<pDa
b120: 74 61 2d 3e 6e 3b 20 69 2b 2b 29 7b 20 0a 20 20  ta->n; i++){ .  
b130: 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70      if( pData->p
b140: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20 29 20  [pIter->iOff] ) 
b150: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74  break;.      pIt
b160: 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20 20 20 20  er->iOff++;.    
b170: 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73  }..    /* Unless
b180: 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
b190: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
b1a0: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c  e doclist-index,
b1b0: 20 6c 6f 61 64 20 74 68 65 20 66 69 72 73 74 0a   load the first.
b1c0: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 76 61 6c      ** rowid val
b1d0: 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ue.  */.    if( 
b1e0: 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 44 61 74  pIter->iOff<pDat
b1f0: 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36  a->n ){.      i6
b200: 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 49  4 iVal;.      pI
b210: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74  ter->iOff += get
b220: 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
b230: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 28  [pIter->iOff], (
b240: 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20  u64*)&iVal);.   
b250: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
b260: 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 7d 65   += iVal;.    }e
b270: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72  lse{.      pIter
b280: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  ->bEof = 1;.    
b290: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69  }.  }.  pIter->i
b2a0: 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 2b 31  LeafPgno += (i+1
b2b0: 29 3b 0a 0a 20 20 70 49 74 65 72 2d 3e 69 46 69  );..  pIter->iFi
b2c0: 72 73 74 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  rstOff = pIter->
b2d0: 69 4f 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 70  iOff;.  return p
b2e0: 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f  Iter->bEof;.}../
b2f0: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
b300: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
b310: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
b320: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
b330: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
b340: 65 72 4e 65 78 74 28 46 74 73 35 44 6c 69 64 78  erNext(Fts5Dlidx
b350: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b360: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20  Fts5Data *pData 
b370: 3d 20 70 49 74 65 72 2d 3e 70 44 61 74 61 3b 0a  = pIter->pData;.
b380: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 66    int iOff;..  f
b390: 6f 72 28 69 4f 66 66 3d 70 49 74 65 72 2d 3e 69  or(iOff=pIter->i
b3a0: 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d  Off; iOff<pData-
b3b0: 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20  >n; iOff++){.   
b3c0: 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f   if( pData->p[iO
b3d0: 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20  ff] ) break; .  
b3e0: 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70 44  }..  if( iOff<pD
b3f0: 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36  ata->n ){.    i6
b400: 34 20 69 56 61 6c 3b 0a 20 20 20 20 70 49 74 65  4 iVal;.    pIte
b410: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20  r->iLeafPgno += 
b420: 28 69 4f 66 66 20 2d 20 70 49 74 65 72 2d 3e 69  (iOff - pIter->i
b430: 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20 20 69 4f  Off) + 1;.    iO
b440: 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  ff += getVarint(
b450: 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c  &pData->p[iOff],
b460: 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20   (u64*)&iVal);. 
b470: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
b480: 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 49   += iVal;.    pI
b490: 74 65 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  ter->iOff = iOff
b4a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b4b0: 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Iter->bEof = 1;.
b4c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
b4d0: 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74  ter->bEof;.}..st
b4e0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b4f0: 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  dxIterEof(Fts5In
b500: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
b510: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
b520: 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 21 3d   return (p->rc!=
b530: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
b540: 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d 0a 0a 73 74  er->bEof);.}..st
b550: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
b560: 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35  idxIterLast(Fts5
b570: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b580: 29 7b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  ){.  if( fts5Dli
b590: 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74 65  dxIterFirst(pIte
b5a0: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  r)==0 ){.    whi
b5b0: 6c 65 28 20 30 3d 3d 66 74 73 35 44 6c 69 64 78  le( 0==fts5Dlidx
b5c0: 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 20  IterNext(pIter) 
b5d0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45  );.    pIter->bE
b5e0: 6f 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73  of = 0;.  }.}..s
b5f0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
b600: 69 64 78 49 74 65 72 50 72 65 76 28 46 74 73 35  idxIterPrev(Fts5
b610: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b620: 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
b630: 70 49 74 65 72 2d 3e 69 4f 66 66 3b 0a 0a 20 20  pIter->iOff;..  
b640: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62  assert( pIter->b
b650: 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Eof==0 );.  if( 
b660: 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69 46 69  iOff<=pIter->iFi
b670: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 49  rstOff ){.    pI
b680: 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  ter->bEof = 1;. 
b690: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a   }else{.    u8 *
b6a0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61 74 61  a = pIter->pData
b6b0: 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61  ->p;.    i64 iVa
b6c0: 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  l;.    int iLimi
b6d0: 74 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65  t;..    /* Curre
b6e0: 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73  ntly iOff points
b6f0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
b700: 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20  te of a varint. 
b710: 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20  This block .    
b720: 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f  ** decrements iO
b730: 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e  ff until it poin
b740: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
b750: 62 79 74 65 20 6f 66 20 74 68 65 20 70 72 65 76  byte of the prev
b760: 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72  ious .    ** var
b770: 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65  int. Taking care
b780: 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79   not to read any
b790: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
b7a0: 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20  s that occur.   
b7b0: 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62   ** before the b
b7c0: 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e  uffer in memory.
b7d0: 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20    */.    iLimit 
b7e0: 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66  = (iOff>9 ? iOff
b7f0: 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72  -9 : 0);.    for
b800: 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c  (iOff--; iOff>iL
b810: 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20  imit; iOff--){. 
b820: 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66       if( (a[iOff
b830: 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29  -1] & 0x80)==0 )
b840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
b850: 20 20 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b     getVarint(&a[
b860: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56  iOff], (u64*)&iV
b870: 61 6c 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  al);.    pIter->
b880: 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a  iRowid -= iVal;.
b890: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
b8a0: 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 77 68 69  Pgno--;..    whi
b8b0: 6c 65 28 20 69 4f 66 66 3e 70 49 74 65 72 2d 3e  le( iOff>pIter->
b8c0: 69 46 69 72 73 74 4f 66 66 20 0a 20 20 20 20 20  iFirstOff .     
b8d0: 20 20 20 26 26 20 61 5b 69 4f 66 66 2d 31 5d 3d     && a[iOff-1]=
b8e0: 3d 30 78 30 30 20 26 26 20 28 61 5b 69 4f 66 66  =0x00 && (a[iOff
b8f0: 2d 32 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 0a  -2] & 0x80)==0 .
b900: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 4f 66      ){.      iOf
b910: 66 2d 2d 3b 0a 20 20 20 20 20 20 70 49 74 65 72  f--;.      pIter
b920: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20  ->iLeafPgno--;. 
b930: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e     }.    pIter->
b940: 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 7d  iOff = iOff;.  }
b950: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ..  return pIter
b960: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69  ->bEof;.}..stati
b970: 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78  c void fts5Dlidx
b980: 49 74 65 72 49 6e 69 74 46 72 6f 6d 44 61 74 61  IterInitFromData
b990: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
b9a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b9b0: 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b      /* Fts5 Back
b9c0: 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
b9d0: 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62  ithin */.  int b
b9e0: 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20 20  Rev,            
b9f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
ba00: 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20  ue for ORDER BY 
ba10: 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  ASC */.  int iLe
ba20: 61 66 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  afPgno,         
ba30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66           /* Leaf
ba40: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 64 6c 69   page number dli
ba50: 64 78 20 69 73 20 66 6f 72 20 2a 2f 0a 20 20 46  dx is for */.  F
ba60: 74 73 35 44 61 74 61 20 2a 70 44 6c 69 64 78 2c  ts5Data *pDlidx,
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba80: 2a 20 4c 65 61 66 20 69 6e 64 65 78 20 64 61 74  * Leaf index dat
ba90: 61 20 2a 2f 0a 20 20 46 74 73 35 44 6c 69 64 78  a */.  Fts5Dlidx
baa0: 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
bab0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
bac0: 6f 70 75 6c 61 74 65 64 20 69 74 65 72 61 74 6f  opulated iterato
bad0: 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c  r */.){.  Fts5Dl
bae0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  idxIter *pIter =
baf0: 20 2a 70 70 49 74 65 72 3b 0a 0a 20 20 69 66 28   *ppIter;..  if(
bb00: 20 70 49 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20   pIter==0 ){.   
bb10: 20 2a 70 70 49 74 65 72 20 3d 20 70 49 74 65 72   *ppIter = pIter
bb20: 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74 65   = (Fts5DlidxIte
bb30: 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
bb40: 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
bb50: 6c 69 64 78 49 74 65 72 29 29 3b 0a 20 20 20 20  lidxIter));.    
bb60: 69 66 28 20 70 49 74 65 72 3d 3d 30 20 29 7b 20  if( pIter==0 ){ 
bb70: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
bb80: 65 6c 65 61 73 65 28 70 44 6c 69 64 78 29 3b 0a  elease(pDlidx);.
bb90: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
bba0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
bbb0: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
bbc0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
bbd0: 64 78 49 74 65 72 29 29 3b 0a 20 20 7d 0a 0a 20  dxIter));.  }.. 
bbe0: 20 70 49 74 65 72 2d 3e 70 44 61 74 61 20 3d 20   pIter->pData = 
bbf0: 70 44 6c 69 64 78 3b 0a 20 20 70 49 74 65 72 2d  pDlidx;.  pIter-
bc00: 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
bc10: 61 66 50 67 6e 6f 3b 0a 20 20 69 66 28 20 62 52  afPgno;.  if( bR
bc20: 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  ev==0 ){.    fts
bc30: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
bc40: 70 49 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pIter);.  }else{
bc50: 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74  .    fts5DlidxIt
bc60: 65 72 4c 61 73 74 28 70 49 74 65 72 29 3b 0a 20  erLast(pIter);. 
bc70: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
bc80: 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  d fts5DlidxIterI
bc90: 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
bca0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
bcb0: 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42         /* Fts5 B
bcc0: 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
bcd0: 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e  e within */.  in
bce0: 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20  t bRev,         
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd00: 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20   True for ORDER 
bd10: 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20  BY ASC */.  int 
bd20: 69 49 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64  iIdx, int iSegid
bd30: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
bd40: 65 67 6d 65 6e 74 20 69 53 65 67 69 64 20 77 69  egment iSegid wi
bd50: 74 68 69 6e 20 69 6e 64 65 78 20 69 49 64 78 20  thin index iIdx 
bd60: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
bd70: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
bd80: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67       /* Leaf pag
bd90: 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64  e number to load
bda0: 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 20 20   dlidx for */.  
bdb0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 2a  Fts5DlidxIter **
bdc0: 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
bdd0: 2f 2a 20 4f 55 54 3a 20 50 6f 70 75 6c 61 74 65  /* OUT: Populate
bde0: 64 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  d iterator */.){
bdf0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 6c  .  Fts5Data *pDl
be00: 69 64 78 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20  idx;.  pDlidx = 
be10: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
be20: 46 54 53 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58  FTS5_DOCLIST_IDX
be30: 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65  _ROWID(iIdx, iSe
be40: 67 69 64 2c 20 69 4c 65 61 66 50 67 6e 6f 29 29  gid, iLeafPgno))
be50: 3b 0a 20 20 69 66 28 20 70 44 6c 69 64 78 3d 3d  ;.  if( pDlidx==
be60: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 74  0 ) return;.  ft
be70: 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 46  s5DlidxIterInitF
be80: 72 6f 6d 44 61 74 61 28 70 2c 20 62 52 65 76 2c  romData(p, bRev,
be90: 20 69 4c 65 61 66 50 67 6e 6f 2c 20 70 44 6c 69   iLeafPgno, pDli
bea0: 64 78 2c 20 70 70 49 74 65 72 29 3b 0a 7d 0a 0a  dx, ppIter);.}..
beb0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63  /*.** Free a doc
bec0: 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61  list-index itera
bed0: 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  tor object alloc
bee0: 61 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64  ated by fts5Dlid
bef0: 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a  xIterInit()..*/.
bf00: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
bf10: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74  DlidxIterFree(Ft
bf20: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bf30: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
bf40: 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61   ){.    fts5Data
bf50: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
bf60: 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  Data);.    sqlit
bf70: 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
bf80: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
bf90: 69 64 20 66 74 73 35 4c 65 61 66 48 65 61 64 65  id fts5LeafHeade
bfa0: 72 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61  r(Fts5Data *pLea
bfb0: 66 2c 20 69 6e 74 20 2a 70 69 52 6f 77 69 64 2c  f, int *piRowid,
bfc0: 20 69 6e 74 20 2a 70 69 54 65 72 6d 29 7b 0a 20   int *piTerm){. 
bfd0: 20 2a 70 69 52 6f 77 69 64 20 3d 20 28 69 6e 74   *piRowid = (int
bfe0: 29 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65  )fts5GetU16(&pLe
bff0: 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 2a 70 69  af->p[0]);.  *pi
c000: 54 65 72 6d 20 3d 20 28 69 6e 74 29 66 74 73 35  Term = (int)fts5
c010: 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
c020: 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  [2]);.}../*.** L
c030: 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61  oad the next lea
c040: 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  f page into the 
c050: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
c060: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c070: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
c080: 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
c090: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
c0a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
c0b0: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
c0c0: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
c0d0: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
c0e0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
c0f0: 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
c100: 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  xt page */.){.  
c110: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
c120: 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74  ment *pSeg = pIt
c130: 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35  er->pSeg;.  fts5
c140: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
c150: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74  r->pLeaf);.  pIt
c160: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b  er->iLeafPgno++;
c170: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c  .  if( pIter->iL
c180: 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  eafPgno<=pSeg->p
c190: 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
c1a0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74  Iter->pLeaf = ft
c1b0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
c1c0: 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d         FTS5_SEGM
c1d0: 45 4e 54 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  ENT_ROWID(pIter-
c1e0: 3e 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65  >iIdx, pSeg->iSe
c1f0: 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69  gid, 0, pIter->i
c200: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b  LeafPgno).    );
c210: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
c220: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
c230: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73    }.}../*.** Fts
c240: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
c250: 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70  fset currently p
c260: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
c270: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
c280: 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69 65  ** "nSuffix" fie
c290: 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75  ld of a term. Fu
c2a0: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
c2b0: 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20   nKeep contains 
c2c0: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
c2d0: 74 68 65 20 22 6e 50 72 65 66 69 78 22 20 66 69  the "nPrefix" fi
c2e0: 65 6c 64 20 28 69 66 20 74 68 65 72 65 20 77 61  eld (if there wa
c2f0: 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61  s one - it is pa
c300: 73 73 65 64 20 30 20 69 66 20 74 68 69 73 20 69  ssed 0 if this i
c310: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  s.** the first t
c320: 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65  erm in the segme
c330: 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nt)..**.** This 
c340: 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
c350: 65 73 20 28 46 74 73 35 53 65 67 49 74 65 72 2e  es (Fts5SegIter.
c360: 74 65 72 6d 29 20 61 6e 64 20 28 46 74 73 35 53  term) and (Fts5S
c370: 65 67 49 74 65 72 2e 69 52 6f 77 69 64 29 0a 2a  egIter.iRowid).*
c380: 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e  * accordingly an
c390: 64 20 6c 65 61 76 65 73 20 28 46 74 73 35 53 65  d leaves (Fts5Se
c3a0: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
c3b0: 74 29 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  t) set to the of
c3c0: 66 73 65 74 20 74 6f 20 0a 2a 2a 20 74 68 65 20  fset to .** the 
c3d0: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
c3e0: 65 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e  e first position
c3f0: 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74   list. The posit
c400: 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69  ion list belongi
c410: 6e 67 20 0a 2a 2a 20 74 6f 20 64 6f 63 75 6d 65  ng .** to docume
c420: 6e 74 20 28 46 74 73 35 53 65 67 49 74 65 72 2e  nt (Fts5SegIter.
c430: 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74  iRowid)..*/.stat
c440: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
c450: 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35  terLoadTerm(Fts5
c460: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
c470: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  gIter *pIter, in
c480: 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a  t nKeep){.  u8 *
c490: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
c4a0: 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ->p;        /* B
c4b0: 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61  uffer to read da
c4c0: 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ta from */.  int
c4d0: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
c4e0: 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20  LeafOffset;  /* 
c4f0: 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61  Offset to read a
c500: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b  t */.  int nNew;
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
c530: 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a  of new data */..
c540: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
c550: 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
c560: 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49 74  f], nNew);.  pIt
c570: 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65  er->term.n = nKe
c580: 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  ep;.  fts5Buffer
c590: 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
c5a0: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
c5b0: 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
c5c0: 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77  ;.  iOff += nNew
c5d0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
c5e0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
c5f0: 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  f;.  pIter->iTer
c600: 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  mLeafPgno = pIte
c610: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  r->iLeafPgno;.  
c620: 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d  if( iOff>=pIter-
c630: 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  >pLeaf->n ){.   
c640: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
c650: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
c660: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
c670: 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
c680: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
c690: 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
c6a0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
c6b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
c6c0: 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a  }.    iOff = 4;.
c6d0: 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
c6e0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69  Leaf->p;.  }.  i
c6f0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Off += sqlite3Ge
c700: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
c710: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
c720: 69 52 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72  iRowid);.  pIter
c730: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
c740: 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  iOff;.}../*.** I
c750: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74  nitialize the it
c760: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49  erator object pI
c770: 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  ter to iterate t
c780: 68 72 6f 75 67 68 20 74 68 65 20 65 6e 74 72 69  hrough the entri
c790: 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74  es in.** segment
c7a0: 20 70 53 65 67 20 77 69 74 68 69 6e 20 69 6e 64   pSeg within ind
c7b0: 65 78 20 69 49 64 78 2e 20 54 68 65 20 69 74 65  ex iIdx. The ite
c7c0: 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  rator is left po
c7d0: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a  inting to the .*
c7e0: 2a 20 66 69 72 73 74 20 65 6e 74 72 79 20 77 68  * first entry wh
c7f0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
c800: 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20   returns..**.** 
c810: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
c820: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
c830: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
c840: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
c850: 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
c860: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
c870: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
c880: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
c890: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
c8a0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
c8b0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c8c0: 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  erInit(.  Fts5In
c8d0: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
c8e0: 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20   .  int iIdx,   
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48      /* Config.aH
c910: 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46  ash[] index of F
c920: 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74  TS index */.  Ft
c930: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
c940: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
c950: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
c960: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
c970: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c990: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
c9a0: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  te */.){.  if( p
c9b0: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
c9c0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
c9d0: 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
c9e0: 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67  segment is being
c9f0: 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75   used as an inpu
ca00: 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t to an incremen
ca10: 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65  tal.    ** merge
ca20: 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61   and all data ha
ca30: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22  s already been "
ca40: 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75  trimmed". See fu
ca50: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74  nction.    ** ft
ca60: 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29  s5TrimSegments()
ca70: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e   for details. In
ca80: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
ca90: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d   the iterator em
caa0: 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  pty..    ** The 
cab0: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20  caller will see 
cac0: 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61  the (pIter->pLea
cad0: 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65  f==0) and assume
cae0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
caf0: 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61  .    ** at EOF a
cb00: 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61  lready. */.    a
cb10: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
cb20: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  eaf==0 );.    re
cb30: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
cb40: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
cb50: 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  K ){.    memset(
cb60: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
cb70: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70  (*pIter));.    p
cb80: 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
cb90: 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 49  g;.    pIter->iI
cba0: 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 70  dx = iIdx;.    p
cbb0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
cbc0: 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
cbd0: 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  t-1;.    fts5Seg
cbe0: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
cbf0: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  pIter);.  }..  i
cc00: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
cc10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38 20 2a 61  _OK ){.    u8 *a
cc20: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
cc30: 3e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  >p;.    pIter->i
cc40: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
cc50: 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a  5GetU16(&a[2]);.
cc60: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
cc70: 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72  oadTerm(p, pIter
cc80: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
cc90: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cca0: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61   is only ever ca
ccb0: 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72  lled on iterator
ccc0: 73 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  s created by cal
ccd0: 6c 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64  ls to.** Fts5Ind
cce0: 65 78 51 75 65 72 79 28 29 20 77 69 74 68 20 74  exQuery() with t
ccf0: 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  he FTS5INDEX_QUE
cd00: 52 59 5f 41 53 43 20 66 6c 61 67 20 73 65 74 2e  RY_ASC flag set.
cd10: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
cd20: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
cd30: 6c 65 64 2c 20 69 74 65 72 61 74 6f 72 20 70 49  led, iterator pI
cd40: 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
cd50: 65 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a  e first rowid.**
cd60: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
cd70: 6c 65 61 66 20 61 73 73 6f 63 69 61 74 65 64 20  leaf associated 
cd80: 77 69 74 68 20 74 68 65 20 74 65 72 6d 20 62 65  with the term be
cd90: 69 6e 67 20 71 75 65 72 69 65 64 2e 20 54 68 69  ing queried. Thi
cda0: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 64  s function.** ad
cdb0: 76 61 6e 63 65 73 20 69 74 20 74 6f 20 70 6f 69  vances it to poi
cdc0: 6e 74 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73  nt to the last s
cdd0: 75 63 68 20 72 6f 77 69 64 20 61 6e 64 2c 20 69  uch rowid and, i
cde0: 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69  f necessary, ini
cdf0: 74 69 61 6c 69 7a 65 73 0a 2a 2a 20 74 68 65 20  tializes.** the 
ce00: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
ce10: 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20  nd iRowidOffset 
ce20: 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  variables..*/.st
ce30: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
ce40: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
ce50: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
ce60: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
ce70: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  pIter){.  int n 
ce80: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
ce90: 6e 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 74  n;.  int i = pIt
cea0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
ceb0: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
cec0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e  ->pLeaf->p;.  in
ced0: 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  t iRowidOffset =
cee0: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d   0;..  while( p-
cef0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
cf00: 26 20 69 3c 6e 20 29 7b 0a 20 20 20 20 69 36 34  & i<n ){.    i64
cf10: 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20   iDelta = 0;.   
cf20: 20 69 6e 74 20 6e 50 6f 73 3b 0a 0a 20 20 20 20   int nPos;..    
cf30: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
cf40: 6e 74 33 32 28 26 61 5b 69 5d 2c 20 6e 50 6f 73  nt32(&a[i], nPos
cf50: 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73  );.    i += nPos
cf60: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29  ;.    if( i>=n )
cf70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d   break;.    i +=
cf80: 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d   getVarint(&a[i]
cf90: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
cfa0: 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c 74 61  ;.    if( iDelta
cfb0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
cfc0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
cfd0: 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 69  = iDelta;..    i
cfe0: 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e  f( iRowidOffset>
cff0: 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66  =pIter->nRowidOf
d000: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  fset ){.      in
d010: 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e  t nNew = pIter->
d020: 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38  nRowidOffset + 8
d030: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65  ;.      int *aNe
d040: 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  w = (int*)sqlite
d050: 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d  3_realloc(pIter-
d060: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e  >aRowidOffset, n
d070: 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  New*sizeof(int))
d080: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77  ;.      if( aNew
d090: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
d0a0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
d0b0: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  MEM;.        bre
d0c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d0d0: 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f    pIter->aRowidO
d0e0: 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20  ffset = aNew;.  
d0f0: 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69      pIter->nRowi
d100: 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a  dOffset = nNew;.
d110: 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72      }..    pIter
d120: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69  ->aRowidOffset[i
d130: 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d  RowidOffset++] =
d140: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d150: 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  set;.    pIter->
d160: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b  iLeafOffset = i;
d170: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52  .  }.  pIter->iR
d180: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f  owidOffset = iRo
d190: 77 69 64 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a  widOffset;.}../*
d1a0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
d1b0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65  id fts5SegIterRe
d1c0: 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73  verseNewPage(Fts
d1d0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
d1e0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
d1f0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
d200: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
d210: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b  GITER_REVERSE );
d220: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
d230: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
d240: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
d250: 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  ;..  fts5DataRel
d260: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
d270: 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65  f);.  pIter->pLe
d280: 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  af = 0;.  while(
d290: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d2a0: 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61  K && pIter->iLea
d2b0: 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65  fPgno>pIter->iTe
d2c0: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
d2d0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
d2e0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
d2f0: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e  afPgno--;.    pN
d300: 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
d310: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
d320: 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20  T_ROWID(.       
d330: 20 20 20 70 49 74 65 72 2d 3e 69 49 64 78 2c 20     pIter->iIdx, 
d340: 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
d350: 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69  gid, 0, pIter->i
d360: 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b  LeafPgno.    ));
d370: 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
d380: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
d390: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74  ->iLeafPgno==pIt
d3a0: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
d3b0: 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  o ){.        if(
d3c0: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
d3d0: 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 6e 20  fOffset<pNew->n 
d3e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
d3f0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
d400: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
d410: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d420: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
d430: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  fOffset;.       
d440: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
d450: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
d460: 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a 20 20  idOff, dummy;.  
d470: 20 20 20 20 20 20 66 74 73 35 4c 65 61 66 48 65        fts5LeafHe
d480: 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52 6f 77  ader(pNew, &iRow
d490: 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a  idOff, &dummy);.
d4a0: 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
d4b0: 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20  idOff ){.       
d4c0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
d4d0: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
d4e0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d4f0: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
d500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d510: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
d520: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
d530: 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26         u8 *a = &
d540: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
d550: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d560: 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74  et];.        pIt
d570: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d580: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 61 2c 20  += getVarint(a, 
d590: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
d5a0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62  owid);.        b
d5b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
d5c0: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  e{.        fts5D
d5d0: 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
d5e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d5f0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72    }..  if( pIter
d600: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 66  ->pLeaf ){.    f
d610: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
d620: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
d630: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
d640: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
d650: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
d660: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
d670: 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
d680: 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20  ently.** points 
d690: 74 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b  to a delete mark
d6a0: 65 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72  er. A delete mar
d6b0: 6b 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20  ker is an entry 
d6c0: 77 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a  with a 0 byte.**
d6d0: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a   position-list..
d6e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
d6f0: 73 35 53 65 67 49 74 65 72 49 73 44 65 6c 65 74  s5SegIterIsDelet
d700: 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
d710: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
d720: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
d730: 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
d740: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
d750: 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
d760: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
d770: 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20  advance */.){.  
d780: 69 6e 74 20 62 52 65 74 20 3d 20 30 3b 0a 20 20  int bRet = 0;.  
d790: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
d7a0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a  = pIter->pLeaf;.
d7b0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
d7c0: 49 54 45 5f 4f 4b 20 26 26 20 70 4c 65 61 66 20  ITE_OK && pLeaf 
d7d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
d7e0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3c 70 4c  ->iLeafOffset<pL
d7f0: 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  eaf->n ){.      
d800: 62 52 65 74 20 3d 20 28 70 4c 65 61 66 2d 3e 70  bRet = (pLeaf->p
d810: 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66  [pIter->iLeafOff
d820: 73 65 74 5d 3d 3d 30 78 30 30 29 3b 0a 20 20 20  set]==0x00);.   
d830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74   }else{.      Ft
d840: 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66  s5Data *pNew = f
d850: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
d860: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
d870: 44 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  D(.            p
d880: 49 74 65 72 2d 3e 69 49 64 78 2c 20 70 49 74 65  Iter->iIdx, pIte
d890: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  r->pSeg->iSegid,
d8a0: 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   0, pIter->iLeaf
d8b0: 50 67 6e 6f 2b 31 0a 20 20 20 20 20 20 29 29 3b  Pgno+1.      ));
d8c0: 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20  .      if( pNew 
d8d0: 29 7b 0a 20 20 20 20 20 20 20 20 62 52 65 74 20  ){.        bRet 
d8e0: 3d 20 28 70 4e 65 77 2d 3e 70 5b 34 5d 3d 3d 30  = (pNew->p[4]==0
d8f0: 78 30 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74  x00);.        ft
d900: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e  s5DataRelease(pN
d910: 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
d920: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d930: 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  bRet;.}../*.** A
d940: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
d950: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
d960: 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
d970: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d980: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
d990: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
d9a0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
d9b0: 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20  code. It .** is 
d9c0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
d9d0: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
d9e0: 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
d9f0: 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  EOF. If an error
da00: 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
da10: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
da20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
da30: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
da40: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
da50: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
da60: 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64  rNext(.  Fts5Ind
da70: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
da80: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
da90: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
daa0: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
dab0: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
dac0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
dad0: 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
dae0: 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20   int *pbNewTerm 
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72   /* OUT: Set for
db10: 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a   new term */.){.
db20: 20 20 61 73 73 65 72 74 28 20 70 62 4e 65 77 54    assert( pbNewT
db30: 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77  erm==0 || *pbNew
db40: 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Term==0 );.  if(
db50: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
db60: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  K ){.    if( pIt
db70: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
db80: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
db90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
dba0: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
dbb0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  t>0 ){.        u
dbc0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
dbd0: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20  eaf->p;.        
dbe0: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
dbf0: 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
dc00: 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
dc10: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
dc20: 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 0a  RowidOffset--;..
dc30: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
dc40: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
dc50: 66 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69  f = pIter->aRowi
dc60: 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69  dOffset[pIter->i
dc70: 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20  RowidOffset];.  
dc80: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
dc90: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
dca0: 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20  [iOff], nPos);. 
dcb0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
dcc0: 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 67 65 74  Pos;.        get
dcd0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
dce0: 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
dcf0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
dd00: 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61  iRowid -= iDelta
dd10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dd20: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
dd30: 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
dd40: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
dd50: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
dd60: 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
dd70: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
dd80: 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  eaf;.      int i
dd90: 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  Off;.      int b
dda0: 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
ddb0: 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
ddc0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 61 72  ;..      /* Sear
ddd0: 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  ch for the end o
dde0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
ddf0: 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20 63  ist within the c
de00: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a  urrent page. */.
de10: 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c        u8 *a = pL
de20: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e  eaf->p;.      in
de30: 74 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 6e 3b 0a  t n = pLeaf->n;.
de40: 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 70 49  .      iOff = pI
de50: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
de60: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
de70: 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  <n ){.        in
de80: 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  t nPoslist;.    
de90: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
dea0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
deb0: 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73 74 29 3b  Off], nPoslist);
dec0: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
ded0: 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20   nPoslist;.     
dee0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 4f   }..      if( iO
def0: 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
df00: 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72  /* The next entr
df10: 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72  y is on the curr
df20: 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ent page */.    
df30: 20 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a      u64 iDelta;.
df40: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
df50: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
df60: 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c  (&a[iOff], &iDel
df70: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  ta);.        pIt
df80: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
df90: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
dfa0: 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 7b  if( iDelta==0 ){
dfb0: 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65 77 54  .          bNewT
dfc0: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
dfd0: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29     if( iOff>=n )
dfe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
dff0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
e000: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
e010: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e020: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34 3b  iLeafOffset = 4;
e030: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e040: 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35 47   if( iOff!=fts5G
e050: 65 74 55 31 36 28 26 61 5b 32 5d 29 20 29 7b 0a  etU16(&a[2]) ){.
e060: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
e070: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
e080: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
e090: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
e0a0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
e0b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
e0c0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e0d0: 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
e0e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e0f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
e100: 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20  r->pSeg==0 ){.  
e110: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
e120: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  pList = 0;.     
e130: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
e140: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e  Term;.        in
e150: 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  t nList;.       
e160: 20 69 66 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e   if( 0==(pIter->
e170: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
e180: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b  ITER_ONETERM) ){
e190: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e1a0: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65  e3Fts5HashScanNe
e1b0: 78 74 28 70 2d 3e 61 70 48 61 73 68 5b 30 5d 29  xt(p->apHash[0])
e1c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
e1d0: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
e1e0: 6e 74 72 79 28 70 2d 3e 61 70 48 61 73 68 5b 30  ntry(p->apHash[0
e1f0: 5d 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73  ], &zTerm, &pLis
e200: 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
e210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
e220: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
e230: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
e240: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
e250: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
e260: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
e270: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
e280: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
e290: 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75  r->pLeaf->p = (u
e2a0: 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  8*)pList;.      
e2b0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
e2c0: 2d 3e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  ->n = nList;.   
e2d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
e2e0: 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
e2f0: 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
e300: 2c 20 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c  , strlen(zTerm),
e310: 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20   (u8*)zTerm);.  
e320: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e330: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 67 65 74  LeafOffset = get
e340: 56 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75  Varint(pList, (u
e350: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
e360: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  id);.          i
e370: 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  f( pIter->flags 
e380: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
e390: 45 56 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20  EVERSE ){.      
e3a0: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
e3b0: 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
e3c0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
e3d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e3e0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
e3f0: 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 30 3b         iOff = 0;
e400: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  .        /* Next
e410: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e   entry is not on
e420: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
e430: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  e */.        whi
e440: 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  le( iOff==0 ){. 
e450: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
e460: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
e470: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
e480: 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
e490: 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20  >pLeaf;.        
e4a0: 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
e4b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
e4c0: 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74    if( (iOff = ft
e4d0: 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
e4e0: 3e 70 5b 30 5d 29 29 20 29 7b 0a 20 20 20 20 20  >p[0])) ){.     
e4f0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
e500: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
e510: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
e520: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
e530: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
e540: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e550: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
e560: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e570: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 69       else if( (i
e580: 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
e590: 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 29 20  (&pLeaf->p[2])) 
e5a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
e5b0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e5c0: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
e5d0: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
e5e0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
e5f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e600: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  }..      /* Chec
e610: 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  k if the iterato
e620: 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e  r is now at EOF.
e630: 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65   If so, return e
e640: 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  arly. */.      i
e650: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
e660: 26 26 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20  && bNewTerm ){. 
e670: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
e680: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
e690: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
e6a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
e6b0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
e6c0: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
e6d0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e6e0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  f = 0;.        }
e6f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e700: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
e710: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b  erm(p, pIter, nK
e720: 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eep);.          
e730: 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20  if( pbNewTerm ) 
e740: 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a  *pbNewTerm = 1;.
e750: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e760: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
e770: 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49  *.** Iterator pI
e780: 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
e790: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
e7a0: 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63  t rowid in a doc
e7b0: 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  list. This.** fu
e7c0: 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
e7d0: 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74  iterator up so t
e7e0: 68 61 74 20 69 74 65 72 61 74 65 73 20 69 6e 20  hat iterates in 
e7f0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68  reverse order th
e800: 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63  rough.** the doc
e810: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
e820: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
e830: 52 65 76 65 72 73 65 28 46 74 73 35 49 6e 64 65  Reverse(Fts5Inde
e840: 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20  x *p, int iIdx, 
e850: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
e860: 65 72 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  er){.  Fts5Data 
e870: 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  *pLeaf;         
e880: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
e890: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20  t leaf data */. 
e8a0: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
e8b0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20  r->iLeafOffset; 
e8c0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
e8d0: 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c  within current l
e8e0: 65 61 66 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  eaf */.  Fts5Dat
e8f0: 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  a *pLast = 0;.  
e900: 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
e910: 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 6f 20  ;..  /* Move to 
e920: 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  the page that co
e930: 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 20  ntains the last 
e940: 72 6f 77 69 64 20 69 6e 20 74 68 69 73 20 64 6f  rowid in this do
e950: 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 4c 65 61  clist. */.  pLea
e960: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
e970: 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
e980: 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e  pDlidx ){.    in
e990: 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72  t iSegid = pIter
e9a0: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
e9b0: 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70      pgnoLast = p
e9c0: 49 74 65 72 2d 3e 70 44 6c 69 64 78 2d 3e 69 4c  Iter->pDlidx->iL
e9d0: 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 70 4c 61  eafPgno;.    pLa
e9e0: 73 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  st = fts5DataRea
e9f0: 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  d(p, FTS5_SEGMEN
ea00: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53  T_ROWID(iIdx, iS
ea10: 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f 4c 61 73  egid, 0, pgnoLas
ea20: 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t));.  }else{.  
ea30: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c    while( iOff<pL
ea40: 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  eaf->n ){.      
ea50: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
ea60: 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20  i64 iDelta;..   
ea70: 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c     /* Position l
ea80: 69 73 74 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ist size in byte
ea90: 73 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20  s */.      iOff 
eaa0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
eab0: 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
eac0: 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20  f], nPos);.     
ead0: 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20   iOff += nPos;. 
eae0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70       if( iOff>=p
eaf0: 4c 65 61 66 2d 3e 6e 20 29 20 62 72 65 61 6b 3b  Leaf->n ) break;
eb00: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ..      /* Rowid
eb10: 20 64 65 6c 74 61 2e 20 4f 72 2c 20 69 66 20 30   delta. Or, if 0
eb20: 78 30 30 2c 20 74 68 65 20 65 6e 64 20 6f 66 20  x00, the end of 
eb30: 64 6f 63 6c 69 73 74 20 6d 61 72 6b 65 72 2e 20  doclist marker. 
eb40: 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20  */.      nPos = 
eb50: 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  getVarint(&pLeaf
eb60: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
eb70: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
eb80: 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
eb90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 4f   break;.      iO
eba0: 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  ff += nPos;.    
ebb0: 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  }..    if( iOff>
ebc0: 3d 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  =pLeaf->n ){.   
ebd0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
ebe0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
ebf0: 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 20  pIter->pSeg;.   
ec00: 20 20 20 69 36 34 20 69 41 62 73 20 3d 20 46 54     i64 iAbs = FT
ec10: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
ec20: 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65  (iIdx, pSeg->iSe
ec30: 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69  gid, 0, pIter->i
ec40: 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
ec50: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
ec60: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
ec70: 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67  iIdx, pSeg->iSeg
ec80: 69 64 2c 20 30 2c 20 70 53 65 67 2d 3e 70 67 6e  id, 0, pSeg->pgn
ec90: 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f  oLast);..      /
eca0: 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64  * The last rowid
ecb0: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20   in the doclist 
ecc0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68  may not be on th
ecd0: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
ece0: 53 65 61 72 63 68 0a 20 20 20 20 20 20 20 2a 2a  Search.       **
ecf0: 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64   forward to find
ed00: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
ed10: 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f  ning the last ro
ed20: 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66  wid.  */.      f
ed30: 6f 72 28 69 41 62 73 2b 2b 3b 20 70 2d 3e 72 63  or(iAbs++; p->rc
ed40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
ed50: 41 62 73 3c 3d 69 4c 61 73 74 3b 20 69 41 62 73  Abs<=iLast; iAbs
ed60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73  ++){.        Fts
ed70: 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74  5Data *pNew = ft
ed80: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 41  s5DataRead(p, iA
ed90: 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  bs);.        if(
eda0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
edb0: 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 69     int iRowid, i
edc0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Term;.          
edd0: 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28 70  fts5LeafHeader(p
ede0: 4e 65 77 2c 20 26 69 52 6f 77 69 64 2c 20 26 69  New, &iRowid, &i
edf0: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  Term);.         
ee00: 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20   if( iRowid ){. 
ee10: 20 20 20 20 20 20 20 20 20 20 20 46 74 73 35 44             Fts5D
ee20: 61 74 61 20 2a 70 54 6d 70 20 3d 20 70 4c 61 73  ata *pTmp = pLas
ee30: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  t;.            p
ee40: 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Last = pNew;.   
ee50: 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
ee60: 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 20 20  pTmp;.          
ee70: 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 69 41 62    pgnoLast = iAb
ee80: 73 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  s & (((i64)1 << 
ee90: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
eea0: 29 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ) - 1);.        
eeb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
eec0: 28 20 69 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  ( iTerm ){.     
eed0: 20 20 20 20 20 20 20 69 41 62 73 20 3d 20 69 4c         iAbs = iL
eee0: 61 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ast;.          }
eef0: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
ef00: 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
ef10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ef20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
ef30: 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20   /* If pLast is 
ef40: 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
ef50: 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  nt, then the las
ef60: 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73  t rowid for this
ef70: 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69   doclist.  ** li
ef80: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63  es on the page c
ef90: 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74  urrently indicat
efa0: 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
efb0: 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
efc0: 20 0a 20 20 2a 2a 20 69 4c 61 73 74 4f 66 66 20   .  ** iLastOff 
efd0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
efe0: 6c 75 65 20 74 68 61 74 20 70 49 74 65 72 2d 3e  lue that pIter->
eff0: 69 4c 65 61 66 4f 66 66 73 65 74 20 77 69 6c 6c  iLeafOffset will
f000: 20 74 61 6b 65 20 77 68 65 6e 0a 20 20 2a 2a 20   take when.  ** 
f010: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
f020: 6e 74 73 20 74 6f 20 74 68 61 74 20 72 6f 77 69  nts to that rowi
f030: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c  d..  **.  ** Or,
f040: 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e   if pLast is non
f050: 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69  -NULL, then it i
f060: 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
f070: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73  contains the las
f080: 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 0a 20 20  t.  ** rowid..  
f090: 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29  */.  if( pLast )
f0a0: 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b  {.    int dummy;
f0b0: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
f0c0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
f0d0: 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
f0e0: 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20  Leaf = pLast;.  
f0f0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
f100: 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20  no = pgnoLast;. 
f110: 20 20 20 66 74 73 35 4c 65 61 66 48 65 61 64 65     fts5LeafHeade
f120: 72 28 70 4c 61 73 74 2c 20 26 69 4f 66 66 2c 20  r(pLast, &iOff, 
f130: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66  &dummy);.    iOf
f140: 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  f += getVarint(&
f150: 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLast->p[iOff], 
f160: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
f170: 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72  owid);.    pIter
f180: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
f190: 69 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  iOff;.  }..  fts
f1a0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
f1b0: 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
f1c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  );.}../*.** Iter
f1d0: 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
f1e0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
f1f0: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
f200: 66 20 61 20 64 6f 63 6c 69 73 74 20 77 69 74 68  f a doclist with
f210: 69 6e 0a 2a 2a 20 69 6e 64 65 78 20 69 49 64 78  in.** index iIdx
f220: 2e 20 54 68 65 72 65 20 69 73 20 61 20 64 6f 63  . There is a doc
f230: 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63  list-index assoc
f240: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
f250: 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 0a 2a 2a 20  inal term on.** 
f260: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f270: 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  . If the current
f280: 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73   term is the las
f290: 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70 61  t term on the pa
f2a0: 67 65 2c 20 0a 2a 2a 20 6c 6f 61 64 20 74 68 65  ge, .** load the
f2b0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66   doclist-index f
f2c0: 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e 69  rom disk and ini
f2d0: 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72 61  tialize an itera
f2e0: 74 6f 72 20 61 74 20 0a 2a 2a 20 28 70 49 74 65  tor at .** (pIte
f2f0: 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73  r->pDlidx)..*/.s
f300: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
f310: 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28  egIterLoadDlidx(
f320: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
f330: 74 20 69 49 64 78 2c 20 46 74 73 35 53 65 67 49  t iIdx, Fts5SegI
f340: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
f350: 6e 74 20 69 53 65 67 20 3d 20 70 49 74 65 72 2d  nt iSeg = pIter-
f360: 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
f370: 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74   int bRev = (pIt
f380: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
f390: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
f3a0: 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  );.  Fts5Data *p
f3b0: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
f3c0: 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  eaf; /* Current 
f3d0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 69  leaf data */.  i
f3e0: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
f3f0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f  >iLeafOffset;  /
f400: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69  * Byte offset wi
f410: 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61  thin current lea
f420: 66 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  f */..  assert( 
f430: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
f440: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
f450: 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ERM );.  assert(
f460: 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d   pIter->pDlidx==
f470: 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
f480: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
f490: 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20  doclist ends on 
f4a0: 74 68 69 73 20 70 61 67 65 2e 20 49 66 20 69 74  this page. If it
f4b0: 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20   does, return.  
f4c0: 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74  ** early without
f4d0: 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63   loading the doc
f4e0: 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69  list-index (as i
f4f0: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64  t belongs to a d
f500: 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65  ifferent.  ** te
f510: 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74  rm. */.  if( pIt
f520: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  er->iTermLeafPgn
f530: 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o==pIter->iLeafP
f540: 67 6e 6f 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  gno ){.    while
f550: 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20  ( iOff<pLeaf->n 
f560: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  ){.      i64 iDe
f570: 6c 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lta;.      int n
f580: 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20 20 20  Poslist;..      
f590: 2f 2a 20 69 4f 66 66 20 69 73 20 63 75 72 72 65  /* iOff is curre
f5a0: 6e 74 6c 79 20 74 68 65 20 6f 66 66 73 65 74 20  ntly the offset 
f5b0: 6f 66 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c  of the size fiel
f5c0: 64 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e 20  d of a position 
f5d0: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69  list. */.      i
f5e0: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
f5f0: 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
f600: 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73 74  [iOff], nPoslist
f610: 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  );.      iOff +=
f620: 20 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20   nPoslist;..    
f630: 20 20 69 66 28 20 69 4f 66 66 3c 70 4c 65 61 66    if( iOff<pLeaf
f640: 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ->n ){.        i
f650: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
f660: 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
f670: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
f680: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 44  ;.        if( iD
f690: 65 6c 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  elta==0 ) return
f6a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f6b0: 20 20 7d 0a 0a 20 20 66 74 73 35 44 6c 69 64 78    }..  fts5Dlidx
f6c0: 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76  IterInit(p, bRev
f6d0: 2c 20 69 49 64 78 2c 20 69 53 65 67 2c 20 70 49  , iIdx, iSeg, pI
f6e0: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
f6f0: 6e 6f 2c 20 26 70 49 74 65 72 2d 3e 70 44 6c 69  no, &pIter->pDli
f700: 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dx);.}../*.** In
f710: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a  itialize the obj
f720: 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ect pIter to poi
f730: 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d  nt to term pTerm
f740: 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65  /nTerm within se
f750: 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2c 20 69  gment.** pSeg, i
f760: 6e 64 65 78 20 69 49 64 78 2e 20 49 66 20 74 68  ndex iIdx. If th
f770: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74  ere is no such t
f780: 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78  erm in the index
f790: 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a  , the iterator.*
f7a0: 2a 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e  * is set to EOF.
f7b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
f7c0: 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
f7d0: 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
f7e0: 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
f7f0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
f800: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73  .** an error has
f810: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
f820: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
f830: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
f840: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
f850: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
f860: 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69  s5SegIterSeekIni
f870: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
f880: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
f890: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
f8a0: 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  kend */.  int iI
f8b0: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
f8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
f8d0: 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65  fig.aHash[] inde
f8e0: 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a  x of FTS index *
f8f0: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
f900: 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
f910: 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
f920: 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
f930: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
f940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
f950: 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
f960: 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
f970: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
f980: 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
f990: 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
f9a0: 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  f segment */.  F
f9b0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
f9c0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
f9d0: 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  * Object to popu
f9e0: 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  late */.){.  int
f9f0: 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20   iPg = 1;.  int 
fa00: 68 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28  h;.  int bGe = (
fa10: 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
fa20: 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29  EX_QUERY_PREFIX)
fa30: 20 26 26 20 69 49 64 78 3d 3d 30 29 3b 0a 20 20   && iIdx==0);.  
fa40: 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b 20  int bDlidx = 0; 
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
fa70: 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
fa80: 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dex */..  assert
fa90: 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61  ( bGe==0 || (fla
faa0: 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
fab0: 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b  UERY_DESC)==0 );
fac0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d  .  assert( pTerm
fad0: 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d   && nTerm );.  m
fae0: 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
faf0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
fb00: 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d  .  pIter->pSeg =
fb10: 20 70 53 65 67 3b 0a 20 20 70 49 74 65 72 2d 3e   pSeg;.  pIter->
fb20: 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 0a 20 20  iIdx = iIdx;..  
fb30: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
fb40: 74 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ts stack variabl
fb50: 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65 61  e iPg to the lea
fb60: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  f page number th
fb70: 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74  at may.  ** cont
fb80: 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d 2f  ain term (pTerm/
fb90: 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69 73  nTerm), if it is
fba0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
fbb0: 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 66 6f  segment. */.  fo
fbc0: 72 28 68 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68  r(h=pSeg->nHeigh
fbd0: 74 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d 29 7b 0a  t-1; h>0; h--){.
fbe0: 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72      Fts5NodeIter
fbf0: 20 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20   node;          
fc00: 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61      /* For itera
fc10: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 74  ting through int
fc20: 65 72 6e 61 6c 20 6e 6f 64 65 73 20 2a 2f 0a 20  ernal nodes */. 
fc30: 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
fc40: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
fc50: 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69  ID(iIdx, pSeg->i
fc60: 53 65 67 69 64 2c 20 68 2c 20 69 50 67 29 3b 0a  Segid, h, iPg);.
fc70: 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e      Fts5Data *pN
fc80: 6f 64 65 20 3d 20 66 74 73 35 44 61 74 61 52 65  ode = fts5DataRe
fc90: 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ad(p, iRowid);. 
fca0: 20 20 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20     if( pNode==0 
fcb0: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 66 74  ) break;..    ft
fcc0: 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
fcd0: 4e 6f 64 65 2d 3e 70 2c 20 70 4e 6f 64 65 2d 3e  Node->p, pNode->
fce0: 6e 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20 20 61  n, &node);.    a
fcf0: 73 73 65 72 74 28 20 6e 6f 64 65 2e 74 65 72 6d  ssert( node.term
fd00: 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 50  .n==0 );..    iP
fd10: 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b  g = node.iChild;
fd20: 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f  .    bDlidx = no
fd30: 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20 66  de.bDlidx;.    f
fd40: 6f 72 28 66 74 73 35 4e 6f 64 65 49 74 65 72 4e  or(fts5NodeIterN
fd50: 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64  ext(&p->rc, &nod
fd60: 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 6f 64 65  e);.        node
fd70: 2e 61 44 61 74 61 20 26 26 20 66 74 73 35 42 75  .aData && fts5Bu
fd80: 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28  fferCompareBlob(
fd90: 26 6e 6f 64 65 2e 74 65 72 6d 2c 20 70 54 65 72  &node.term, pTer
fda0: 6d 2c 20 6e 54 65 72 6d 29 3c 3d 30 3b 0a 20 20  m, nTerm)<=0;.  
fdb0: 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74        fts5NodeIt
fdc0: 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26  erNext(&p->rc, &
fdd0: 6e 6f 64 65 29 0a 20 20 20 20 29 7b 0a 20 20 20  node).    ){.   
fde0: 20 20 20 69 50 67 20 3d 20 6e 6f 64 65 2e 69 43     iPg = node.iC
fdf0: 68 69 6c 64 3b 0a 20 20 20 20 20 20 62 44 6c 69  hild;.      bDli
fe00: 64 78 20 3d 20 6e 6f 64 65 2e 62 44 6c 69 64 78  dx = node.bDlidx
fe10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
fe20: 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 6e 6f  NodeIterFree(&no
fe30: 64 65 29 3b 0a 20 20 20 20 66 74 73 35 44 61 74  de);.    fts5Dat
fe40: 61 52 65 6c 65 61 73 65 28 70 4e 6f 64 65 29 3b  aRelease(pNode);
fe50: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 50 67 3c  .  }..  if( iPg<
fe60: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
fe70: 29 7b 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65  ){.    iPg = pSe
fe80: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20  g->pgnoFirst;.  
fe90: 20 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20    bDlidx = 0;.  
fea0: 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  }..  pIter->iLea
feb0: 66 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b  fPgno = iPg - 1;
fec0: 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  .  fts5SegIterNe
fed0: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
fee0: 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
fef0: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  pLeaf ){.    int
ff00: 20 72 65 73 3b 0a 20 20 20 20 70 49 74 65 72 2d   res;.    pIter-
ff10: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
ff20: 74 73 35 47 65 74 55 31 36 28 26 70 49 74 65 72  ts5GetU16(&pIter
ff30: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a  ->pLeaf->p[2]);.
ff40: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
ff50: 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72  oadTerm(p, pIter
ff60: 2c 20 30 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  , 0);.    do {. 
ff70: 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35 42       res = fts5B
ff80: 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
ff90: 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70  (&pIter->term, p
ffa0: 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
ffb0: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
ffc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 74   break;.      ft
ffd0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
ffe0: 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20   pIter, 0);.    
fff0: 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 70  }while( pIter->p
10000 4c 65 61 66 20 26 26 20 70 2d 3e 72 63 3d 3d 53  Leaf && p->rc==S
10010 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20  QLITE_OK );..   
10020 20 69 66 28 20 62 47 65 3d 3d 30 20 26 26 20 72   if( bGe==0 && r
10030 65 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  es ){.      /* S
10040 65 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70  et iterator to p
10050 6f 69 6e 74 20 74 6f 20 45 4f 46 20 2a 2f 0a 20  oint to EOF */. 
10060 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
10070 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
10080 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  f);.      pIter-
10090 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
100a0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
100b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
100c0 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70   bGe==0 ){.    p
100d0 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
100e0 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
100f0 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74  ERM;.    if( pIt
10100 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
10110 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
10120 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
10130 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ESC ){.        p
10140 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
10150 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
10160 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RSE;.      }.   
10170 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b     if( bDlidx ){
10180 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
10190 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c  IterLoadDlidx(p,
101a0 20 69 49 64 78 2c 20 70 49 74 65 72 29 3b 0a 20   iIdx, pIter);. 
101b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
101c0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
101d0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
101e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
101f0 49 74 65 72 52 65 76 65 72 73 65 28 70 2c 20 69  IterReverse(p, i
10200 49 64 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  Idx, pIter);.   
10210 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
10220 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
10230 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49  ze the object pI
10240 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ter to point to 
10250 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
10260 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 69   within the.** i
10270 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
10280 62 6c 65 20 69 49 64 78 2e 20 49 66 20 74 68 65  ble iIdx. If the
10290 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65  re is no such te
102a0 72 6d 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c  rm in the table,
102b0 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 6f   the .** iterato
102c0 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e  r is set to EOF.
102d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
102e0 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
102f0 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
10300 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
10310 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
10320 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73  .** an error has
10330 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
10340 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
10350 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
10360 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
10370 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10380 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69  s5SegIterHashIni
10390 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
103a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
103b0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
103c0 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  kend */.  int iI
103d0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
103e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
103f0 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65  fig.aHash[] inde
10400 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a  x of FTS index *
10410 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
10420 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
10430 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
10440 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
10450 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
10460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
10470 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
10480 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
10490 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
104a0 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
104b0 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
104c0 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 46 74  ulate */.){.  Ft
104d0 73 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  s5Hash *pHash = 
104e0 70 2d 3e 61 70 48 61 73 68 5b 69 49 64 78 5d 3b  p->apHash[iIdx];
104f0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69  .  const u8 *pLi
10500 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c  st = 0;.  int nL
10510 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  ist = 0;.  const
10520 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e   u8 *z = 0;.  in
10530 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  t n = 0;..  asse
10540 72 74 28 20 70 48 61 73 68 20 29 3b 0a 20 20 61  rt( pHash );.  a
10550 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
10560 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
10570 28 20 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 69  ( pTerm==0 || (i
10580 49 64 78 3d 3d 30 20 26 26 20 28 66 6c 61 67 73  Idx==0 && (flags
10590 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
105a0 52 59 5f 50 52 45 46 49 58 29 29 20 29 7b 0a 20  RY_PREFIX)) ){. 
105b0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
105c0 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e  e3Fts5HashScanIn
105d0 69 74 28 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  it(pHash, (const
105e0 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
105f0 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  erm);.    sqlite
10600 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
10610 72 79 28 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  ry(pHash, (const
10620 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69   char**)&z, &pLi
10630 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20  st, &nList);.   
10640 20 6e 20 3d 20 28 7a 20 3f 20 73 74 72 6c 65 6e   n = (z ? strlen
10650 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 29  ((const char*)z)
10660 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   : 0);.  }else{.
10670 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
10680 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
10690 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73 71  _ONETERM;.    sq
106a0 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75 65  lite3Fts5HashQue
106b0 72 79 28 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  ry(pHash, (const
106c0 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
106d0 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
106e0 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54  ist);.    z = pT
106f0 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65  erm;.    n = nTe
10700 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rm;.  }..  if( p
10710 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35  List ){.    Fts5
10720 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
10730 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
10740 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
10750 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a  Iter->term, n, z
10760 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
10770 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
10780 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
10790 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
107a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
107b0 20 20 70 4c 65 61 66 2d 3e 6e 52 65 66 20 3d 20    pLeaf->nRef = 
107c0 31 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70 20  1;.    pLeaf->p 
107d0 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20  = (u8*)pList;.  
107e0 20 20 70 4c 65 61 66 2d 3e 6e 20 3d 20 6e 4c 69    pLeaf->n = nLi
107f0 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  st;.    pIter->p
10800 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20  Leaf = pLeaf;.  
10810 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
10820 66 73 65 74 20 3d 20 67 65 74 56 61 72 69 6e 74  fset = getVarint
10830 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a  (pLeaf->p, (u64*
10840 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
10850 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  ;..    if( flags
10860 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
10870 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  RY_DESC ){.     
10880 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
10890 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
108a0 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66 74 73  VERSE;.      fts
108b0 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
108c0 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
108d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
108e0 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69  /*.** Zero the i
108f0 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
10900 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
10910 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
10920 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43  oid fts5SegIterC
10930 6c 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72  lear(Fts5SegIter
10940 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35   *pIter){.  fts5
10950 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65  BufferFree(&pIte
10960 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35  r->term);.  fts5
10970 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
10980 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73  r->pLeaf);.  fts
10990 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
109a0 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20  Iter->pDlidx);. 
109b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
109c0 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
109d0 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  t);.  memset(pIt
109e0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
109f0 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a  s5SegIter));.}..
10a00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
10a10 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BUG../*.** This 
10a20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
10a30 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
10a40 62 69 67 20 61 73 73 65 72 74 28 29 20 70 72 6f  big assert() pro
10a50 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74  cedure implement
10a60 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41 73 73  ed by.** fts5Ass
10a70 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
10a80 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65 73 20  p(). It ensures 
10a90 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20  that the result 
10aa0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
10ab0 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69 73 20  .** in *pRes is 
10ac0 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75  the correct resu
10ad0 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
10ae0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
10af0 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tions of the.** 
10b00 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  two iterators..*
10b10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10b20 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73  s5AssertComparis
10b30 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74 73 35  onResult(.  Fts5
10b40 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
10b50 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67 49  ter, .  Fts5SegI
10b60 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35 53  ter *p1,.  Fts5S
10b70 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46 74  egIter *p2,.  Ft
10b80 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 0a  s5CResult *pRes.
10b90 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70 31  ){.  int i1 = p1
10ba0 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a   - pIter->aSeg;.
10bb0 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d 20    int i2 = p2 - 
10bc0 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20 20  pIter->aSeg;..  
10bd0 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c 7c  if( p1->pLeaf ||
10be0 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20   p2->pLeaf ){.  
10bf0 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d    if( p1->pLeaf=
10c00 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
10c10 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74  rt( pRes->iFirst
10c20 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73  ==i2 );.    }els
10c30 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d  e if( p2->pLeaf=
10c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
10c50 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74  rt( pRes->iFirst
10c60 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c 73  ==i1 );.    }els
10c70 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 69  e{.      int nMi
10c80 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72 6d  n = MIN(p1->term
10c90 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b  .n, p2->term.n);
10ca0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
10cb0 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d   memcmp(p1->term
10cc0 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20  .p, p2->term.p, 
10cd0 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  nMin);.      if(
10ce0 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20   res==0 ) res = 
10cf0 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d  p1->term.n - p2-
10d00 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20  >term.n;..      
10d10 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
10d20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
10d30 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29  es->bTermEq==1 )
10d40 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
10d50 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32  ( p1->iRowid!=p2
10d60 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->iRowid );.    
10d70 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e      res = ((p1->
10d80 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f  iRowid > p2->iRo
10d90 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
10da0 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20  v) ? -1 : 1;.   
10db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10dc0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
10dd0 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20  bTermEq==0 );.  
10de0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
10df0 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
10e00 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
10e10 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20  iFirst==i1 );.  
10e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10e30 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
10e40 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20  >iFirst==i2 );. 
10e50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
10e70 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
10e80 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45  op unless SQLITE
10e90 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
10ea0 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75  d when this modu
10eb0 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65  le.** is compile
10ec0 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  d. In that case,
10ed0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10ee0 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e  s essentially an
10ef0 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74   assert() .** st
10f00 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20  atement used to 
10f10 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
10f20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
10f30 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20  pIter->aFirst[] 
10f40 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72  array.** are cor
10f50 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
10f60 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 4d  void fts5AssertM
10f70 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 46 74  ultiIterSetup(Ft
10f80 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
10f90 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
10fa0 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
10fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10fc0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
10fd0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
10fe0 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20 20  >nSeg; i+=2){.  
10ff0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
11000 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p1 = &pIter->aS
11010 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74 73  eg[i];.      Fts
11020 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26  5SegIter *p2 = &
11030 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31 5d  pIter->aSeg[i+1]
11040 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65 73  ;.      Fts5CRes
11050 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74  ult *pRes = &pIt
11060 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49 74 65  er->aFirst[(pIte
11070 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20 32  r->nSeg + i) / 2
11080 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73 73  ];.      fts5Ass
11090 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73  ertComparisonRes
110a0 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70  ult(pIter, p1, p
110b0 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a  2, pRes);.    }.
110c0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
110d0 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20 32  (pIter->nSeg / 2
110e0 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  ); i+=2){.      
110f0 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
11100 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
11110 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74 73  st[i];.      Fts
11120 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26  5SegIter *p1 = &
11130 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
11140 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e  er->aFirst[i*2].
11150 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20  iFirst ];.      
11160 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 20  Fts5SegIter *p2 
11170 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
11180 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a  pIter->aFirst[i*
11190 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 0a  2+1].iFirst ];..
111a0 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
111b0 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
111c0 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20  (pIter, p1, p2, 
111d0 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pRes);.    }.  }
111e0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
111f0 65 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  e fts5AssertMult
11200 69 49 74 65 72 53 65 74 75 70 28 78 2c 79 29 0a  iIterSetup(x,y).
11210 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f  #endif../*.** Do
11220 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
11230 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f 70  necessary to pop
11240 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46 69  ulate pIter->aFi
11250 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a  rst[iOut]..**.**
11260 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
11270 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65   value is non-ze
11280 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
11290 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65  he index of an e
112a0 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ntry.** in the p
112b0 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72  Iter->aSeg[] arr
112c0 61 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6e  ay that is (a) n
112d0 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20 28  ot at EOF, and (
112e0 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  b) pointing.** t
112f0 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20  o a key that is 
11300 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
11310 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20 70  nother, higher p
11320 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67  riority, .** seg
11330 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69 6e  ment-iterator in
11340 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67 5b   the pSeg->aSeg[
11350 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
11360 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
11370 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46 74  IterDoCompare(Ft
11380 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
11390 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29  pIter, int iOut)
113a0 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20  {.  int i1;     
113b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
113d0 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65  left-hand Fts5Se
113e0 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  gIter */.  int i
113f0 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
11400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
11410 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e  dex of right-han
11420 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
11430 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46  .  int iRes;.  F
11440 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20  ts5SegIter *p1; 
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11460 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35  * Left-hand Fts5
11470 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73  SegIter */.  Fts
11480 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20  5SegIter *p2;   
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
114a0 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53  Right-hand Fts5S
114b0 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35  egIter */.  Fts5
114c0 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
114d0 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69  &pIter->aFirst[i
114e0 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  Out];..  assert(
114f0 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65   iOut<pIter->nSe
11500 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20  g && iOut>0 );. 
11510 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
11520 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72  bRev==0 || pIter
11530 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20  ->bRev==1 );..  
11540 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72  if( iOut>=(pIter
11550 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20  ->nSeg/2) ){.   
11560 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49   i1 = (iOut - pI
11570 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32  ter->nSeg/2) * 2
11580 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20  ;.    i2 = i1 + 
11590 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
115a0 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  i1 = pIter->aFir
115b0 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73  st[iOut*2].iFirs
115c0 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65  t;.    i2 = pIte
115d0 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32  r->aFirst[iOut*2
115e0 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a  +1].iFirst;.  }.
115f0 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61    p1 = &pIter->a
11600 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20  Seg[i1];.  p2 = 
11610 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d  &pIter->aSeg[i2]
11620 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72 6d  ;..  pRes->bTerm
11630 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 31  Eq = 0;.  if( p1
11640 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20  ->pLeaf==0 ){   
11650 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31          /* If p1
11660 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20   is at EOF */.  
11670 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d    iRes = i2;.  }
11680 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65  else if( p2->pLe
11690 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20  af==0 ){     /* 
116a0 49 66 20 70 32 20 69 73 20 61 74 20 45 4f 46 20  If p2 is at EOF 
116b0 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31  */.    iRes = i1
116c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
116d0 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42 75 66  nt res = fts5Buf
116e0 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e  ferCompare(&p1->
116f0 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29  term, &p2->term)
11700 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ;.    if( res==0
11710 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11720 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20 20  ( i2>i1 );.     
11730 20 61 73 73 65 72 74 28 20 69 32 21 3d 30 20 29   assert( i2!=0 )
11740 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62 54  ;.      pRes->bT
11750 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  ermEq = 1;.     
11760 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d   if( p1->iRowid=
11770 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 20 72 65  =p2->iRowid ) re
11780 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 72  turn i2;.      r
11790 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69  es = ((p1->iRowi
117a0 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d  d > p2->iRowid)=
117b0 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20  =pIter->bRev) ? 
117c0 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  -1 : +1;.    }. 
117d0 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d     assert( res!=
117e0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  0 );.    if( res
117f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73  <0 ){.      iRes
11800 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = i1;.    }else
11810 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
11820 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
11830 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 69  pRes->iFirst = i
11840 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  Res;.  return 0;
11850 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
11860 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74  he seg-iter so t
11870 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
11880 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
11890 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67   on page iLeafPg
118a0 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  no..** It is an 
118b0 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c  error if leaf iL
118c0 65 61 66 50 67 6e 6f 20 63 6f 6e 74 61 69 6e 73  eafPgno contains
118d0 20 6e 6f 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74   no rowid..*/.st
118e0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
118f0 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20  gIterGotoPage(. 
11900 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
11910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11920 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
11930 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
11940 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
11950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11960 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
11970 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  nce */.  int iLe
11980 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65  afPgno.){.  asse
11990 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  rt( iLeafPgno>pI
119a0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
119b0 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
119c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
119d0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
119e0 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a   = iLeafPgno-1;.
119f0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
11a00 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
11a10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
11a20 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
11a30 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  || pIter->iLeafP
11a40 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29  gno==iLeafPgno )
11a50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
11a60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11a70 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
11a80 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72     u8 *a = pIter
11a90 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
11aa0 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70  int n = pIter->p
11ab0 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20 69 4f  Leaf->n;..    iO
11ac0 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
11ad0 26 61 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  &a[0]);.    if( 
11ae0 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d  iOff<4 || iOff>=
11af0 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  n ){.      p->rc
11b00 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
11b10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11b20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
11b30 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
11b40 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
11b50 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  id);.      pIter
11b60 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
11b70 69 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iOff;.    }.  }.
11b80 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
11b90 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
11ba0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
11bb0 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69  nd argument unti
11bc0 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a  l it is at or .*
11bd0 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72  * past rowid iFr
11be0 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  om. Regardless o
11bf0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  f the value of i
11c00 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74  From, the iterat
11c10 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  or is.** always 
11c20 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73  advanced at leas
11c30 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  t once..*/.stati
11c40 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
11c50 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
11c60 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11c80 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
11c90 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
11ca0 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
11cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
11cc0 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
11cd0 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68   */.  i64 iMatch
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
11d00 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61   iterator at lea
11d10 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29  st this far */.)
11d20 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28  {.  int bRev = (
11d30 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
11d40 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
11d50 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64  RSE);.  Fts5Dlid
11d60 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
11d70 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20  pIter->pDlidx;. 
11d80 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d   int iLeafPgno =
11d90 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
11da0 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d  o;.  int bMove =
11db0 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   1;..  assert( p
11dc0 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
11dd0 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
11de0 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RM );.  assert( 
11df0 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b  pIter->pDlidx );
11e00 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
11e10 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66  ->pLeaf );..  if
11e20 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
11e30 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
11e40 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
11e50 64 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68  dx)==0 && iMatch
11e60 3e 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  >pDlidx->iRowid 
11e70 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67  ){.      iLeafPg
11e80 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65  no = pDlidx->iLe
11e90 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74  afPgno;.      ft
11ea0 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
11eb0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20  pDlidx);.    }. 
11ec0 20 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66     assert( iLeaf
11ed0 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno>=pIter->iLe
11ee0 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20  afPgno || p->rc 
11ef0 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66  );.    if( iLeaf
11f00 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
11f10 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66  fPgno ){.      f
11f20 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
11f30 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65  ge(p, pIter, iLe
11f40 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62  afPgno);.      b
11f50 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
11f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
11f70 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65  ert( iMatch<pIte
11f80 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  r->iRowid );.   
11f90 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
11fa0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
11fb0 64 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68  dx)==0 && iMatch
11fc0 3c 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  <pDlidx->iRowid 
11fd0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
11fe0 64 78 49 74 65 72 50 72 65 76 28 70 44 6c 69 64  dxIterPrev(pDlid
11ff0 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c  x);.    }.    iL
12000 65 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64 78  eafPgno = pDlidx
12010 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20  ->iLeafPgno;..  
12020 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c    assert( fts5Dl
12030 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
12040 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67  lidx) || iLeafPg
12050 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no<=pIter->iLeaf
12060 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28  Pgno );..    if(
12070 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72   iLeafPgno<pIter
12080 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
12090 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
120a0 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
120b0 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53  o+1;.      fts5S
120c0 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
120d0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
120e0 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b        bMove = 0;
120f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68  .    }.  }..  wh
12100 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66  ile( 1 ){.    if
12110 28 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65  ( bMove ) fts5Se
12120 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  gIterNext(p, pIt
12130 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
12140 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
12150 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
12160 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65   bRev==0 && pIte
12170 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  r->iRowid>=iMatc
12180 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
12190 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49  f( bRev!=0 && pI
121a0 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61  ter->iRowid<=iMa
121b0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
121c0 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a   bMove = 1;.  }.
121d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  }.../*.** Free t
121e0 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
121f0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
12200 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12220 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
12230 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ee(Fts5Index *p,
12240 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
12250 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
12260 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e   pIter ){.    in
12270 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
12280 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
12290 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
122a0 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70  5SegIterClear(&p
122b0 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a  Iter->aSeg[i]);.
122c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
122d0 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20  3_free(pIter);. 
122e0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
122f0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  d fts5MultiIterA
12300 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49  dvanced(.  Fts5I
12310 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
12320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
12330 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
12340 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
12350 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
12360 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
12370 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
12380 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
12390 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
123a0 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20  int iChanged,   
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123c0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
123d0 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
123e0 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  vanced */.  int 
123f0 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20  iMinset         
12400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12410 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20  inimum entry in 
12420 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20  aFirst[] to set 
12430 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
12440 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
12450 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
12460 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70   i>=iMinset && p
12470 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  ->rc==SQLITE_OK;
12480 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74   i=i/2){.    int
12490 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69   iEq;.    if( (i
124a0 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
124b0 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65  erDoCompare(pIte
124c0 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20  r, i)) ){.      
124d0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
124e0 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
124f0 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iEq], 0);.      
12500 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20  i = pIter->nSeg 
12510 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  + iEq;.    }.  }
12520 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
12530 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
12540 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35  nceRowid(.  Fts5
12550 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
12560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12570 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
12580 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
12590 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
125a0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
125b0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
125c0 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
125d0 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
125e0 20 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20   int iChanged   
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12600 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
12610 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
12620 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20  dvanced */.){.  
12630 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 53 65 67  int i;.  Fts5Seg
12640 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49  Iter *pNew = &pI
12650 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
12660 65 64 5d 3b 0a 20 20 46 74 73 35 53 65 67 49 74  ed];.  Fts5SegIt
12670 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49  er *pOther = &pI
12680 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
12690 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 0a 20  ed ^ 0x0001];.. 
126a0 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
126b0 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
126c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
126d0 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 46  K; i=i/2){.    F
126e0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
126f0 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
12700 74 5b 69 5d 3b 0a 0a 20 20 20 20 61 73 73 65 72  t[i];..    asser
12710 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29  t( pNew->pLeaf )
12720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
12730 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c  es->bTermEq==0 |
12740 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20  | pOther->pLeaf 
12750 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
12760 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b  pRes->bTermEq ){
12770 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
12780 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d  >iRowid==pOther-
12790 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
127a0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
127b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
127c0 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65  ther->iRowid>pNe
127d0 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  w->iRowid)==pIte
127e0 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  r->bRev ){.     
127f0 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72     pNew = pOther
12800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12810 20 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74      pRes->iFirst
12820 20 3d 20 28 70 4e 65 77 20 2d 20 70 49 74 65 72   = (pNew - pIter
12830 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 69 66 28  ->aSeg);.    if(
12840 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a   i==1 ) break;..
12850 20 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49      pOther = &pI
12860 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
12870 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30  ->aFirst[i ^ 0x0
12880 30 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  001].iFirst ];. 
12890 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
128a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
128b0 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
128c0 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
128d0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
128e0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
128f0 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
12900 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  n Fts5Index.rc. 
12910 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  It is not .** co
12920 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
12930 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
12940 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f  r reaches EOF, o
12950 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
12960 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68  dy at .** EOF wh
12970 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
12980 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
12990 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
129a0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20  ultiIterNext(.  
129b0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
129c0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
129d0 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
129e0 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  bFrom,          
129f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12a00 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20  rue if argument 
12a10 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a  iFrom is valid *
12a20 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20  /.  i64 iFrom   
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61      /* Advance a
12a50 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61  t least as far a
12a60 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69  s this */.){.  i
12a70 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  _OK ){.    int b
12a90 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b  UseFrom = bFrom;
12aa0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
12ab0 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
12ac0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
12ad0 69 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  irst;.      int 
12ae0 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
12af0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
12b00 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
12b10 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
12b20 20 20 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d      if( bUseFrom
12b30 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78   && pSeg->pDlidx
12b40 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
12b50 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
12b60 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b  p, pSeg, iFrom);
12b70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12b80 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12b90 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26  rNext(p, pSeg, &
12ba0 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20  bNewTerm);.     
12bb0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53   }..      if( pS
12bc0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20  eg->pLeaf==0 || 
12bd0 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20  bNewTerm .      
12be0 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65   || fts5MultiIte
12bf0 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c  rAdvanceRowid(p,
12c00 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a   pIter, iFirst).
12c10 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
12c20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
12c30 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c  vanced(p, pIter,
12c40 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20   iFirst, 1);.   
12c50 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41     }.      fts5A
12c60 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
12c70 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  tup(p, pIter);..
12c80 20 20 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d        bUseFrom =
12c90 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
12ca0 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74  pIter->bSkipEmpt
12cb0 79 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 66  y .         && f
12cc0 74 73 35 53 65 67 49 74 65 72 49 73 44 65 6c 65  ts5SegIterIsDele
12cd0 74 65 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53  te(p, &pIter->aS
12ce0 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74  eg[pIter->aFirst
12cf0 5b 31 5d 2e 69 46 69 72 73 74 5d 29 0a 20 20 20  [1].iFirst]).   
12d00 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
12d10 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
12d20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
12d30 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
12d40 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69  he new object wi
12d50 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
12d60 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 61  erate through da
12d70 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65 20  ta in structure 
12d80 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69  pStruct..** If i
12d90 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68  Level is -ve, th
12da0 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61  en all data in a
12db0 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d  ll segments is m
12dc0 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c  erged. Or, if iL
12dd0 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  evel.** is zero 
12de0 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74 61  or greater, data
12df0 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
12e00 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74  nSegment segment
12e10 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65  s on level iLeve
12e20 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a  l.** is merged..
12e30 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  **.** The iterat
12e40 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69  or initially poi
12e50 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
12e60 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72   term/rowid entr
12e70 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65  y in the .** ite
12e80 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  rated data..*/.s
12e90 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
12ea0 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46  ultiIterNew(.  F
12eb0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ed0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
12ee0 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
12ef0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
12f00 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20  ure *pStruct,   
12f10 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
12f20 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 69  re of specific i
12f30 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ndex */.  int iI
12f40 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
12f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
12f60 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65  fig.aHash[] inde
12f70 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a  x of FTS index *
12f80 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70  /.  int bSkipEmp
12f90 74 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ty,             
12fa0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
12fb0 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d 6b 65 79  gnore delete-key
12fc0 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  s */.  int flags
12fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12fe0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
12ff0 6f 72 20 3e 3d 20 2a 2f 0a 20 20 63 6f 6e 73 74  or >= */.  const
13000 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
13010 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
13020 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
13030 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
13040 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13060 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
13070 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
13080 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
13090 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
130a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
130b0 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
130c0 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
130d0 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  */.  Fts5MultiSe
130e0 67 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  gIter **ppOut   
130f0 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
13100 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
13110 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
13120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13130 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
13140 20 6d 65 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74   merged */.  int
13150 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13170 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20  Power of two >= 
13180 6e 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nSeg */.  int iI
13190 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ter = 0;        
131a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a            /* */.
131b0 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131d0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
131e0 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67  rate through seg
131f0 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53  ments */.  Fts5S
13200 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
13210 4c 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69  Lvl;.  Fts5Multi
13220 53 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  SegIter *pNew;..
13230 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
13240 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
13250 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
13260 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
13270 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
13280 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
13290 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c  tor. */.  if( iL
132a0 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 6e 53  evel<0 ){.    nS
132b0 65 67 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  eg = fts5Structu
132c0 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
132d0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 6e 53  pStruct);.    nS
132e0 65 67 20 2b 3d 20 28 70 2d 3e 61 70 48 61 73 68  eg += (p->apHash
132f0 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 7d 65 6c   ? 1 : 0);.  }el
13300 73 65 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 4d  se{.    nSeg = M
13310 49 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  IN(pStruct->aLev
13320 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c  el[iLevel].nSeg,
13330 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d 0a   nSegment);.  }.
13340 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e    for(nSlot=2; n
13350 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74  Slot<nSeg; nSlot
13360 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 2a 70 70  =nSlot*2);.  *pp
13370 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
13380 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20  5IdxMalloc(p, . 
13390 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
133a0 4d 75 6c 74 69 53 65 67 49 74 65 72 29 20 2b 20  MultiSegIter) + 
133b0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
133c0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
133d0 28 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20  (Fts5SegIter) * 
133e0 6e 53 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a  nSlot +       /*
133f0 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f   pNew->aSeg[] */
13400 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
13410 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c  s5CResult) * nSl
13420 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e  ot         /* pN
13430 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a  ew->aFirst[] */.
13440 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d    );.  if( pNew=
13450 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
13460 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f  New->nSeg = nSlo
13470 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67 20  t;.  pNew->aSeg 
13480 3d 20 28 46 74 73 35 53 65 67 49 74 65 72 2a 29  = (Fts5SegIter*)
13490 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77  &pNew[1];.  pNew
134a0 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35  ->aFirst = (Fts5
134b0 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e  CResult*)&pNew->
134c0 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 70  aSeg[nSlot];.  p
134d0 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d  New->bRev = (0!=
134e0 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
134f0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b  EX_QUERY_DESC));
13500 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  .  pNew->bSkipEm
13510 70 74 79 20 3d 20 62 53 6b 69 70 45 6d 70 74 79  pty = bSkipEmpty
13520 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
13530 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  ze each of the c
13540 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74  omponent segment
13550 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20   iterators. */. 
13560 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
13570 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
13580 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20  reLevel *pEnd = 
13590 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
135a0 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
135b0 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 70  ];.    if( p->ap
135c0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hash ){.      /*
135d0 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69   Add a segment i
135e0 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20  terator for the 
135f0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
13600 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62   of the hash tab
13610 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  le. */.      Fts
13620 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
13630 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
13640 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 66 74  ter++];.      ft
13650 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69  s5SegIterHashIni
13660 74 28 70 2c 20 69 49 64 78 2c 20 70 54 65 72 6d  t(p, iIdx, pTerm
13670 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
13680 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
13690 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72    for(pLvl=&pStr
136a0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20  uct->aLevel[0]; 
136b0 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b  pLvl<pEnd; pLvl+
136c0 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  +){.      for(iS
136d0 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b  eg=pLvl->nSeg-1;
136e0 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d   iSeg>=0; iSeg--
136f0 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
13700 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
13710 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61  *pSeg = &pLvl->a
13720 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
13730 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13740 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
13750 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
13760 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
13770 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
13780 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
13790 70 2c 20 69 49 64 78 2c 20 70 53 65 67 2c 20 70  p, iIdx, pSeg, p
137a0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
137b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
137c0 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
137d0 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 70 54 65  nit(p, iIdx, pTe
137e0 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73  rm, nTerm, flags
137f0 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
13800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13810 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
13820 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74  .    pLvl = &pSt
13830 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65  ruct->aLevel[iLe
13840 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69 53  vel];.    for(iS
13850 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e  eg=nSeg-1; iSeg>
13860 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20  =0; iSeg--){.   
13870 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49 6e     fts5SegIterIn
13880 69 74 28 70 2c 20 69 49 64 78 2c 20 26 70 4c 76  it(p, iIdx, &pLv
13890 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26  l->aSeg[iSeg], &
138a0 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72  pNew->aSeg[iIter
138b0 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ++]);.    }.  }.
138c0 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72 3d    assert( iIter=
138d0 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20 49  =nSeg );..  /* I
138e0 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73 20  f the above was 
138f0 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68  successful, each
13900 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61   component itera
13910 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20  tors now points 
13920 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  .  ** to the fir
13930 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20  st entry in its 
13940 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73  segment. In this
13950 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65   case initialize
13960 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73   the .  ** aFirs
13970 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69  t[] array. Or, i
13980 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
13990 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74 68  ccurred, free th
139a0 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20  e iterator.  ** 
139b0 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74  object and set t
139c0 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
139d0 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a  le to NULL.  */.
139e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
139f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f  ITE_OK ){.    fo
13a00 72 28 69 49 74 65 72 3d 6e 53 6c 6f 74 2d 31 3b  r(iIter=nSlot-1;
13a10 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d   iIter>0; iIter-
13a20 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45  -){.      int iE
13a30 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 45  q;.      if( (iE
13a40 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
13a50 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c  rDoCompare(pNew,
13a60 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20   iIter)) ){.    
13a70 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
13a80 65 78 74 28 70 2c 20 26 70 4e 65 77 2d 3e 61 53  ext(p, &pNew->aS
13a90 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20  eg[iEq], 0);.   
13aa0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
13ab0 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e  erAdvanced(p, pN
13ac0 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b  ew, iEq, iIter);
13ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13ae0 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c     fts5AssertMul
13af0 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70  tiIterSetup(p, p
13b00 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
13b10 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
13b20 0a 20 20 20 20 20 26 26 20 66 74 73 35 53 65 67  .     && fts5Seg
13b30 49 74 65 72 49 73 44 65 6c 65 74 65 28 70 2c 20  IterIsDelete(p, 
13b40 26 70 4e 65 77 2d 3e 61 53 65 67 5b 70 4e 65 77  &pNew->aSeg[pNew
13b50 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
13b60 73 74 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  st]) .    ){.   
13b70 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
13b80 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c  Next(p, pNew, 0,
13b90 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
13ba0 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  se{.    fts5Mult
13bb0 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65  iIterFree(p, pNe
13bc0 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d  w);.    *ppOut =
13bd0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
13be0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
13bf0 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
13c00 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20  at EOF or if an 
13c10 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
13c20 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74  ed. .** False ot
13c30 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
13c40 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
13c50 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
13c60 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53  x *p, Fts5MultiS
13c70 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
13c80 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20    return (p->rc 
13c90 7c 7c 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  || pIter->aSeg[ 
13ca0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
13cb0 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d  .iFirst ].pLeaf=
13cc0 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  =0);.}../*.** Re
13cd0 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f  turn the rowid o
13ce0 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  f the entry that
13cf0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75   the iterator cu
13d00 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a  rrently points.*
13d10 2a 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65  * to. If the ite
13d20 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  rator points to 
13d30 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66 75  EOF when this fu
13d40 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13d50 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20   the.** results 
13d60 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  are undefined..*
13d70 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  /.static i64 fts
13d80 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
13d90 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
13da0 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
13db0 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  rt( pIter->aSeg[
13dc0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
13dd0 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
13de0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74   );.  return pIt
13df0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13e00 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
13e10 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  t ].iRowid;.}../
13e20 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
13e30 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
13e40 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66  xt entry at or f
13e50 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e  ollowing iMatch.
13e60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13e70 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
13e80 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
13e90 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 4d 75  ex *p, .  Fts5Mu
13ea0 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
13eb0 72 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68  r, .  i64 iMatch
13ec0 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  .){.  while( 1 )
13ed0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
13ee0 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
13ef0 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
13f00 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  , 1, iMatch);.  
13f10 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
13f20 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
13f30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52   ) break;.    iR
13f40 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
13f50 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
13f60 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
13f70 3e 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77  >bRev==0 && iRow
13f80 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id>=iMatch ) bre
13f90 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ak;.    if( pIte
13fa0 72 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52  r->bRev!=0 && iR
13fb0 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62  owid<=iMatch ) b
13fc0 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  reak;.  }.}../*.
13fd0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
13fe0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
13ff0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
14000 65 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77  erm associated w
14010 69 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72  ith the .** entr
14020 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  y that the itera
14030 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  tor currently po
14040 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
14050 69 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73  ic const u8 *fts
14060 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46  5MultiIterTerm(F
14070 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
14080 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
14090 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
140a0 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  *p = &pIter->aSe
140b0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
140c0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
140d0 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b  *pn = p->term.n;
140e0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72  .  return p->ter
140f0 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  m.p;.}../*.** Re
14100 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
14110 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20   chunk iterator 
14120 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
14130 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
14140 0a 2a 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69  .** at EOF. Or i
14150 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
14160 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e  lready occurred.
14170 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
14180 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61  rn false..*/.sta
14190 74 69 63 20 69 6e 74 20 66 74 73 35 43 68 75 6e  tic int fts5Chun
141a0 6b 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  kIterEof(Fts5Ind
141b0 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b  ex *p, Fts5Chunk
141c0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
141d0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c  return (p->rc ||
141e0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
141f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
14200 6e 63 65 20 74 68 65 20 63 68 75 6e 6b 2d 69 74  nce the chunk-it
14210 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
14220 78 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61  xt chunk of data
14230 20 74 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61   to read..*/.sta
14240 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
14250 6e 6b 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  nkIterNext(Fts5I
14260 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75  ndex *p, Fts5Chu
14270 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  nkIter *pIter){.
14280 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
14290 3e 6e 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20  >nRem>=pIter->n 
142a0 29 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d  );.  pIter->nRem
142b0 20 2d 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20 20   -= pIter->n;.  
142c0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
142d0 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
142e0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
142f0 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20  0;.  pIter->p = 
14300 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  0;.  if( pIter->
14310 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46 74  nRem>0 ){.    Ft
14320 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
14330 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52     pIter->iLeafR
14340 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65 61  owid++;.    pLea
14350 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
14360 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
14370 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52  p, pIter->iLeafR
14380 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70  owid);.    if( p
14390 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 49  Leaf ){.      pI
143a0 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49 74  ter->n = MIN(pIt
143b0 65 72 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66 2d  er->nRem, pLeaf-
143c0 3e 6e 2d 34 29 3b 0a 20 20 20 20 20 20 70 49 74  >n-4);.      pIt
143d0 65 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70  er->p = pLeaf->p
143e0 2b 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  +4;.    }.  }.}.
143f0 0a 2f 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a 65  ./*.** Intialize
14400 20 74 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61   the chunk itera
14410 74 6f 72 20 74 6f 20 72 65 61 64 20 74 68 65 20  tor to read the 
14420 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61  position list da
14430 74 61 20 66 6f 72 20 77 68 69 63 68 20 0a 2a 2a  ta for which .**
14440 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20   the size field 
14450 69 73 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66  is at offset iOf
14460 66 20 6f 66 20 6c 65 61 66 20 70 4c 65 61 66 2e  f of leaf pLeaf.
14470 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
14480 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e   fts5ChunkIterIn
14490 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
144a0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
144b0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
144c0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
144d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
144e0 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
144f0 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74 65    /* Segment ite
14500 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f  rator to read po
14510 73 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  slist from */.  
14520 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70  Fts5ChunkIter *p
14530 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
14540 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
14550 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
14560 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
14570 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3b  f = pSeg->pLeaf;
14580 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53  .  int iOff = pS
14590 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  eg->iLeafOffset;
145a0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  ..  memset(pIter
145b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
145c0 65 72 29 29 3b 0a 20 20 2f 2a 20 49 66 20 46 74  er));.  /* If Ft
145d0 73 35 53 65 67 49 74 65 72 2e 70 53 65 67 20 69  s5SegIter.pSeg i
145e0 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  s NULL, then thi
145f0 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61  s iterator itera
14600 74 65 73 20 74 68 72 6f 75 67 68 20 64 61 74 61  tes through data
14610 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  .  ** currently 
14620 73 74 6f 72 65 64 20 69 6e 20 61 20 68 61 73 68  stored in a hash
14630 20 74 61 62 6c 65 2e 20 49 6e 20 74 68 69 73 20   table. In this 
14640 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
14650 20 6c 65 61 66 2d 72 6f 77 69 64 0a 20 20 2a 2a   leaf-rowid.  **
14660 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 2e 20 20   to calculate.  
14670 2a 2f 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70  */.  if( pSeg->p
14680 53 65 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Seg ){.    int i
14690 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d  Id = pSeg->pSeg-
146a0 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 69 36 34  >iSegid;.    i64
146b0 20 72 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45   rowid = FTS5_SE
146c0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67  GMENT_ROWID(pSeg
146d0 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20  ->iIdx, iId, 0, 
146e0 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pSeg->iLeafPgno)
146f0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
14700 61 66 52 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b  afRowid = rowid;
14710 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66  .  }..  if( iOff
14720 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  <pLeaf->n ){.   
14730 20 66 74 73 35 44 61 74 61 52 65 66 65 72 65 6e   fts5DataReferen
14740 63 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 70  ce(pLeaf);.    p
14750 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c  Iter->pLeaf = pL
14760 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  eaf;.  }else{.  
14770 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20 3d 20    pIter->nRem = 
14780 31 3b 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b  1;.    fts5Chunk
14790 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
147a0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  r);.    if( p->r
147b0 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  c ) return;.    
147c0 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 70 4c  iOff = 4;.    pL
147d0 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
147e0 61 66 3b 0a 20 20 7d 0a 0a 20 20 69 4f 66 66 20  af;.  }..  iOff 
147f0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
14800 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
14810 66 5d 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29  f], pIter->nRem)
14820 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d  ;.  pIter->n = M
14830 49 4e 28 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f  IN(pLeaf->n - iO
14840 66 66 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29  ff, pIter->nRem)
14850 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70  ;.  pIter->p = p
14860 4c 65 61 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a  Leaf->p + iOff;.
14870 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 3d  .  if( pIter->n=
14880 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 43 68  =0 ){.    fts5Ch
14890 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70  unkIterNext(p, p
148a0 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
148b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68  atic void fts5Ch
148c0 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 46  unkIterRelease(F
148d0 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49  ts5ChunkIter *pI
148e0 74 65 72 29 7b 0a 20 20 66 74 73 35 44 61 74 61  ter){.  fts5Data
148f0 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
14900 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
14910 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pLeaf = 0;.}../*
14920 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74  .** Read and ret
14930 75 72 6e 20 74 68 65 20 6e 65 78 74 20 33 32 2d  urn the next 32-
14940 62 69 74 20 76 61 72 69 6e 74 20 66 72 6f 6d 20  bit varint from 
14950 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
14960 74 20 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70  t iterator .** p
14970 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
14980 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
14990 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
149a0 6f 63 63 75 72 73 2c 20 7a 65 72 6f 20 69 73 20  occurs, zero is 
149b0 72 65 74 75 72 6e 65 64 20 61 6e 20 61 6e 20 65  returned an an e
149c0 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69  rror code left i
149d0 6e 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 2e  n .** Fts5Index.
149e0 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  rc. If an error 
149f0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
14a00 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
14a10 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61  unction is.** ca
14a20 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
14a30 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
14a40 6e 74 20 66 74 73 35 50 6f 73 49 74 65 72 52 65  nt fts5PosIterRe
14a50 61 64 56 61 72 69 6e 74 28 46 74 73 35 49 6e 64  adVarint(Fts5Ind
14a60 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74  ex *p, Fts5PosIt
14a70 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
14a80 74 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 69 66  t iVal = 0;.  if
14a90 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14aa0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  OK ){.    if( pI
14ab0 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72  ter->iOff>=pIter
14ac0 2d 3e 63 68 75 6e 6b 2e 6e 20 29 7b 0a 20 20 20  ->chunk.n ){.   
14ad0 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
14ae0 4e 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e  Next(p, &pIter->
14af0 63 68 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66  chunk);.      if
14b00 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45  ( fts5ChunkIterE
14b10 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68  of(p, &pIter->ch
14b20 75 6e 6b 29 20 29 20 72 65 74 75 72 6e 20 30 3b  unk) ) return 0;
14b30 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4f  .      pIter->iO
14b40 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ff = 0;.    }.  
14b50 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
14b60 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
14b70 28 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 2e 70  (&pIter->chunk.p
14b80 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 69  [pIter->iOff], i
14b90 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Val);.  }.  retu
14ba0 72 6e 20 69 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iVal;.}../*.*
14bb0 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 70 6f  * Advance the po
14bc0 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 74 65 72  sition list iter
14bd0 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
14be0 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61 74 69   entry..*/.stati
14bf0 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 49 74  c void fts5PosIt
14c00 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
14c10 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74 65 72   *p, Fts5PosIter
14c20 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
14c30 69 56 61 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  iVal;.  assert( 
14c40 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
14c50 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e  (p, &pIter->chun
14c60 6b 29 3d 3d 30 20 29 3b 0a 20 20 69 56 61 6c 20  k)==0 );.  iVal 
14c70 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52 65 61  = fts5PosIterRea
14c80 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74 65 72  dVarint(p, pIter
14c90 29 3b 0a 20 20 69 66 28 20 66 74 73 35 43 68 75  );.  if( fts5Chu
14ca0 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 70 49  nkIterEof(p, &pI
14cb0 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30 20 29  ter->chunk)==0 )
14cc0 7b 0a 20 20 20 20 69 66 28 20 69 56 61 6c 3d 3d  {.    if( iVal==
14cd0 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  1 ){.      pIter
14ce0 2d 3e 69 43 6f 6c 20 3d 20 66 74 73 35 50 6f 73  ->iCol = fts5Pos
14cf0 49 74 65 72 52 65 61 64 56 61 72 69 6e 74 28 70  IterReadVarint(p
14d00 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
14d10 70 49 74 65 72 2d 3e 69 50 6f 73 20 3d 20 66 74  pIter->iPos = ft
14d20 73 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72  s5PosIterReadVar
14d30 69 6e 74 28 70 2c 20 70 49 74 65 72 29 20 2d 20  int(p, pIter) - 
14d40 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
14d50 20 20 20 20 70 49 74 65 72 2d 3e 69 50 6f 73 20      pIter->iPos 
14d60 2b 3d 20 28 69 56 61 6c 20 2d 20 32 29 3b 0a 20  += (iVal - 2);. 
14d70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14d80 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
14d90 20 46 74 73 35 50 6f 73 49 74 65 72 20 6f 62 6a   Fts5PosIter obj
14da0 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
14db0 65 20 66 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74  e final argument
14dc0 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74   to iterate.** t
14dd0 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73 69 74  hrough the posit
14de0 69 6f 6e 2d 6c 69 73 74 20 61 73 73 6f 63 69 61  ion-list associa
14df0 74 65 64 20 77 69 74 68 20 74 68 65 20 69 6e 64  ted with the ind
14e00 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 69 74  ex entry that it
14e10 65 72 61 74 6f 72 20 0a 2a 2a 20 70 4d 75 6c 74  erator .** pMult
14e20 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  i currently poin
14e30 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  ts to..*/.static
14e40 20 76 6f 69 64 20 66 74 73 35 50 6f 73 49 74 65   void fts5PosIte
14e50 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
14e60 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
14e70 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
14e80 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
14e90 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  */.  Fts5MultiSe
14ea0 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 20 20  gIter *pMulti,  
14eb0 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d 73 65       /* Multi-se
14ec0 67 20 69 74 65 72 61 74 6f 72 20 74 6f 20 72 65  g iterator to re
14ed0 61 64 20 70 6f 73 2d 6c 69 73 74 20 66 72 6f 6d  ad pos-list from
14ee0 20 2a 2f 0a 20 20 46 74 73 35 50 6f 73 49 74 65   */.  Fts5PosIte
14ef0 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
14f00 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
14f10 69 7a 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ize this object 
14f20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
14f30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14f40 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
14f50 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d  *pSeg = &pMulti-
14f60 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61  >aSeg[ pMulti->a
14f70 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
14f80 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
14f90 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
14fa0 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66 74 73  pIter));.    fts
14fb0 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74 28 70  5ChunkIterInit(p
14fc0 2c 20 70 53 65 67 2c 20 26 70 49 74 65 72 2d 3e  , pSeg, &pIter->
14fd0 63 68 75 6e 6b 29 3b 0a 20 20 20 20 69 66 28 20  chunk);.    if( 
14fe0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
14ff0 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e  (p, &pIter->chun
15000 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  k)==0 ){.      f
15010 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28 70  ts5PosIterNext(p
15020 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a  , pIter);.    }.
15030 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
15040 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
15050 70 6f 73 69 74 69 6f 6e 20 69 74 65 72 61 74 6f  position iterato
15060 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
15070 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
15080 69 73 0a 2a 2a 20 61 74 20 45 4f 46 2e 20 4f 72  is.** at EOF. Or
15090 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   if an error has
150a0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
150b0 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  d. Otherwise, re
150c0 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73  turn false..*/.s
150d0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f  tatic int fts5Po
150e0 73 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  sIterEof(Fts5Ind
150f0 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74  ex *p, Fts5PosIt
15100 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
15110 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
15120 49 74 65 72 2d 3e 63 68 75 6e 6b 2e 70 4c 65 61  Iter->chunk.pLea
15130 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f==0);.}../*.** 
15140 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
15150 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68  egment-id for th
15160 65 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  e structure pStr
15170 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  uct..**.** If an
15180 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
15190 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
151a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
151b0 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20  no-op. 0 is .** 
151c0 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73  returned in this
151d0 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   case..*/.static
151e0 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74   int fts5Allocat
151f0 65 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78  eSegid(Fts5Index
15200 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75   *p, Fts5Structu
15210 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
15220 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
15230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
15240 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 66 6f 72  return 0;..  for
15250 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20 69 2b 2b  (i=0; i<100; i++
15260 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  ){.    int iSegi
15270 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  d;.    sqlite3_r
15280 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
15290 28 69 6e 74 29 2c 20 28 76 6f 69 64 2a 29 26 69  (int), (void*)&i
152a0 53 65 67 69 64 29 3b 0a 20 20 20 20 69 53 65 67  Segid);.    iSeg
152b0 69 64 20 3d 20 69 53 65 67 69 64 20 26 20 28 28  id = iSegid & ((
152c0 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
152d0 44 5f 42 29 2d 31 29 3b 0a 20 20 20 20 69 66 28  D_B)-1);.    if(
152e0 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20   iSegid ){.     
152f0 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
15300 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  .      for(iLvl=
15310 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
15320 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
15330 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53  {.        for(iS
15340 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
15350 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
15360 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
15370 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 53            if( iS
15380 65 67 69 64 3d 3d 70 53 74 72 75 63 74 2d 3e 61  egid==pStruct->a
15390 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
153a0 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20 29 7b  [iSeg].iSegid ){
153b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 53 65  .            iSe
153c0 67 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gid = 0;.       
153d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
153e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
153f0 20 69 66 28 20 69 53 65 67 69 64 20 29 20 72 65   if( iSegid ) re
15400 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 20 20 7d  turn iSegid;.  }
15410 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ..  p->rc = SQLI
15420 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  TE_ERROR;.  retu
15430 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
15440 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20  iscard all data 
15450 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
15460 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62   in the hash-tab
15470 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
15480 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44 69 73  oid fts5IndexDis
15490 63 61 72 64 44 61 74 61 28 46 74 73 35 49 6e 64  cardData(Fts5Ind
154a0 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ex *p){.  assert
154b0 28 20 70 2d 3e 61 70 48 61 73 68 20 7c 7c 20 70  ( p->apHash || p
154c0 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d  ->nPendingData==
154d0 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  0 );.  if( p->ap
154e0 48 61 73 68 20 29 7b 0a 20 20 20 20 46 74 73 35  Hash ){.    Fts5
154f0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
15500 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
15510 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
15520 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67  (i=0; i<=pConfig
15530 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b  ->nPrefix; i++){
15540 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70  .      if( p->ap
15550 48 61 73 68 5b 69 5d 20 29 20 73 71 6c 69 74 65  Hash[i] ) sqlite
15560 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70  3Fts5HashClear(p
15570 2d 3e 61 70 48 61 73 68 5b 69 5d 29 3b 0a 20 20  ->apHash[i]);.  
15580 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64    }.    p->nPend
15590 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d  ingData = 0;.  }
155a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
155b0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
155c0 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65   prefix, in byte
155d0 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 28  s, that buffer (
155e0 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72 65  nNew/pNew) share
155f0 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65 72  s.** with buffer
15600 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f   (nOld/pOld)..*/
15610 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
15620 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a  PrefixCompress(.
15630 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73    int nOld, cons
15640 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e  t u8 *pOld,.  in
15650 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75 38  t nNew, const u8
15660 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20   *pNew.){.  int 
15670 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
15680 6e 4e 65 77 20 26 26 20 69 3c 6e 4f 6c 64 3b 20  nNew && i<nOld; 
15690 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  i++){.    if( pO
156a0 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29  ld[i]!=pNew[i] )
156b0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
156c0 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
156d0 20 49 66 20 61 6e 20 22 6e 45 6d 70 74 79 22 20   If an "nEmpty" 
156e0 72 65 63 6f 72 64 20 6d 75 73 74 20 62 65 20 77  record must be w
156f0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 2d  ritten to the b-
15700 74 72 65 65 20 62 65 66 6f 72 65 20 74 68 65 20  tree before the 
15710 6e 65 78 74 0a 2a 2a 20 74 65 72 6d 2c 20 77 72  next.** term, wr
15720 69 74 65 20 69 74 20 6e 6f 77 2e 0a 2a 2f 0a 73  ite it now..*/.s
15730 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
15740 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28  riteBtreeNEmpty(
15750 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
15760 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
15770 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72  iter){.  if( pWr
15780 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a  iter->nEmpty ){.
15790 20 20 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20      int bFlag = 
157a0 30 3b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57  0;.    Fts5PageW
157b0 72 69 74 65 72 20 2a 70 50 67 3b 0a 20 20 20 20  riter *pPg;.    
157c0 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  pPg = &pWriter->
157d0 61 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 20 20  aWriter[1];.    
157e0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  if( pWriter->nEm
157f0 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c  pty>=FTS5_MIN_DL
15800 49 44 58 5f 53 49 5a 45 20 26 26 20 70 57 72 69  IDX_SIZE && pWri
15810 74 65 72 2d 3e 63 64 6c 69 64 78 2e 6e 20 29 7b  ter->cdlidx.n ){
15820 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79 20  .      i64 iKey 
15830 3d 20 46 54 53 35 5f 44 4f 43 4c 49 53 54 5f 49  = FTS5_DOCLIST_I
15840 44 58 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20  DX_ROWID(.      
15850 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64      pWriter->iId
15860 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  x, pWriter->iSeg
15870 69 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  id, .          p
15880 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
15890 30 5d 2e 70 67 6e 6f 20 2d 20 31 20 2d 20 70 57  0].pgno - 1 - pW
158a0 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 0a 20 20  riter->nEmpty.  
158b0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
158c0 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 63 64  ert( pWriter->cd
158d0 6c 69 64 78 2e 6e 3e 30 20 29 3b 0a 20 20 20 20  lidx.n>0 );.    
158e0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
158f0 70 2c 20 69 4b 65 79 2c 20 70 57 72 69 74 65 72  p, iKey, pWriter
15900 2d 3e 63 64 6c 69 64 78 2e 70 2c 20 70 57 72 69  ->cdlidx.p, pWri
15910 74 65 72 2d 3e 63 64 6c 69 64 78 2e 6e 29 3b 0a  ter->cdlidx.n);.
15920 20 20 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b        bFlag = 1;
15930 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42  .    }.    fts5B
15940 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
15950 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e  t(&p->rc, &pPg->
15960 62 75 66 2c 20 62 46 6c 61 67 29 3b 0a 20 20 20  buf, bFlag);.   
15970 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
15980 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
15990 26 70 50 67 2d 3e 62 75 66 2c 20 70 57 72 69 74  &pPg->buf, pWrit
159a0 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20  er->nEmpty);.   
159b0 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
159c0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
159d0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69  Whether or not i
159e0 74 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  t was written to
159f0 20 64 69 73 6b 2c 20 7a 65 72 6f 20 74 68 65 20   disk, zero the 
15a00 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 61 74  doclist index at
15a10 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
15a20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73   */.  sqlite3Fts
15a30 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 57 72  5BufferZero(&pWr
15a40 69 74 65 72 2d 3e 63 64 6c 69 64 78 29 3b 0a 20  iter->cdlidx);. 
15a50 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78   pWriter->bDlidx
15a60 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 7d  PrevValid = 0;.}
15a70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
15a80 73 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77  s5WriteBtreeGrow
15a90 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
15aa0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
15ab0 72 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  riter){.  if( p-
15ac0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15ad0 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
15ae0 69 74 65 72 20 2a 61 4e 65 77 3b 0a 20 20 20 20  iter *aNew;.    
15af0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
15b00 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 4e  pNew;.    int nN
15b10 65 77 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  ew = sizeof(Fts5
15b20 50 61 67 65 57 72 69 74 65 72 29 20 2a 20 28 70  PageWriter) * (p
15b30 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 2b  Writer->nWriter+
15b40 31 29 3b 0a 0a 20 20 20 20 61 4e 65 77 20 3d 20  1);..    aNew = 
15b50 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a  (Fts5PageWriter*
15b60 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
15b70 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  (pWriter->aWrite
15b80 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66  r, nNew);.    if
15b90 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
15ba0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
15bb0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 72  E_NOMEM;.      r
15bc0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
15bd0 20 20 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70    pNew = &aNew[p
15be0 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 5d  Writer->nWriter]
15bf0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  ;.    memset(pNe
15c00 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  w, 0, sizeof(Fts
15c10 35 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20  5PageWriter));. 
15c20 20 20 20 70 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20     pNew->pgno = 
15c30 31 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  1;.    fts5Buffe
15c40 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
15c50 2d 3e 72 63 2c 20 26 70 4e 65 77 2d 3e 62 75 66  ->rc, &pNew->buf
15c60 2c 20 31 29 3b 0a 0a 20 20 20 20 70 57 72 69 74  , 1);..    pWrit
15c70 65 72 2d 3e 6e 57 72 69 74 65 72 2b 2b 3b 0a 20  er->nWriter++;. 
15c80 20 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69     pWriter->aWri
15c90 74 65 72 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  ter = aNew;.  }.
15ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
15cb0 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
15cc0 20 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20   each leaf page 
15cd0 65 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74  except the first
15ce0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
15cf0 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  * at least one t
15d00 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e  erm. Argument (n
15d10 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74  Term/pTerm) is t
15d20 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61  he split-key - a
15d30 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73   term that.** is
15d40 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c   larger than all
15d50 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74   terms written t
15d60 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73  o earlier leaves
15d70 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f  , and equal to o
15d80 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61  r.** smaller tha
15d90 6e 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  n the first term
15da0 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66   on the new leaf
15db0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
15dc0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
15dd0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
15de0 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
15df0 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a  c. If an error.*
15e00 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  * has already oc
15e10 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
15e20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
15e30 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
15e40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
15e50 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65  id fts5WriteBtre
15e60 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  eTerm(.  Fts5Ind
15e70 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
15e80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
15e90 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
15ea0 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
15eb0 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
15ec0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
15ed0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
15ee0 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a  Term, const u8 *
15ef0 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69  pTerm      /* Fi
15f00 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20  rst term on new 
15f10 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
15f20 20 69 48 65 69 67 68 74 3b 0a 20 20 66 6f 72 28   iHeight;.  for(
15f30 69 48 65 69 67 68 74 3d 31 3b 20 31 3b 20 69 48  iHeight=1; 1; iH
15f40 65 69 67 68 74 2b 2b 29 7b 0a 20 20 20 20 46 74  eight++){.    Ft
15f50 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
15f60 61 67 65 3b 0a 0a 20 20 20 20 69 66 28 20 69 48  age;..    if( iH
15f70 65 69 67 68 74 3e 3d 70 57 72 69 74 65 72 2d 3e  eight>=pWriter->
15f80 6e 57 72 69 74 65 72 20 29 7b 0a 20 20 20 20 20  nWriter ){.     
15f90 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 47   fts5WriteBtreeG
15fa0 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 29 3b  row(p, pWriter);
15fb0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
15fc0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d   ) return;.    }
15fd0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57  .    pPage = &pW
15fe0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69  riter->aWriter[i
15ff0 48 65 69 67 68 74 5d 3b 0a 0a 20 20 20 20 66 74  Height];..    ft
16000 73 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70  s5WriteBtreeNEmp
16010 74 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ty(p, pWriter);.
16020 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
16030 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69  buf.n>=p->pConfi
16040 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  g->pgsz ){.     
16050 20 2f 2a 20 70 50 61 67 65 20 77 69 6c 6c 20 62   /* pPage will b
16060 65 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  e written to dis
16070 6b 2e 20 54 68 65 20 74 65 72 6d 20 77 69 6c 6c  k. The term will
16080 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
16090 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61   the.      ** pa
160a0 72 65 6e 74 20 6f 66 20 70 50 61 67 65 2e 20 20  rent of pPage.  
160b0 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  */.      i64 iRo
160c0 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
160d0 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20  NT_ROWID(.      
160e0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64      pWriter->iId
160f0 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  x, pWriter->iSeg
16100 69 64 2c 20 69 48 65 69 67 68 74 2c 20 70 50 61  id, iHeight, pPa
16110 67 65 2d 3e 70 67 6e 6f 0a 20 20 20 20 20 20 29  ge->pgno.      )
16120 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
16130 57 72 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c  Write(p, iRowid,
16140 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70   pPage->buf.p, p
16150 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20  Page->buf.n);.  
16160 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
16170 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66 29 3b  ro(&pPage->buf);
16180 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
16190 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 74 65  rZero(&pPage->te
161a0 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  rm);.      fts5B
161b0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
161c0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
161d0 2d 3e 62 75 66 2c 20 70 50 61 67 65 5b 2d 31 5d  ->buf, pPage[-1]
161e0 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 50  .pgno);.      pP
161f0 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20  age->pgno++;.   
16200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
16210 74 20 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65  t nPre = fts5Pre
16220 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67  fixCompress(pPag
16230 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65  e->term.n, pPage
16240 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c  ->term.p, nTerm,
16250 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66   pTerm);.      f
16260 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
16270 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
16280 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 2b  Page->buf, nPre+
16290 32 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  2);.      fts5Bu
162a0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
162b0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
162c0 3e 62 75 66 2c 20 6e 54 65 72 6d 2d 6e 50 72 65  >buf, nTerm-nPre
162d0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
162e0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
162f0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
16300 66 2c 20 6e 54 65 72 6d 2d 6e 50 72 65 2c 20 70  f, nTerm-nPre, p
16310 54 65 72 6d 2b 6e 50 72 65 29 3b 0a 20 20 20 20  Term+nPre);.    
16320 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
16330 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
16340 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
16350 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rm);.      break
16360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
16370 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
16380 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28  riteBtreeNoTerm(
16390 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
163c0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
163d0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
163e0 72 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f  riter          /
163f0 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
16400 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 57 72 69  */.){.  if( pWri
16410 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
16420 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a  InPage ){.    /*
16430 20 4e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68   No rowids on th
16440 69 73 20 70 61 67 65 2e 20 41 70 70 65 6e 64 20  is page. Append 
16450 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20  an 0x00 byte to 
16460 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20  the current .   
16470 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65   ** doclist-inde
16480 78 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72  x */.    if( pWr
16490 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76  iter->bDlidxPrev
164a0 56 61 6c 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Valid==0 ){.    
164b0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 70    i64 iRowid = p
164c0 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
164d0 69 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  id;.      sqlite
164e0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
164f0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
16500 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78  &pWriter->cdlidx
16510 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
16520 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78   pWriter->bDlidx
16530 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
16540 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 44       pWriter->iD
16550 6c 69 64 78 50 72 65 76 20 3d 20 69 52 6f 77 69  lidxPrev = iRowi
16560 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  d;.    }.    sql
16570 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
16580 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
16590 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 63 64 6c  c, &pWriter->cdl
165a0 69 64 78 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  idx, 0);.  }.  p
165b0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b  Writer->nEmpty++
165c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64  ;.}../*.** Rowid
165d0 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74   iRowid has just
165e0 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74   been appended t
165f0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  o the current le
16600 61 66 20 70 61 67 65 2e 20 41 73 20 69 74 20 69  af page. As it i
16610 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
16620 6e 20 69 74 73 20 70 61 67 65 2c 20 61 70 70 65  n its page, appe
16630 6e 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  nd an entry to t
16640 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
16650 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  st-index..*/.sta
16660 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
16670 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20  teDlidxAppend(. 
16680 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
16690 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
166a0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34  *pWriter, .  i64
166b0 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 36 34   iRowid.){.  i64
166c0 20 69 56 61 6c 3b 0a 20 20 69 66 28 20 70 57 72   iVal;.  if( pWr
166d0 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76  iter->bDlidxPrev
166e0 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 69 56 61  Valid ){.    iVa
166f0 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20 70 57 72  l = iRowid - pWr
16700 69 74 65 72 2d 3e 69 44 6c 69 64 78 50 72 65 76  iter->iDlidxPrev
16710 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
16720 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
16730 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
16740 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 63  >rc, &pWriter->c
16750 64 6c 69 64 78 2c 20 69 52 6f 77 69 64 29 3b 0a  dlidx, iRowid);.
16760 20 20 20 20 69 56 61 6c 20 3d 20 31 3b 0a 20 20      iVal = 1;.  
16770 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  }.  sqlite3Fts5B
16780 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
16790 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  t(&p->rc, &pWrit
167a0 65 72 2d 3e 63 64 6c 69 64 78 2c 20 69 56 61 6c  er->cdlidx, iVal
167b0 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 44  );.  pWriter->bD
167c0 6c 69 64 78 50 72 65 76 56 61 6c 69 64 20 3d 20  lidxPrevValid = 
167d0 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 44  1;.  pWriter->iD
167e0 6c 69 64 78 50 72 65 76 20 3d 20 69 52 6f 77 69  lidxPrev = iRowi
167f0 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  d;.}..static voi
16800 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68  d fts5WriteFlush
16810 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20 2a  Leaf(Fts5Index *
16820 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72  p, Fts5SegWriter
16830 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73 74   *pWriter){.  st
16840 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
16850 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30  ro[] = { 0x00, 0
16860 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
16870 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  };.  Fts5PageWri
16880 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
16890 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
168a0 5d 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ];.  i64 iRowid;
168b0 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ..  if( pWriter-
168c0 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
168d0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74  e ){.    /* No t
168e0 65 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e 20  erm was written 
168f0 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a 2f  to this page. */
16900 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d  .    assert( 0==
16910 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61 67  fts5GetU16(&pPag
16920 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a  e->buf.p[2]) );.
16930 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
16940 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72 69  eeNoTerm(p, pWri
16950 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter);.  }..  /* 
16960 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
16970 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 62  t page to the db
16980 2e 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20  . */.  iRowid = 
16990 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
169a0 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64 78  ID(pWriter->iIdx
169b0 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  , pWriter->iSegi
169c0 64 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d, 0, pPage->pgn
169d0 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72  o);.  fts5DataWr
169e0 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70  ite(p, iRowid, p
169f0 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
16a00 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f  ge->buf.n);..  /
16a10 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
16a20 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20   next page. */. 
16a30 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
16a40 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20  &pPage->buf);.  
16a50 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
16a60 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
16a70 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
16a80 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e  o);.  pPage->pgn
16a90 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  o++;..  /* Incre
16aa0 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20 77  ase the leaves w
16ab0 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a  ritten counter *
16ac0 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65  /.  pWriter->nLe
16ad0 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20  afWritten++;..  
16ae0 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20  /* The new leaf 
16af0 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 2a  holds no terms *
16b00 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  /.  pWriter->bFi
16b10 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
16b20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  1;.}../*.** Appe
16b30 6e 64 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  nd term pTerm/nT
16b40 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65  erm to the segme
16b50 6e 74 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  nt being written
16b60 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20 70   by the writer p
16b70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
16b80 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
16b90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
16ba0 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
16bb0 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
16bc0 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
16bd0 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
16be0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
16bf0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
16c00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
16c10 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
16c20 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a  riteAppendTerm(.
16c30 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
16c40 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
16c50 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74   *pWriter,.  int
16c60 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38   nTerm, const u8
16c70 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e   *pTerm .){.  in
16c80 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20  t nPrefix;      
16c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16ca0 20 42 79 74 65 73 20 6f 66 20 70 72 65 66 69 78   Bytes of prefix
16cb0 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72   compression for
16cc0 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50   term */.  Fts5P
16cd0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
16ce0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
16cf0 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 61 73 73 65  iter[0];..  asse
16d00 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c 20  rt( pPage==0 || 
16d10 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20  pPage->buf.n==0 
16d20 7c 7c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  || pPage->buf.n>
16d30 34 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  4 );.  if( pPage
16d40 20 26 26 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e   && pPage->buf.n
16d50 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65  ==0 ){.    /* Ze
16d60 72 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ro the first ter
16d70 6d 20 61 6e 64 20 66 69 72 73 74 20 64 6f 63 69  m and first doci
16d80 64 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20 20  d fields */.    
16d90 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
16da0 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c  zero[] = { 0x00,
16db0 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
16dc0 30 20 7d 3b 0a 20 20 20 20 66 74 73 35 42 75 66  0 };.    fts5Buf
16dd0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
16de0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
16df0 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 20  f, 4, zero);.   
16e00 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
16e10 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
16e20 67 65 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ge );.  }.  if( 
16e30 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
16e40 20 20 0a 20 20 69 66 28 20 70 57 72 69 74 65 72    .  if( pWriter
16e50 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
16e60 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64  ge ){.    /* Upd
16e70 61 74 65 20 74 68 65 20 22 66 69 72 73 74 20 74  ate the "first t
16e80 65 72 6d 22 20 66 69 65 6c 64 20 6f 66 20 74 68  erm" field of th
16e90 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 2a  e page header. *
16ea0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
16eb0 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30  age->buf.p[2]==0
16ec0 20 26 26 20 70 50 61 67 65 2d 3e 62 75 66 2e 70   && pPage->buf.p
16ed0 5b 33 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74  [3]==0 );.    ft
16ee0 73 35 50 75 74 55 31 36 28 26 70 50 61 67 65 2d  s5PutU16(&pPage-
16ef0 3e 62 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65  >buf.p[2], pPage
16f00 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 6e 50  ->buf.n);.    nP
16f10 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69  refix = 0;.    i
16f20 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d  f( pPage->pgno!=
16f30 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  1 ){.      /* Th
16f40 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
16f50 74 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74  term on a leaf t
16f60 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  hat is not the l
16f70 65 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a  eftmost leaf in.
16f80 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67        ** the seg
16f90 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20  ment b-tree. In 
16fa0 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
16fb0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 64 64  necessary to add
16fc0 20 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20   a term to.     
16fd0 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68   ** the b-tree h
16fe0 69 65 72 61 72 63 68 79 20 74 68 61 74 20 69 73  ierarchy that is
16ff0 20 28 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e   (a) larger than
17000 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72   the largest ter
17010 6d 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  m .      ** alre
17020 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
17030 68 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28  he segment and (
17040 62 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  b) smaller than 
17050 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20  or equal to.    
17060 20 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20    ** this term. 
17070 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
17080 61 20 70 72 65 66 69 78 20 6f 66 20 28 70 54 65  a prefix of (pTe
17090 72 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69  rm/nTerm) that i
170a0 73 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62  s one.      ** b
170b0 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  yte longer than 
170c0 74 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66  the longest pref
170d0 69 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  ix (pTerm/nTerm)
170e0 20 73 68 61 72 65 73 20 77 69 74 68 20 74 68 65   shares with the
170f0 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f  .      ** previo
17100 75 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20  us term. .      
17110 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61  **.      ** Usua
17120 6c 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75  lly, the previou
17130 73 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61  s term is availa
17140 62 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65  ble in pPage->te
17150 72 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  rm. The exceptio
17160 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66  n.      ** is if
17170 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
17180 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  st term written 
17190 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  in an incrementa
171a0 6c 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20  l-merge step..  
171b0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
171c0 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
171d0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61   term is not ava
171e0 69 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20  ilable, so just 
171f0 77 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a  write a.      **
17200 20 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f   copy of (pTerm/
17210 6e 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20  nTerm) into the 
17220 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69  parent node. Thi
17230 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20  s is slightly.  
17240 20 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65      ** inefficie
17250 6e 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f  nt, but still co
17260 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20  rrect.  */.     
17270 20 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a   int n = nTerm;.
17280 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
17290 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20  >term.n ){.     
172a0 20 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50     n = 1 + fts5P
172b0 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
172c0 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61  age->term.n, pPa
172d0 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72  ge->term.p, nTer
172e0 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
172f0 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72 69   }.      fts5Wri
17300 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70  teBtreeTerm(p, p
17310 57 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d  Writer, n, pTerm
17320 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
17330 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
17340 65 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  er[0];.    }.  }
17350 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69  else{.    nPrefi
17360 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  x = fts5PrefixCo
17370 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
17380 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
17390 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
173a0 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  m);.    fts5Buff
173b0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
173c0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
173d0 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  uf, nPrefix);.  
173e0 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
173f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
17400 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20  es of new data, 
17410 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61  then the term da
17420 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74  ta itself.  ** t
17430 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  o the page. */. 
17440 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
17450 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
17460 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
17470 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20  rm - nPrefix);. 
17480 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
17490 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
174a0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
174b0 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65   - nPrefix, &pTe
174c0 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20  rm[nPrefix]);.. 
174d0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46   /* Update the F
174e0 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65  ts5PageWriter.te
174f0 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66  rm field. */.  f
17500 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
17510 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72  >rc, &pPage->ter
17520 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
17530 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
17540 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
17550 30 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62  0;..  pWriter->b
17560 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
17570 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 0;.  pWriter-
17580 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
17590 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a  clist = 1;..  /*
175a0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
175b0 6c 65 61 66 20 70 61 67 65 20 69 73 20 66 75 6c  leaf page is ful
175c0 6c 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64  l, flush it to d
175d0 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  isk. */.  if( pP
175e0 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70  age->buf.n>=p->p
175f0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a  Config->pgsz ){.
17600 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
17610 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
17620 72 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  r);.    pWriter-
17630 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
17640 67 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ge = 1;.  }.}../
17650 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f  *.** Append a do
17660 63 69 64 20 74 6f 20 74 68 65 20 77 72 69 74 65  cid to the write
17670 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73  rs output. .*/.s
17680 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
17690 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
176a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
176b0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
176c0 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36  r *pWriter,.  i6
176d0 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66  4 iRowid.){.  if
176e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
176f0 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61  OK ){.    Fts5Pa
17700 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
17710 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
17720 74 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20  ter[0];..    /* 
17730 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65  If this is to be
17740 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64   the first docid
17750 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
17760 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20  page, set the . 
17770 20 20 20 2a 2a 20 64 6f 63 69 64 2d 70 6f 69 6e     ** docid-poin
17780 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d  ter in the page-
17790 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70  header. Also app
177a0 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74  end a value to t
177b0 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20  he dlidx.    ** 
177c0 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20  buffer, in case 
177d0 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
177e0 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  is required.  */
177f0 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
17800 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
17810 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73  age ){.      fts
17820 35 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62  5PutU16(pPage->b
17830 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66  uf.p, pPage->buf
17840 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57  .n);.      fts5W
17850 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28  riteDlidxAppend(
17860 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77  p, pWriter, iRow
17870 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
17880 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f 63  /* Write the doc
17890 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  id. */.    if( p
178a0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
178b0 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20  widInDoclist || 
178c0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
178d0 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20  owidInPage ){.  
178e0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
178f0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
17900 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
17910 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c  iRowid);.    }el
17920 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
17930 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69  ( p->rc || iRowi
17940 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76  d>pWriter->iPrev
17950 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 66  Rowid );.      f
17960 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
17970 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
17980 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69  Page->buf, iRowi
17990 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 50 72  d - pWriter->iPr
179a0 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a  evRowid);.    }.
179b0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72      pWriter->iPr
179c0 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  evRowid = iRowid
179d0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
179e0 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
179f0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 72  ist = 0;.    pWr
17a00 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
17a10 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  dInPage = 0;..  
17a20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66    if( pPage->buf
17a30 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  .n>=p->pConfig->
17a40 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74  pgsz ){.      ft
17a50 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
17a60 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
17a70 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
17a80 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
17a90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   1;.    }.  }.}.
17aa0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17ab0 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
17ac0 69 73 74 49 6e 74 28 0a 20 20 46 74 73 35 49 6e  istInt(.  Fts5In
17ad0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
17ae0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
17af0 72 2c 0a 20 20 69 6e 74 20 69 56 61 6c 0a 29 7b  r,.  int iVal.){
17b00 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
17b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
17b20 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
17b30 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
17b40 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 20  >aWriter[0];.   
17b50 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
17b60 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
17b70 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 56 61  &pPage->buf, iVa
17b80 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  l);.    if( pPag
17b90 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f  e->buf.n>=p->pCo
17ba0 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
17bb0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
17bc0 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
17bd0 72 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  r);.      pWrite
17be0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
17bf0 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Page = 1;.    }.
17c00 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
17c10 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
17c20 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20  ndPoslistData(. 
17c30 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
17c40 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
17c50 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e  *pWriter, .  con
17c60 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20  st u8 *aData, . 
17c70 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20   int nData.){.  
17c80 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
17c90 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
17ca0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20  ->aWriter[0];.  
17cb0 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44  const u8 *a = aD
17cc0 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e  ata;.  int n = n
17cd0 44 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72  Data;.  .  asser
17ce0 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  t( p->pConfig->p
17cf0 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  gsz>0 );.  while
17d00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
17d10 4f 4b 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75  OK && (pPage->bu
17d20 66 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f  f.n + n)>=p->pCo
17d30 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
17d40 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e    int nReq = p->
17d50 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20  pConfig->pgsz - 
17d60 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 20 20  pPage->buf.n;.  
17d70 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b    int nCopy = 0;
17d80 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70  .    while( nCop
17d90 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20  y<nReq ){.      
17da0 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  i64 dummy;.     
17db0 20 6e 43 6f 70 79 20 2b 3d 20 67 65 74 56 61 72   nCopy += getVar
17dc0 69 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28  int(&a[nCopy], (
17dd0 75 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20  u64*)&dummy);.  
17de0 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
17df0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
17e00 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
17e10 2c 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20  , nCopy, a);.   
17e20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20   a += nCopy;.   
17e30 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20   n -= nCopy;.   
17e40 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
17e50 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
17e60 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46  .    pWriter->bF
17e70 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
17e80 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 1;.  }.  if( n
17e90 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  >0 ){.    fts5Bu
17ea0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
17eb0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
17ec0 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d  uf, n, a);.  }.}
17ed0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
17ee0 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72  s5WriteAppendZer
17ef0 6f 62 79 74 65 28 46 74 73 35 49 6e 64 65 78 20  obyte(Fts5Index 
17f00 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
17f10 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 66  r *pWriter){.  f
17f20 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
17f30 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
17f40 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
17f50 30 5d 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  0].buf, 0);.}../
17f60 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64  *.** Flush any d
17f70 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74 68  ata cached by th
17f80 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20  e writer object 
17f90 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
17fa0 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c   Free any.** all
17fb0 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  ocations associa
17fc0 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72 69  ted with the wri
17fd0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
17fe0 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69 6e  oid fts5WriteFin
17ff0 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ish(.  Fts5Index
18000 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
18010 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
18020 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18030 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
18040 74 20 2a 70 6e 48 65 69 67 68 74 2c 20 20 20 20  t *pnHeight,    
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18060 20 4f 55 54 3a 20 48 65 69 67 68 74 20 6f 66 20   OUT: Height of 
18070 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  the b-tree */.  
18080 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20 20  int *pnLeaf     
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f  /* OUT: Number o
180b0 66 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e 20  f leaf pages in 
180c0 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69  b-tree */.){.  i
180d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 72  nt i;.  if( p->r
180e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
180f0 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
18100 65 72 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72  er *pLeaf = &pWr
18110 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
18120 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d  ;.    if( pLeaf-
18130 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 4c 65 61  >pgno==1 && pLea
18140 66 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20  f->buf.n==0 ){. 
18150 20 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 30       *pnLeaf = 0
18160 3b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68  ;.      *pnHeigh
18170 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
18180 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 61  {.      if( pLea
18190 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  f->buf.n>4 ){.  
181a0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
181b0 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
181c0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
181d0 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c      *pnLeaf = pL
181e0 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20  eaf->pgno-1;.   
181f0 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
18200 6e 57 72 69 74 65 72 3d 3d 31 20 26 26 20 70 57  nWriter==1 && pW
18210 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46  riter->nEmpty>=F
18220 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
18230 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ZE ){.        ft
18240 73 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77  s5WriteBtreeGrow
18250 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
18260 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
18270 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
18280 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  >1 ){.        ft
18290 73 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70  s5WriteBtreeNEmp
182a0 74 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ty(p, pWriter);.
182b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
182c0 6e 48 65 69 67 68 74 20 3d 20 70 57 72 69 74 65  nHeight = pWrite
182d0 72 2d 3e 6e 57 72 69 74 65 72 3b 0a 0a 20 20 20  r->nWriter;..   
182e0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 57     for(i=1; i<pW
182f0 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20  riter->nWriter; 
18300 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74  i++){.        Ft
18310 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
18320 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  g = &pWriter->aW
18330 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  riter[i];.      
18340 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
18350 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  p, .            
18360 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
18370 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64 78  ID(pWriter->iIdx
18380 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  , pWriter->iSegi
18390 64 2c 20 69 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  d, i, pPg->pgno)
183a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  , .            p
183b0 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e  Pg->buf.p, pPg->
183c0 62 75 66 2e 6e 0a 20 20 20 20 20 20 20 20 29 3b  buf.n.        );
183d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
183e0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
183f0 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
18400 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
18410 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 67 20  PageWriter *pPg 
18420 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
18430 74 65 72 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  ter[i];.    asse
18440 72 74 28 20 70 50 67 20 7c 7c 20 70 2d 3e 72 63  rt( pPg || p->rc
18450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
18460 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
18470 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
18480 65 65 28 26 70 50 67 2d 3e 74 65 72 6d 29 3b 0a  ee(&pPg->term);.
18490 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
184a0 46 72 65 65 28 26 70 50 67 2d 3e 62 75 66 29 3b  Free(&pPg->buf);
184b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
184c0 69 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65  ite3_free(pWrite
184d0 72 2d 3e 61 57 72 69 74 65 72 29 3b 0a 20 20 73  r->aWriter);.  s
184e0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
184f0 46 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 63  Free(&pWriter->c
18500 64 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69  dlidx);.}..stati
18510 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
18520 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
18530 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
18540 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
18550 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 69 6e   .  int iIdx, in
18560 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 6d 65  t iSegid.){.  me
18570 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c  mset(pWriter, 0,
18580 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
18590 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74  riter));.  pWrit
185a0 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b  er->iIdx = iIdx;
185b0 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  .  pWriter->iSeg
185c0 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20  id = iSegid;..  
185d0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
185e0 20 3d 20 28 46 74 73 35 50 61 67 65 57 72 69 74   = (Fts5PageWrit
185f0 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
18600 63 28 70 2c 73 69 7a 65 6f 66 28 46 74 73 35 50  c(p,sizeof(Fts5P
18610 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20 20 69  ageWriter));.  i
18620 66 28 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69  f( pWriter->aWri
18630 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ter==0 ) return;
18640 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69  .  pWriter->nWri
18650 74 65 72 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  ter = 1;.  pWrit
18660 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70  er->aWriter[0].p
18670 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  gno = 1;.  pWrit
18680 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
18690 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 73 74 61  Page = 1;.}..sta
186a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
186b0 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28  teInitForAppend(
186c0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
186d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186e0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
186f0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
18700 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
18710 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
18720 2a 20 57 72 69 74 65 72 20 74 6f 20 69 6e 69 74  * Writer to init
18730 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  ialize */.  int 
18740 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
18750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18760 6e 64 65 78 20 73 65 67 6d 65 6e 74 20 69 73 20  ndex segment is 
18770 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46  a part of */.  F
18780 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
18790 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f  ent *pSeg      /
187a0 2a 20 53 65 67 6d 65 6e 74 20 6f 62 6a 65 63 74  * Segment object
187b0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f   to append to */
187c0 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
187d0 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 20  = pSeg->nHeight 
187e0 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67  * sizeof(Fts5Pag
187f0 65 57 72 69 74 65 72 29 3b 0a 20 20 6d 65 6d 73  eWriter);.  mems
18800 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73  et(pWriter, 0, s
18810 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
18820 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72  ter));.  pWriter
18830 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20  ->iIdx = iIdx;. 
18840 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
18850 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b   = pSeg->iSegid;
18860 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69  .  pWriter->aWri
18870 74 65 72 20 3d 20 28 46 74 73 35 50 61 67 65 57  ter = (Fts5PageW
18880 72 69 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61  riter*)fts5IdxMa
18890 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a  lloc(p, nByte);.
188a0 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74    pWriter->nWrit
188b0 65 72 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67  er = pSeg->nHeig
188c0 68 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  ht;..  if( p->rc
188d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
188e0 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 31 3b     int pgno = 1;
188f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
18900 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
18910 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d  [0].pgno = pSeg-
18920 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20  >pgnoLast+1;.   
18930 20 66 6f 72 28 69 3d 70 53 65 67 2d 3e 6e 48 65   for(i=pSeg->nHe
18940 69 67 68 74 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d  ight-1; i>0; i--
18950 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
18960 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
18970 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
18980 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72 2d  ->iIdx, pWriter-
18990 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 67 6e 6f  >iSegid, i, pgno
189a0 29 3b 0a 20 20 20 20 20 20 46 74 73 35 50 61 67  );.      Fts5Pag
189b0 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26  eWriter *pPg = &
189c0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
189d0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  [i];.      pPg->
189e0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
189f0 20 20 20 66 74 73 35 44 61 74 61 42 75 66 66 65     fts5DataBuffe
18a00 72 28 70 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20  r(p, &pPg->buf, 
18a10 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
18a20 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
18a30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 46  _OK ){.        F
18a40 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a  ts5NodeIter ss;.
18a50 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65          fts5Node
18a60 49 74 65 72 49 6e 69 74 28 70 50 67 2d 3e 62 75  IterInit(pPg->bu
18a70 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 2c  f.p, pPg->buf.n,
18a80 20 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20 77   &ss);.        w
18a90 68 69 6c 65 28 20 73 73 2e 61 44 61 74 61 20 29  hile( ss.aData )
18aa0 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
18ab0 74 28 26 70 2d 3e 72 63 2c 20 26 73 73 29 3b 0a  t(&p->rc, &ss);.
18ac0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
18ad0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
18ae0 50 67 2d 3e 74 65 72 6d 2c 20 73 73 2e 74 65 72  Pg->term, ss.ter
18af0 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 29 3b  m.n, ss.term.p);
18b00 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  .        pgno = 
18b10 73 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 20  ss.iChild;.     
18b20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46     fts5NodeIterF
18b30 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 20 20  ree(&ss);.      
18b40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
18b50 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3d 3d 31  pSeg->nHeight==1
18b60 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74 65   ){.      pWrite
18b70 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 53 65 67  r->nEmpty = pSeg
18b80 2d 3e 70 67 6e 6f 4c 61 73 74 2d 31 3b 0a 20 20  ->pgnoLast-1;.  
18b90 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
18ba0 28 70 67 6e 6f 2b 70 57 72 69 74 65 72 2d 3e 6e  (pgno+pWriter->n
18bb0 45 6d 70 74 79 29 3d 3d 70 53 65 67 2d 3e 70 67  Empty)==pSeg->pg
18bc0 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20 70 57  noLast );.    pW
18bd0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
18be0 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20  mInPage = 1;.   
18bf0 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
18c00 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 74 65 72  ->aWriter[0].ter
18c10 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 7d 0a 7d 0a  m.n==0 );.  }.}.
18c20 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
18c30 70 49 74 65 72 20 77 61 73 20 75 73 65 64 20 74  pIter was used t
18c40 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
18c50 68 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d  h the input segm
18c60 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a  ents of on an.**
18c70 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
18c80 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  ge operation. Th
18c90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
18ca0 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e 63  alled if the inc
18cb0 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67  remental.** merg
18cc0 65 20 73 74 65 70 20 68 61 73 20 66 69 6e 69 73  e step has finis
18cd0 68 65 64 20 62 75 74 20 74 68 65 20 69 6e 70 75  hed but the inpu
18ce0 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63  t has not been c
18cf0 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75 73  ompletely exhaus
18d00 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
18d10 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65 67 6d  oid fts5TrimSegm
18d20 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ents(Fts5Index *
18d30 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  p, Fts5MultiSegI
18d40 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
18d50 6e 74 20 69 3b 0a 20 20 46 74 73 35 42 75 66 66  nt i;.  Fts5Buff
18d60 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74  er buf;.  memset
18d70 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  (&buf, 0, sizeof
18d80 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
18d90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
18da0 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  r->nSeg; i++){. 
18db0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
18dc0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
18dd0 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Seg[i];.    if( 
18de0 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b  pSeg->pSeg==0 ){
18df0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  .      /* no-op 
18e00 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
18e10 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20   pSeg->pLeaf==0 
18e20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  ){.      pSeg->p
18e30 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20  Seg->pgnoLast = 
18e40 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  0;.      pSeg->p
18e50 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
18e60 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
18e70 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
18e80 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  pSeg->iTermLeafO
18e90 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66  ffset;     /* Of
18ea0 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72 73  fset on new firs
18eb0 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  t leaf page */. 
18ec0 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52 6f       i64 iLeafRo
18ed0 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35 44  wid;.      Fts5D
18ee0 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
18ef0 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67    int iId = pSeg
18f00 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
18f10 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34 5d        u8 aHdr[4]
18f20 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c 20   = {0x00, 0x00, 
18f30 30 78 30 30 2c 20 30 78 30 34 7d 3b 0a 0a 20 20  0x00, 0x04};..  
18f40 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20 3d      iLeafRowid =
18f50 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
18f60 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c 20  WID(pSeg->iIdx, 
18f70 69 49 64 2c 20 30 2c 20 70 53 65 67 2d 3e 69 54  iId, 0, pSeg->iT
18f80 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ermLeafPgno);.  
18f90 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
18fa0 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c 65 61  DataRead(p, iLea
18fb0 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  fRowid);.      i
18fc0 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
18fd0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
18fe0 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20 20  ro(&buf);.      
18ff0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
19000 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
19010 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48 64 72  buf, sizeof(aHdr
19020 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20 20 20  ), aHdr);.      
19030 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
19040 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
19050 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
19060 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74  m.n);.        ft
19070 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
19080 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
19090 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70   pSeg->term.n, p
190a0 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20  Seg->term.p);.  
190b0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
190c0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
190d0 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e  c, &buf, pData->
190e0 6e 20 2d 20 69 4f 66 66 2c 20 26 70 44 61 74 61  n - iOff, &pData
190f0 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  ->p[iOff]);.    
19100 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
19110 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
19120 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
19130 70 67 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67  pgnoFirst = pSeg
19140 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  ->iTermLeafPgno;
19150 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
19160 61 44 65 6c 65 74 65 28 70 2c 20 46 54 53 35 5f  aDelete(p, FTS5_
19170 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
19180 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20 30  eg->iIdx, iId, 0
19190 2c 20 31 29 2c 69 4c 65 61 66 52 6f 77 69 64 29  , 1),iLeafRowid)
191a0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
191b0 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66  taWrite(p, iLeaf
191c0 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75  Rowid, buf.p, bu
191d0 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  f.n);.      }.  
191e0 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75    }.  }.  fts5Bu
191f0 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
19200 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
19210 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
19220 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46  xMergeLevel(.  F
19230 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19250 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
19260 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
19270 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
19280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
19290 64 65 78 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a  dex to work on *
192a0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
192b0 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20  e **ppStruct,   
192c0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
192d0 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  tucture of index
192e0 20 69 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69   iIdx */.  int i
192f0 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
19300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
19310 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75  vel to read inpu
19320 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  t from */.  int 
19330 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20  *pnRem          
19340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
19350 72 69 74 65 20 75 70 20 74 6f 20 74 68 69 73 20  rite up to this 
19360 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76  many output leav
19370 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  es */.){.  Fts5S
19380 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
19390 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
193a0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
193b0 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
193c0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
193d0 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  l];.  Fts5Struct
193e0 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75  ureLevel *pLvlOu
193f0 74 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  t;.  Fts5MultiSe
19400 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30  gIter *pIter = 0
19410 3b 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72  ;    /* Iterator
19420 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64   to read input d
19430 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ata */.  int nRe
19440 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52  m = pnRem ? *pnR
19450 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70  em : 0;  /* Outp
19460 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  ut leaf pages le
19470 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  ft to write */. 
19480 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20   int nInput;    
19490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
194b0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
194c0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
194d0 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  writer;         
194e0 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
194f0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
19500 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
19510 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  eg;     /* Outpu
19520 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  t segment */.  F
19530 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a  ts5Buffer term;.
19540 20 20 69 6e 74 20 62 52 65 71 75 69 72 65 44 6f    int bRequireDo
19550 63 6c 69 73 74 54 65 72 6d 20 3d 20 30 3b 20 20  clistTerm = 0;  
19560 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 65 72    /* Doclist ter
19570 6d 69 6e 61 74 6f 72 20 28 30 78 30 30 29 20 72  minator (0x00) r
19580 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74  equired */.  int
19590 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20 20 20   bOldest;       
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195b0 54 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 70  True if the outp
195c0 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20 74 68  ut segment is th
195d0 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 0a 20 20 61  e oldest */..  a
195e0 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72  ssert( iLvl<pStr
195f0 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20  uct->nLevel );. 
19600 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e   assert( pLvl->n
19610 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65  Merge<=pLvl->nSe
19620 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  g );..  memset(&
19630 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  writer, 0, sizeo
19640 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
19650 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72  );.  memset(&ter
19660 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
19670 35 42 75 66 66 65 72 29 29 3b 0a 20 20 77 72 69  5Buffer));.  wri
19680 74 65 72 2e 69 49 64 78 20 3d 20 69 49 64 78 3b  ter.iIdx = iIdx;
19690 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65  .  if( pLvl->nMe
196a0 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f  rge ){.    pLvlO
196b0 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
196c0 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20  Level[iLvl+1];. 
196d0 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f     assert( pLvlO
196e0 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20  ut->nSeg>0 );.  
196f0 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d    nInput = pLvl-
19700 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 66 74 73  >nMerge;.    fts
19710 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70 70  5WriteInitForApp
19720 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  end(p, &writer, 
19730 69 49 64 78 2c 20 26 70 4c 76 6c 4f 75 74 2d 3e  iIdx, &pLvlOut->
19740 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53  aSeg[pLvlOut->nS
19750 65 67 2d 31 5d 29 3b 0a 20 20 20 20 70 53 65 67  eg-1]);.    pSeg
19760 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
19770 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d  g[pLvlOut->nSeg-
19780 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1];.  }else{.   
19790 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74   int iSegid = ft
197a0 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
197b0 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  p, pStruct);..  
197c0 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20    /* Extend the 
197d0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
197e0 6a 65 63 74 20 61 73 20 72 65 71 75 69 72 65 64  ject as required
197f0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f   to ensure the o
19800 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67  utput.    ** seg
19810 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  ment exists. */.
19820 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53      if( iLvl==pS
19830 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20  truct->nLevel-1 
19840 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
19850 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
19860 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29  p->rc, ppStruct)
19870 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20  ;.      pStruct 
19880 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
19890 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
198a0 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
198b0 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
198c0 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a   iLvl+1, 1, 0);.
198d0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
198e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c  return;.    pLvl
198f0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
19900 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70  vel[iLvl];.    p
19910 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63  LvlOut = &pStruc
19920 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31  t->aLevel[iLvl+1
19930 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
19940 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
19950 2c 20 69 49 64 78 2c 20 69 53 65 67 69 64 29 3b  , iIdx, iSegid);
19960 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
19970 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20   new segment to 
19980 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c  the output level
19990 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c   */.    if( iLvl
199a0 2b 31 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65  +1==pStruct->nLe
199b0 76 65 6c 20 29 20 70 53 74 72 75 63 74 2d 3e 6e  vel ) pStruct->n
199c0 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 70 53 65  Level++;.    pSe
199d0 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
199e0 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
199f0 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e  ];.    pLvlOut->
19a00 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67  nSeg++;.    pSeg
19a10 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
19a20 0a 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69  .    pSeg->iSegi
19a30 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 20  d = iSegid;..   
19a40 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66   /* Read input f
19a50 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rom all segments
19a60 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65   in the input le
19a70 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75  vel */.    nInpu
19a80 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a  t = pLvl->nSeg;.
19a90 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20    }.  bOldest = 
19aa0 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d  (pLvlOut->nSeg==
19ab0 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c  1 && pStruct->nL
19ac0 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a  evel==iLvl+2);..
19ad0 23 69 66 20 30 0a 66 70 72 69 6e 74 66 28 73 74  #if 0.fprintf(st
19ae0 64 6f 75 74 2c 20 22 6d 65 72 67 69 6e 67 20 25  dout, "merging %
19af0 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  d segments from 
19b00 6c 65 76 65 6c 20 25 64 21 22 2c 20 6e 49 6e 70  level %d!", nInp
19b10 75 74 2c 20 69 4c 76 6c 29 3b 0a 66 66 6c 75 73  ut, iLvl);.fflus
19b20 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69  h(stdout);.#endi
19b30 66 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  f..  assert( iLv
19b40 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74  l>=0 );.  for(ft
19b50 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
19b60 2c 20 70 53 74 72 75 63 74 2c 20 69 49 64 78 2c  , pStruct, iIdx,
19b70 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76   0, 0, 0, 0, iLv
19b80 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65  l, nInput, &pIte
19b90 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
19ba0 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
19bb0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
19bc0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
19bd0 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
19be0 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  .  ){.    Fts5Se
19bf0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
19c00 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
19c10 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
19c20 72 73 74 20 5d 3b 0a 20 20 20 20 46 74 73 35 43  rst ];.    Fts5C
19c30 68 75 6e 6b 49 74 65 72 20 73 50 6f 73 3b 20 20  hunkIter sPos;  
19c40 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
19c50 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
19c60 75 67 68 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ugh position lis
19c70 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20  t */..    /* If 
19c80 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e  the segment bein
19c90 67 20 77 72 69 74 74 65 6e 20 69 73 20 74 68 65  g written is the
19ca0 20 6f 6c 64 65 73 74 20 69 6e 20 74 68 65 20 65   oldest in the e
19cb0 6e 74 69 72 65 20 69 6e 64 65 78 20 61 6e 64 0a  ntire index and.
19cc0 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 73 69 74      ** the posit
19cd0 69 6f 6e 20 6c 69 73 74 20 69 73 20 65 6d 70 74  ion list is empt
19ce0 79 20 28 69 2e 65 2e 20 74 68 65 20 65 6e 74 72  y (i.e. the entr
19cf0 79 20 69 73 20 61 20 64 65 6c 65 74 65 20 6d 61  y is a delete ma
19d00 72 6b 65 72 29 2c 20 6e 6f 0a 20 20 20 20 2a 2a  rker), no.    **
19d10 20 65 6e 74 72 79 20 6e 65 65 64 20 62 65 20 77   entry need be w
19d20 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75  ritten to the ou
19d30 74 70 75 74 2e 20 20 2a 2f 0a 20 20 20 20 66 74  tput.  */.    ft
19d40 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74 28  s5ChunkIterInit(
19d50 70 2c 20 70 53 65 67 2c 20 26 73 50 6f 73 29 3b  p, pSeg, &sPos);
19d60 0a 20 20 20 20 69 66 28 20 62 4f 6c 64 65 73 74  .    if( bOldest
19d70 3d 3d 30 20 7c 7c 20 73 50 6f 73 2e 6e 52 65 6d  ==0 || sPos.nRem
19d80 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
19d90 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e  nTerm;.      con
19da0 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66  st u8 *pTerm = f
19db0 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
19dc0 28 70 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b  (pIter, &nTerm);
19dd0 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d  .      if( nTerm
19de0 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63  !=term.n || memc
19df0 6d 70 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70  mp(pTerm, term.p
19e00 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20  , nTerm) ){.    
19e10 20 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26 26      if( pnRem &&
19e20 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69   writer.nLeafWri
19e30 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20  tten>nRem ){.   
19e40 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b         fts5Chunk
19e50 49 74 65 72 52 65 6c 65 61 73 65 28 26 73 50 6f  IterRelease(&sPo
19e60 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  s);.          br
19e70 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  eak;.        }..
19e80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
19e90 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41  is a new term. A
19ea0 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20  ppend a term to 
19eb0 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
19ec0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  nt. */.        i
19ed0 66 28 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69  f( bRequireDocli
19ee0 73 74 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  stTerm ){.      
19ef0 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
19f00 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2c 20 26  endZerobyte(p, &
19f10 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20  writer);.       
19f20 20 7d 0a 20 20 20 20 20 20 20 20 66 74 73 35 57   }.        fts5W
19f30 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70  riteAppendTerm(p
19f40 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d  , &writer, nTerm
19f50 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
19f60 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
19f70 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e  &p->rc, &term, n
19f80 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
19f90 20 20 20 20 20 20 62 52 65 71 75 69 72 65 44 6f        bRequireDo
19fa0 63 6c 69 73 74 54 65 72 6d 20 3d 20 31 3b 0a 20  clistTerm = 1;. 
19fb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
19fc0 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f 77 69   Append the rowi
19fd0 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
19fe0 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  */.      fts5Wri
19ff0 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c  teAppendRowid(p,
1a000 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75   &writer, fts5Mu
1a010 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
1a020 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  er));..      /* 
1a030 43 6f 70 79 20 74 68 65 20 70 6f 73 69 74 69 6f  Copy the positio
1a040 6e 20 6c 69 73 74 20 66 72 6f 6d 20 69 6e 70 75  n list from inpu
1a050 74 20 74 6f 20 6f 75 74 70 75 74 20 2a 2f 0a 20  t to output */. 
1a060 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
1a070 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 70  pendPoslistInt(p
1a080 2c 20 26 77 72 69 74 65 72 2c 20 73 50 6f 73 2e  , &writer, sPos.
1a090 6e 52 65 6d 29 3b 0a 20 20 20 20 20 20 66 6f 72  nRem);.      for
1a0a0 28 2f 2a 20 6e 6f 6f 70 20 2a 2f 3b 20 21 66 74  (/* noop */; !ft
1a0b0 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70  s5ChunkIterEof(p
1a0c0 2c 20 26 73 50 6f 73 29 3b 20 66 74 73 35 43 68  , &sPos); fts5Ch
1a0d0 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 26  unkIterNext(p, &
1a0e0 73 50 6f 73 29 29 7b 0a 20 20 20 20 20 20 20 20  sPos)){.        
1a0f0 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50  fts5WriteAppendP
1a100 6f 73 6c 69 73 74 44 61 74 61 28 70 2c 20 26 77  oslistData(p, &w
1a110 72 69 74 65 72 2c 20 73 50 6f 73 2e 70 2c 20 73  riter, sPos.p, s
1a120 50 6f 73 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  Pos.n);.      }.
1a130 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 43      }..    fts5C
1a140 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28  hunkIterRelease(
1a150 26 73 50 6f 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f  &sPos);.  }..  /
1a160 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74  * Flush the last
1a170 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64 69   leaf page to di
1a180 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70  sk. Set the outp
1a190 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  ut segment b-tre
1a1a0 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e  e height.  ** an
1a1b0 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65  d last leaf page
1a1c0 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20 73   number at the s
1a1d0 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20  ame time.  */.  
1a1e0 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
1a1f0 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53 65  p, &writer, &pSe
1a200 67 2d 3e 6e 48 65 69 67 68 74 2c 20 26 70 53 65  g->nHeight, &pSe
1a210 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20  g->pgnoLast);.. 
1a220 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74   if( fts5MultiIt
1a230 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20  erEof(p, pIter) 
1a240 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ){.    int i;.. 
1a250 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
1a260 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65   redundant segme
1a270 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  nts from the %_d
1a280 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ata table */.   
1a290 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70   for(i=0; i<nInp
1a2a0 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ut; i++){.      
1a2b0 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
1a2c0 67 6d 65 6e 74 28 70 2c 20 69 49 64 78 2c 20 70  gment(p, iIdx, p
1a2d0 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65  Lvl->aSeg[i].iSe
1a2e0 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gid);.    }..   
1a2f0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
1a300 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
1a310 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  s from the input
1a320 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
1a330 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49  ( pLvl->nSeg!=nI
1a340 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  nput ){.      in
1a350 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d  t nMove = (pLvl-
1a360 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20  >nSeg - nInput) 
1a370 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1a380 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
1a390 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c        memmove(pL
1a3a0 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d  vl->aSeg, &pLvl-
1a3b0 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e  >aSeg[nInput], n
1a3c0 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Move);.    }.   
1a3d0 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e   pLvl->nSeg -= n
1a3e0 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
1a3f0 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20  >nMerge = 0;.   
1a400 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   if( pSeg->pgnoL
1a410 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
1a420 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b  pLvlOut->nSeg--;
1a430 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1a440 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67      assert( pSeg
1a450 2d 3e 6e 48 65 69 67 68 74 3e 30 20 26 26 20 70  ->nHeight>0 && p
1a460 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20  Seg->pgnoLast>0 
1a470 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69 6d 53  );.    fts5TrimS
1a480 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74 65 72  egments(p, pIter
1a490 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65  );.    pLvl->nMe
1a4a0 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  rge = nInput;.  
1a4b0 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  }..  fts5MultiIt
1a4c0 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29  erFree(p, pIter)
1a4d0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
1a4e0 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 69 66 28  ee(&term);.  if(
1a4f0 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52 65 6d 20   pnRem ) *pnRem 
1a500 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57  -= writer.nLeafW
1a510 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ritten;.}../*.**
1a520 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61   A total of nLea
1a530 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  f leaf pages of 
1a540 64 61 74 61 20 68 61 73 20 6a 75 73 74 20 62 65  data has just be
1a550 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20  en flushed to a 
1a560 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65  level-0.** segme
1a570 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 69 49 64  nts in index iId
1a580 78 20 77 69 74 68 20 73 74 72 75 63 74 75 72 65  x with structure
1a590 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20 66   pStruct. This f
1a5a0 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20  unction updates 
1a5b0 74 68 65 0a 2a 2a 20 77 72 69 74 65 2d 63 6f 75  the.** write-cou
1a5c0 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79  nter accordingly
1a5d0 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
1a5e0 72 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e 63  ry, performs inc
1a5f0 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 0a 2a  remental merge.*
1a600 2a 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  * work..**.** If
1a610 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1a620 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
1a630 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
1a640 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
1a650 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
1a660 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
1a670 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1a680 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1a690 64 20 66 74 73 35 49 6e 64 65 78 57 6f 72 6b 28  d fts5IndexWork(
1a6a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6c0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1a6d0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
1a6e0 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a700 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f 72 6b 20  * Index to work 
1a710 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  on */.  Fts5Stru
1a720 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
1a730 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
1a740 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
1a750 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
1a760 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20  .  int nLeaf    
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a780 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a790 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75  output leaves ju
1a7a0 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b  st written */.){
1a7b0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1a7c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
1a7d0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1a7e0 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1a7f0 74 3b 0a 20 20 20 20 69 36 34 20 6e 57 72 69 74  t;.    i64 nWrit
1a800 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1a810 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
1a820 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63  value of write-c
1a830 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
1a840 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20  t nWork;        
1a850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a860 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75  umber of work-qu
1a870 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20  anta to perform 
1a880 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b  */.    int nRem;
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1a8b0 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66  f leaf pages lef
1a8c0 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20  t to write */.. 
1a8d0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
1a8e0 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20   write-counter. 
1a8f0 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20  While doing so, 
1a900 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20  set nWork. */.  
1a910 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72 75    nWrite = pStru
1a920 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
1a930 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28  r;.    nWork = (
1a940 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66 29  (nWrite + nLeaf)
1a950 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
1a960 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e   - (nWrite / p->
1a970 6e 57 6f 72 6b 55 6e 69 74 29 3b 0a 20 20 20 20  nWorkUnit);.    
1a980 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
1a990 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b  ounter += nLeaf;
1a9a0 0a 20 20 20 20 6e 52 65 6d 20 3d 20 70 2d 3e 6e  .    nRem = p->n
1a9b0 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b  WorkUnit * nWork
1a9c0 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   * pStruct->nLev
1a9d0 65 6c 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  el;..    while( 
1a9e0 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRem>0 ){.      
1a9f0 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1aa10 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1aa20 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20  h levels */.    
1aa30 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d    int iBestLvl =
1aa40 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1aa50 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20   Level offering 
1aa60 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73  the most input s
1aa70 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  egments */.     
1aa80 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20   int nBest = 0; 
1aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aaa0 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  Number of input 
1aab0 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74  segments on best
1aac0 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 20   level */..     
1aad0 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c   /* Set iBestLvl
1aae0 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f   to the level to
1aaf0 20 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d   read input segm
1ab00 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20  ents from. */.  
1ab10 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
1ab20 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b  uct->nLevel>0 );
1ab30 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  .      for(iLvl=
1ab40 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
1ab50 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
1ab60 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74  {.        Fts5St
1ab70 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
1ab80 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
1ab90 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
1aba0 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
1abb0 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 20  Merge ){.       
1abc0 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
1abd0 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  rge>nBest ){.   
1abe0 20 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76           iBestLv
1abf0 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20  l = iLvl;.      
1ac00 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c        nBest = pL
1ac10 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20  vl->nMerge;.    
1ac20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ac30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1ac40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
1ac50 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20  Lvl->nSeg>nBest 
1ac60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65  ){.          nBe
1ac70 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  st = pLvl->nSeg;
1ac80 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74  .          iBest
1ac90 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
1aca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1acb0 20 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74       /* If nBest
1acc0 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65   is still 0, the
1acd0 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  n the index must
1ace0 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69   be empty. */.#i
1acf0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1ad00 47 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c  G.      for(iLvl
1ad10 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20  =0; nBest==0 && 
1ad20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1ad30 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
1ad40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ad50 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1ad60 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a  Lvl].nSeg==0 );.
1ad70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1ad80 20 20 20 20 20 20 69 66 28 20 6e 42 65 73 74 3c        if( nBest<
1ad90 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74  p->pConfig->nAut
1ada0 6f 6d 65 72 67 65 20 0a 20 20 20 20 20 20 20 26  omerge .       &
1adb0 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
1adc0 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72  l[iBestLvl].nMer
1add0 67 65 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b 0a  ge==0 .      ){.
1ade0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1adf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
1ae00 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
1ae10 28 70 2c 20 69 49 64 78 2c 20 26 70 53 74 72 75  (p, iIdx, &pStru
1ae20 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e  ct, iBestLvl, &n
1ae30 52 65 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Rem);.      asse
1ae40 72 74 28 20 6e 52 65 6d 3d 3d 30 20 7c 7c 20 70  rt( nRem==0 || p
1ae50 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ae60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
1ae70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ae80 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
1ae90 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67  [iBestLvl].nMerg
1aea0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1aeb0 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1aec0 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c  mote(p, iBestLvl
1aed0 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  +1, pStruct);.  
1aee0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 53      }.      *ppS
1aef0 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b  truct = pStruct;
1af00 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 7d 0a 0a 73  .    }..  }.}..s
1af10 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1af20 6e 64 65 78 43 72 69 73 69 73 4d 65 72 67 65 28  ndexCrisisMerge(
1af30 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1af60 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
1af70 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1af90 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f 72 6b 20  * Index to work 
1afa0 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  on */.  Fts5Stru
1afb0 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
1afc0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
1afd0 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
1afe0 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
1aff0 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
1b000 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
1b010 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20  ppStruct;.  int 
1b020 69 4c 76 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c  iLvl = 0;.  whil
1b030 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1b040 5f 4f 4b 20 0a 20 20 20 20 20 20 26 26 20 69 4c  _OK .      && iL
1b050 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1b060 65 6c 0a 20 20 20 20 20 20 26 26 20 70 53 74 72  el.      && pStr
1b070 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1b080 5d 2e 6e 53 65 67 3e 3d 70 2d 3e 70 43 6f 6e 66  ].nSeg>=p->pConf
1b090 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65  ig->nCrisisMerge
1b0a0 20 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49   .  ){.    fts5I
1b0b0 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
1b0c0 2c 20 69 49 64 78 2c 20 26 70 53 74 72 75 63 74  , iIdx, &pStruct
1b0d0 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20  , iLvl, 0);.    
1b0e0 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1b0f0 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20  mote(p, iLvl+1, 
1b100 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c  pStruct);.    iL
1b110 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53  vl++;.  }.  *ppS
1b120 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b  truct = pStruct;
1b130 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
1b140 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46  ts5IndexReturn(F
1b150 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1b160 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
1b170 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1b180 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  _OK;.  return rc
1b190 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
1b1a0 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
1b1b0 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73   Fts5FlushCtx;.s
1b1c0 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
1b1d0 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  tx {.  Fts5Index
1b1e0 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65   *pIdx;.  Fts5Se
1b1f0 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
1b200 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  .};../*.** Buffe
1b210 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e  r aBuf[] contain
1b220 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69  s a list of vari
1b230 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65  nts, all small e
1b240 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20  nough to fit.** 
1b250 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
1b260 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ger. Return the 
1b270 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67  size of the larg
1b280 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74 68  est prefix of th
1b290 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78  is .** list nMax
1b2a0 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69   bytes or less i
1b2b0 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
1b2c0 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73  c int fts5Poslis
1b2d0 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38  tPrefix(const u8
1b2e0 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78   *aBuf, int nMax
1b2f0 29 7b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30  ){.  int ret = 0
1b300 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
1b310 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
1b320 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35 47     int i = fts5G
1b330 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75 66  etVarint32(&aBuf
1b340 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20  [ret], dummy);. 
1b350 20 20 20 69 66 28 20 28 72 65 74 20 2b 20 69 29     if( (ret + i)
1b360 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b   > nMax ) break;
1b370 0a 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20  .    ret += i;. 
1b380 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
1b390 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .}..#define fts5
1b3a0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1b3b0 42 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62  Blob(pBuf, pBlob
1b3c0 2c 20 6e 42 6c 6f 62 29 20 7b 20 5c 0a 20 20 61  , nBlob) { \.  a
1b3d0 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 53 70  ssert( pBuf->nSp
1b3e0 61 63 65 3e 3d 28 70 42 75 66 2d 3e 6e 2b 6e 42  ace>=(pBuf->n+nB
1b3f0 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20 20  lob) );         
1b400 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26      \.  memcpy(&
1b410 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
1b420 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1b440 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f   pBuf->n += nBlo
1b450 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
1b480 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65   Flush the conte
1b490 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  nts of in-memory
1b4a0 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73   hash table iHas
1b4b0 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c  h to a new level
1b4c0 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f  -0 .** segment o
1b4d0 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64  n disk. Also upd
1b4e0 61 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ate the correspo
1b4f0 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  nding structure 
1b500 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  record..**.** If
1b510 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1b520 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
1b530 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
1b540 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
1b550 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
1b560 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
1b570 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1b580 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1b590 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61  d fts5FlushOneHa
1b5a0 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  sh(Fts5Index *p,
1b5b0 20 69 6e 74 20 69 48 61 73 68 2c 20 69 6e 74 20   int iHash, int 
1b5c0 2a 70 6e 4c 65 61 66 29 7b 0a 20 20 46 74 73 35  *pnLeaf){.  Fts5
1b5d0 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d  Hash *pHash = p-
1b5e0 3e 61 70 48 61 73 68 5b 69 48 61 73 68 5d 3b 0a  >apHash[iHash];.
1b5f0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1b600 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20  *pStruct;.  int 
1b610 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67  iSegid;.  int pg
1b620 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20  noLast = 0;     
1b630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1b640 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
1b650 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
1b660 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
1b670 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
1b680 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
1b690 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  re and allocate 
1b6a0 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
1b6b0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
1b6c0 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e  w level-0 segmen
1b6d0 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74  t.  */.  pStruct
1b6e0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
1b6f0 52 65 61 64 28 70 2c 20 69 48 61 73 68 29 3b 0a  Read(p, iHash);.
1b700 20 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41    iSegid = fts5A
1b710 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20  llocateSegid(p, 
1b720 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69 66 28  pStruct);..  if(
1b730 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63   iSegid ){.    c
1b740 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
1b750 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1b760 3b 0a 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ;..    Fts5Struc
1b770 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
1b780 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d  g;   /* New segm
1b790 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72 75  ent within pStru
1b7a0 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 48  ct */.    int nH
1b7b0 65 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  eight;          
1b7c0 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68          /* Heigh
1b7d0 74 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74  t of new segment
1b7e0 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 46   b-tree */.    F
1b7f0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b  ts5Buffer *pBuf;
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b810 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68 20  Buffer in which 
1b820 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66  to assemble leaf
1b830 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 63 6f 6e   page */.    con
1b840 73 74 20 75 38 20 2a 7a 50 72 65 76 20 3d 20 30  st u8 *zPrev = 0
1b850 3b 0a 0a 20 20 20 20 46 74 73 35 53 65 67 57 72  ;..    Fts5SegWr
1b860 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20  iter writer;.   
1b870 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
1b880 2c 20 26 77 72 69 74 65 72 2c 20 69 48 61 73 68  , &writer, iHash
1b890 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
1b8a0 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 20  /* Pre-allocate 
1b8b0 74 68 65 20 62 75 66 66 65 72 20 75 73 65 64 20  the buffer used 
1b8c0 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66  to assemble leaf
1b8d0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 74 61   pages to the ta
1b8e0 72 67 65 74 0a 20 20 20 20 2a 2a 20 70 61 67 65  rget.    ** page
1b8f0 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20 61   size.  */.    a
1b900 73 73 65 72 74 28 20 70 67 73 7a 3e 30 20 29 3b  ssert( pgsz>0 );
1b910 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69  .    pBuf = &wri
1b920 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e 62  ter.aWriter[0].b
1b930 75 66 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  uf;.    fts5Buff
1b940 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70  erGrow(&p->rc, p
1b950 42 75 66 2c 20 70 67 73 7a 20 2b 20 32 30 29 3b  Buf, pgsz + 20);
1b960 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 73  ..    /* Begin s
1b970 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
1b980 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69  hash table entri
1b990 65 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  es. */.    if( p
1b9a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1b9b0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
1b9c0 70 42 75 66 2d 3e 70 2c 20 30 2c 20 34 29 3b 0a  pBuf->p, 0, 4);.
1b9d0 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20        pBuf->n = 
1b9e0 34 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  4;.      p->rc =
1b9f0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1ba00 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20  ScanInit(pHash, 
1ba10 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  0, 0);.    }..  
1ba20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1ba30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
1ba40 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
1ba50 63 61 6e 45 6f 66 28 70 48 61 73 68 29 20 29 7b  canEof(pHash) ){
1ba60 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1ba70 72 20 2a 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20  r *zTerm;.      
1ba80 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  int nTerm;.     
1ba90 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c   const u8 *pDocl
1baa0 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ist;.      int n
1bab0 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 69  Doclist;.      i
1bac0 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20 20  nt nSuffix;     
1bad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1bae0 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66 69  ze of term suffi
1baf0 78 20 2a 2f 0a 0a 20 20 20 20 20 20 73 71 6c 69  x */..      sqli
1bb00 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
1bb10 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a 54 65  ntry(pHash, &zTe
1bb20 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20 26  rm, &pDoclist, &
1bb30 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
1bb40 20 6e 54 65 72 6d 20 3d 20 73 74 72 6c 65 6e 28   nTerm = strlen(
1bb50 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20 20 2f  zTerm);..      /
1bb60 2a 20 44 65 63 69 64 65 20 69 66 20 74 68 65 20  * Decide if the 
1bb70 74 65 72 6d 20 66 69 74 73 20 6f 6e 20 74 68 65  term fits on the
1bb80 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 49   current leaf. I
1bb90 66 20 6e 6f 74 2c 20 66 6c 75 73 68 20 69 74 0a  f not, flush it.
1bba0 20 20 20 20 20 20 2a 2a 20 74 6f 20 64 69 73 6b        ** to disk
1bbb0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
1bbc0 28 70 42 75 66 2d 3e 6e 20 2b 20 6e 54 65 72 6d  (pBuf->n + nTerm
1bbd0 20 2b 20 32 29 20 3e 20 70 67 73 7a 20 29 7b 0a   + 2) > pgsz ){.
1bbe0 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
1bbf0 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77  eFlushLeaf(p, &w
1bc00 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
1bc10 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61  pBuf = &writer.a
1bc20 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20  Writer[0].buf;. 
1bc30 20 20 20 20 20 20 20 69 66 28 20 28 6e 54 65 72         if( (nTer
1bc40 6d 20 2b 20 33 32 29 20 3e 20 70 42 75 66 2d 3e  m + 32) > pBuf->
1bc50 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  nSpace ){.      
1bc60 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1bc70 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ow(&p->rc, pBuf,
1bc80 20 6e 54 65 72 6d 20 2b 20 33 32 20 2d 20 70 42   nTerm + 32 - pB
1bc90 75 66 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  uf->n);.        
1bca0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
1bcb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1bcc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1bcd0 20 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20   Write the term 
1bce0 74 6f 20 74 68 65 20 6c 65 61 66 2e 20 41 6e 64  to the leaf. And
1bcf0 20 70 75 73 68 20 69 74 20 75 70 20 69 6e 74 6f   push it up into
1bd00 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
1bd10 61 72 63 68 79 20 2a 2f 0a 20 20 20 20 20 20 69  archy */.      i
1bd20 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
1bd30 54 65 72 6d 49 6e 50 61 67 65 3d 3d 30 20 29 7b  TermInPage==0 ){
1bd40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 72  .        int nPr
1bd50 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  e = fts5PrefixCo
1bd60 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c 20 7a 50  mpress(nTerm, zP
1bd70 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e  rev, nTerm, (con
1bd80 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20  st u8*)zTerm);. 
1bd90 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
1bda0 3d 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69  = sqlite3PutVari
1bdb0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
1bdc0 2d 3e 6e 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20  ->n], nPre);.   
1bdd0 20 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e       nSuffix = n
1bde0 54 65 72 6d 20 2d 20 6e 50 72 65 3b 0a 20 20 20  Term - nPre;.   
1bdf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1be00 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42    fts5PutU16(&pB
1be10 75 66 2d 3e 70 5b 32 5d 2c 20 70 42 75 66 2d 3e  uf->p[2], pBuf->
1be20 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74  n);.        writ
1be30 65 72 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  er.bFirstTermInP
1be40 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
1be50 20 69 66 28 20 77 72 69 74 65 72 2e 61 57 72 69   if( writer.aWri
1be60 74 65 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29  ter[0].pgno!=1 )
1be70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1be80 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65 66 69  nPre = fts5Prefi
1be90 78 43 6f 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c  xCompress(nTerm,
1bea0 20 7a 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28   zPrev, nTerm, (
1beb0 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29  const u8*)zTerm)
1bec0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1bed0 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 70  WriteBtreeTerm(p
1bee0 2c 20 26 77 72 69 74 65 72 2c 20 6e 50 72 65 2b  , &writer, nPre+
1bef0 31 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54  1, (const u8*)zT
1bf00 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  erm);.          
1bf10 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61  pBuf = &writer.a
1bf20 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20  Writer[0].buf;. 
1bf30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1bf40 20 6e 50 72 65 3c 6e 54 65 72 6d 20 29 3b 0a 20   nPre<nTerm );. 
1bf50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bf60 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d   nSuffix = nTerm
1bf70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bf80 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1bf90 65 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  e3PutVarint(&pBu
1bfa0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e  f->p[pBuf->n], n
1bfb0 53 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 66  Suffix);.      f
1bfc0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1bfd0 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 28 63  endBlob(pBuf, (c
1bfe0 6f 6e 73 74 20 75 38 2a 29 26 7a 54 65 72 6d 5b  onst u8*)&zTerm[
1bff0 6e 54 65 72 6d 2d 6e 53 75 66 66 69 78 5d 2c 20  nTerm-nSuffix], 
1c000 6e 53 75 66 66 69 78 29 3b 0a 0a 20 20 20 20 20  nSuffix);..     
1c010 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66   if( pgsz>=(pBuf
1c020 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b  ->n + nDoclist +
1c030 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   1) ){.        /
1c040 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63  * The entire doc
1c050 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  list will fit on
1c060 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1c070 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  f. */.        ft
1c080 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1c090 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f  ndBlob(pBuf, pDo
1c0a0 63 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29  clist, nDoclist)
1c0b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c0c0 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69         i64 iRowi
1c0d0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  d = 0;.        i
1c0e0 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20  64 iDelta = 0;. 
1c0f0 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20         int iOff 
1c100 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
1c110 20 62 46 69 72 73 74 44 6f 63 69 64 20 3d 20 30   bFirstDocid = 0
1c120 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
1c130 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
1c140 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
1c150 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20   this leaf. The 
1c160 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20  following .     
1c170 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61     ** loop itera
1c180 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  tes through the 
1c190 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61  poslists that ma
1c1a0 6b 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e  ke up the curren
1c1b0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  t .        ** do
1c1c0 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  clist.  */.     
1c1d0 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e     while( iOff<n
1c1e0 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
1c1f0 20 20 20 20 20 75 33 32 20 6e 50 6f 73 3b 0a 20       u32 nPos;. 
1c200 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f           int nCo
1c210 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  py;.          iO
1c220 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  ff += getVarint(
1c230 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
1c240 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
1c250 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79  .          nCopy
1c260 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
1c270 33 32 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  32(&pDoclist[iOf
1c280 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20  f], nPos);.     
1c290 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50       nCopy += nP
1c2a0 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52  os;.          iR
1c2b0 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
1c2c0 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
1c2d0 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74 44       if( bFirstD
1c2e0 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ocid ){.        
1c2f0 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26      fts5PutU16(&
1c300 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 70 42 75 66  pBuf->p[0], pBuf
1c310 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73 74  ->n);   /* first
1c320 20 64 6f 63 69 64 20 6f 6e 20 70 61 67 65 20 2a   docid on page *
1c330 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  /.            pB
1c340 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  uf->n += sqlite3
1c350 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
1c360 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f  >p[pBuf->n], iRo
1c370 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
1c380 20 20 62 46 69 72 73 74 44 6f 63 69 64 20 3d 20    bFirstDocid = 
1c390 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
1c3a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1c3b0 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1c3c0 65 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  e3PutVarint(&pBu
1c3d0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69  f->p[pBuf->n], i
1c3e0 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
1c3f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
1c400 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70  sert( pBuf->n<=p
1c410 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a  Buf->nSpace );..
1c420 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
1c430 42 75 66 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20  Buf->n + nCopy) 
1c440 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  <= pgsz ){.     
1c450 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
1c460 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c  tire poslist wil
1c470 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72  l fit on the cur
1c480 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f  rent leaf. So co
1c490 70 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  py.            *
1c4a0 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20  * it in one go. 
1c4b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  */.            f
1c4c0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1c4d0 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70  endBlob(pBuf, &p
1c4e0 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e  Doclist[iOff], n
1c4f0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20  Copy);.         
1c500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c510 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
1c520 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e  e poslist will n
1c530 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c  ot fit on this l
1c540 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73  eaf. So it needs
1c550 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1c560 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74  to be broken int
1c570 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20  o sections. The 
1c580 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69  only qualificati
1c590 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20  on being.       
1c5a0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63       ** that eac
1c5b0 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65  h varint must be
1c5c0 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f   stored contiguo
1c5d0 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20  usly.  */.      
1c5e0 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
1c5f0 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63  pPoslist = &pDoc
1c600 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  list[iOff];.    
1c610 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73          int iPos
1c620 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1c630 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1c640 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1c650 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20  nSpace = pgsz - 
1c660 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  pBuf->n;.       
1c670 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
1c680 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1c690 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d  (nCopy - iPos)<=
1c6a0 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  nSpace ){.      
1c6b0 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43            n = nC
1c6c0 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20  opy - iPos;.    
1c6d0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1c6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c6f0 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74   n = fts5Poslist
1c700 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74  Prefix(&pPoslist
1c710 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b  [iPos], nSpace);
1c720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1c730 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .              f
1c740 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1c750 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70  endBlob(pBuf, &p
1c760 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e  Poslist[iPos], n
1c770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1c780 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20   iPos += n;.    
1c790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
1c7a0 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61  os>=nCopy ) brea
1c7b0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
1c7c0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1c7d0 65 61 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b  eaf(p, &writer);
1c7e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
1c7f0 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57  Buf = &writer.aW
1c800 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20  riter[0].buf;.  
1c810 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c820 20 20 20 20 20 20 20 20 62 46 69 72 73 74 44 6f          bFirstDo
1c830 63 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cid = 1;.       
1c840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
1c850 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d  ssert( pBuf->n<=
1c860 70 67 73 7a 20 29 3b 0a 20 20 20 20 20 20 20 20  pgsz );.        
1c870 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b    iOff += nCopy;
1c880 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c890 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 66 2d 3e   }..      pBuf->
1c8a0 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27  p[pBuf->n++] = '
1c8b0 5c 30 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  \0';.      asser
1c8c0 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66  t( pBuf->n<=pBuf
1c8d0 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20  ->nSpace );.    
1c8e0 20 20 7a 50 72 65 76 20 3d 20 28 63 6f 6e 73 74    zPrev = (const
1c8f0 20 75 38 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20   u8*)zTerm;.    
1c900 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1c910 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29  hScanNext(pHash)
1c920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1c930 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72  te3Fts5HashClear
1c940 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73  (pHash);.    fts
1c950 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20  5WriteFinish(p, 
1c960 26 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67 68  &writer, &nHeigh
1c970 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  t, &pgnoLast);..
1c980 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1c990 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
1c9a0 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20 62   It is written b
1c9b0 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
1c9c0 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a  ase by the.    *
1c9d0 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  * fts5StructureR
1c9e0 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65  elease() call be
1c9f0 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  low.  */.    if(
1ca00 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1ca10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
1ca20 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
1ca30 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72  el(&p->rc, &pStr
1ca40 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uct);.    }.    
1ca50 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
1ca60 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
1ca70 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20   pStruct, 0, 1, 
1ca80 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  0);.    if( p->r
1ca90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1caa0 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 53        pSeg = &pS
1cab0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
1cac0 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e  .aSeg[ pStruct->
1cad0 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b  aLevel[0].nSeg++
1cae0 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   ];.      pSeg->
1caf0 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
1cb00 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 6e 48 65  .      pSeg->nHe
1cb10 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b 0a  ight = nHeight;.
1cb20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
1cb30 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  First = 1;.     
1cb40 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
1cb50 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
1cb60 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
1cb70 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c  urePromote(p, 0,
1cb80 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a   pStruct);.  }..
1cb90 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69  .  if( p->pConfi
1cba0 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20  g->nAutomerge>0 
1cbb0 29 20 66 74 73 35 49 6e 64 65 78 57 6f 72 6b 28  ) fts5IndexWork(
1cbc0 70 2c 20 69 48 61 73 68 2c 20 26 70 53 74 72 75  p, iHash, &pStru
1cbd0 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  ct, pgnoLast);. 
1cbe0 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1cbf0 4d 65 72 67 65 28 70 2c 20 69 48 61 73 68 2c 20  Merge(p, iHash, 
1cc00 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73  &pStruct);.  fts
1cc10 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
1cc20 70 2c 20 69 48 61 73 68 2c 20 70 53 74 72 75 63  p, iHash, pStruc
1cc30 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
1cc40 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
1cc50 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  ct);.}../*.** Fl
1cc60 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ush any data sto
1cc70 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
1cc80 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
1cc90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1cca0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ccb0 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
1ccc0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
1ccd0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
1cce0 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
1ccf0 67 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  g;.  int i;     
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1cd20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1cd30 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74  indexes */.  int
1cd40 20 6e 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20   nLeaf = 0;     
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cd60 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
1cd70 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f   written */..  /
1cd80 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
1cd90 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65  s already occure
1cda0 64 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  d this call is a
1cdb0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
1cdc0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1cdd0 4b 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  K || p->nPending
1cde0 44 61 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  Data==0 ) return
1cdf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
1ce00 70 48 61 73 68 20 29 3b 0a 0a 20 20 2f 2a 20 46  pHash );..  /* F
1ce10 6c 75 73 68 20 74 68 65 20 74 65 72 6d 73 20 61  lush the terms a
1ce20 6e 64 20 65 61 63 68 20 70 72 65 66 69 78 20 69  nd each prefix i
1ce30 6e 64 65 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a  ndex to disk */.
1ce40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
1ce50 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
1ce60 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 46 6c  i++){.    fts5Fl
1ce70 75 73 68 4f 6e 65 48 61 73 68 28 70 2c 20 69 2c  ushOneHash(p, i,
1ce80 20 26 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a 20 20   &nLeaf);.  }.  
1ce90 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
1cea0 3d 20 30 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c  = 0;.}...int sql
1ceb0 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74  ite3Fts5IndexOpt
1cec0 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20  imize(Fts5Index 
1ced0 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  *p){.  Fts5Confi
1cee0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
1cef0 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69  pConfig;.  int i
1cf00 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c  ;..  fts5IndexFl
1cf10 75 73 68 28 70 29 3b 0a 20 20 66 6f 72 28 69 3d  ush(p);.  for(i=
1cf20 30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  0; i<=pConfig->n
1cf30 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20  Prefix; i++){.  
1cf40 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1cf50 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
1cf60 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20  tructureRead(p, 
1cf70 69 29 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  i);.    Fts5Stru
1cf80 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
1cf90 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20  .    int nSeg = 
1cfa0 30 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  0;.    if( pStru
1cfb0 63 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 65 67  ct ){.      nSeg
1cfc0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
1cfd0 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
1cfe0 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 69 66  truct);.      if
1cff0 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20 20 20  ( nSeg>1 ){.    
1d000 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
1d010 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
1d020 74 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  ture);.        n
1d030 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74  Byte += (pStruct
1d040 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69  ->nLevel+1) * si
1d050 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1d060 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  reLevel);.      
1d070 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74    pNew = (Fts5St
1d080 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33  ructure*)sqlite3
1d090 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
1d0a0 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20  p->rc, nByte);. 
1d0b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d0c0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1d0d0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1d0e0 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20  Level *pLvl;.   
1d0f0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
1d100 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  Seg * sizeof(Fts
1d110 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1d120 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  t);.      pNew->
1d130 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74  nLevel = pStruct
1d140 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20  ->nLevel+1;.    
1d150 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f    pNew->nWriteCo
1d160 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d  unter = pStruct-
1d170 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
1d180 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e        pLvl = &pN
1d190 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75  ew->aLevel[pStru
1d1a0 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20  ct->nLevel];.   
1d1b0 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
1d1c0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
1d1d0 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
1d1e0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
1d1f0 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >rc, nByte);.   
1d200 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65     if( pLvl->aSe
1d210 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  g ){.        int
1d220 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
1d230 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74       int iSegOut
1d240 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1d250 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1d260 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1d270 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1d280 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1d290 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1d2a0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1d2b0 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1d2c0 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b       pLvl->aSeg[
1d2d0 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75  iSegOut] = pStru
1d2e0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1d2f0 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
1d300 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74           iSegOut
1d310 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
1d320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d330 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
1d340 53 65 67 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Seg;.      }else
1d350 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d360 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
1d370 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
1d380 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1d390 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
1d3a0 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20       int iLvl = 
1d3b0 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a  pNew->nLevel-1;.
1d3c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
1d3d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d3e0 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c   pNew->aLevel[iL
1d3f0 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20  vl].nSeg>0 ){.  
1d400 20 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d        int nRem =
1d410 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55   FTS5_OPT_WORK_U
1d420 4e 49 54 3b 0a 20 20 20 20 20 20 20 20 66 74 73  NIT;.        fts
1d430 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
1d440 28 70 2c 20 69 2c 20 26 70 4e 65 77 2c 20 69 4c  (p, i, &pNew, iL
1d450 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
1d460 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 53    }..      fts5S
1d470 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
1d480 20 69 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20   i, pNew);.     
1d490 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1d4a0 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
1d4b0 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75   }..    fts5Stru
1d4c0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1d4d0 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ruct);.  }..  re
1d4e0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
1d4f0 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 0a 0a 2f  turn(p); .}..../
1d500 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69  *.** Return a si
1d510 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61  mple checksum va
1d520 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  lue based on the
1d530 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73   arguments..*/.s
1d540 74 61 74 69 63 20 75 36 34 20 66 74 73 35 49 6e  tatic u64 fts5In
1d550 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20  dexEntryCksum(. 
1d560 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
1d570 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74  int iCol, .  int
1d580 20 69 50 6f 73 2c 20 0a 20 20 63 6f 6e 73 74 20   iPos, .  const 
1d590 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 0a 20 20  char *pTerm, .  
1d5a0 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69  int nTerm.){.  i
1d5b0 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20  nt i;.  u64 ret 
1d5c0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20  = iRowid;.  ret 
1d5d0 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43  += (ret<<3) + iC
1d5e0 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  ol;.  ret += (re
1d5f0 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20  t<<3) + iPos;.  
1d600 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
1d610 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72  ; i++) ret += (r
1d620 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69  et<<3) + pTerm[i
1d630 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ];.  return ret;
1d640 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1d650 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69  fts5BtreeIterIni
1d660 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
1d670 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a  p, .  int iIdx,.
1d680 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
1d690 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 0a 20  egment *pSeg, . 
1d6a0 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a   Fts5BtreeIter *
1d6b0 70 49 74 65 72 0a 29 7b 0a 20 20 69 6e 74 20 6e  pIter.){.  int n
1d6c0 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
1d6d0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
1d6e0 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 29 20  pIter->aLvl[0]) 
1d6f0 2a 20 28 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  * (pSeg->nHeight
1d700 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  -1);.  memset(pI
1d710 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
1d720 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
1d730 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65 67 2d 3e 6e  ->nLvl = pSeg->n
1d740 48 65 69 67 68 74 2d 31 3b 0a 20 20 70 49 74 65  Height-1;.  pIte
1d750 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
1d760 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a    pIter->p = p;.
1d770 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
1d780 70 53 65 67 3b 0a 20 20 69 66 28 20 6e 42 79 74  pSeg;.  if( nByt
1d790 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  e && p->rc==SQLI
1d7a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74  TE_OK ){.    pIt
1d7b0 65 72 2d 3e 61 4c 76 6c 20 3d 20 28 46 74 73 35  er->aLvl = (Fts5
1d7c0 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 2a 29  BtreeIterLevel*)
1d7d0 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
1d7e0 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 66   nByte);.  }.  f
1d7f0 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
1d800 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49  QLITE_OK && i<pI
1d810 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
1d820 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
1d830 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1d840 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d  OWID(iIdx, pSeg-
1d850 3e 69 53 65 67 69 64 2c 20 69 2b 31 2c 20 31 29  >iSegid, i+1, 1)
1d860 3b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  ;.    Fts5Data *
1d870 70 44 61 74 61 3b 0a 20 20 20 20 70 49 74 65 72  pData;.    pIter
1d880 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 20  ->aLvl[i].pData 
1d890 3d 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  = pData = fts5Da
1d8a0 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64  taRead(p, iRowid
1d8b0 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  );.    if( pData
1d8c0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f   ){.      fts5No
1d8d0 64 65 49 74 65 72 49 6e 69 74 28 70 44 61 74 61  deIterInit(pData
1d8e0 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26  ->p, pData->n, &
1d8f0 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 73  pIter->aLvl[i].s
1d900 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d910 69 66 28 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 3d  if( pIter->nLvl=
1d920 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20  =0 || p->rc ){. 
1d930 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
1d940 20 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   1;.    pIter->i
1d950 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Leaf = pSeg->pgn
1d960 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  oLast;.  }else{.
1d970 20 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74      pIter->nEmpt
1d980 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  y = pIter->aLvl[
1d990 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 20  0].s.nEmpty;.   
1d9a0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20   pIter->iLeaf = 
1d9b0 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
1d9c0 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 70 49 74  .iChild;.    pIt
1d9d0 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74  er->bDlidx = pIt
1d9e0 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44  er->aLvl[0].s.bD
1d9f0 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  lidx;.  }.}..sta
1da00 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72  tic void fts5Btr
1da10 65 65 49 74 65 72 4e 65 78 74 28 46 74 73 35 42  eeIterNext(Fts5B
1da20 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29  treeIter *pIter)
1da30 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
1da40 20 3d 20 70 49 74 65 72 2d 3e 70 3b 0a 20 20 69   = pIter->p;.  i
1da50 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
1da60 20 70 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20   pIter->bEof==0 
1da70 26 26 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  && pIter->aLvl[0
1da80 5d 2e 73 2e 61 44 61 74 61 20 29 3b 0a 20 20 66  ].s.aData );.  f
1da90 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
1daa0 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e 72 63 3d 3d  >nLvl && p->rc==
1dab0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
1dac0 0a 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74  .    Fts5BtreeIt
1dad0 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  erLevel *pLvl = 
1dae0 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
1daf0 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
1db00 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 70  rNext(&p->rc, &p
1db10 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28  Lvl->s);.    if(
1db20 20 70 4c 76 6c 2d 3e 73 2e 61 44 61 74 61 20 29   pLvl->s.aData )
1db30 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
1db40 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1db50 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c  Iter->term, pLvl
1db60 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c  ->s.term.n, pLvl
1db70 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20  ->s.term.p);.   
1db80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
1db90 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4e  lse{.      fts5N
1dba0 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76  odeIterFree(&pLv
1dbb0 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20 66 74 73  l->s);.      fts
1dbc0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
1dbd0 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
1dbe0 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30   pLvl->pData = 0
1dbf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1dc00 28 20 69 3d 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c  ( i==pIter->nLvl
1dc10 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20   || p->rc ){.   
1dc20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
1dc30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1dc40 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65  nt iSegid = pIte
1dc50 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  r->pSeg->iSegid;
1dc60 0a 20 20 20 20 66 6f 72 28 69 2d 2d 3b 20 69 3e  .    for(i--; i>
1dc70 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
1dc80 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
1dc90 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  el *pLvl = &pIte
1dca0 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20  r->aLvl[i];.    
1dcb0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
1dcc0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1dcd0 44 28 70 49 74 65 72 2d 3e 69 49 64 78 2c 69 53  D(pIter->iIdx,iS
1dce0 65 67 69 64 2c 69 2b 31 2c 70 4c 76 6c 5b 31 5d  egid,i+1,pLvl[1]
1dcf0 2e 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  .s.iChild);.    
1dd00 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
1dd10 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1dd20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
1dd30 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
1dd40 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f  {.        fts5No
1dd50 64 65 49 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d  deIterInit(pLvl-
1dd60 3e 70 44 61 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d  >pData->p, pLvl-
1dd70 3e 70 44 61 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c  >pData->n, &pLvl
1dd80 2d 3e 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ->s);.      }.  
1dd90 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72    }.  }..  pIter
1dda0 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72  ->nEmpty = pIter
1ddb0 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70  ->aLvl[0].s.nEmp
1ddc0 74 79 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 6c  ty;.  pIter->bDl
1ddd0 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  idx = pIter->aLv
1dde0 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20  l[0].s.bDlidx;. 
1ddf0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20   pIter->iLeaf = 
1de00 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
1de10 2e 69 43 68 69 6c 64 3b 0a 20 20 61 73 73 65 72  .iChild;.  asser
1de20 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
1de30 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45  _OK || pIter->bE
1de40 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  of );.}..static 
1de50 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74  void fts5BtreeIt
1de60 65 72 46 72 65 65 28 46 74 73 35 42 74 72 65 65  erFree(Fts5Btree
1de70 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1de80 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1de90 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
1dea0 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42   i++){.    Fts5B
1deb0 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70  treeIterLevel *p
1dec0 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
1ded0 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e  vl[i];.    fts5N
1dee0 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76  odeIterFree(&pLv
1def0 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70  l->s);.    if( p
1df00 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20  Lvl->pData ){.  
1df10 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
1df20 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
1df30 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
1df40 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ata = 0;.    }. 
1df50 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1df60 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a  e(pIter->aLvl);.
1df70 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1df80 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
1df90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1dfa0 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79  nction is purely
1dfb0 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
1dfc0 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
1dfd0 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
1dfe0 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
1dff0 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
1e000 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
1e010 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
1e020 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74  ** Instead, it t
1e030 65 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61  ests that the sa
1e040 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72  me set of pgno/r
1e050 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  owid combination
1e060 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65  s are .** visite
1e070 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  d regardless of 
1e080 77 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c  whether the docl
1e090 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69  ist-index identi
1e0a0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
1e0b0 72 73 0a 2a 2a 20 69 49 64 78 2f 69 53 65 67 69  rs.** iIdx/iSegi
1e0c0 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61  d/iLeaf is itera
1e0d0 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20  ted in forwards 
1e0e0 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  or reverse order
1e0f0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1e100 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
1e110 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
1e120 65 72 54 65 73 74 52 65 76 65 72 73 65 28 0a 20  erTestReverse(. 
1e130 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1e140 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e160 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6c 6f    /* Index to lo
1e170 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
1e180 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1e190 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
1e1a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1e1b0 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64  gment id to load
1e1c0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1e1d0 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
1e1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1e1f0 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
1e200 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
1e210 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  /.){.  Fts5Dlidx
1e220 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
1e230 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d 31 20 3d  ;.  i64 cksum1 =
1e240 20 31 33 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d   13;.  i64 cksum
1e250 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 66  2 = 13;..  for(f
1e260 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
1e270 28 70 2c 20 30 2c 20 69 49 64 78 2c 20 69 53 65  (p, 0, iIdx, iSe
1e280 67 69 64 2c 20 69 4c 65 61 66 2c 20 26 70 44 6c  gid, iLeaf, &pDl
1e290 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35  idx);.      fts5
1e2a0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
1e2b0 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
1e2c0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
1e2d0 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 29 7b  ext(pDlidx).  ){
1e2e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c  .    assert( pDl
1e2f0 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 69  idx->iLeafPgno>i
1e300 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75  Leaf );.    cksu
1e310 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 28  m1 = (cksum1 ^ (
1e320 20 28 69 36 34 29 28 70 44 6c 69 64 78 2d 3e 69   (i64)(pDlidx->i
1e330 4c 65 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32 20  LeafPgno) << 32 
1e340 29 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 3d  ));.    cksum1 =
1e350 20 28 63 6b 73 75 6d 31 20 5e 20 70 44 6c 69 64   (cksum1 ^ pDlid
1e360 78 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a  x->iRowid);.  }.
1e370 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
1e380 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
1e390 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f  Dlidx = 0;..  fo
1e3a0 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  r(fts5DlidxIterI
1e3b0 6e 69 74 28 70 2c 20 31 2c 20 69 49 64 78 2c 20  nit(p, 1, iIdx, 
1e3c0 69 53 65 67 69 64 2c 20 69 4c 65 61 66 2c 20 26  iSegid, iLeaf, &
1e3d0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
1e3e0 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
1e3f0 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
1e400 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1e410 65 72 50 72 65 76 28 70 44 6c 69 64 78 29 0a 20  erPrev(pDlidx). 
1e420 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e430 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e  pDlidx->iLeafPgn
1e440 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63  o>iLeaf );.    c
1e450 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20  ksum2 = (cksum2 
1e460 5e 20 28 20 28 69 36 34 29 28 70 44 6c 69 64 78  ^ ( (i64)(pDlidx
1e470 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c 20  ->iLeafPgno) << 
1e480 33 32 20 29 29 3b 0a 20 20 20 20 63 6b 73 75 6d  32 ));.    cksum
1e490 32 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20 70 44  2 = (cksum2 ^ pD
1e4a0 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  lidx->iRowid);. 
1e4b0 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74   }.  fts5DlidxIt
1e4c0 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
1e4d0 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20    pDlidx = 0;.. 
1e4e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1e4f0 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21  TE_OK && cksum1!
1e500 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
1e510 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 20  = FTS5_CORRUPT; 
1e520 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1e530 65 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 54  e fts5DlidxIterT
1e540 65 73 74 52 65 76 65 72 73 65 28 77 2c 78 2c 79  estReverse(w,x,y
1e550 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  ,z).#endif..stat
1e560 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1e570 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
1e580 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e  egment(.  Fts5In
1e590 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1e5a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1e5b0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1e5c0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1e5f0 68 61 74 20 70 53 65 67 20 69 73 20 61 20 70 61  hat pSeg is a pa
1e600 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53  rt of */.  Fts5S
1e610 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
1e620 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65  *pSeg      /* Se
1e630 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
1e640 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
1e650 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ncy */.){.  Fts5
1e660 42 74 72 65 65 49 74 65 72 20 69 74 65 72 3b 20  BtreeIter iter; 
1e670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1e680 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1e690 68 72 6f 75 67 68 20 62 2d 74 72 65 65 20 68 69  hrough b-tree hi
1e6a0 65 72 61 72 63 68 79 20 2a 2f 0a 0a 20 20 2f 2a  erarchy */..  /*
1e6b0 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
1e6c0 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
1e6d0 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 66 6f 72  archy.  */.  for
1e6e0 28 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e  (fts5BtreeIterIn
1e6f0 69 74 28 70 2c 20 69 49 64 78 2c 20 70 53 65 67  it(p, iIdx, pSeg
1e700 2c 20 26 69 74 65 72 29 3b 0a 20 20 20 20 20 20  , &iter);.      
1e710 69 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20  iter.bEof==0;.  
1e720 20 20 20 20 66 74 73 35 42 74 72 65 65 49 74 65      fts5BtreeIte
1e730 72 4e 65 78 74 28 26 69 74 65 72 29 0a 20 20 29  rNext(&iter).  )
1e740 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20  {.    i64 iRow; 
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e760 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
1e770 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20   this leaf */.  
1e780 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
1e790 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1e7a0 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73  /* Data for this
1e7b0 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74   leaf */.    int
1e7c0 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
1e7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1e7e0 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65  fset of first te
1e7f0 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  rm on leaf */.  
1e800 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1e810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e820 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
1e830 74 65 20 74 68 72 6f 75 67 68 20 65 6d 70 74 79  te through empty
1e840 20 6c 65 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20   leaves */..    
1e850 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20 69  /* If the leaf i
1e860 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61  n question has a
1e870 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d  lready been trim
1e880 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67  med from the seg
1e890 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67  ment, .    ** ig
1e8a0 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65 65  nore this b-tree
1e8b0 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73   entry. Otherwis
1e8c0 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20  e, load it into 
1e8d0 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69  memory. */.    i
1e8e0 66 28 20 69 74 65 72 2e 69 4c 65 61 66 3c 70 53  f( iter.iLeaf<pS
1e8f0 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20  eg->pgnoFirst ) 
1e900 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52  continue;.    iR
1e910 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ow = FTS5_SEGMEN
1e920 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53  T_ROWID(iIdx, pS
1e930 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 69  eg->iSegid, 0, i
1e940 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20  ter.iLeaf);.    
1e950 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
1e960 52 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20  Read(p, iRow);. 
1e970 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20     if( pLeaf==0 
1e980 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
1e990 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
1e9a0 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74  leaf contains at
1e9b0 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c   least one term,
1e9c0 20 61 6e 64 20 74 68 61 74 20 69 74 20 69 73 20   and that it is 
1e9d0 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20  equal.    ** to 
1e9e0 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  or larger than t
1e9f0 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20  he split-key in 
1ea00 69 74 65 72 2e 74 65 72 6d 2e 20 20 2a 2f 0a 20  iter.term.  */. 
1ea10 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65     iOff = fts5Ge
1ea20 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
1ea30 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66  ]);.    if( iOff
1ea40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1ea50 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1ea60 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
1ea70 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20      int nTerm;  
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea90 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
1eaa0 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73  on leaf in bytes
1eab0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
1eac0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1ead0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
1eae0 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20  son of term and 
1eaf0 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 20 20 20  split-key */.   
1eb00 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
1eb10 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
1eb20 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
1eb30 6d 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  m);.      res = 
1eb40 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70  memcmp(&pLeaf->p
1eb50 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72  [iOff], iter.ter
1eb60 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20  m.p, MIN(nTerm, 
1eb70 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20  iter.term.n));. 
1eb80 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1eb90 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
1eba0 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20  iter.term.n;.   
1ebb0 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
1ebc0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1ebd0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
1ebe0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ebf0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1ec00 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
1ec10 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
1ec20 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b      /* Now check
1ec30 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
1ec40 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
1ec50 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
1ec60 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28  nt leaf.    ** (
1ec70 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
1ec80 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
1ec90 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  s. */.    for(i=
1eca0 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  1; p->rc==SQLITE
1ecb0 5f 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e  _OK && i<=iter.n
1ecc0 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  Empty; i++){.   
1ecd0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1ece0 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b  ataRead(p, iRow+
1ecf0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  i);.      if( pL
1ed00 65 61 66 20 26 26 20 30 21 3d 66 74 73 35 47 65  eaf && 0!=fts5Ge
1ed10 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
1ed20 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ]) ){.        p-
1ed30 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1ed40 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1ed50 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1ed60 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  e(pLeaf);.    }.
1ed70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1ed80 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
1ed90 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20  dex, check that 
1eda0 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20  it looks right. 
1edb0 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e  */.    if( iter.
1edc0 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  bDlidx ){.      
1edd0 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
1ede0 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46  Dlidx = 0;  /* F
1edf0 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
1ee00 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64  ough doclist ind
1ee10 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
1ee20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72  iPrevLeaf = iter
1ee30 2e 69 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e  .iLeaf;.      in
1ee40 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  t iSegid = pSeg-
1ee50 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69  >iSegid;.      i
1ee60 6e 74 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36  nt iPg;.      i6
1ee70 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66  4 iKey;..      f
1ee80 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
1ee90 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
1eea0 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c   iSegid, iter.iL
1eeb0 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20  eaf, &pDlidx);. 
1eec0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
1eed0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
1eee0 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
1eef0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1ef00 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 20  Next(pDlidx).   
1ef10 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f     ){..        /
1ef20 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69  * Check any rowi
1ef30 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  d-less pages tha
1ef40 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
1ef50 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1ef60 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
1ef70 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b  iPg=iPrevLeaf+1;
1ef80 20 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65   iPg<pDlidx->iLe
1ef90 61 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a  afPgno; iPg++){.
1efa0 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d            iKey =
1efb0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1efc0 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1efd0 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20  , 0, iPg);.     
1efe0 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
1eff0 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65  5DataRead(p, iKe
1f000 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1f010 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
1f020 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 47         if( fts5G
1f030 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
1f040 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  0])!=0 ) p->rc =
1f050 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
1f060 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44             fts5D
1f070 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
1f080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1f090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f0a0 20 69 50 72 65 76 4c 65 61 66 20 3d 20 70 44 6c   iPrevLeaf = pDl
1f0b0 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  idx->iLeafPgno;.
1f0c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
1f0d0 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
1f0e0 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62  page indicated b
1f0f0 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  y the iterator r
1f100 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20  eally does.     
1f110 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68     ** contain th
1f120 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65  e rowid suggeste
1f130 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a  d by the same. *
1f140 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  /.        iKey =
1f150 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1f160 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1f170 2c 20 30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c 65  , 0, pDlidx->iLe
1f180 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  afPgno);.       
1f190 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1f1a0 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1f1b0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1f1c0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1f1d0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
1f1e0 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
1f1f0 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
1f200 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
1f210 20 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69           getVari
1f220 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
1f230 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
1f240 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1f250 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 70     if( iRowid!=p
1f260 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 20  Dlidx->iRowid ) 
1f270 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1f280 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
1f290 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1f2a0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
1f2b0 7d 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  }..      }..    
1f2c0 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
1f2d0 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65  eaf+1; iPg<=(ite
1f2e0 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e  r.iLeaf + iter.n
1f2f0 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a  Empty); iPg++){.
1f300 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
1f310 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1f320 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
1f330 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  0, iPg);.       
1f340 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1f350 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1f360 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1f370 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1f380 66 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70  f( fts5GetU16(&p
1f390 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29  Leaf->p[0])!=0 )
1f3a0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1f3b0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
1f3c0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1f3d0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
1f3e0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
1f3f0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
1f400 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  ree(pDlidx);.   
1f410 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1f420 54 65 73 74 52 65 76 65 72 73 65 28 70 2c 20 69  TestReverse(p, i
1f430 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 74 65  Idx, iSegid, ite
1f440 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  r.iLeaf);.    }.
1f450 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1f460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1f470 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d  ter.iLeaf!=pSeg-
1f480 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
1f490 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1f4a0 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74  RRUPT;.  }..  ft
1f4b0 73 35 42 74 72 65 65 49 74 65 72 46 72 65 65 28  s5BtreeIterFree(
1f4c0 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &iter);.}../*.**
1f4d0 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69   Iterator pMulti
1f4e0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1f4f0 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  s to a valid ent
1f500 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68  ry (not EOF). Th
1f510 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1f520 70 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66  ppends a copy of
1f530 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
1f540 73 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20  st of the entry 
1f550 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65  pMulti .** curre
1f560 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
1f570 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  o buffer pBuf..*
1f580 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1f590 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
1f5a0 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
1f5b0 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61  n p->rc. It is a
1f5c0 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72  ssumed.** no err
1f5d0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
1f5e0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
1f5f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f600 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
1f610 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
1f620 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
1f630 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
1f640 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
1f650 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a  Multi,.  int bSz
1f660 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
1f670 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d  pBuf.){.  if( p-
1f680 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1f690 7b 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49  {.    Fts5ChunkI
1f6a0 74 65 72 20 69 74 65 72 3b 0a 20 20 20 20 46 74  ter iter;.    Ft
1f6b0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
1f6c0 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b  = &pMulti->aSeg[
1f6d0 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b   pMulti->aFirst[
1f6e0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
1f6f0 20 61 73 73 65 72 74 28 20 66 74 73 35 4d 75 6c   assert( fts5Mul
1f700 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 4d 75  tiIterEof(p, pMu
1f710 6c 74 69 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66  lti)==0 );.    f
1f720 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74  ts5ChunkIterInit
1f730 28 70 2c 20 70 53 65 67 2c 20 26 69 74 65 72 29  (p, pSeg, &iter)
1f740 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 43 68  ;.    if( fts5Ch
1f750 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 69  unkIterEof(p, &i
1f760 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ter)==0 ){.     
1f770 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20 20 20   if( bSz ){.    
1f780 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f790 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1f7a0 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e 52  c, pBuf, iter.nR
1f7b0 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  em);.      }.   
1f7c0 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 43 68     while( fts5Ch
1f7d0 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 69  unkIterEof(p, &i
1f7e0 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ter)==0 ){.     
1f7f0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f800 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1f810 70 42 75 66 2c 20 69 74 65 72 2e 6e 2c 20 69 74  pBuf, iter.n, it
1f820 65 72 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66  er.p);.        f
1f830 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74  ts5ChunkIterNext
1f840 28 70 2c 20 26 69 74 65 72 29 3b 0a 20 20 20 20  (p, &iter);.    
1f850 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
1f860 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61  s5ChunkIterRelea
1f870 73 65 28 26 69 74 65 72 29 3b 0a 20 20 7d 0a 7d  se(&iter);.  }.}
1f880 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1f890 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1f8a0 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t(Fts5DoclistIte
1f8b0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
1f8c0 20 70 49 74 65 72 2d 3e 69 3c 70 49 74 65 72 2d   pIter->i<pIter-
1f8d0 3e 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  >n ){.    if( pI
1f8e0 74 65 72 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20  ter->i ){.      
1f8f0 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  i64 iDelta;.    
1f900 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65    pIter->i += ge
1f910 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e  tVarint(&pIter->
1f920 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36  a[pIter->i], (u6
1f930 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
1f940 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 44     if( pIter->bD
1f950 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  esc ){.        p
1f960 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20  Iter->iRowid -= 
1f970 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d 65  iDelta;.      }e
1f980 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 74  lse{.        pIt
1f990 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
1f9a0 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  elta;.      }.  
1f9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1f9c0 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61  Iter->i += getVa
1f9d0 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70  rint(&pIter->a[p
1f9e0 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29  Iter->i], (u64*)
1f9f0 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
1fa00 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72  .    }.    pIter
1fa10 2d 3e 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61  ->i += fts5GetVa
1fa20 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61  rint32(&pIter->a
1fa30 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 70 49 74 65  [pIter->i], pIte
1fa40 72 2d 3e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20  r->nPoslist);.  
1fa50 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73    pIter->aPoslis
1fa60 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 5b 70 49  t = &pIter->a[pI
1fa70 74 65 72 2d 3e 69 5d 3b 0a 20 20 20 20 70 49 74  ter->i];.    pIt
1fa80 65 72 2d 3e 69 20 2b 3d 20 70 49 74 65 72 2d 3e  er->i += pIter->
1fa90 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73  nPoslist;.  }els
1faa0 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  e{.    pIter->aP
1fab0 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a  oslist = 0;.  }.
1fac0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1fad0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
1fae0 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  it(.  Fts5Buffer
1faf0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 62   *pBuf, .  int b
1fb00 44 65 73 63 2c 20 0a 20 20 46 74 73 35 44 6f 63  Desc, .  Fts5Doc
1fb10 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a  listIter *pIter.
1fb20 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ){.  memset(pIte
1fb30 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
1fb40 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
1fb50 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70  a = pBuf->p;.  p
1fb60 49 74 65 72 2d 3e 6e 20 3d 20 70 42 75 66 2d 3e  Iter->n = pBuf->
1fb70 6e 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 65 73  n;.  pIter->bDes
1fb80 63 20 3d 20 62 44 65 73 63 3b 0a 20 20 66 74 73  c = bDesc;.  fts
1fb90 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
1fba0 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pIter);.}../*.*
1fbb0 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69  * Append a docli
1fbc0 73 74 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  st to buffer pBu
1fbd0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  f..*/.static voi
1fbe0 64 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e  d fts5MergeAppen
1fbf0 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20 2a 70  dDocid(.  int *p
1fc00 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
1fc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
1fc20 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
1fc30 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 0a  */.  int bDesc,.
1fc40 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1fc50 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1fc60 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77    /* Buffer to w
1fc70 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
1fc80 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20   *piLastRowid,  
1fc90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fca0 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73  IN/OUT: Previous
1fcb0 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28   rowid written (
1fcc0 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34  if any) */.  i64
1fcd0 20 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20   iRowid         
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fcf0 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20  Rowid to append 
1fd00 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 42 75 66  */.){.  if( pBuf
1fd10 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  ->n==0 ){.    ft
1fd20 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1fd30 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20  rint(pRc, pBuf, 
1fd40 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65  iRowid);.  }else
1fd50 20 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20   if( bDesc ){.  
1fd60 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fd70 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42  ndVarint(pRc, pB
1fd80 75 66 2c 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  uf, *piLastRowid
1fd90 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65   - iRowid);.  }e
1fda0 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75 66  lse{.    fts5Buf
1fdb0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1fdc0 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69  pRc, pBuf, iRowi
1fdd0 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  d - *piLastRowid
1fde0 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61 73 74  );.  }.  *piLast
1fdf0 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1fe00 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73  }../*.** Buffers
1fe10 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61   p1 and p2 conta
1fe20 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69  in doclists. Thi
1fe30 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65  s function merge
1fe40 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  s the content.**
1fe50 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c   of the two docl
1fe60 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e  ists together an
1fe70 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31  d sets buffer p1
1fe80 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62   to the result b
1fe90 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
1fea0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
1feb0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1fec0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
1fed0 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66  eft in p->rc. If
1fee0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a   an error has.**
1fef0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1ff00 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1ff10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1ff20 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1ff30 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
1ff40 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1ff50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ff60 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1ff70 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1ff80 69 6e 74 20 62 44 65 73 63 2c 0a 20 20 46 74 73  int bDesc,.  Fts
1ff90 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20  5Buffer *p1,    
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ffb0 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65  First list to me
1ffc0 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  rge */.  Fts5Buf
1ffd0 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20  fer *p2         
1ffe0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
1fff0 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65  nd list to merge
20000 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d   */.){.  if( p2-
20010 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c  >n ){.    i64 iL
20020 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
20030 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65    Fts5DoclistIte
20040 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f  r i1;.    Fts5Do
20050 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20  clistIter i2;.  
20060 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74    Fts5Buffer out
20070 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  ;.    Fts5Buffer
20080 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74   tmp;.    memset
20090 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (&out, 0, sizeof
200a0 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73  (out));.    mems
200b0 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65  et(&tmp, 0, size
200c0 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20 66  of(tmp));..    f
200d0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
200e0 69 74 28 70 31 2c 20 62 44 65 73 63 2c 20 26 69  it(p1, bDesc, &i
200f0 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c  1);.    fts5Docl
20100 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20  istIterInit(p2, 
20110 62 44 65 73 63 2c 20 26 69 32 29 3b 0a 20 20 20  bDesc, &i2);.   
20120 20 77 68 69 6c 65 28 20 69 31 2e 61 50 6f 73 6c   while( i1.aPosl
20130 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61 50 6f  ist!=0 || i2.aPo
20140 73 6c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20  slist!=0 ){.    
20150 20 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73    if( i2.aPoslis
20160 74 3d 3d 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73  t==0 || (i1.aPos
20170 6c 69 73 74 20 26 26 20 0a 20 20 20 20 20 20 20  list && .       
20180 20 20 20 20 28 20 28 62 44 65 73 63 20 26 26 20      ( (bDesc && 
20190 69 31 2e 69 52 6f 77 69 64 3e 69 32 2e 69 52 6f  i1.iRowid>i2.iRo
201a0 77 69 64 29 20 7c 7c 20 28 21 62 44 65 73 63 20  wid) || (!bDesc 
201b0 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e  && i1.iRowid<i2.
201c0 69 52 6f 77 69 64 29 20 29 0a 20 20 20 20 20 20  iRowid) ).      
201d0 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  )){.        /* C
201e0 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69  opy entry from i
201f0 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  1 */.        fts
20200 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
20210 64 28 26 70 2d 3e 72 63 2c 20 62 44 65 73 63 2c  d(&p->rc, bDesc,
20220 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77   &out, &iLastRow
20230 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a  id, i1.iRowid);.
20240 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20250 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
20260 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e  p->rc, &out, i1.
20270 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  nPoslist);.     
20280 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
20290 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
202a0 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  &out, i1.nPoslis
202b0 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b  t, i1.aPoslist);
202c0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
202d0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
202e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
202f0 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61 50 6f   else if( i1.aPo
20300 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 69  slist==0 || i2.i
20310 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69 64  Rowid!=i1.iRowid
20320 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
20330 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69  opy entry from i
20340 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  2 */.        fts
20350 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
20360 64 28 26 70 2d 3e 72 63 2c 20 62 44 65 73 63 2c  d(&p->rc, bDesc,
20370 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77   &out, &iLastRow
20380 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a  id, i2.iRowid);.
20390 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
203a0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
203b0 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e  p->rc, &out, i2.
203c0 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  nPoslist);.     
203d0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
203e0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
203f0 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  &out, i2.nPoslis
20400 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b  t, i2.aPoslist);
20410 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
20420 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32  listIterNext(&i2
20430 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20440 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 46   else{.        F
20450 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
20460 20 72 31 3b 0a 20 20 20 20 20 20 20 20 46 74 73   r1;.        Fts
20470 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72  5PoslistReader r
20480 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  2;.        Fts5P
20490 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69  oslistWriter wri
204a0 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  ter;..        me
204b0 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
204c0 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29   sizeof(writer))
204d0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65  ;..        /* Me
204e0 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69  rge the two posi
204f0 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a  tion lists. */ .
20500 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
20510 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d  eAppendDocid(&p-
20520 3e 72 63 2c 20 62 44 65 73 63 2c 20 26 6f 75 74  >rc, bDesc, &out
20530 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  , &iLastRowid, i
20540 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
20550 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
20560 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20  o(&tmp);.       
20570 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
20580 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31  istReaderInit(-1
20590 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i1.aPoslist, i
205a0 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 72 31 29  1.nPoslist, &r1)
205b0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
205c0 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
205d0 65 72 49 6e 69 74 28 2d 31 2c 20 69 32 2e 61 50  erInit(-1, i2.aP
205e0 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c  oslist, i2.nPosl
205f0 69 73 74 2c 20 26 72 32 29 3b 0a 20 20 20 20 20  ist, &r2);.     
20600 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
20610 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 72  =SQLITE_OK && (r
20620 31 2e 62 45 6f 66 3d 3d 30 20 7c 7c 20 72 32 2e  1.bEof==0 || r2.
20630 62 45 6f 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20  bEof==0) ){.    
20640 20 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a        i64 iNew;.
20650 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 32            if( r2
20660 2e 62 45 6f 66 20 7c 7c 20 28 72 31 2e 62 45 6f  .bEof || (r1.bEo
20670 66 3d 3d 30 20 26 26 20 72 31 2e 69 50 6f 73 3c  f==0 && r1.iPos<
20680 72 32 2e 69 50 6f 73 29 20 29 7b 0a 20 20 20 20  r2.iPos) ){.    
20690 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 72          iNew = r
206a0 31 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  1.iPos;.        
206b0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
206c0 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
206d0 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  (&r1);.         
206e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
206f0 20 20 20 20 69 4e 65 77 20 3d 20 72 32 2e 69 50      iNew = r2.iP
20700 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
20710 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
20720 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 32  stReaderNext(&r2
20730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
20740 66 28 20 72 31 2e 69 50 6f 73 3d 3d 72 32 2e 69  f( r1.iPos==r2.i
20750 50 6f 73 20 29 20 73 71 6c 69 74 65 33 46 74 73  Pos ) sqlite3Fts
20760 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65  5PoslistReaderNe
20770 78 74 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20  xt(&r1);.       
20780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
20790 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
207a0 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41  s5PoslistWriterA
207b0 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 77 72 69  ppend(&tmp, &wri
207c0 74 65 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20  ter, iNew);.    
207d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
207e0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
207f0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f  arint(&p->rc, &o
20800 75 74 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20  ut, tmp.n);.    
20810 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
20820 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
20830 20 26 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d   &out, tmp.n, tm
20840 70 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74  p.p);.        ft
20850 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
20860 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20  t(&i1);.        
20870 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
20880 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
20890 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
208a0 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
208b0 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75  c, p1, out.n, ou
208c0 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75  t.p);.    fts5Bu
208d0 66 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a  fferFree(&tmp);.
208e0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
208f0 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a  ee(&out);.  }.}.
20900 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
20910 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35  5BufferSwap(Fts5
20920 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35  Buffer *p1, Fts5
20930 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46  Buffer *p2){.  F
20940 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20  ts5Buffer tmp = 
20950 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32  *p1;.  *p1 = *p2
20960 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d  ;.  *p2 = tmp;.}
20970 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
20980 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65  s5SetupPrefixIte
20990 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r(.  Fts5Index *
209a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
209b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
209c0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
209d0 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20  int bDesc,      
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209f0 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44  /* True for "ORD
20a00 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
20a10 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  " */.  const u8 
20a20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20  *pToken,        
20a30 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
20a40 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66   containing pref
20a50 69 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20  ix to match */. 
20a60 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20   int nToken,    
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
20a90 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74  er pToken in byt
20aa0 65 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  es */.  Fts5Inde
20ab0 78 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  xIter *pIter    
20ac0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c          /* Popul
20ad0 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ate this object 
20ae0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
20af0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
20b00 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42    Fts5Buffer *aB
20b10 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  uf;.  const int 
20b20 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42  nBuf = 32;..  aB
20b30 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72  uf = (Fts5Buffer
20b40 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
20b50 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  p, sizeof(Fts5Bu
20b60 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70  ffer)*nBuf);.  p
20b70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
20b80 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 30 29  uctureRead(p, 0)
20b90 3b 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26  ;..  if( aBuf &&
20ba0 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
20bb0 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
20bc0 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69  *pDoclist;.    i
20bd0 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c  nt i;.    i64 iL
20be0 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
20bf0 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
20c00 65 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20  er *p1 = 0;     
20c10 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
20c20 20 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20   to gather data 
20c30 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20  from index */.  
20c40 20 20 46 74 73 35 42 75 66 66 65 72 20 64 6f 63    Fts5Buffer doc
20c50 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65  list;..    memse
20c60 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73  t(&doclist, 0, s
20c70 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b  izeof(doclist));
20c80 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c  .    for(fts5Mul
20c90 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
20ca0 72 75 63 74 2c 20 30 2c 20 31 2c 20 31 2c 20 70  ruct, 0, 1, 1, p
20cb0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d  Token, nToken, -
20cc0 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20 20  1, 0, &p1);.    
20cd0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
20ce0 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a  rEof(p, p1)==0;.
20cf0 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
20d00 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 31 2c  iIterNext(p, p1,
20d10 20 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20 20   0, 0).    ){.  
20d20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
20d30 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
20d40 77 69 64 28 70 31 29 3b 0a 20 20 20 20 20 20 69  wid(p1);.      i
20d50 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt nTerm;.      
20d60 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
20d70 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
20d80 65 72 6d 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b  erm(p1, &nTerm);
20d90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
20da0 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
20db0 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c  erm, MIN(nToken,
20dc0 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20   nTerm))<=0 );. 
20dd0 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e       if( nTerm<n
20de0 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  Token || memcmp(
20df0 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e  pToken, pTerm, n
20e00 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a  Token) ) break;.
20e10 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69  .      if( docli
20e20 73 74 2e 6e 3e 30 20 0a 20 20 20 20 20 20 20 26  st.n>0 .       &
20e30 26 20 28 28 21 62 44 65 73 63 20 26 26 20 69 52  & ((!bDesc && iR
20e40 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64  owid<=iLastRowid
20e50 29 20 7c 7c 20 28 62 44 65 73 63 20 26 26 20 69  ) || (bDesc && i
20e60 52 6f 77 69 64 3e 3d 69 4c 61 73 74 52 6f 77 69  Rowid>=iLastRowi
20e70 64 29 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20  d)).      ){..  
20e80 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
20e90 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20ea0 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b  && doclist.n; i+
20eb0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
20ec0 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a  sert( i<nBuf );.
20ed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42            if( aB
20ee0 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  uf[i].n==0 ){.  
20ef0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
20f00 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73  fferSwap(&doclis
20f10 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
20f20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
20f30 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73  fferZero(&doclis
20f40 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
20f50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
20f60 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
20f70 4c 69 73 74 73 28 70 2c 20 62 44 65 73 63 2c 20  Lists(p, bDesc, 
20f80 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
20f90 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
20fa0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
20fb0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
20fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20fe0 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30 20  f( doclist.n==0 
20ff0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
21000 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
21010 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69  t(&p->rc, &docli
21020 73 74 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  st, iRowid);.   
21030 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 44 65     }else if( bDe
21040 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  sc ){.        ft
21050 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
21060 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f  rint(&p->rc, &do
21070 63 6c 69 73 74 2c 20 69 4c 61 73 74 52 6f 77 69  clist, iLastRowi
21080 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  d - iRowid);.   
21090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
210a0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
210b0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
210c0 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69   &doclist, iRowi
210d0 64 20 2d 20 69 4c 61 73 74 52 6f 77 69 64 29 3b  d - iLastRowid);
210e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
210f0 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
21100 69 64 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  id;.      fts5Mu
21110 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70  ltiIterPoslist(p
21120 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69 73  , p1, 1, &doclis
21130 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  t);.    }..    f
21140 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20  or(i=0; i<nBuf; 
21150 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
21160 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
21170 28 70 2c 20 62 44 65 73 63 2c 20 26 64 6f 63 6c  (p, bDesc, &docl
21180 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
21190 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
211a0 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a  Free(&aBuf[i]);.
211b0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75      }.    fts5Mu
211c0 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
211d0 31 29 3b 0a 0a 20 20 20 20 70 44 6f 63 6c 69 73  1);..    pDoclis
211e0 74 20 3d 20 28 46 74 73 35 44 6f 63 6c 69 73 74  t = (Fts5Doclist
211f0 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c  Iter*)fts5IdxMal
21200 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
21210 73 35 44 6f 63 6c 69 73 74 49 74 65 72 29 29 3b  s5DoclistIter));
21220 0a 20 20 20 20 69 66 28 20 21 70 44 6f 63 6c 69  .    if( !pDocli
21230 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  st ){.      fts5
21240 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c  BufferFree(&docl
21250 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
21260 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 44  .      pIter->pD
21270 6f 63 6c 69 73 74 20 3d 20 70 44 6f 63 6c 69 73  oclist = pDoclis
21280 74 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6f 63  t;.      fts5Doc
21290 6c 69 73 74 49 74 65 72 49 6e 69 74 28 26 64 6f  listIterInit(&do
212a0 63 6c 69 73 74 2c 20 62 44 65 73 63 2c 20 70 49  clist, bDesc, pI
212b0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a  ter->pDoclist);.
212c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
212d0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
212e0 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71  e(pStruct);.  sq
212f0 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29  lite3_free(aBuf)
21300 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69  ;.}../*.** Run i
21310 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 74  nternal checks t
21320 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
21330 65 20 46 54 53 20 69 6e 64 65 78 20 28 61 29 20  e FTS index (a) 
21340 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a  is internally .*
21350 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  * consistent and
21360 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e   (b) contains en
21370 74 72 69 65 73 20 66 6f 72 20 77 68 69 63 68 20  tries for which 
21380 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 63  the XOR of the c
21390 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63  hecksums.** as c
213a0 61 6c 63 75 6c 61 74 65 64 20 62 79 20 66 74 73  alculated by fts
213b0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
213c0 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a  () is cksum..**.
213d0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
213e0 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20  _CORRUPT if any 
213f0 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  of the internal 
21400 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20  checks fail, or 
21410 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  if the.** checks
21420 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  um does not matc
21430 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  h. Return SQLITE
21440 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b  _OK if all check
21450 73 20 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a  s pass without.*
21460 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65  * error, or some
21470 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 65 72   other SQLite er
21480 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74  ror code if anot
21490 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20  her error (e.g. 
214a0 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  OOM).** occurs..
214b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
214c0 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
214d0 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20  Check(Fts5Index 
214e0 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a  *p, u64 cksum){.
214f0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
21500 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
21510 69 67 3b 0a 20 20 69 6e 74 20 69 49 64 78 3b 20  ig;.  int iIdx; 
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
21540 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
21550 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 75 36   indexes */.  u6
21560 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20  4 cksum2 = 0;   
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21580 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   Checksum based 
21590 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69  on contents of i
215a0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 75 36 34 20  ndexes */.  u64 
215b0 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20 20 20  cksum3 = 0;     
215c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
215d0 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
215e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64   contents of ind
215f0 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75  exes */.  Fts5Bu
21600 66 66 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30  ffer term = {0,0
21610 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66  ,0};      /* Buf
21620 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64  fer used to hold
21630 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 74 65 72   most recent ter
21640 6d 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  m */..  /* Check
21650 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e   that the intern
21660 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68  al nodes of each
21670 20 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74   segment match t
21680 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 66  he leaves */.  f
21690 6f 72 28 69 49 64 78 3d 30 3b 20 70 2d 3e 72 63  or(iIdx=0; p->rc
216a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
216b0 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
216c0 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
216d0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
216e0 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73  e *pStruct = fts
216f0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
21700 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , iIdx);.    if(
21710 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
21720 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
21730 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c  ;.      for(iLvl
21740 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
21750 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
21760 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
21770 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72  Seg=0; iSeg<pStr
21780 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
21790 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ].nSeg; iSeg++){
217a0 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53  .          Fts5S
217b0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
217c0 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74  *pSeg = &pStruct
217d0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
217e0 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
217f0 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e       fts5IndexIn
21800 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
21810 65 6e 74 28 70 2c 20 69 49 64 78 2c 20 70 53 65  ent(p, iIdx, pSe
21820 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
21830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
21840 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
21850 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
21860 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73   }..  /* The cks
21870 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  um argument pass
21880 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
21890 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75  ion is a checksu
218a0 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a  m calculated.  *
218b0 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65  * based on all e
218c0 78 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20  xpected entries 
218d0 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  in the FTS index
218e0 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66   (including pref
218f0 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e  ix index.  ** en
21900 74 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f  tries). This blo
21910 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61  ck checks that a
21920 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c   checksum calcul
21930 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
21940 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f  e.  ** actual co
21950 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e  ntents of FTS in
21960 64 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c  dex is identical
21970 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20  ..  **.  ** Two 
21980 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
21990 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72  same checksum ar
219a0 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68  e calculated. Th
219b0 65 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20  e first (stack. 
219c0 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73   ** variable cks
219d0 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e  um2) based on en
219e0 74 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20  tries extracted 
219f0 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65  from the full-te
21a00 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68  xt index.  ** wh
21a10 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65  ile doing a line
21a20 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20  ar scan of each 
21a30 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78  individual index
21a40 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a   in turn. .  **.
21a50 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72    ** As each ter
21a60 6d 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  m visited by the
21a70 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61   linear scans, a
21a80 20 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20   separate query 
21a90 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  for the.  ** sam
21aa0 65 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72  e term is perfor
21ab0 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63  med. cksum3 is c
21ac0 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20  alculated based 
21ad0 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20  on the entries. 
21ae0 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79   ** extracted by
21af0 20 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a   these queries..
21b00 20 20 2a 2f 0a 20 20 66 6f 72 28 69 49 64 78 3d    */.  for(iIdx=
21b10 30 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  0; iIdx<=pConfig
21b20 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
21b30 2b 29 7b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74  +){.    Fts5Mult
21b40 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 3b  iSegIter *pIter;
21b50 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
21b60 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74  re *pStruct = ft
21b70 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
21b80 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 66 6f  p, iIdx);.    fo
21b90 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
21ba0 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 69  ew(p, pStruct, i
21bb0 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  Idx, 0, 0, 0, 0,
21bc0 20 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b   -1, 0, &pIter);
21bd0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
21be0 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
21bf0 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
21c00 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
21c10 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
21c20 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 46  ).    ){.      F
21c30 74 73 35 50 6f 73 49 74 65 72 20 73 50 6f 73 3b  ts5PosIter sPos;
21c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
21c50 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
21c60 72 6f 75 67 68 20 70 6f 73 69 74 69 6f 6e 20 6c  rough position l
21c70 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ist */.      int
21c80 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
21c90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
21ca0 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
21cb0 73 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  s */.      i64 i
21cc0 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74  Rowid = fts5Mult
21cd0 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
21ce0 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
21cf0 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d 75   = (char*)fts5Mu
21d00 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
21d10 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 20 20 2f  r, &n);..      /
21d20 2a 20 55 70 64 61 74 65 20 63 6b 73 75 6d 32 20  * Update cksum2 
21d30 77 69 74 68 20 74 68 65 20 65 6e 74 72 69 65 73  with the entries
21d40 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21d50 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
21d60 6d 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  m.      ** and r
21d70 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  owid.  */.      
21d80 66 6f 72 28 66 74 73 35 50 6f 73 49 74 65 72 49  for(fts5PosIterI
21d90 6e 69 74 28 70 2c 20 70 49 74 65 72 2c 20 26 73  nit(p, pIter, &s
21da0 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pos);.          
21db0 66 74 73 35 50 6f 73 49 74 65 72 45 6f 66 28 70  fts5PosIterEof(p
21dc0 2c 20 26 73 50 6f 73 29 3d 3d 30 3b 0a 20 20 20  , &sPos)==0;.   
21dd0 20 20 20 20 20 20 20 66 74 73 35 50 6f 73 49 74         fts5PosIt
21de0 65 72 4e 65 78 74 28 70 2c 20 26 73 50 6f 73 29  erNext(p, &sPos)
21df0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
21e00 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66 74 73 35    cksum2 ^= fts5
21e10 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
21e20 69 52 6f 77 69 64 2c 20 73 50 6f 73 2e 69 43 6f  iRowid, sPos.iCo
21e30 6c 2c 20 73 50 6f 73 2e 69 50 6f 73 2c 20 7a 2c  l, sPos.iPos, z,
21e40 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   n);.      }..  
21e50 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
21e60 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20 71 75  s a new term, qu
21e70 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70 64 61  ery for it. Upda
21e80 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68 20 74  te cksum3 with t
21e90 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a 20  he results. */. 
21ea0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
21eb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 74 65  SQLITE_OK && (te
21ec0 72 6d 2e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d  rm.n!=n || memcm
21ed0 70 28 74 65 72 6d 2e 70 2c 20 7a 2c 20 6e 29 29  p(term.p, z, n))
21ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
21ef0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 64 78 49  IndexIter *pIdxI
21f00 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
21f10 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 69 49   int flags = (iI
21f20 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54 53 35  dx==0 ? 0 : FTS5
21f30 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
21f40 49 58 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  IX);.        int
21f50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
21f60 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20 7a  5IndexQuery(p, z
21f70 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 26 70 49 64  , n, flags, &pId
21f80 78 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  xIter);.        
21f90 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
21fa0 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74  E_OK && 0==sqlit
21fb0 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
21fc0 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20 20 20  dxIter) ){.     
21fd0 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
21fe0 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Pos;.          i
21ff0 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  nt nPos;.       
22000 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73     i64 rowid = s
22010 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 52 6f  qlite3Fts5IterRo
22020 77 69 64 28 70 49 64 78 49 74 65 72 29 3b 0a 20  wid(pIdxIter);. 
22030 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
22040 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
22050 6c 69 73 74 28 70 49 64 78 49 74 65 72 2c 20 26  list(pIdxIter, &
22060 70 50 6f 73 2c 20 26 6e 50 6f 73 29 3b 0a 20 20  pPos, &nPos);.  
22070 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22080 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22090 20 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73           Fts5Pos
220a0 6c 69 73 74 52 65 61 64 65 72 20 73 52 65 61 64  listReader sRead
220b0 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  er;.            
220c0 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35 50  for(sqlite3Fts5P
220d0 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
220e0 28 2d 31 2c 20 70 50 6f 73 2c 20 6e 50 6f 73 2c  (-1, pPos, nPos,
220f0 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20   &sReader);.    
22100 20 20 20 20 20 20 20 20 20 20 20 20 73 52 65 61              sRea
22110 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20  der.bEof==0;.   
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
22130 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
22140 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61 64  eaderNext(&sRead
22150 65 72 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  er).            
22160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22170 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35   int iCol = FTS5
22180 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61  _POS2COLUMN(sRea
22190 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20  der.iPos);.     
221a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66           int iOf
221b0 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  f = FTS5_POS2OFF
221c0 53 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73  SET(sReader.iPos
221d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
221e0 20 63 6b 73 75 6d 33 20 5e 3d 20 66 74 73 35 49   cksum3 ^= fts5I
221f0 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72  ndexEntryCksum(r
22200 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66  owid, iCol, iOff
22210 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  , z, n);.       
22220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
22240 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 64 78  ts5IterNext(pIdx
22250 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
22260 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
22270 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
22280 49 74 65 72 43 6c 6f 73 65 28 70 49 64 78 49 74  IterClose(pIdxIt
22290 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  er);.        fts
222a0 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
222b0 26 74 65 72 6d 2c 20 6e 2c 20 28 63 6f 6e 73 74  &term, n, (const
222c0 20 75 38 2a 29 7a 29 3b 0a 20 20 20 20 20 20 20   u8*)z);.       
222d0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
222e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
222f0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
22300 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
22310 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
22320 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
22330 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d   }.  if( p->rc==
22340 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
22350 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e  um!=cksum2 ) p->
22360 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
22370 54 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  T;.  if( p->rc==
22380 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
22390 75 6d 21 3d 63 6b 73 75 6d 33 20 29 20 70 2d 3e  um!=cksum3 ) p->
223a0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
223b0 54 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72  T;..  fts5Buffer
223c0 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 72  Free(&term);.  r
223d0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
223e0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a  eturn(p);.}.../*
223f0 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
22400 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
22410 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
22420 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
22430 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20  ) pertain.** to 
22440 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
22450 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a  h rowid iRowid..
22460 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22470 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74  s5IndexBeginWrit
22480 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
22490 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61  i64 iRowid){.  a
224a0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
224b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a  LITE_OK );..  /*
224c0 20 41 6c 6c 6f 63 61 74 65 20 68 61 73 68 20 74   Allocate hash t
224d0 61 62 6c 65 73 20 69 66 20 74 68 65 79 20 68 61  ables if they ha
224e0 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  ve not already b
224f0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
22500 0a 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68  .  if( p->apHash
22510 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
22520 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53  ;.    int rc = S
22530 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e  QLITE_OK;.    in
22540 74 20 6e 48 61 73 68 20 3d 20 70 2d 3e 70 43 6f  t nHash = p->pCo
22550 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 2b 20  nfig->nPrefix + 
22560 31 3b 0a 20 20 20 20 46 74 73 35 48 61 73 68 20  1;.    Fts5Hash 
22570 2a 2a 61 70 4e 65 77 3b 0a 0a 20 20 20 20 61 70  **apNew;..    ap
22580 4e 65 77 20 3d 20 28 46 74 73 35 48 61 73 68 2a  New = (Fts5Hash*
22590 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
225a0 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a  locZero(&rc, siz
225b0 65 6f 66 28 46 74 73 35 48 61 73 68 2a 29 2a 6e  eof(Fts5Hash*)*n
225c0 48 61 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 69  Hash);.    for(i
225d0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
225e0 4b 20 26 26 20 69 3c 6e 48 61 73 68 3b 20 69 2b  K && i<nHash; i+
225f0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  +){.      rc = s
22600 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65  qlite3Fts5HashNe
22610 77 28 26 61 70 4e 65 77 5b 69 5d 2c 20 26 70 2d  w(&apNew[i], &p-
22620 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a  >nPendingData);.
22630 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
22640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22650 20 20 20 20 20 70 2d 3e 61 70 48 61 73 68 20 3d       p->apHash =
22660 20 61 70 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73   apNew;.    }els
22670 65 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e  e{.      if( apN
22680 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  ew ){.        fo
22690 72 28 69 3d 30 3b 20 69 3c 6e 48 61 73 68 3b 20  r(i=0; i<nHash; 
226a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
226b0 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 46  sqlite3Fts5HashF
226c0 72 65 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20  ree(apNew[i]);. 
226d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
226e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70   sqlite3_free(ap
226f0 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
22700 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22710 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
22720 69 52 6f 77 69 64 3c 3d 70 2d 3e 69 57 72 69 74  iRowid<=p->iWrit
22730 65 52 6f 77 69 64 20 7c 7c 20 28 70 2d 3e 6e 50  eRowid || (p->nP
22740 65 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e  endingData > p->
22750 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 29  nMaxPendingData)
22760 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
22770 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20  xFlush(p);.  }. 
22780 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20   p->iWriteRowid 
22790 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75  = iRowid;.  retu
227a0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
227b0 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
227c0 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64  Commit data to d
227d0 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
227e0 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63  te3Fts5IndexSync
227f0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
22800 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 61  nt bCommit){.  a
22810 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
22820 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
22830 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a  5IndexFlush(p);.
22840 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 20 29 20    if( bCommit ) 
22850 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
22860 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  p);.  return fts
22870 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
22880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
22890 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  d any data store
228a0 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
228b0 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20  ry hash tables. 
228c0 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a  Do not write it.
228d0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
228e0 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
228f0 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
22900 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
22910 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c  e %_data.** tabl
22920 65 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67  e may have chang
22930 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61  ed on disk. So a
22940 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ny in-memory cac
22950 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a  hes of %_data .*
22960 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62  * records must b
22970 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
22980 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
22990 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46  5IndexRollback(F
229a0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
229b0 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
229c0 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44  p);.  fts5IndexD
229d0 69 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20  iscardData(p);. 
229e0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
229f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
22a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22a10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f  .}../*.** The %_
22a20 64 61 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f  data table is co
22a30 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77  mpletely empty w
22a40 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
22a50 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69  n is called. Thi
22a60 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f  s.** function po
22a70 70 75 6c 61 74 65 73 20 69 74 20 77 69 74 68 20  pulates it with 
22a80 74 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75  the initial stru
22a90 63 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f  cture objects fo
22aa0 72 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a  r each index,.**
22ab0 20 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c   and the initial
22ac0 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
22ad0 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
22ae0 64 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62  d (a zero-byte b
22af0 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lob)..*/.int sql
22b00 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69  ite3Fts5IndexRei
22b10 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  nit(Fts5Index *p
22b20 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
22b30 73 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a 0a  s5Structure s;..
22b40 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20    memset(&s, 0, 
22b50 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
22b60 74 75 72 65 29 29 3b 0a 20 20 66 6f 72 28 69 3d  ture));.  for(i=
22b70 30 3b 20 69 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d  0; i<p->pConfig-
22b80 3e 6e 50 72 65 66 69 78 2b 31 3b 20 69 2b 2b 29  >nPrefix+1; i++)
22b90 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  {.    fts5Struct
22ba0 75 72 65 57 72 69 74 65 28 70 2c 20 69 2c 20 26  ureWrite(p, i, &
22bb0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  s);.  }.  if( p-
22bc0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
22bd0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
22be0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
22bf0 74 41 76 65 72 61 67 65 73 28 70 2c 20 28 63 6f  tAverages(p, (co
22c00 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a  nst u8*)"", 0);.
22c10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74    }..  return ft
22c20 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
22c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
22c40 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20  a new Fts5Index 
22c50 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62  handle. If the b
22c60 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20  Create argument 
22c70 69 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a  is true, create.
22c80 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
22c90 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
22ca0 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
22cb0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
22cc0 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ul, set *pp to p
22cd0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
22ce0 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
22cf0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
22d00 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a  Otherwise, set *
22d10 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72  pp to NULL and r
22d20 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
22d30 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
22d40 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
22d50 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43  dexOpen(.  Fts5C
22d60 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20  onfig *pConfig, 
22d70 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20  .  int bCreate, 
22d80 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70  .  Fts5Index **p
22d90 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  p,.  char **pzEr
22da0 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
22db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
22dc0 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20  5Index *p;      
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22de0 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  New object */.. 
22df0 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35   *pp = p = (Fts5
22e00 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 5f 6d  Index*)sqlite3_m
22e10 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73  alloc(sizeof(Fts
22e20 35 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20  5Index));.  if( 
22e30 21 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  !p ) return SQLI
22e40 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 6d 65 6d  TE_NOMEM;..  mem
22e50 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
22e60 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20  (Fts5Index));.  
22e70 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f  p->pConfig = pCo
22e80 6e 66 69 67 3b 0a 20 20 70 2d 3e 6e 57 6f 72 6b  nfig;.  p->nWork
22e90 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b  Unit = FTS5_WORK
22ea0 5f 55 4e 49 54 3b 0a 20 20 70 2d 3e 6e 4d 61 78  _UNIT;.  p->nMax
22eb0 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 31 30  PendingData = 10
22ec0 32 34 2a 31 30 32 34 3b 0a 20 20 70 2d 3e 7a 44  24*1024;.  p->zD
22ed0 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ataTbl = sqlite3
22ee0 5f 6d 70 72 69 6e 74 66 28 22 25 73 5f 64 61 74  _mprintf("%s_dat
22ef0 61 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  a", pConfig->zNa
22f00 6d 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 44  me);.  if( p->zD
22f10 61 74 61 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  ataTbl==0 ){.   
22f20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
22f30 45 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EM;.  }else if( 
22f40 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 72  bCreate ){.    r
22f50 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43  c = sqlite3Fts5C
22f60 72 65 61 74 65 54 61 62 6c 65 28 0a 20 20 20 20  reateTable(.    
22f70 20 20 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61      pConfig, "da
22f80 74 61 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52  ta", "id INTEGER
22f90 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c   PRIMARY KEY, bl
22fa0 6f 63 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a  ock BLOB", 0, pz
22fb0 45 72 72 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Err.    );.    i
22fc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22fd0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
22fe0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
22ff0 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 7d 0a  einit(p);.    }.
23000 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
23010 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
23020 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
23030 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
23040 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
23050 6e 64 65 78 43 6c 6f 73 65 28 70 2c 20 30 29 3b  ndexClose(p, 0);
23060 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
23070 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
23080 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
23090 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79  handle opened by
230a0 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
230b0 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
230c0 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  ndexOpen()..*/.i
230d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
230e0 64 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64  dexClose(Fts5Ind
230f0 65 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 73 74  ex *p, int bDest
23100 72 6f 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  roy){.  int rc =
23110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
23120 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 62  ( p ){.    if( b
23130 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20  Destroy ){.     
23140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
23150 35 44 72 6f 70 54 61 62 6c 65 28 70 2d 3e 70 43  5DropTable(p->pC
23160 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 29 3b 0a  onfig, "data");.
23170 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23180 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
23190 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
231a0 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74  inalize(p->pWrit
231b0 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
231c0 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65  _finalize(p->pDe
231d0 6c 65 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  leter);.    if( 
231e0 70 2d 3e 61 70 48 61 73 68 20 29 7b 0a 20 20 20  p->apHash ){.   
231f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
23200 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 70  for(i=0; i<=p->p
23210 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
23220 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
23230 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 46 72  qlite3Fts5HashFr
23240 65 65 28 70 2d 3e 61 70 48 61 73 68 5b 69 5d 29  ee(p->apHash[i])
23250 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23260 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
23270 61 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20  apHash);.    }. 
23280 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23290 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20  p->zDataTbl);.  
232a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
232b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
232c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  rc;.}../*.** Arg
232d0 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74  ument p points t
232e0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
232f0 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74  ining utf-8 text
23300 20 74 68 61 74 20 69 73 20 6e 20 62 79 74 65 73   that is n bytes
23310 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65   in .** size. Re
23320 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
23330 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
23340 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 20  nChar character 
23350 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a  prefix of the.**
23360 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66   buffer, or 0 if
23370 20 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20   there are less 
23380 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61  than nChar chara
23390 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a  cters in total..
233a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
233b0 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
233c0 42 79 74 65 6c 65 6e 28 63 6f 6e 73 74 20 63 68  Bytelen(const ch
233d0 61 72 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65  ar *p, int nByte
233e0 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b 0a 20 20  , int nChar){.  
233f0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  int n = 0;.  int
23400 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
23410 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20  <nChar; i++){.  
23420 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29    if( n>=nByte )
23430 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
23440 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e  /* Input contain
23450 73 20 66 65 77 65 72 20 74 68 61 6e 20 6e 43 68  s fewer than nCh
23460 61 72 20 63 68 61 72 73 20 2a 2f 0a 20 20 20 20  ar chars */.    
23470 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68  if( (unsigned ch
23480 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20  ar)p[n++]>=0xc0 
23490 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
234a0 28 70 5b 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30  (p[n] & 0xc0)==0
234b0 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d  x80 ) n++;.    }
234c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
234d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73  .}../*.** pIn is
234e0 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64   a UTF-8 encoded
234f0 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74   string, nIn byt
23500 65 73 20 69 6e 20 73 69 7a 65 2e 20 52 65 74 75  es in size. Retu
23510 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
23520 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63 68 61 72  .** unicode char
23530 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 74  acters in the st
23540 72 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 66 74 73  ring..*/.int fts
23550 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f  5IndexCharlen(co
23560 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69  nst char *pIn, i
23570 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  nt nIn){.  int n
23580 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Char = 0;       
23590 20 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20       .  int i = 
235a0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49  0;.  while( i<nI
235b0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e  n ){.    if( (un
235c0 73 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b  signed char)pIn[
235d0 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20  i++]>=0xc0 ){.  
235e0 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e      while( i<nIn
235f0 20 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78   && (pIn[i] & 0x
23600 63 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b  c0)==0x80 ) i++;
23610 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72  .    }.    nChar
23620 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
23630 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nChar;.}../*.**
23640 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20 72   Calculate and r
23650 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
23660 20 74 68 61 74 20 69 73 20 74 68 65 20 58 4f 52   that is the XOR
23670 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
23680 74 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20  try.** checksum 
23690 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 74  of all entries t
236a0 68 61 74 20 77 6f 75 6c 64 20 62 65 20 67 65 6e  hat would be gen
236b0 65 72 61 74 65 64 20 62 79 20 74 68 65 20 74 6f  erated by the to
236c0 6b 65 6e 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ken specified.**
236d0 20 62 79 20 74 68 65 20 66 69 6e 61 6c 20 35 20   by the final 5 
236e0 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36  arguments..*/.u6
236f0 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  4 sqlite3Fts5Ind
23700 65 78 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 43  exCksum(.  Fts5C
23710 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20  onfig *pConfig, 
23720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
23730 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
23740 63 74 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ct */.  i64 iRow
23750 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
23760 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 75 6d          /* Docum
23770 65 6e 74 20 74 65 72 6d 20 61 70 70 65 61 72 73  ent term appears
23780 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   in */.  int iCo
23790 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
237a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
237b0 6d 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73 20  mn term appears 
237c0 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73  in */.  int iPos
237d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
237e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
237f0 69 6f 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73  ion term appears
23800 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63   in */.  const c
23810 68 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20  har *pTerm, int 
23820 6e 54 65 72 6d 20 20 20 20 2f 2a 20 54 65 72 6d  nTerm    /* Term
23830 20 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20   at iPos */.){. 
23840 20 75 36 34 20 72 65 74 20 3d 20 30 3b 20 20 20   u64 ret = 0;   
23850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23860 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
23870 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20   */.  int iIdx; 
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23890 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65        /* For ite
238a0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69  rating through i
238b0 6e 64 65 78 65 73 20 2a 2f 0a 0a 20 20 72 65 74  ndexes */..  ret
238c0 20 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72   = fts5IndexEntr
238d0 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69  yCksum(iRowid, i
238e0 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 65 72 6d  Col, iPos, pTerm
238f0 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 66 6f 72  , nTerm);..  for
23900 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 70 43  (iIdx=0; iIdx<pC
23910 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
23920 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  iIdx++){.    int
23930 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e 64   nByte = fts5Ind
23940 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c  exCharlenToBytel
23950 65 6e 28 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  en(pTerm, nTerm,
23960 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69   pConfig->aPrefi
23970 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66  x[iIdx]);.    if
23980 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
23990 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64 65   ret ^= fts5Inde
239a0 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77  xEntryCksum(iRow
239b0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
239c0 70 54 65 72 6d 2c 20 6e 42 79 74 65 29 3b 0a 20  pTerm, nByte);. 
239d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
239e0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
239f0 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76   Insert or remov
23a00 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f  e data to or fro
23a10 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63  m the index. Eac
23a20 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e  h time a documen
23a30 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74  t is .** added t
23a40 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f  o or removed fro
23a50 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69  m the index, thi
23a60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
23a70 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  lled one or more
23a80 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a  .** times..**.**
23a90 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20   For an insert, 
23aa0 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
23ab0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
23ac0 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77  token in the new
23ad0 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66   document..** If
23ae0 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
23af0 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d  s a delete, it m
23b00 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61  ust be called (a
23b10 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f  t least) once fo
23b20 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65  r each.** unique
23b30 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f   token in the do
23b40 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69  cument with an i
23b50 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74  Col value less t
23b60 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50  han zero. The iP
23b70 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  os.** argument i
23b80 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20  s ignored for a 
23b90 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73  delete..*/.int s
23ba0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57  qlite3Fts5IndexW
23bb0 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rite(.  Fts5Inde
23bc0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
23bd0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
23be0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
23bf0 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
23c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c10 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65    /* Column toke
23c20 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76  n appears in (-v
23c30 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a  e -> delete) */.
23c40 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20    int iPos,     
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c60 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66    /* Position of
23c70 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f   token within co
23c80 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
23c90 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
23ca0 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b  t nToken  /* Tok
23cb0 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d  en to add or rem
23cc0 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69  ove to or from i
23cd0 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ndex */.){.  int
23ce0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23d00 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
23d10 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20  through indexes 
23d20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
23d50 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e  ode */.  Fts5Con
23d60 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
23d70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73  ->pConfig;..  as
23d80 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
23d90 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20  ITE_OK );..  /* 
23da0 41 64 64 20 74 68 65 20 6e 65 77 20 74 6f 6b 65  Add the new toke
23db0 6e 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65  n to the main te
23dc0 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20  rms hash table. 
23dd0 41 6e 64 20 74 6f 20 65 61 63 68 20 6f 66 20 74  And to each of t
23de0 68 65 0a 20 20 2a 2a 20 70 72 65 66 69 78 20 68  he.  ** prefix h
23df0 61 73 68 20 74 61 62 6c 65 73 20 74 68 61 74 20  ash tables that 
23e00 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  it is large enou
23e10 67 68 20 66 6f 72 2e 20 2a 2f 0a 20 20 72 63 20  gh for. */.  rc 
23e20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
23e30 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d  hWrite(.      p-
23e40 3e 61 70 48 61 73 68 5b 30 5d 2c 20 70 2d 3e 69  >apHash[0], p->i
23e50 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c  WriteRowid, iCol
23e60 2c 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20  , iPos, pToken, 
23e70 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 20 20 66 6f  nToken.  );.  fo
23e80 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67  r(i=0; i<pConfig
23e90 2d 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d  ->nPrefix && rc=
23ea0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
23eb0 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
23ec0 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c  = fts5IndexCharl
23ed0 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b  enToBytelen(pTok
23ee0 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e  en, nToken, pCon
23ef0 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 29  fig->aPrefix[i])
23f00 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
23f10 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23f20 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
23f30 74 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 2d  te(.          p-
23f40 3e 61 70 48 61 73 68 5b 69 2b 31 5d 2c 20 70 2d  >apHash[i+1], p-
23f50 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43  >iWriteRowid, iC
23f60 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e  ol, iPos, pToken
23f70 2c 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b  , nByte.      );
23f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
23f90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23fa0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65  * Open a new ite
23fb0 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65  rator to iterate
23fc0 20 74 68 6f 75 67 68 20 61 6c 6c 20 64 6f 63 69   though all doci
23fd0 64 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  ds that match th
23fe0 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  e .** specified 
23ff0 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
24000 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  refix..*/.int sq
24010 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
24020 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ery(.  Fts5Index
24030 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
24040 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e         /* FTS in
24050 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  dex to query */.
24060 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
24070 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
24080 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70  , /* Token (or p
24090 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20  refix) to query 
240a0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  for */.  int fla
240b0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
240c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
240d0 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55   of FTS5INDEX_QU
240e0 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20  ERY_X flags */. 
240f0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
24100 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
24110 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65   /* OUT: New ite
24120 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  rator object */.
24130 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  ){.  Fts5IndexIt
24140 65 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20  er *pRet;.  int 
24150 69 49 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28  iIdx = 0;..  if(
24160 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
24170 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20  EX_QUERY_PREFIX 
24180 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
24190 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
241a0 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69 6e 74  pConfig;.    int
241b0 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e 64   nChar = fts5Ind
241c0 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e  exCharlen(pToken
241d0 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 66  , nToken);.    f
241e0 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78 3c  or(iIdx=1; iIdx<
241f0 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  =pConfig->nPrefi
24200 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20  x; iIdx++){.    
24210 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61    if( pConfig->a
24220 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d  Prefix[iIdx-1]==
24230 6e 43 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20  nChar ) break;. 
24240 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 49 64     }.    if( iId
24250 78 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  x>pConfig->nPref
24260 69 78 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  ix ){.      iIdx
24270 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   = -1;.    }.  }
24280 0a 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73 35  ..  pRet = (Fts5
24290 49 6e 64 65 78 49 74 65 72 2a 29 73 71 6c 69 74  IndexIter*)sqlit
242a0 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
242b0 28 26 70 2d 3e 72 63 2c 20 73 69 7a 65 6f 66 28  (&p->rc, sizeof(
242c0 46 74 73 35 49 6e 64 65 78 49 74 65 72 29 29 3b  Fts5IndexIter));
242d0 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20  .  if( pRet ){. 
242e0 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20     memset(pRet, 
242f0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e  0, sizeof(Fts5In
24300 64 65 78 49 74 65 72 29 29 3b 0a 0a 20 20 20 20  dexIter));..    
24310 70 52 65 74 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pRet->pIndex = p
24320 3b 0a 20 20 20 20 69 66 28 20 69 49 64 78 3e 3d  ;.    if( iIdx>=
24330 30 20 29 7b 0a 20 20 20 20 20 20 70 52 65 74 2d  0 ){.      pRet-
24340 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  >pStruct = fts5S
24350 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20  tructureRead(p, 
24360 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28  iIdx);.      if(
24370 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74 20 29   pRet->pStruct )
24380 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
24390 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 52  ltiIterNew(p, pR
243a0 65 74 2d 3e 70 53 74 72 75 63 74 2c 20 0a 20 20  et->pStruct, .  
243b0 20 20 20 20 20 20 20 20 20 20 69 49 64 78 2c 20            iIdx, 
243c0 31 2c 20 66 6c 61 67 73 2c 20 28 63 6f 6e 73 74  1, flags, (const
243d0 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f   u8*)pToken, nTo
243e0 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65  ken, -1, 0, &pRe
243f0 74 2d 3e 70 4d 75 6c 74 69 0a 20 20 20 20 20 20  t->pMulti.      
24400 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
24410 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
24420 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73  t bDesc = (flags
24430 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
24440 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20  RY_DESC)!=0;.   
24450 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66     fts5SetupPref
24460 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c  ixIter(p, bDesc,
24470 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 54 6f 6b   (const u8*)pTok
24480 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 52 65 74  en, nToken, pRet
24490 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
244a0 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
244b0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
244c0 43 6c 6f 73 65 28 70 52 65 74 29 3b 0a 20 20 20  Close(pRet);.   
244d0 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
244e0 20 2a 70 70 49 74 65 72 20 3d 20 70 52 65 74 3b   *ppIter = pRet;
244f0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
24500 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
24510 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
24520 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
24530 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
24540 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69   only argument i
24550 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 69 6e 74  s at EOF..*/.int
24560 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
24570 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65  Eof(Fts5IndexIte
24580 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
24590 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
245a0 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
245b0 4b 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72  K );.  if( pIter
245c0 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 20 0a 20  ->pDoclist ){ . 
245d0 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d     return pIter-
245e0 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50 6f 73 6c  >pDoclist->aPosl
245f0 69 73 74 3d 3d 30 3b 20 0a 20 20 7d 65 6c 73 65  ist==0; .  }else
24600 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66 74 73  {.    return fts
24610 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 49  5MultiIterEof(pI
24620 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
24630 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 7d  er->pMulti);.  }
24640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
24650 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
24660 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69  ing rowid. .*/.i
24670 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
24680 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
24690 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
246a0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
246b0 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
246c0 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 49  E_OK );.  if( pI
246d0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b  ter->pDoclist ){
246e0 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74  .    fts5Doclist
246f0 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e  IterNext(pIter->
24700 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 65 6c  pDoclist);.  }el
24710 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66  se{.    fts5Buff
24720 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
24730 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73  oslist);.    fts
24740 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
24750 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
24760 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 30 2c 20  ter->pMulti, 0, 
24770 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
24780 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
24790 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
247a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
247b0 68 65 20 64 6f 63 6c 69 73 74 2d 69 74 65 72 20  he doclist-iter 
247c0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
247d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
247e0 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20 6d 61 74  the next .** mat
247f0 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74  ching rowid that
24800 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61 66   occurs at or af
24810 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65 20  ter iMatch. The 
24820 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61  definition of "a
24830 74 20 0a 2a 2a 20 6f 72 20 61 66 74 65 72 22 20  t .** or after" 
24840 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
24850 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  er this iterator
24860 20 69 74 65 72 61 74 65 73 20 69 6e 20 61 73 63   iterates in asc
24870 65 6e 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 64 65  ending or .** de
24880 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f  scending rowid o
24890 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
248a0 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74  void fts5Doclist
248b0 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73  IterNextFrom(Fts
248c0 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 2c  5DoclistIter *p,
248d0 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20   i64 iMatch){.  
248e0 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77  do{.    i64 iRow
248f0 69 64 20 3d 20 70 2d 3e 69 52 6f 77 69 64 3b 0a  id = p->iRowid;.
24900 20 20 20 20 69 66 28 20 70 2d 3e 62 44 65 73 63      if( p->bDesc
24910 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69  ==0 && iRowid>=i
24920 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
24930 20 20 20 69 66 28 20 70 2d 3e 62 44 65 73 63 21     if( p->bDesc!
24940 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d  =0 && iRowid<=iM
24950 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
24960 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
24970 72 4e 65 78 74 28 70 29 3b 0a 20 20 7d 77 68 69  rNext(p);.  }whi
24980 6c 65 28 20 70 2d 3e 61 50 6f 73 6c 69 73 74 20  le( p->aPoslist 
24990 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
249a0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
249b0 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74  ching rowid that
249c0 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61 66   occurs at or af
249d0 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a  ter iMatch. The.
249e0 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  ** definition of
249f0 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20 64   "at or after" d
24a00 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
24a10 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  r this iterator 
24a20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61  iterates.** in a
24a30 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63  scending or desc
24a40 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64  ending rowid ord
24a50 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
24a60 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
24a70 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  om(Fts5IndexIter
24a80 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69 4d 61   *pIter, i64 iMa
24a90 74 63 68 29 7b 0a 20 20 69 66 28 20 70 49 74 65  tch){.  if( pIte
24aa0 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20  r->pDoclist ){. 
24ab0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
24ac0 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72  erNextFrom(pIter
24ad0 2d 3e 70 44 6f 63 6c 69 73 74 2c 20 69 4d 61 74  ->pDoclist, iMat
24ae0 63 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ch);.  }else{.  
24af0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
24b00 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70  extFrom(pIter->p
24b10 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d  Index, pIter->pM
24b20 75 6c 74 69 2c 20 69 4d 61 74 63 68 29 3b 0a 20  ulti, iMatch);. 
24b30 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35   }.  return fts5
24b40 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65  IndexReturn(pIte
24b50 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  r->pIndex);.}../
24b60 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24b70 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a  current rowid..*
24b80 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74 73  /.i64 sqlite3Fts
24b90 35 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49  5IterRowid(Fts5I
24ba0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
24bb0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  {.  if( pIter->p
24bc0 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 72  Doclist ){.    r
24bd0 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f  eturn pIter->pDo
24be0 63 6c 69 73 74 2d 3e 69 52 6f 77 69 64 3b 0a 20  clist->iRowid;. 
24bf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
24c00 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  rn fts5MultiIter
24c10 52 6f 77 69 64 28 70 49 74 65 72 2d 3e 70 4d 75  Rowid(pIter->pMu
24c20 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  lti);.  }.}.../*
24c30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
24c40 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
24c50 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63 6f   containing a co
24c60 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  py of the positi
24c70 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20 74  on list for.** t
24c80 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
24c90 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  . Output variabl
24ca0 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f 20  e *pn is set to 
24cb0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
24cc0 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62 79  buffer .** in by
24cd0 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  tes before retur
24ce0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ning..**.** The 
24cf0 72 65 74 75 72 6e 65 64 20 62 75 66 66 65 72 20  returned buffer 
24d00 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
24d10 20 74 68 65 20 30 78 30 30 20 74 65 72 6d 69 6e   the 0x00 termin
24d20 61 74 6f 72 20 62 79 74 65 20 73 74 6f 72 65 64  ator byte stored
24d30 20 6f 6e 0a 2a 2a 20 64 69 73 6b 2e 0a 2a 2f 0a   on.** disk..*/.
24d40 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
24d50 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49  terPoslist(Fts5I
24d60 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
24d70 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20   const u8 **pp, 
24d80 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 61 73 73 65  int *pn){.  asse
24d90 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
24da0 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
24db0 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d   );.  if( pIter-
24dc0 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  >pDoclist ){.   
24dd0 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 44   *pn = pIter->pD
24de0 6f 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c 69 73 74  oclist->nPoslist
24df0 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65  ;.    *pp = pIte
24e00 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50 6f  r->pDoclist->aPo
24e10 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  slist;.  }else{.
24e20 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70      Fts5Index *p
24e30 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
24e40 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
24e50 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
24e60 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 4d  list);.    fts5M
24e70 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
24e80 70 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  p, pIter->pMulti
24e90 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  , 0, &pIter->pos
24ea0 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 6e 20 3d  list);.    *pn =
24eb0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
24ec0 6e 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74  n;.    *pp = pIt
24ed0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
24ee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35   }.  return fts5
24ef0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65  IndexReturn(pIte
24f00 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  r->pIndex);.}../
24f10 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74  *.** Close an it
24f20 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79  erator opened by
24f30 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
24f40 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
24f50 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a  ndexQuery()..*/.
24f60 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
24f70 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e  IterClose(Fts5In
24f80 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
24f90 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
24fa0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
24fb0 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
24fc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
24fd0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61  ter->pDoclist->a
24fe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24ff0 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f  _free(pIter->pDo
25000 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  clist);.    }els
25010 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  e{.      fts5Mul
25020 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72  tiIterFree(pIter
25030 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d  ->pIndex, pIter-
25040 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20  >pMulti);.      
25050 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
25060 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72  ease(pIter->pStr
25070 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  uct);.      fts5
25080 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65  BufferFree(&pIte
25090 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
250a0 20 7d 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65   }.    fts5Close
250b0 52 65 61 64 65 72 28 70 49 74 65 72 2d 3e 70 49  Reader(pIter->pI
250c0 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
250d0 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
250e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
250f0 64 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  d the "averages"
25100 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
25110 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64   buffer supplied
25120 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
25130 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74  ** argument. Ret
25140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
25150 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
25160 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
25170 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72  code.** if an er
25180 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  ror occurs..*/.i
25190 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
251a0 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
251b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
251c0 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
251d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
251e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
251f0 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
25200 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46 54  ffer(p, pBuf, FT
25210 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
25220 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  D);.  return fts
25230 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
25240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  .}../*.** Replac
25250 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61  e the current "a
25260 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
25270 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
25280 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
25290 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20  .** supplied as 
252a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
252b0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
252c0 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
252d0 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
252e0 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a  x *p, const u8 *
252f0 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
25300 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
25310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
25320 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
25330 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
25340 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20  S_ROWID, pData, 
25350 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  nData);.  return
25360 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
25370 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
25380 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
25390 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20  umber of blocks 
253a0 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20  this module has 
253b0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  read from the %_
253c0 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69  data.** table si
253d0 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74  nce it was creat
253e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
253f0 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73  e3Fts5IndexReads
25400 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
25410 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61    return p->nRea
25420 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  d;.}../*.** Set 
25430 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69  the 32-bit cooki
25440 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61  e value stored a
25450 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  t the start of a
25460 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  ll structure .**
25470 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20   records to the 
25480 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
25490 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
254a0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ent..**.** Retur
254b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
254c0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
254d0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
254e0 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
254f0 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
25500 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
25510 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49  xSetCookie(Fts5I
25520 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65  ndex *p, int iNe
25530 77 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  w){.  int rc = S
25540 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35  QLITE_OK;.  Fts5
25550 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
25560 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
25570 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 0a 20  u8 aCookie[4];. 
25580 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
25590 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
255a0 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
255b0 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b 69  Fts5Put32(aCooki
255c0 65 2c 20 69 4e 65 77 29 3b 0a 20 20 66 6f 72 28  e, iNew);.  for(
255d0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
255e0 4f 4b 20 26 26 20 69 3c 3d 70 43 6f 6e 66 69 67  OK && i<=pConfig
255f0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b  ->nPrefix; i++){
25600 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .    sqlite3_blo
25610 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20  b *pBlob = 0;.  
25620 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
25630 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
25640 57 49 44 28 69 29 3b 0a 20 20 20 20 72 63 20 3d  WID(i);.    rc =
25650 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
25660 65 6e 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e  en(.        pCon
25670 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67  fig->db, pConfig
25680 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54  ->zDb, p->zDataT
25690 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f  bl, "block", iRo
256a0 77 69 64 2c 20 31 2c 20 26 70 42 6c 6f 62 0a 20  wid, 1, &pBlob. 
256b0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
256c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
256d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f       sqlite3_blo
256e0 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61  b_write(pBlob, a
256f0 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20  Cookie, 4, 0);. 
25700 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25710 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c  3_blob_close(pBl
25720 6f 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ob);.    }.  }..
25730 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25740 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
25750 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46  ndexLoadConfig(F
25760 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
25770 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
25780 53 74 72 75 63 74 3b 0a 20 20 70 53 74 72 75 63  Struct;.  pStruc
25790 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
257a0 65 52 65 61 64 28 70 2c 20 30 29 3b 0a 20 20 66  eRead(p, 0);.  f
257b0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
257c0 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
257d0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
257e0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
257f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25830 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
25840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25880 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69  ***.** Below thi
25890 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69  s point is the i
258a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
258b0 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
258c0 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e  () scalar.** fun
258d0 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a  ction only..*/..
258e0 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73  /*.** Decode a s
258f0 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77 69  egment-data rowi
25900 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
25910 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  a table. This fu
25920 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65  nction is.** the
25930 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61 63   opposite of mac
25940 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ro FTS5_SEGMENT_
25950 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74  ROWID()..*/.stat
25960 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
25970 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20 69  deRowid(.  i64 i
25980 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
25990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
259a0 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61 20  wid from %_data 
259b0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  table */.  int *
259c0 70 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  piIdx,          
259d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
259e0 54 3a 20 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  T: Index */.  in
259f0 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20  t *piSegid,     
25a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a10 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64   OUT: Segment id
25a20 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69   */.  int *piHei
25a30 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
25a40 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65        /* OUT: He
25a50 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ight */.  int *p
25a60 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20  iPgno           
25a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
25a80 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  : Page number */
25a90 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20  .){.  *piPgno = 
25aa0 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
25ab0 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
25ac0 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31  DATA_PAGE_B) - 1
25ad0 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
25ae0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
25af0 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20  B;..  *piHeight 
25b00 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
25b10 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
25b20 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29  5_DATA_HEIGHT_B)
25b30 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64   - 1));.  iRowid
25b40 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48   >>= FTS5_DATA_H
25b50 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 69 53  EIGHT_B;..  *piS
25b60 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f  egid = (int)(iRo
25b70 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
25b80 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  < FTS5_DATA_ID_B
25b90 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69  ) - 1));.  iRowi
25ba0 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
25bb0 49 44 5f 42 3b 0a 0a 20 20 2a 70 69 49 64 78 20  ID_B;..  *piIdx 
25bc0 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
25bd0 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
25be0 35 5f 44 41 54 41 5f 49 44 58 5f 42 29 20 2d 20  5_DATA_IDX_B) - 
25bf0 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  1));.}..static v
25c00 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77  oid fts5DebugRow
25c10 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  id(int *pRc, Fts
25c20 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
25c30 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20  64 iKey){.  int 
25c40 69 49 64 78 2c 69 53 65 67 69 64 2c 69 48 65 69  iIdx,iSegid,iHei
25c50 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52  ght,iPgno;  /* R
25c60 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20  owid compenents 
25c70 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52  */.  fts5DecodeR
25c80 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 49 64 78  owid(iKey, &iIdx
25c90 2c 20 26 69 53 65 67 69 64 2c 20 26 69 48 65 69  , &iSegid, &iHei
25ca0 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
25cb0 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
25cc0 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d  {.    if( iKey==
25cd0 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
25ce0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  WID ){.      sql
25cf0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
25d00 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
25d10 70 42 75 66 2c 20 22 28 61 76 65 72 61 67 65 73  pBuf, "(averages
25d20 29 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ) ");.    }else{
25d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
25d40 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
25d50 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
25d60 0a 20 20 20 20 20 20 20 20 20 20 22 7b 73 74 72  .          "{str
25d70 75 63 74 75 72 65 20 69 64 78 3d 25 64 7d 22 2c  ucture idx=%d}",
25d80 20 28 69 6e 74 29 28 69 4b 65 79 2d 31 30 29 0a   (int)(iKey-10).
25d90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
25da0 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 69 48   }.  else if( iH
25db0 65 69 67 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d  eight==FTS5_SEGM
25dc0 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 29  ENT_MAX_HEIGHT )
25dd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
25de0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
25df0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
25e00 28 64 6c 69 64 78 20 69 64 78 3d 25 64 20 73 65  (dlidx idx=%d se
25e10 67 69 64 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22  gid=%d pgno=%d)"
25e20 2c 0a 20 20 20 20 20 20 20 20 69 49 64 78 2c 20  ,.        iIdx, 
25e30 69 53 65 67 69 64 2c 20 69 50 67 6e 6f 0a 20 20  iSegid, iPgno.  
25e40 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
25e50 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
25e60 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
25e70 70 52 63 2c 20 70 42 75 66 2c 20 22 28 69 64 78  pRc, pBuf, "(idx
25e80 3d 25 64 20 73 65 67 69 64 3d 25 64 20 68 3d 25  =%d segid=%d h=%
25e90 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20 20 20  d pgno=%d)",.   
25ea0 20 20 20 20 20 69 49 64 78 2c 20 69 53 65 67 69       iIdx, iSegi
25eb0 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
25ec0 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
25ed0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
25ee0 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a  DebugStructure(.
25ef0 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f10 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
25f20 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
25f30 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
25f40 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
25f50 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  p.){.  int iLvl,
25f60 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
25f70 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
25f80 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
25f90 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20  , segments */.. 
25fa0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
25fb0 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  l<p->nLevel; iLv
25fc0 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74  l++){.    Fts5St
25fd0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
25fe0 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b  vl = &p->aLevel[
25ff0 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74  iLvl];.    sqlit
26000 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
26010 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
26020 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b  uf, .        " {
26030 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64  lvl=%d nMerge=%d
26040 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e  ", iLvl, pLvl->n
26050 4d 65 72 67 65 0a 20 20 20 20 29 3b 0a 20 20 20  Merge.    );.   
26060 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
26070 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
26080 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  eg++){.      Fts
26090 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
260a0 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d  t *pSeg = &pLvl-
260b0 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  >aSeg[iSeg];.   
260c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
260d0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
260e0 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20  (pRc, pBuf, .   
260f0 20 20 20 20 20 20 20 22 20 7b 69 64 3d 25 64 20         " {id=%d 
26100 68 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e  h=%d leaves=%d..
26110 25 64 7d 22 2c 20 70 53 65 67 2d 3e 69 53 65 67  %d}", pSeg->iSeg
26120 69 64 2c 20 70 53 65 67 2d 3e 6e 48 65 69 67 68  id, pSeg->nHeigh
26130 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 53  t, .          pS
26140 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70  eg->pgnoFirst, p
26150 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20  Seg->pgnoLast.  
26160 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
26170 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
26180 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
26190 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a  Rc, pBuf, "}");.
261a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
261b0 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  s is part of the
261c0 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
261d0 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a  ebugging aid..**
261e0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42  .** Arguments pB
261f0 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69  lob/nBlob contai
26200 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46  n a serialized F
26210 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
26220 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ect. This.** fun
26230 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
26240 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72  human-readable r
26250 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
26260 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74   the same object
26270 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65  .** to the buffe
26280 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
26290 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
262a0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
262b0 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63   fts5DecodeStruc
262c0 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ture(.  int *pRc
262d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
262e0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
262f0 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: error code */
26300 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
26310 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20  Buf,.  const u8 
26320 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
26330 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  b.){.  int rc;  
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
26360 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53   code */.  Fts5S
26370 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b  tructure *p = 0;
26380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
26390 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65 20  coded structure 
263a0 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20  object */..  rc 
263b0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  = fts5StructureD
263c0 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c  ecode(pBlob, nBl
263d0 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66  ob, 0, &p);.  if
263e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
263f0 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  ){.    *pRc = rc
26400 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
26410 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53 74  }..  fts5DebugSt
26420 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42 75  ructure(pRc, pBu
26430 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72  f, p);.  fts5Str
26440 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 29  uctureRelease(p)
26450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  ;.}../*.** Buffe
26460 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d  r (a/n) is assum
26470 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20  ed to contain a 
26480 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a  list of serializ
26490 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64  ed varints. Read
264a0 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20  .** each varint 
264b0 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20 73  and append its s
264c0 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
264d0 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70  tion to buffer p
264e0 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61  Buf. Return.** a
264f0 66 74 65 72 20 65 69 74 68 65 72 20 74 68 65 20  fter either the 
26500 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20  input buffer is 
26510 65 78 68 61 75 73 74 65 64 20 6f 72 20 61 20 30  exhausted or a 0
26520 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a   value is read..
26530 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
26540 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
26550 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
26560 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
26570 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
26580 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
26590 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70  dePoslist(int *p
265a0 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
265b0 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
265c0 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  a, int n){.  int
265d0 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69   iOff = 0;.  whi
265e0 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  le( iOff<n ){.  
265f0 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
26600 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
26610 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
26620 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  , iVal);.    sql
26630 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
26640 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
26650 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61  pBuf, " %d", iVa
26660 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  l);.  }.  return
26670 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
26680 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66  The start of buf
26690 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69  fer (a/n) contai
266a0 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ns the start of 
266b0 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64  a doclist. The d
266c0 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72  oclist.** may or
266d0 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20   may not finish 
266e0 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65  within the buffe
266f0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
26700 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a   appends a text.
26710 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ** representatio
26720 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66  n of the part of
26730 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61   the doclist tha
26740 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20  t is present to 
26750 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20  buffer.** pBuf. 
26760 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
26770 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
26780 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
26790 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
267a0 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
267b0 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
267c0 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a  odeDoclist(int *
267d0 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
267e0 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
267f0 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36  *a, int n){.  i6
26800 34 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74 20  4 iDocid;.  int 
26810 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28  iOff = 0;..  if(
26820 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
26830 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Off += sqlite3Ge
26840 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
26850 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29  , (u64*)&iDocid)
26860 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
26870 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
26880 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
26890 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44   rowid=%lld", iD
268a0 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69  ocid);.  }.  whi
268b0 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  le( iOff<n ){.  
268c0 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
268d0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
268e0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
268f0 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 69 4f 66  , nPos);.    iOf
26900 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50  f += fts5DecodeP
26910 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66  oslist(pRc, pBuf
26920 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28  , &a[iOff], MIN(
26930 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a  n-iOff, nPos));.
26940 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
26950 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  {.      i64 iDel
26960 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ta;.      iOff +
26970 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
26980 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
26990 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
269a0 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
269b0 20 29 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a   ) return iOff;.
269c0 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20        iDocid += 
269d0 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71  iDelta;.      sq
269e0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
269f0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
26a00 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64 3d 25   pBuf, " rowid=%
26a10 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20  lld", iDocid);. 
26a20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
26a30 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iOff;.}../*.*
26a40 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
26a50 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
26a60 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
26a70 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65  tion fts5_decode
26a80 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
26a90 69 64 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e  id fts5DecodeFun
26aa0 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
26ab0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
26ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
26ad0 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78  tion call contex
26ae0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
26af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26b10 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73   of args (always
26b20 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   2) */.  sqlite3
26b30 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
26b40 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
26b50 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
26b60 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69  /.){.  i64 iRowi
26b70 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
26b80 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
26b90 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67  for record being
26ba0 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e   decoded */.  in
26bb0 74 20 69 49 64 78 2c 69 53 65 67 69 64 2c 69 48  t iIdx,iSegid,iH
26bc0 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a  eight,iPgno;  /*
26bd0 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74   Rowid component
26be0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  s */.  const u8 
26bf0 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20  *aBlob; int n;  
26c00 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64         /* Record
26c10 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20   to decode */.  
26c20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73  u8 *a = 0;.  Fts
26c30 35 42 75 66 66 65 72 20 73 3b 20 20 20 20 20 20  5Buffer s;      
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26c50 42 75 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f  Build up text to
26c60 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a   return here */.
26c70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26c80 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
26c90 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
26ca0 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65   */.  int nSpace
26cb0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
26cc0 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65   nArg==2 );.  me
26cd0 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
26ce0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
26cf0 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69  .  iRowid = sqli
26d00 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
26d10 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d  apVal[0]);.  n =
26d20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
26d30 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  ytes(apVal[1]);.
26d40 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65    aBlob = sqlite
26d50 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56  3_value_blob(apV
26d60 61 6c 5b 31 5d 29 3b 0a 0a 20 20 6e 53 70 61 63  al[1]);..  nSpac
26d70 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54  e = n + FTS5_DAT
26d80 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a  A_ZERO_PADDING;.
26d90 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74    a = (u8*)sqlit
26da0 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
26db0 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20  (&rc, nSpace);. 
26dc0 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f   if( a==0 ) goto
26dd0 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d   decode_out;.  m
26de0 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20  emcpy(a, aBlob, 
26df0 6e 29 3b 0a 20 20 66 74 73 35 44 65 63 6f 64 65  n);.  fts5Decode
26e00 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69  Rowid(iRowid, &i
26e10 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20 26 69  Idx, &iSegid, &i
26e20 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b  Height, &iPgno);
26e30 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77  ..  fts5DebugRow
26e40 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77  id(&rc, &s, iRow
26e50 69 64 29 3b 0a 20 20 69 66 28 20 69 48 65 69 67  id);.  if( iHeig
26e60 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54  ht==FTS5_SEGMENT
26e70 5f 4d 41 58 5f 48 45 49 47 48 54 20 29 7b 0a 20  _MAX_HEIGHT ){. 
26e80 20 20 20 46 74 73 35 44 61 74 61 20 64 6c 69 64     Fts5Data dlid
26e90 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  x;.    Fts5Dlidx
26ea0 49 74 65 72 20 69 74 65 72 3b 0a 0a 20 20 20 20  Iter iter;..    
26eb0 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20  dlidx.p = a;.   
26ec0 20 64 6c 69 64 78 2e 6e 20 3d 20 6e 3b 0a 20 20   dlidx.n = n;.  
26ed0 20 20 64 6c 69 64 78 2e 6e 52 65 66 20 3d 20 32    dlidx.nRef = 2
26ee0 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  ;..    memset(&i
26ef0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
26f00 74 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b 0a  ts5DlidxIter));.
26f10 20 20 20 20 69 74 65 72 2e 70 44 61 74 61 20 3d      iter.pData =
26f20 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 69 74 65   &dlidx;.    ite
26f30 72 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50  r.iLeafPgno = iP
26f40 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74  gno;..    for(ft
26f50 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74  s5DlidxIterFirst
26f60 28 26 69 74 65 72 29 3b 20 69 74 65 72 2e 62 45  (&iter); iter.bE
26f70 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78  of==0; fts5Dlidx
26f80 49 74 65 72 4e 65 78 74 28 26 69 74 65 72 29 29  IterNext(&iter))
26f90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
26fa0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
26fb0 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 0a  rintf(&rc, &s, .
26fc0 20 20 20 20 20 20 20 20 20 20 22 20 25 64 28 25            " %d(%
26fd0 6c 6c 64 29 22 2c 20 69 74 65 72 2e 69 4c 65 61  lld)", iter.iLea
26fe0 66 50 67 6e 6f 2c 20 69 74 65 72 2e 69 52 6f 77  fPgno, iter.iRow
26ff0 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  id.      );.    
27000 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53  }.  }else if( iS
27010 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  egid==0 ){.    i
27020 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f  f( iRowid==FTS5_
27030 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29  AVERAGES_ROWID )
27040 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20  {.      /* todo 
27050 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
27060 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53 74      fts5DecodeSt
27070 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c  ructure(&rc, &s,
27080 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   a, n);.    }.  
27090 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 46 74 73 35  }else{..    Fts5
270a0 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 20  Buffer term;.   
270b0 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30   memset(&term, 0
270c0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
270d0 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20  fer));..    if( 
270e0 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20  iHeight==0 ){.  
270f0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66      int iTermOff
27100 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
27110 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20  iRowidOff = 0;. 
27120 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20       int iOff;. 
27130 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d       int nKeep =
27140 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e   0;..      if( n
27150 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=4 ){.        i
27160 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47  RowidOff = fts5G
27170 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20  etU16(&a[0]);.  
27180 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d        iTermOff =
27190 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32   fts5GetU16(&a[2
271a0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
271b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
271c0 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72  Fts5BufferSet(&r
271d0 63 2c 20 26 73 2c 20 38 2c 20 28 63 6f 6e 73 74  c, &s, 8, (const
271e0 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29 3b   u8*)"corrupt");
271f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
27200 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  code_out;.      
27210 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  }..      if( iRo
27220 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  widOff ){.      
27230 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f    iOff = iRowidO
27240 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ff;.      }else 
27250 69 66 28 20 69 54 65 72 6d 4f 66 66 20 29 7b 0a  if( iTermOff ){.
27260 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69          iOff = i
27270 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20 7d  TermOff;.      }
27280 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
27290 66 66 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  ff = n;.      }.
272a0 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65        fts5Decode
272b0 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c  Poslist(&rc, &s,
272c0 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b   &a[4], iOff-4);
272d0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
272e0 69 52 6f 77 69 64 4f 66 66 3d 3d 30 20 7c 7c 20  iRowidOff==0 || 
272f0 69 4f 66 66 3d 3d 69 52 6f 77 69 64 4f 66 66 20  iOff==iRowidOff 
27300 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f  );.      if( iRo
27310 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  widOff ){.      
27320 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65    iOff += fts5De
27330 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c  codeDoclist(&rc,
27340 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e   &s, &a[iOff], n
27350 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a  -iOff);.      }.
27360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
27370 54 65 72 6d 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f  TermOff==0 || iO
27380 66 66 3d 3d 69 54 65 72 6d 4f 66 66 20 29 3b 0a  ff==iTermOff );.
27390 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66        while( iOf
273a0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  f<n ){.        i
273b0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  nt nByte;.      
273c0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
273d0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
273e0 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
273f0 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65 65      term.n= nKee
27400 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  p;.        fts5B
27410 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
27420 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74  &rc, &term, nByt
27430 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  e, &a[iOff]);.  
27440 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42        iOff += nB
27450 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  yte;..        sq
27460 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
27470 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20  ppendPrintf(.   
27480 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73           &rc, &s
27490 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20  , " term=%.*s", 
274a0 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63  term.n, (const c
274b0 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20  har*)term.p.    
274c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
274d0 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
274e0 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
274f0 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f  , &a[iOff], n-iO
27500 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ff);.        if(
27510 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
27520 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
27530 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
27540 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20  iOff], nKeep);. 
27550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27560 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
27570 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
27580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46    }else{.      F
27590 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a  ts5NodeIter ss;.
275a0 20 20 20 20 20 20 66 6f 72 28 66 74 73 35 4e 6f        for(fts5No
275b0 64 65 49 74 65 72 49 6e 69 74 28 61 2c 20 6e 2c  deIterInit(a, n,
275c0 20 26 73 73 29 3b 20 73 73 2e 61 44 61 74 61 3b   &ss); ss.aData;
275d0 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
275e0 74 28 26 72 63 2c 20 26 73 73 29 29 7b 0a 20 20  t(&rc, &ss)){.  
275f0 20 20 20 20 20 20 69 66 28 20 73 73 2e 74 65 72        if( ss.ter
27600 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  m.n==0 ){.      
27610 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
27620 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
27630 66 28 26 72 63 2c 20 26 73 2c 20 22 20 6c 65 66  f(&rc, &s, " lef
27640 74 3d 25 64 22 2c 20 73 73 2e 69 43 68 69 6c 64  t=%d", ss.iChild
27650 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
27660 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
27670 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
27680 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 26 73  endPrintf(&rc,&s
27690 2c 20 22 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a  , " \"%.*s\"", .
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 73                ss
276b0 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d  .term.n, ss.term
276c0 2e 70 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .p.          );.
276d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
276e0 20 20 69 66 28 20 73 73 2e 6e 45 6d 70 74 79 20    if( ss.nEmpty 
276f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
27700 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
27710 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20  pendPrintf(&rc, 
27720 26 73 2c 20 22 20 65 6d 70 74 79 3d 25 64 25 73  &s, " empty=%d%s
27730 22 2c 20 73 73 2e 6e 45 6d 70 74 79 2c 0a 20 20  ", ss.nEmpty,.  
27740 20 20 20 20 20 20 20 20 20 20 20 20 73 73 2e 62              ss.b
27750 44 6c 69 64 78 20 3f 20 22 2a 22 20 3a 20 22 22  Dlidx ? "*" : ""
27760 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
27770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
27780 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74        fts5NodeIt
27790 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20 20 20  erFree(&ss);.   
277a0 20 7d 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64   }.  }.  . decod
277b0 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  e_out:.  sqlite3
277c0 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20  _free(a);.  if( 
277d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
277e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
277f0 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28  ult_text(pCtx, (
27800 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c  const char*)s.p,
27810 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   s.n, SQLITE_TRA
27820 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
27830 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
27840 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
27850 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  pCtx, rc);.  }. 
27860 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
27870 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  &s);.}../*.** Th
27880 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
27890 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
278a0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
278b0 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a   fts5_rowid()..*
278c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
278d0 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28  s5RowidFunction(
278e0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
278f0 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
27900 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
27910 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
27920 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
27950 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
27960 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
27970 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
27980 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
27990 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
279a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
279b0 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  g;.  if( nArg==0
279c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
279d0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
279e0 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66  x, "should be: f
279f0 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63  ts5_rowid(subjec
27a00 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a  t, ....)", -1);.
27a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72    }else{.    zAr
27a20 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
27a30 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
27a40 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
27a50 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
27a60 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
27a70 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20  "segment") ){.  
27a80 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
27a90 20 20 20 20 20 20 69 6e 74 20 69 64 78 2c 20 73        int idx, s
27aa0 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67  egid, height, pg
27ab0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  no;.      if( nA
27ac0 72 67 21 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  rg!=5 ){.       
27ad0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
27ae0 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20  error(pCtx, .   
27af0 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64           "should
27b00 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28   be: fts5_rowid(
27b10 27 73 65 67 6d 65 6e 74 27 2c 20 69 64 78 2c 20  'segment', idx, 
27b20 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70  segid, height, p
27b30 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20 20  gno))", -1.     
27b40 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73     );.      }els
27b50 65 7b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  e{.        idx =
27b60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
27b70 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  nt(apVal[1]);.  
27b80 20 20 20 20 20 20 73 65 67 69 64 20 3d 20 73 71        segid = sq
27b90 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
27ba0 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20  apVal[2]);.     
27bb0 20 20 20 68 65 69 67 68 74 20 3d 20 73 71 6c 69     height = sqli
27bc0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
27bd0 56 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 20 20 20  Val[3]);.       
27be0 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f   pgno = sqlite3_
27bf0 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
27c00 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f  4]);.        iRo
27c10 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
27c20 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73 65  NT_ROWID(idx, se
27c30 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e  gid, height, pgn
27c40 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
27c50 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
27c60 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
27c70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
27c80 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
27c90 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22  _stricmp(zArg, "
27ca0 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78 22 29  start-of-index")
27cb0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
27cc0 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  owid;.      int 
27cd0 69 64 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  idx;.      if( n
27ce0 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
27cf0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
27d00 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
27d10 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c            "shoul
27d20 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
27d30 28 27 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78  ('start-of-index
27d40 27 2c 20 69 64 78 29 22 2c 20 2d 31 0a 20 20 20  ', idx)", -1.   
27d50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65       );.      }e
27d60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 64 78  lse{.        idx
27d70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
27d80 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  _int(apVal[1]);.
27d90 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
27da0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
27db0 57 49 44 28 69 64 78 2c 20 31 2c 20 30 2c 20 30  WID(idx, 1, 0, 0
27dc0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
27dd0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
27de0 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20  pCtx, iRowid);. 
27df0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
27e00 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
27e10 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
27e20 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69  tx, .        "fi
27e30 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f  rst arg to fts5_
27e40 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20  rowid() must be 
27e50 27 73 65 67 6d 65 6e 74 27 20 22 0a 20 20 20 20  'segment' ".    
27e60 20 20 20 20 22 6f 72 20 27 73 74 61 72 74 2d 6f      "or 'start-o
27e70 66 2d 69 6e 64 65 78 27 22 0a 20 20 20 20 20 20  f-index'".      
27e80 20 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a    , -1.      );.
27e90 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
27ea0 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
27eb0 64 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 67  d as part of reg
27ec0 69 73 74 65 72 69 6e 67 20 74 68 65 20 46 54 53  istering the FTS
27ed0 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61  5 module with da
27ee0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
27ef0 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69  tion db. It regi
27f00 73 74 65 72 73 20 73 65 76 65 72 61 6c 20 75 73  sters several us
27f10 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61  er-defined scala
27f20 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66  r functions usef
27f30 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e  ul.** with FTS5.
27f40 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
27f50 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  sful, SQLITE_OK 
27f60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
27f70 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
27f80 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53   some other.** S
27f90 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
27fa0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
27fb0 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tead..*/.int sql
27fc0 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69  ite3Fts5IndexIni
27fd0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
27fe0 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
27ff0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
28000 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66  on(.      db, "f
28010 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20  ts5_decode", 2, 
28020 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
28030 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
28040 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20  on, 0, 0.  );.  
28050 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28060 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
28070 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
28080 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64  ction(.        d
28090 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c  b, "fts5_rowid",
280a0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
280b0 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75  , 0, fts5RowidFu
280c0 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20  nction, 0, 0.   
280d0 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
280e0 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
280f0 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
28100 46 54 53 35 20 2a 2f 0a                          FTS5 */.