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

Artifact 5f969f5b6f5e022c9c62973dd6e4e82e1d5f3f30:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 23 69 66  s5Int.h..*/..#if
0280: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
0290: 45 5f 46 54 53 35 0a 0a 23 69 6e 63 6c 75 64 65  E_FTS5..#include
02a0: 20 22 66 74 73 35 49 6e 74 2e 68 22 0a 0a 2f 2a   "fts5Int.h"../*
02b0: 0a 2a 2a 20 4f 76 65 72 76 69 65 77 3a 0a 2a 2a  .** Overview:.**
02c0: 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74  .** The %_data t
02d0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c  able contains al
02e0: 6c 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 65  l the FTS indexe
02f0: 73 20 66 6f 72 20 61 6e 20 46 54 53 35 20 76 69  s for an FTS5 vi
0300: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  rtual table..** 
0310: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  As well as the m
0320: 61 69 6e 20 74 65 72 6d 20 69 6e 64 65 78 2c 20  ain term index, 
0330: 74 68 65 72 65 20 6d 61 79 20 62 65 20 75 70 20  there may be up 
0340: 74 6f 20 33 31 20 70 72 65 66 69 78 20 69 6e 64  to 31 prefix ind
0350: 65 78 65 73 2e 0a 2a 2a 20 54 68 65 20 66 6f 72  exes..** The for
0360: 6d 61 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74  mat is similar t
0370: 6f 20 46 54 53 33 2f 34 2c 20 65 78 63 65 70 74  o FTS3/4, except
0380: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
0390: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d 74   all segment b-t
03a0: 72 65 65 20 6c 65 61 66 20 64 61 74 61 20 69 73  ree leaf data is
03b0: 20 73 74 6f 72 65 64 20 69 6e 20 66 69 78 65 64   stored in fixed
03c0: 20 73 69 7a 65 20 70 61 67 65 20 72 65 63 6f 72   size page recor
03d0: 64 73 20 0a 2a 2a 20 20 20 20 20 28 65 2e 67 2e  ds .**     (e.g.
03e0: 20 31 30 30 30 20 62 79 74 65 73 29 2e 20 41 20   1000 bytes). A 
03f0: 73 69 6e 67 6c 65 20 64 6f 63 6c 69 73 74 20 6d  single doclist m
0400: 61 79 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65  ay span multiple
0410: 20 70 61 67 65 73 2e 20 43 61 72 65 20 69 73 20   pages. Care is 
0420: 0a 2a 2a 20 20 20 20 20 74 61 6b 65 6e 20 74 6f  .**     taken to
0430: 20 65 6e 73 75 72 65 20 69 74 20 69 73 20 70 6f   ensure it is po
0440: 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72 61 74  ssible to iterat
0450: 65 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  e in either dire
0460: 63 74 69 6f 6e 20 74 68 72 6f 75 67 68 20 0a 2a  ction through .*
0470: 2a 20 20 20 20 20 74 68 65 20 65 6e 74 72 69 65  *     the entrie
0480: 73 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2c 20  s in a doclist, 
0490: 6f 72 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 20  or to seek to a 
04a0: 73 70 65 63 69 66 69 63 20 65 6e 74 72 79 20 77  specific entry w
04b0: 69 74 68 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20  ithin a .**     
04c0: 64 6f 63 6c 69 73 74 2c 20 77 69 74 68 6f 75 74  doclist, without
04d0: 20 6c 6f 61 64 69 6e 67 20 69 74 20 69 6e 74 6f   loading it into
04e0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
04f0: 20 2a 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74   * large doclist
0500: 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
0510: 20 70 61 67 65 73 20 68 61 76 65 20 61 73 73 6f   pages have asso
0520: 63 69 61 74 65 64 20 22 64 6f 63 6c 69 73 74 20  ciated "doclist 
0530: 69 6e 64 65 78 22 0a 2a 2a 20 20 20 20 20 72 65  index".**     re
0540: 63 6f 72 64 73 20 74 68 61 74 20 63 6f 6e 74 61  cords that conta
0550: 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  in a copy of the
0560: 20 66 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20   first docid on 
0570: 65 61 63 68 20 70 61 67 65 20 73 70 61 6e 6e 65  each page spanne
0580: 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20  d by.**     the 
0590: 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 20 69 73  doclist. This is
05a0: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
05b0: 70 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  p seek operation
05c0: 73 2c 20 61 6e 64 20 6d 65 72 67 65 73 20 6f 66  s, and merges of
05d0: 0a 2a 2a 20 20 20 20 20 6c 61 72 67 65 20 64 6f  .**     large do
05e0: 63 6c 69 73 74 73 20 77 69 74 68 20 76 65 72 79  clists with very
05f0: 20 73 6d 61 6c 6c 20 64 6f 63 6c 69 73 74 73 2e   small doclists.
0600: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 65 78 74 72 61  .**.**   * extra
0610: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 22   fields in the "
0620: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
0630: 22 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  " record the sta
0640: 74 65 20 6f 66 20 6f 6e 67 6f 69 6e 67 0a 2a 2a  te of ongoing.**
0650: 20 20 20 20 20 69 6e 63 72 65 6d 65 6e 74 61 6c       incremental
0660: 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
0670: 73 2e 0a 2a 2a 0a 2a 2f 0a 0a 0a 23 64 65 66 69  s..**.*/...#defi
0680: 6e 65 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b  ne FTS5_OPT_WORK
0690: 5f 55 4e 49 54 20 20 31 30 30 30 20 20 2f 2a 20  _UNIT  1000  /* 
06a0: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
06b0: 61 67 65 73 20 70 65 72 20 6f 70 74 69 6d 69 7a  ages per optimiz
06c0: 65 20 73 74 65 70 20 2a 2f 0a 23 64 65 66 69 6e  e step */.#defin
06d0: 65 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54  e FTS5_WORK_UNIT
06e0: 20 20 20 20 20 20 36 34 20 20 20 20 2f 2a 20 4e        64    /* N
06f0: 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
0700: 67 65 73 20 69 6e 20 75 6e 69 74 20 6f 66 20 77  ges in unit of w
0710: 6f 72 6b 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ork */..#define 
0720: 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
0730: 49 5a 45 20 34 20 20 20 20 20 2f 2a 20 41 64 64  IZE 4     /* Add
0740: 20 64 6c 69 64 78 20 69 66 20 74 68 69 73 20 6d   dlidx if this m
0750: 61 6e 79 20 65 6d 70 74 79 20 70 61 67 65 73 20  any empty pages 
0760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c  */../*.** Detail
0770: 73 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  s:.**.** The %_d
0780: 61 74 61 20 74 61 62 6c 65 20 6d 61 6e 61 67 65  ata table manage
0790: 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65  d by this module
07a0: 2c 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  ,.**.**     CREA
07b0: 54 45 20 54 41 42 4c 45 20 25 5f 64 61 74 61 28  TE TABLE %_data(
07c0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
07d0: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c  RY KEY, block BL
07e0: 4f 42 29 3b 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e  OB);.**.** , con
07f0: 74 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tains the follow
0800: 69 6e 67 20 35 20 74 79 70 65 73 20 6f 66 20 72  ing 5 types of r
0810: 65 63 6f 72 64 73 2e 20 53 65 65 20 74 68 65 20  ecords. See the 
0820: 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e  comments surroun
0830: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 46 54 53 35  ding.** the FTS5
0840: 5f 2a 5f 52 4f 57 49 44 20 6d 61 63 72 6f 73 20  _*_ROWID macros 
0850: 62 65 6c 6f 77 20 66 6f 72 20 61 20 64 65 73 63  below for a desc
0860: 72 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 25  ription of how %
0870: 5f 64 61 74 61 20 72 6f 77 69 64 73 20 61 72 65  _data rowids are
0880: 20 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20 74 6f   .** assigned to
0890: 20 65 61 63 68 20 66 6f 20 74 68 65 6d 2e 0a 2a   each fo them..*
08a0: 2a 0a 2a 2a 20 31 2e 20 53 74 72 75 63 74 75 72  *.** 1. Structur
08b0: 65 20 52 65 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a  e Records:.**.**
08c0: 20 20 20 54 68 65 20 73 65 74 20 6f 66 20 73 65     The set of se
08d0: 67 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 6b 65  gments that make
08e0: 20 75 70 20 61 6e 20 69 6e 64 65 78 20 2d 20 74   up an index - t
08f0: 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
0900: 72 65 20 2d 20 61 72 65 0a 2a 2a 20 20 20 72 65  re - are.**   re
0910: 63 6f 72 64 65 64 20 69 6e 20 61 20 73 69 6e 67  corded in a sing
0920: 6c 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e  le record within
0930: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
0940: 65 2e 20 54 68 65 20 72 65 63 6f 72 64 20 63 6f  e. The record co
0950: 6e 73 69 73 74 73 0a 2a 2a 20 20 20 6f 66 20 61  nsists.**   of a
0960: 20 73 69 6e 67 6c 65 20 33 32 2d 62 69 74 20 63   single 32-bit c
0970: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
0980: 6b 69 65 20 76 61 6c 75 65 20 66 6f 6c 6c 6f 77  kie value follow
0990: 65 64 20 62 79 20 61 20 6c 69 73 74 20 6f 66 20  ed by a list of 
09a0: 0a 2a 2a 20 20 20 53 51 4c 69 74 65 20 76 61 72  .**   SQLite var
09b0: 69 6e 74 73 2e 20 49 66 20 74 68 65 20 46 54 53  ints. If the FTS
09c0: 20 74 61 62 6c 65 20 66 65 61 74 75 72 65 73 20   table features 
09d0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 69 6e  more than one in
09e0: 64 65 78 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  dex (because.** 
09f0: 20 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20    there are one 
0a00: 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20 69  or more prefix i
0a10: 6e 64 65 78 65 73 29 2c 20 69 74 20 69 73 20 67  ndexes), it is g
0a20: 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 61  uaranteed that a
0a30: 6c 6c 20 73 68 61 72 65 0a 2a 2a 20 20 20 74 68  ll share.**   th
0a40: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
0a50: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d  lue..**.**   Imm
0a60: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
0a70: 6e 67 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  ng the configura
0a80: 74 69 6f 6e 20 63 6f 6f 6b 69 65 2c 20 74 68 65  tion cookie, the
0a90: 20 72 65 63 6f 72 64 20 62 65 67 69 6e 73 20 77   record begins w
0aa0: 69 74 68 0a 2a 2a 20 20 20 74 68 72 65 65 20 76  ith.**   three v
0ab0: 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  arints:.**.**   
0ac0: 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65    + number of le
0ad0: 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 74  vels,.**     + t
0ae0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
0af0: 65 67 6d 65 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c  egments on all l
0b00: 65 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20  evels,.**     + 
0b10: 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 20 63  value of write c
0b20: 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  ounter..**.**   
0b30: 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 6c  Then, for each l
0b40: 65 76 65 6c 20 66 72 6f 6d 20 30 20 74 6f 20 6e  evel from 0 to n
0b50: 4d 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b  Max:.**.**     +
0b60: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   number of input
0b70: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 6e 67   segments in ong
0b80: 6f 69 6e 67 20 6d 65 72 67 65 2e 0a 2a 2a 20 20  oing merge..**  
0b90: 20 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65     + total numbe
0ba0: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e  r of segments in
0bb0: 20 6c 65 76 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b   level..**     +
0bc0: 20 66 6f 72 20 65 61 63 68 20 73 65 67 6d 65 6e   for each segmen
0bd0: 74 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f  t from oldest to
0be0: 20 6e 65 77 65 73 74 3a 0a 2a 2a 20 20 20 20 20   newest:.**     
0bf0: 20 20 20 20 2b 20 73 65 67 6d 65 6e 74 20 69 64      + segment id
0c00: 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a   (always > 0).**
0c10: 20 20 20 20 20 20 20 20 20 2b 20 62 2d 74 72 65           + b-tre
0c20: 65 20 68 65 69 67 68 74 20 28 31 20 2d 3e 20 72  e height (1 -> r
0c30: 6f 6f 74 20 69 73 20 6c 65 61 66 2c 20 32 20 2d  oot is leaf, 2 -
0c40: 3e 20 72 6f 6f 74 20 69 73 20 70 61 72 65 6e 74  > root is parent
0c50: 20 6f 66 20 6c 65 61 66 20 65 74 63 2e 29 0a 2a   of leaf etc.).*
0c60: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 72 73  *         + firs
0c70: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
0c80: 65 72 20 28 6f 66 74 65 6e 20 31 2c 20 61 6c 77  er (often 1, alw
0c90: 61 79 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ays greater than
0ca0: 20 30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b   0).**         +
0cb0: 20 66 69 6e 61 6c 20 6c 65 61 66 20 70 61 67 65   final leaf page
0cc0: 20 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e   number.**.** 2.
0cd0: 20 54 68 65 20 41 76 65 72 61 67 65 73 20 52 65   The Averages Re
0ce0: 63 6f 72 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20  cord:.**.**   A 
0cf0: 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 69  single record wi
0d00: 74 68 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  thin the %_data 
0d10: 74 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 20  table. The data 
0d20: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72  is a list of var
0d30: 69 6e 74 73 2e 0a 2a 2a 20 20 20 54 68 65 20 66  ints..**   The f
0d40: 69 72 73 74 20 76 61 6c 75 65 20 69 73 20 74 68  irst value is th
0d50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
0d60: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54   in the index. T
0d70: 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 63 6f  hen, for each co
0d80: 6c 75 6d 6e 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c  lumn.**   from l
0d90: 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 74 68  eft to right, th
0da0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
0db0: 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20  f tokens in the 
0dc0: 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a  column for all .
0dd0: 2a 2a 20 20 20 72 6f 77 73 20 6f 66 20 74 68 65  **   rows of the
0de0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e   table..**.** 3.
0df0: 20 53 65 67 6d 65 6e 74 20 6c 65 61 76 65 73 3a   Segment leaves:
0e00: 0a 2a 2a 0a 2a 2a 20 20 20 54 45 52 4d 20 44 4f  .**.**   TERM DO
0e10: 43 4c 49 53 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a  CLIST FORMAT:.**
0e20: 0a 2a 2a 20 20 20 20 20 4d 6f 73 74 20 6f 66 20  .**     Most of 
0e30: 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61  each segment lea
0e40: 66 20 69 73 20 74 61 6b 65 6e 20 75 70 20 62 79  f is taken up by
0e50: 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61   term/doclist da
0e60: 74 61 2e 20 54 68 65 20 0a 2a 2a 20 20 20 20 20  ta. The .**     
0e70: 67 65 6e 65 72 61 6c 20 66 6f 72 6d 61 74 20 6f  general format o
0e80: 66 20 74 68 65 20 74 65 72 6d 2f 64 6f 63 6c 69  f the term/docli
0e90: 73 74 20 64 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a  st data is:.**.*
0ea0: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
0eb0: 20 3a 20 73 69 7a 65 20 6f 66 20 66 69 72 73 74   : size of first
0ec0: 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20   term.**        
0ed0: 20 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74 20   blob:    first 
0ee0: 74 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20  term data.**    
0ef0: 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 66 69       doclist: fi
0f00: 72 73 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20  rst doclist.**  
0f10: 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d         zero-or-m
0f20: 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ore {.**        
0f30: 20 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62     varint:  numb
0f40: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  er of bytes in c
0f50: 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65 76 69  ommon with previ
0f60: 6f 75 73 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20  ous term.**     
0f70: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 6e        varint:  n
0f80: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
0f90: 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 20  f new term data 
0fa0: 28 6e 4e 65 77 29 0a 2a 2a 20 20 20 20 20 20 20  (nNew).**       
0fb0: 20 20 20 20 62 6c 6f 62 3a 20 20 20 20 6e 4e 65      blob:    nNe
0fc0: 77 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74  w bytes of new t
0fd0: 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20  erm data.**     
0fe0: 20 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 6e        doclist: n
0ff0: 65 78 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20  ext doclist.**  
1000: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1010: 20 20 20 64 6f 63 6c 69 73 74 20 66 6f 72 6d 61     doclist forma
1020: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1030: 20 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74 20   varint:  first 
1040: 72 6f 77 69 64 0a 2a 2a 20 20 20 20 20 20 20 20  rowid.**        
1050: 20 70 6f 73 6c 69 73 74 3a 20 66 69 72 73 74 20   poslist: first 
1060: 70 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  poslist.**      
1070: 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20     zero-or-more 
1080: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76  {.**           v
1090: 61 72 69 6e 74 3a 20 20 72 6f 77 69 64 20 64 65  arint:  rowid de
10a0: 6c 74 61 20 28 61 6c 77 61 79 73 20 3e 20 30 29  lta (always > 0)
10b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 70 6f  .**           po
10c0: 73 6c 69 73 74 3a 20 6e 65 78 74 20 70 6f 73 6c  slist: next posl
10d0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
10e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30 30  .**         0x00
10f0: 20 62 79 74 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20   byte.**.**     
1100: 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a  poslist format:.
1110: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61  **.**         va
1120: 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66 20 70 6f  rint: size of po
1130: 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 6d  slist in bytes m
1140: 75 6c 74 69 70 6c 69 65 64 20 62 79 20 32 2c 20  ultiplied by 2, 
1150: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  not including.**
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 20 74 68 69 73 20 66 69 65 6c 64 2e 20 50 6c 75   this field. Plu
1180: 73 20 31 20 69 66 20 74 68 69 73 20 65 6e 74 72  s 1 if this entr
1190: 79 20 63 61 72 72 69 65 73 20 74 68 65 20 22 64  y carries the "d
11a0: 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a 2a 2a 20  elete" flag..** 
11b0: 20 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a          collist:
11c0: 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c   collist for col
11d0: 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20 20 20 20  umn 0.**        
11e0: 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a   zero-or-more {.
11f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 30 78 30  **           0x0
1200: 31 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  1 byte.**       
1210: 20 20 20 20 76 61 72 69 6e 74 3a 20 63 6f 6c 75      varint: colu
1220: 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29 0a 2a 2a  mn number (I).**
1230: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69             colli
1240: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
1250: 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20 20 20 20  column I.**     
1260: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
1270: 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a  collist format:.
1280: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61  **.**         va
1290: 72 69 6e 74 3a 20 66 69 72 73 74 20 6f 66 66 73  rint: first offs
12a0: 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20 20 20 20  et + 2.**       
12b0: 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b    zero-or-more {
12c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
12d0: 72 69 6e 74 3a 20 6f 66 66 73 65 74 20 64 65 6c  rint: offset del
12e0: 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20 20 20 20  ta + 2.**       
12f0: 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 49    }.**.**   PAGI
1300: 4e 41 54 49 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20 20  NATION.**.**    
1310: 20 54 68 65 20 66 6f 72 6d 61 74 20 64 65 73 63   The format desc
1320: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 6f  ribed above is o
1330: 6e 6c 79 20 61 63 63 75 72 61 74 65 20 69 66 20  nly accurate if 
1340: 74 68 65 20 65 6e 74 69 72 65 20 74 65 72 6d 2f  the entire term/
1350: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 64  doclist.**     d
1360: 61 74 61 20 66 69 74 73 20 6f 6e 20 61 20 73 69  ata fits on a si
1370: 6e 67 6c 65 20 6c 65 61 66 20 70 61 67 65 2e 20  ngle leaf page. 
1380: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
1390: 68 65 20 63 61 73 65 2c 20 74 68 65 20 66 6f 72  he case, the for
13a0: 6d 61 74 0a 2a 2a 20 20 20 20 20 69 73 20 63 68  mat.**     is ch
13b0: 61 6e 67 65 64 20 69 6e 20 74 77 6f 20 77 61 79  anged in two way
13c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b  s:.**.**       +
13d0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 72 6f   if the first ro
13e0: 77 69 64 20 6f 6e 20 61 20 70 61 67 65 20 6f 63  wid on a page oc
13f0: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1400: 66 69 72 73 74 20 74 65 72 6d 2c 20 69 74 0a 2a  first term, it.*
1410: 2a 20 20 20 20 20 20 20 20 20 69 73 20 73 74 6f  *         is sto
1420: 72 65 64 20 61 73 20 61 20 6c 69 74 65 72 61 6c  red as a literal
1430: 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   value:.**.**   
1440: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
1450: 3a 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a  :  first rowid.*
1460: 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 74 68 65  *.**       + the
1470: 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 65   first term on e
1480: 61 63 68 20 70 61 67 65 20 69 73 20 73 74 6f 72  ach page is stor
1490: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
14a0: 61 79 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 20  ay as the.**    
14b0: 20 20 20 20 20 76 65 72 79 20 66 69 72 73 74 20       very first 
14c0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 67 6d  term of the segm
14d0: 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ent:.**.**      
14e0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20         varint : 
14f0: 73 69 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65  size of first te
1500: 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  rm.**           
1510: 20 20 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74    blob:    first
1520: 20 74 65 72 6d 20 64 61 74 61 0a 2a 2a 0a 2a 2a   term data.**.**
1530: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1540: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 3a  age begins with:
1550: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32  .**.**       + 2
1560: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63  -byte unsigned c
1570: 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74  ontaining offset
1580: 20 74 6f 20 66 69 72 73 74 20 72 6f 77 69 64 20   to first rowid 
1590: 28 6f 72 20 30 29 2e 0a 2a 2a 20 20 20 20 20 20  (or 0)..**      
15a0: 20 2b 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   + 2-byte unsign
15b0: 65 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 66  ed containing of
15c0: 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 74 65  fset to first te
15d0: 72 6d 20 28 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a  rm (or 0)..**.**
15e0: 20 20 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 74     Followed by t
15f0: 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61  erm/doclist data
1600: 2e 0a 2a 2a 0a 2a 2a 20 34 2e 20 53 65 67 6d 65  ..**.** 4. Segme
1610: 6e 74 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  nt interior node
1620: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 69  s:.**.**   The i
1630: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 74 75  nterior nodes tu
1640: 72 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6c  rn the list of l
1650: 65 61 76 65 73 20 69 6e 74 6f 20 61 20 62 2b 74  eaves into a b+t
1660: 72 65 65 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 45 61  ree. .**.**   Ea
1670: 63 68 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  ch interior node
1680: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 76   begins with a v
1690: 61 72 69 6e 74 20 2d 20 74 68 65 20 70 61 67 65  arint - the page
16a0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
16b0: 65 66 74 0a 2a 2a 20 20 20 6d 6f 73 74 20 63 68  eft.**   most ch
16c0: 69 6c 64 20 6e 6f 64 65 2e 20 46 6f 6c 6c 6f 77  ild node. Follow
16d0: 69 6e 67 20 74 68 69 73 2c 20 66 6f 72 20 65 61  ing this, for ea
16e0: 63 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63  ch leaf page exc
16f0: 65 70 74 20 74 68 65 20 66 69 72 73 74 2c 0a 2a  ept the first,.*
1700: 2a 20 20 20 74 68 65 20 69 6e 74 65 72 69 6f 72  *   the interior
1710: 20 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e 3a 0a   nodes contain:.
1720: 2a 2a 0a 2a 2a 20 20 20 20 20 61 29 20 49 66 20  **.**     a) If 
1730: 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 63 6f  the leaf page co
1740: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
1750: 6f 6e 65 20 74 65 72 6d 2c 20 74 68 65 6e 20 61  one term, then a
1760: 20 74 65 72 6d 2d 70 72 65 66 69 78 20 74 68 61   term-prefix tha
1770: 74 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20 67  t.**        is g
1780: 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
1790: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 73 2c 20  previous terms, 
17a0: 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 6f 72  and less than or
17b0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a   equal to the.**
17c0: 20 20 20 20 20 20 20 20 66 69 72 73 74 20 74 65          first te
17d0: 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70  rm on the leaf p
17e0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62  age..**.**     b
17f0: 29 20 49 66 20 74 68 65 20 6c 65 61 66 20 70 61  ) If the leaf pa
1800: 67 65 20 6e 6f 20 74 65 72 6d 73 2c 20 61 20 72  ge no terms, a r
1810: 65 63 6f 72 64 20 69 6e 64 69 63 61 74 69 6e 67  ecord indicating
1820: 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6e 73 65 63   how many consec
1830: 75 74 69 76 65 0a 2a 2a 20 20 20 20 20 20 20 20  utive.**        
1840: 6c 65 61 76 65 73 20 63 6f 6e 74 61 69 6e 20 6e  leaves contain n
1850: 6f 20 74 65 72 6d 73 2c 20 61 6e 64 20 77 68 65  o terms, and whe
1860: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72  ther or not ther
1870: 65 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74  e is an associat
1880: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 62 79 2d  ed.**        by-
1890: 72 6f 77 69 64 20 69 6e 64 65 78 20 72 65 63 6f  rowid index reco
18a0: 72 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 42 79 20 64  rd..**.**   By d
18b0: 65 66 69 6e 69 74 69 6f 6e 2c 20 74 68 65 72 65  efinition, there
18c0: 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
18d0: 68 61 6e 20 6f 6e 65 20 74 79 70 65 20 28 62 29  han one type (b)
18e0: 20 72 65 63 6f 72 64 20 69 6e 20 61 20 72 6f 77   record in a row
18f0: 2e 0a 2a 2a 20 20 20 54 79 70 65 20 28 62 29 20  ..**   Type (b) 
1900: 72 65 63 6f 72 64 73 20 6f 6e 6c 79 20 65 76 65  records only eve
1910: 72 20 61 70 70 65 61 72 20 6f 6e 20 68 65 69 67  r appear on heig
1920: 68 74 3d 31 20 70 61 67 65 73 20 2d 20 69 6d 6d  ht=1 pages - imm
1930: 65 64 69 61 74 65 20 70 61 72 65 6e 74 73 0a 2a  ediate parents.*
1940: 2a 20 20 20 6f 66 20 6c 65 61 76 65 73 2e 20 4f  *   of leaves. O
1950: 6e 6c 79 20 74 79 70 65 20 28 61 29 20 72 65 63  nly type (a) rec
1960: 6f 72 64 73 20 61 72 65 20 70 75 73 68 65 64 20  ords are pushed 
1970: 74 6f 20 68 69 67 68 65 72 20 6c 65 76 65 6c 73  to higher levels
1980: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 65 72 6d 20 66  ..**.**   Term f
1990: 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ormat:.**.**    
19a0: 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74   * Number of byt
19b0: 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74  es in common wit
19c0: 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  h previous term 
19d0: 70 6c 75 73 20 32 2c 20 61 73 20 61 20 76 61 72  plus 2, as a var
19e0: 69 6e 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 4e 75  int..**     * Nu
19f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1a00: 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2c 20   new term data, 
1a10: 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 20  as a varint..** 
1a20: 20 20 20 20 2a 20 6e 65 77 20 74 65 72 6d 20 64      * new term d
1a30: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d  ata..**.**   No-
1a40: 74 65 72 6d 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a  term format:.**.
1a50: 2a 2a 20 20 20 20 20 2a 20 65 69 74 68 65 72 20  **     * either 
1a60: 61 6e 20 30 78 30 30 20 6f 72 20 30 78 30 31 20  an 0x00 or 0x01 
1a70: 62 79 74 65 2e 20 49 66 20 74 68 65 20 76 61 6c  byte. If the val
1a80: 75 65 20 30 78 30 31 20 69 73 20 75 73 65 64 2c  ue 0x01 is used,
1a90: 20 74 68 65 6e 20 74 68 65 72 65 20 0a 2a 2a 20   then there .** 
1aa0: 20 20 20 20 20 20 69 73 20 61 6e 20 61 73 73 6f        is an asso
1ab0: 63 69 61 74 65 64 20 69 6e 64 65 78 2d 62 79 2d  ciated index-by-
1ac0: 72 6f 77 69 64 20 72 65 63 6f 72 64 2e 0a 2a 2a  rowid record..**
1ad0: 20 20 20 20 20 2a 20 74 68 65 20 6e 75 6d 62 65       * the numbe
1ae0: 72 20 6f 66 20 7a 65 72 6f 2d 74 65 72 6d 20 6c  r of zero-term l
1af0: 65 61 76 65 73 20 61 73 20 61 20 76 61 72 69 6e  eaves as a varin
1b00: 74 2e 0a 2a 2a 0a 2a 2a 20 35 2e 20 53 65 67 6d  t..**.** 5. Segm
1b10: 65 6e 74 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ent doclist inde
1b20: 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 6c  xes:.**.**   A l
1b30: 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e 20  ist of varints. 
1b40: 49 66 20 74 68 65 20 66 69 72 73 74 20 74 65 72  If the first ter
1b50: 6d 6c 65 73 73 20 70 61 67 65 20 63 6f 6e 74 61  mless page conta
1b60: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
1b70: 0a 2a 2a 20 20 20 64 6f 63 69 64 2c 20 74 68 65  .**   docid, the
1b80: 20 6c 69 73 74 20 62 65 67 69 6e 73 20 77 69 74   list begins wit
1b90: 68 20 74 68 61 74 20 64 6f 63 69 64 20 61 73 20  h that docid as 
1ba0: 61 20 76 61 72 69 6e 74 20 66 6f 6c 6c 6f 77 65  a varint followe
1bb0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 20 20 76 61  d by the.**   va
1bc0: 6c 75 65 20 31 20 28 30 78 30 31 29 2e 20 4f 72  lue 1 (0x01). Or
1bd0: 2c 20 69 66 20 74 68 65 20 66 69 72 73 74 20 74  , if the first t
1be0: 65 72 6d 6c 65 73 73 20 70 61 67 65 20 63 6f 6e  ermless page con
1bf0: 74 61 69 6e 73 20 6e 6f 20 64 6f 63 69 64 73 2c  tains no docids,
1c00: 0a 2a 2a 20 20 20 61 20 76 61 72 69 6e 74 20 63  .**   a varint c
1c10: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61  ontaining the la
1c20: 73 74 20 64 6f 63 69 64 20 73 74 6f 72 65 64 20  st docid stored 
1c30: 6f 6e 20 74 68 65 20 74 65 72 6d 20 70 61 67 65  on the term page
1c40: 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 20 20 62   followed.**   b
1c50: 79 20 61 20 30 20 28 30 78 30 30 29 20 76 61 6c  y a 0 (0x00) val
1c60: 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  ue..**.**   For 
1c70: 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1c80: 70 61 67 65 20 69 6e 20 74 68 65 20 64 6f 63 6c  page in the docl
1c90: 69 73 74 2c 20 65 69 74 68 65 72 20 61 20 30 78  ist, either a 0x
1ca0: 30 30 20 62 79 74 65 20 69 66 20 74 68 65 0a 2a  00 byte if the.*
1cb0: 2a 20 20 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  *   page contain
1cc0: 73 20 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 20 61  s no terms, or a
1cd0: 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 64   delta-encoded d
1ce0: 6f 63 69 64 20 28 61 6c 77 61 79 73 20 2b 76 65  ocid (always +ve
1cf0: 29 20 0a 2a 2a 20 20 20 72 65 70 72 65 73 65 6e  ) .**   represen
1d00: 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 64  ting the first d
1d10: 6f 63 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  ocid on the page
1d20: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 0a   otherwise..*/..
1d30: 2f 2a 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72  /*.** Rowids for
1d40: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 61 6e   the averages an
1d50: 64 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  d structure reco
1d60: 72 64 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74  rds in the %_dat
1d70: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66  a table..*/.#def
1d80: 69 6e 65 20 46 54 53 35 5f 41 56 45 52 41 47 45  ine FTS5_AVERAGE
1d90: 53 5f 52 4f 57 49 44 20 20 20 20 20 31 20 20 20  S_ROWID     1   
1da0: 20 2f 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66   /* Rowid used f
1db0: 6f 72 20 74 68 65 20 61 76 65 72 61 67 65 73 20  or the averages 
1dc0: 72 65 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e  record */.#defin
1dd0: 65 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  e FTS5_STRUCTURE
1de0: 5f 52 4f 57 49 44 28 69 49 64 78 29 20 28 31 30  _ROWID(iIdx) (10
1df0: 20 2b 20 28 69 49 64 78 29 29 20 20 20 20 20 2f   + (iIdx))     /
1e00: 2a 20 46 6f 72 20 73 74 72 75 63 74 75 72 65 20  * For structure 
1e10: 72 65 63 6f 72 64 73 20 2a 2f 0a 0a 2f 2a 0a 2a  records */../*.*
1e20: 2a 20 4d 61 63 72 6f 73 20 64 65 74 65 72 6d 69  * Macros determi
1e30: 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 73 20  ning the rowids 
1e40: 75 73 65 64 20 62 79 20 73 65 67 6d 65 6e 74 20  used by segment 
1e50: 6e 6f 64 65 73 2e 20 41 6c 6c 20 6e 6f 64 65 73  nodes. All nodes
1e60: 20 69 6e 20 61 6c 6c 0a 2a 2a 20 73 65 67 6d 65   in all.** segme
1e70: 6e 74 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 65  nts for all inde
1e80: 78 65 73 20 28 74 68 65 20 72 65 67 75 6c 61 72  xes (the regular
1e90: 20 46 54 53 20 69 6e 64 65 78 20 61 6e 64 20 61   FTS index and a
1ea0: 6e 79 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  ny prefix indexe
1eb0: 73 29 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  s).** are stored
1ec0: 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74   in the %_data t
1ed0: 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67 65 20  able with large 
1ee0: 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 73 2e  positive rowids.
1ef0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74  .**.** The %_dat
1f00: 61 20 74 61 62 6c 65 20 6d 61 79 20 63 6f 6e 74  a table may cont
1f10: 61 69 6e 20 75 70 20 74 6f 20 28 31 3c 3c 46 54  ain up to (1<<FT
1f20: 53 35 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58  S5_SEGMENT_INDEX
1f30: 5f 42 49 54 53 29 20 0a 2a 2a 20 69 6e 64 65 78  _BITS) .** index
1f40: 65 73 20 2d 20 6f 6e 65 20 72 65 67 75 6c 61 72  es - one regular
1f50: 20 74 65 72 6d 20 69 6e 64 65 78 20 61 6e 64 20   term index and 
1f60: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 72 65  zero or more pre
1f70: 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a  fix indexes..**.
1f80: 2a 2a 20 45 61 63 68 20 73 65 67 6d 65 6e 74 20  ** Each segment 
1f90: 69 6e 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20  in an index has 
1fa0: 61 20 75 6e 69 71 75 65 20 69 64 20 67 72 65 61  a unique id grea
1fb0: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a  ter than zero..*
1fc0: 2a 0a 2a 2a 20 45 61 63 68 20 6e 6f 64 65 20 69  *.** Each node i
1fd0: 6e 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  n a segment b-tr
1fe0: 65 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61  ee is assigned a
1ff0: 20 22 70 61 67 65 20 6e 75 6d 62 65 72 22 20 74   "page number" t
2000: 68 61 74 20 69 73 20 75 6e 69 71 75 65 0a 2a 2a  hat is unique.**
2010: 20 77 69 74 68 69 6e 20 6e 6f 64 65 73 20 6f 66   within nodes of
2020: 20 69 74 73 20 68 65 69 67 68 74 20 77 69 74 68   its height with
2030: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 28  in the segment (
2040: 6c 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20  leaf nodes have 
2050: 61 20 68 65 69 67 68 74 20 0a 2a 2a 20 6f 66 20  a height .** of 
2060: 30 2c 20 70 61 72 65 6e 74 73 20 31 2c 20 65 74  0, parents 1, et
2070: 63 2e 29 2e 20 50 61 67 65 20 6e 75 6d 62 65 72  c.). Page number
2080: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
2090: 73 65 71 75 65 6e 74 69 61 6c 6c 79 20 73 6f 20  sequentially so 
20a0: 74 68 61 74 0a 2a 2a 20 61 20 6e 6f 64 65 73 20  that.** a nodes 
20b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 61  page number is a
20c0: 6c 77 61 79 73 20 6f 6e 65 20 6d 6f 72 65 20 74  lways one more t
20d0: 68 61 6e 20 69 74 73 20 6c 65 66 74 20 73 69 62  han its left sib
20e0: 6c 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ling..**.** The 
20f0: 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 64 65  rowid for a node
2100: 20 69 73 20 74 68 65 6e 20 66 6f 75 6e 64 20 75   is then found u
2110: 73 69 6e 67 20 74 68 65 20 46 54 53 35 5f 53 45  sing the FTS5_SE
2120: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 6d 61  GMENT_ROWID() ma
2130: 63 72 6f 0a 2a 2a 20 62 65 6c 6f 77 2e 20 54 68  cro.** below. Th
2140: 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 2a  e FTS5_SEGMENT_*
2150: 5f 42 49 54 53 20 6d 61 63 72 6f 73 20 64 65 66  _BITS macros def
2160: 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
2170: 66 20 62 69 74 73 20 75 73 65 64 0a 2a 2a 20 74  f bits used.** t
2180: 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 74 68 72  o encode the thr
2190: 65 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ee FTS5_SEGMENT_
21a0: 52 4f 57 49 44 28 29 20 61 72 67 75 6d 65 6e 74  ROWID() argument
21b0: 73 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 72  s. This module r
21c0: 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
21d0: 5f 46 55 4c 4c 20 61 6e 64 20 66 61 69 6c 73 20  _FULL and fails 
21e0: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65 72  the current oper
21f0: 61 74 69 6f 6e 20 69 66 20 74 68 65 79 20 65 76  ation if they ev
2200: 65 72 20 70 72 6f 76 65 20 74 6f 6f 20 73 6d 61  er prove too sma
2210: 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ll..*/.#define F
2220: 54 53 35 5f 44 41 54 41 5f 49 44 58 5f 42 20 20  TS5_DATA_IDX_B  
2230: 20 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78 20     5     /* Max 
2240: 6f 66 20 33 31 20 70 72 65 66 69 78 20 69 6e 64  of 31 prefix ind
2250: 65 78 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  exes */.#define 
2260: 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 20  FTS5_DATA_ID_B  
2270: 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61 78     16     /* Max
2280: 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20 36   seg id number 6
2290: 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20  5535 */.#define 
22a0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
22b0: 5f 42 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78  _B  5     /* Max
22c0: 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 20 6f   b-tree height o
22d0: 66 20 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20  f 32 */.#define 
22e0: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
22f0: 20 20 20 33 31 20 20 20 20 20 2f 2a 20 4d 61 78     31     /* Max
2300: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2310: 32 31 34 37 34 38 33 36 34 38 20 2a 2f 0a 0a 23  2147483648 */..#
2320: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
2330: 45 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73  ENT_ROWID(idx, s
2340: 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67  egid, height, pg
2350: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2370: 20 28 28 69 36 34 29 28 69 64 78 29 20 20 20 20   ((i64)(idx)    
2380: 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 49 44  << (FTS5_DATA_ID
2390: 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  _B + FTS5_DATA_P
23a0: 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54  AGE_B + FTS5_DAT
23b0: 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20 5c  A_HEIGHT_B)) + \
23c0: 0a 20 28 28 69 36 34 29 28 73 65 67 69 64 29 20  . ((i64)(segid) 
23d0: 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 50   << (FTS5_DATA_P
23e0: 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54  AGE_B + FTS5_DAT
23f0: 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20 20  A_HEIGHT_B)) +  
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 5c 0a 20 28 28 69 36 34 29 28 68 65 69 67 68 74  \. ((i64)(height
2420: 29 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f  ) << (FTS5_DATA_
2430: 50 41 47 45 5f 42 29 29 20 2b 20 20 20 20 20 20  PAGE_B)) +      
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 5c 0a 20 28 28 69 36 34 29 28 70 67 6e 6f 29   \. ((i64)(pgno)
2470: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 5c 0a 29 0a 0a 23 69 66 20 46 54 53 35 5f    \.)..#if FTS5_
24c0: 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58  MAX_PREFIX_INDEX
24d0: 45 53 20 3e 20 28 28 31 3c 3c 46 54 53 35 5f 44  ES > ((1<<FTS5_D
24e0: 41 54 41 5f 49 44 58 5f 42 29 2d 31 29 20 0a 23  ATA_IDX_B)-1) .#
24f0: 20 65 72 72 6f 72 20 22 46 54 53 35 5f 4d 41 58   error "FTS5_MAX
2500: 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20  _PREFIX_INDEXES 
2510: 69 73 20 74 6f 6f 20 6c 61 72 67 65 22 0a 23 65  is too large".#e
2520: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
2530: 68 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e  height of segmen
2540: 74 20 62 2d 74 72 65 65 73 20 69 73 20 61 63 74  t b-trees is act
2550: 75 61 6c 6c 79 20 6c 69 6d 69 74 65 64 20 74 6f  ually limited to
2560: 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20 0a   one less than .
2570: 2a 2a 20 28 31 3c 3c 48 45 49 47 48 54 5f 42 49  ** (1<<HEIGHT_BI
2580: 54 53 29 2e 20 54 68 69 73 20 69 73 20 62 65 63  TS). This is bec
2590: 61 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 61  ause the rowid a
25a0: 64 64 72 65 73 73 20 73 70 61 63 65 20 66 6f 72  ddress space for
25b0: 20 6e 6f 64 65 73 0a 2a 2a 20 77 69 74 68 20 73   nodes.** with s
25c0: 75 63 68 20 61 20 68 65 69 67 68 74 20 69 73 20  uch a height is 
25d0: 75 73 65 64 20 62 79 20 64 6f 63 6c 69 73 74 20  used by doclist 
25e0: 69 6e 64 65 78 65 73 2e 0a 2a 2f 0a 23 64 65 66  indexes..*/.#def
25f0: 69 6e 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  ine FTS5_SEGMENT
2600: 5f 4d 41 58 5f 48 45 49 47 48 54 20 28 28 31 20  _MAX_HEIGHT ((1 
2610: 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  << FTS5_DATA_HEI
2620: 47 48 54 5f 42 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a  GHT_B)-1)../*.**
2630: 20 4d 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74   Maximum segment
2640: 73 20 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61  s permitted in a
2650: 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a   single index .*
2660: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d  /.#define FTS5_M
2670: 41 58 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a  AX_SEGMENT 2000.
2680: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64  ./*.** The rowid
2690: 20 66 6f 72 20 74 68 65 20 64 6f 63 6c 69 73 74   for the doclist
26a0: 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
26b0: 64 20 77 69 74 68 20 6c 65 61 66 20 70 61 67 65  d with leaf page
26c0: 20 70 67 6e 6f 20 6f 66 20 73 65 67 6d 65 6e 74   pgno of segment
26d0: 0a 2a 2a 20 73 65 67 69 64 20 69 6e 20 69 6e 64  .** segid in ind
26e0: 65 78 20 69 64 78 2e 0a 2a 2f 0a 23 64 65 66 69  ex idx..*/.#defi
26f0: 6e 65 20 46 54 53 35 5f 44 4f 43 4c 49 53 54 5f  ne FTS5_DOCLIST_
2700: 49 44 58 5f 52 4f 57 49 44 28 69 64 78 2c 20 73  IDX_ROWID(idx, s
2710: 65 67 69 64 2c 20 70 67 6e 6f 29 20 5c 0a 20 20  egid, pgno) \.  
2720: 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45        FTS5_SEGME
2730: 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73 65  NT_ROWID(idx, se
2740: 67 69 64 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  gid, FTS5_SEGMEN
2750: 54 5f 4d 41 58 5f 48 45 49 47 48 54 2c 20 70 67  T_MAX_HEIGHT, pg
2760: 6e 6f 29 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  no)..#ifdef SQLI
2770: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
2780: 69 74 65 33 46 74 73 35 43 6f 72 72 75 70 74 28  ite3Fts5Corrupt(
2790: 29 20 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) { return SQLIT
27a0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 20  E_CORRUPT_VTAB; 
27b0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
27c0: 20 45 61 63 68 20 74 69 6d 65 20 61 20 62 6c 6f   Each time a blo
27d0: 62 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  b is read from t
27e0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2c  he %_data table,
27f0: 20 69 74 20 69 73 20 70 61 64 64 65 64 20 77 69   it is padded wi
2800: 74 68 20 74 68 69 73 0a 2a 2a 20 6d 61 6e 79 20  th this.** many 
2810: 7a 65 72 6f 20 62 79 74 65 73 2e 20 54 68 69 73  zero bytes. This
2820: 20 6d 61 6b 65 73 20 69 74 20 65 61 73 69 65 72   makes it easier
2830: 20 74 6f 20 64 65 63 6f 64 65 20 74 68 65 20 76   to decode the v
2840: 61 72 69 6f 75 73 20 72 65 63 6f 72 64 20 66 6f  arious record fo
2850: 72 6d 61 74 73 0a 2a 2a 20 77 69 74 68 6f 75 74  rmats.** without
2860: 20 6f 76 65 72 72 65 61 64 69 6e 67 20 69 66 20   overreading if 
2870: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
2880: 63 6f 72 72 75 70 74 2e 0a 2a 2f 0a 23 64 65 66  corrupt..*/.#def
2890: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 5a 45  ine FTS5_DATA_ZE
28a0: 52 4f 5f 50 41 44 44 49 4e 47 20 38 0a 0a 74 79  RO_PADDING 8..ty
28b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
28c0: 35 42 74 72 65 65 49 74 65 72 20 46 74 73 35 42  5BtreeIter Fts5B
28d0: 74 72 65 65 49 74 65 72 3b 0a 74 79 70 65 64 65  treeIter;.typede
28e0: 66 20 73 74 72 75 63 74 20 46 74 73 35 42 74 72  f struct Fts5Btr
28f0: 65 65 49 74 65 72 4c 65 76 65 6c 20 46 74 73 35  eeIterLevel Fts5
2900: 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 3b 0a  BtreeIterLevel;.
2910: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2920: 74 73 35 43 68 75 6e 6b 49 74 65 72 20 46 74 73  ts5ChunkIter Fts
2930: 35 43 68 75 6e 6b 49 74 65 72 3b 0a 74 79 70 65  5ChunkIter;.type
2940: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2950: 61 74 61 20 46 74 73 35 44 61 74 61 3b 0a 74 79  ata Fts5Data;.ty
2960: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2970: 35 44 6c 69 64 78 49 74 65 72 20 46 74 73 35 44  5DlidxIter Fts5D
2980: 6c 69 64 78 49 74 65 72 3b 0a 74 79 70 65 64 65  lidxIter;.typede
2990: 66 20 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c  f struct Fts5Mul
29a0: 74 69 53 65 67 49 74 65 72 20 46 74 73 35 4d 75  tiSegIter Fts5Mu
29b0: 6c 74 69 53 65 67 49 74 65 72 3b 0a 74 79 70 65  ltiSegIter;.type
29c0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 4e  def struct Fts5N
29d0: 6f 64 65 49 74 65 72 20 46 74 73 35 4e 6f 64 65  odeIter Fts5Node
29e0: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
29f0: 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69  ruct Fts5PageWri
2a00: 74 65 72 20 46 74 73 35 50 61 67 65 57 72 69 74  ter Fts5PageWrit
2a10: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2a20: 63 74 20 46 74 73 35 50 6f 73 49 74 65 72 20 46  ct Fts5PosIter F
2a30: 74 73 35 50 6f 73 49 74 65 72 3b 0a 74 79 70 65  ts5PosIter;.type
2a40: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2a50: 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74  egIter Fts5SegIt
2a60: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2a70: 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  ct Fts5DoclistIt
2a80: 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  er Fts5DoclistIt
2a90: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2aa0: 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72  ct Fts5SegWriter
2ab0: 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a   Fts5SegWriter;.
2ac0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2ad0: 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73  ts5Structure Fts
2ae0: 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65  5Structure;.type
2af0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2b00: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74  tructureLevel Ft
2b10: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2b20: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2b30: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2b40: 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74  gment Fts5Struct
2b50: 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72  ureSegment;..str
2b60: 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20  uct Fts5Data {. 
2b70: 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20   u8 *p;         
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
2ba0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2bb0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
2bc0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2be0: 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69  Size of record i
2bf0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
2c00: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c20: 52 65 66 20 63 6f 75 6e 74 20 2a 2f 0a 7d 3b 0a  Ref count */.};.
2c30: 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 62 6a 65 63  ./*.** One objec
2c40: 74 20 70 65 72 20 25 5f 64 61 74 61 20 74 61 62  t per %_data tab
2c50: 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  le..*/.struct Ft
2c60: 73 35 49 6e 64 65 78 20 7b 0a 20 20 46 74 73 35  s5Index {.  Fts5
2c70: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b  Config *pConfig;
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2c90: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e  irtual table con
2ca0: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  figuration */.  
2cb0: 63 68 61 72 20 2a 7a 44 61 74 61 54 62 6c 3b 20  char *zDataTbl; 
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 25 5f 64 61 74  /* Name of %_dat
2ce0: 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
2cf0: 20 6e 57 6f 72 6b 55 6e 69 74 3b 20 20 20 20 20   nWorkUnit;     
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d10: 4c 65 61 66 20 70 61 67 65 73 20 69 6e 20 61 20  Leaf pages in a 
2d20: 22 75 6e 69 74 22 20 6f 66 20 77 6f 72 6b 20 2a  "unit" of work *
2d30: 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 56 61 72  /..  /*.  ** Var
2d40: 69 61 62 6c 65 73 20 72 65 6c 61 74 65 64 20 74  iables related t
2d50: 6f 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 69  o the accumulati
2d60: 6f 6e 20 6f 66 20 74 6f 6b 65 6e 73 20 61 6e 64  on of tokens and
2d70: 20 64 6f 63 6c 69 73 74 73 20 77 69 74 68 69 6e   doclists within
2d80: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d   the.  ** in-mem
2d90: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
2da0: 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
2db0: 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e  flushed to disk.
2dc0: 0a 20 20 2a 2f 0a 20 20 46 74 73 35 48 61 73 68  .  */.  Fts5Hash
2dd0: 20 2a 2a 61 70 48 61 73 68 3b 20 20 20 20 20 20   **apHash;      
2de0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
2df0: 20 6f 66 20 68 61 73 68 20 74 61 62 6c 65 73 20   of hash tables 
2e00: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e  */.  int nMaxPen
2e10: 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20  dingData;       
2e20: 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64       /* Max pend
2e30: 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65 20  ing data before 
2e40: 66 6c 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f  flush to disk */
2e50: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44  .  int nPendingD
2e60: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2e70: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2e80: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2e90: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2ea0: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2ec0: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2ed0: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2ee0: 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73  */..  /* Error s
2ef0: 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  tate. */.  int r
2f00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2f20: 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  rrent error code
2f30: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   */..  /* State 
2f40: 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  used by the fts5
2f50: 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69  DataXXX() functi
2f60: 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2f70: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b  3_blob *pReader;
2f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20            /* RO 
2f90: 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f  incr-blob open o
2fa0: 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  n %_data table *
2fb0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2fc0: 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
2fd0: 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e      /* "INSERT .
2fe0: 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53  .. %_data VALUES
2ff0: 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  (?,?)" */.  sqli
3000: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
3010: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22  er;         /* "
3020: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
3030: 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44  ta ... id>=? AND
3040: 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 69 6e 74   id<=?" */.  int
3050: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3070: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
3080: 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d  blocks read */.}
3090: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f  ;..struct Fts5Do
30a0: 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 69 6e  clistIter {.  in
30b0: 74 20 62 44 65 73 63 3b 20 20 20 20 20 20 20 20  t bDesc;        
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 72 75 65 20 66 6f 72 20 44 45 53 43 20 6f   True for DESC o
30e0: 72 64 65 72 2c 20 66 61 6c 73 65 20 66 6f 72 20  rder, false for 
30f0: 41 53 43 20 2a 2f 0a 20 20 75 38 20 2a 61 3b 0a  ASC */.  u8 *a;.
3100: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69    int n;.  int i
3110: 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76  ;..  /* Output v
3120: 61 72 69 61 62 6c 65 73 2e 20 61 50 6f 73 6c 69  ariables. aPosli
3130: 73 74 3d 3d 30 20 61 74 20 45 4f 46 20 2a 2f 0a  st==0 at EOF */.
3140: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
3150: 75 38 20 2a 61 50 6f 73 6c 69 73 74 3b 0a 20 20  u8 *aPoslist;.  
3160: 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 7d 3b  int nPoslist;.};
3170: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 74 65  ../*.** Each ite
3180: 72 61 74 6f 72 20 75 73 65 64 20 62 79 20 65 78  rator used by ex
3190: 74 65 72 6e 61 6c 20 6d 6f 64 75 6c 65 73 20 69  ternal modules i
31a0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
31b0: 20 74 68 69 73 20 74 79 70 65 2e 0a 2a 2f 0a 73   this type..*/.s
31c0: 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 49  truct Fts5IndexI
31d0: 74 65 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65  ter {.  Fts5Inde
31e0: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 46 74 73  x *pIndex;.  Fts
31f0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
3200: 75 63 74 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69  uct;.  Fts5Multi
3210: 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 3b  SegIter *pMulti;
3220: 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  .  Fts5DoclistIt
3230: 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20  er *pDoclist;.  
3240: 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69  Fts5Buffer posli
3250: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
3260: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
3270: 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73  ning current pos
3280: 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  list */.};../*.*
3290: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
32a0: 66 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65  f the "structure
32b0: 22 20 72 65 63 6f 72 64 20 66 6f 72 20 65 61 63  " record for eac
32c0: 68 20 69 6e 64 65 78 20 61 72 65 20 72 65 70 72  h index are repr
32d0: 65 73 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  esented.** using
32e0: 20 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72   an Fts5Structur
32f0: 65 20 72 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f  e record in memo
3300: 72 79 2e 20 57 68 69 63 68 20 75 73 65 73 20 69  ry. Which uses i
3310: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
3320: 0a 2a 2a 20 6f 74 68 65 72 20 46 74 73 35 53 74  .** other Fts5St
3330: 72 75 63 74 75 72 65 58 58 58 20 74 79 70 65 73  ructureXXX types
3340: 20 61 73 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a   as components..
3350: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 74  */.struct Fts5St
3360: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 7b  ructureSegment {
3370: 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20  .  int iSegid;  
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64     /* Segment id
33a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 65 69 67 68   */.  int nHeigh
33b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
33c0: 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20        /* Height 
33d0: 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  of segment b-tre
33e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 46  e */.  int pgnoF
33f0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
3400: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3410: 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
3420: 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20   in segment */. 
3430: 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 3b 20 20   int pgnoLast;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61   /* Last leaf pa
3460: 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67  ge number in seg
3470: 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  ment */.};.struc
3480: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  t Fts5StructureL
3490: 65 76 65 6c 20 7b 0a 20 20 69 6e 74 20 6e 4d 65  evel {.  int nMe
34a0: 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rge;            
34b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
34c0: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69  er of segments i
34d0: 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20 2a 2f 0a  n incr-merge */.
34e0: 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20    int nSeg;     
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3500: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
3510: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e  r of segments on
3520: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 46 74 73 35   level */.  Fts5
3530: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
3540: 20 2a 61 53 65 67 3b 20 20 20 20 20 2f 2a 20 41   *aSeg;     /* A
3550: 72 72 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 73  rray of segments
3560: 2e 20 61 53 65 67 5b 30 5d 20 69 73 20 6f 6c 64  . aSeg[0] is old
3570: 65 73 74 2e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  est. */.};.struc
3580: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  t Fts5Structure 
3590: 7b 0a 20 20 75 36 34 20 6e 57 72 69 74 65 43 6f  {.  u64 nWriteCo
35a0: 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  unter;          
35b0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6c 65 61      /* Total lea
35c0: 76 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6c  ves written to l
35d0: 65 76 65 6c 20 30 20 2a 2f 0a 20 20 69 6e 74 20  evel 0 */.  int 
35e0: 6e 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 20  nSegment;       
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3600: 6f 74 61 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e  otal segments in
3610: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3620: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b  */.  int nLevel;
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3650: 66 20 6c 65 76 65 6c 73 20 69 6e 20 74 68 69 73  f levels in this
3660: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35   index */.  Fts5
3670: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 61  StructureLevel a
3680: 4c 65 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20 41  Level[0];   /* A
3690: 72 72 61 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c  rray of nLevel l
36a0: 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  evel objects */.
36b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  };../*.** An obj
36c0: 65 63 74 20 6f 66 20 74 79 70 65 20 46 74 73 35  ect of type Fts5
36d0: 53 65 67 57 72 69 74 65 72 20 69 73 20 75 73 65  SegWriter is use
36e0: 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 73 65  d to write to se
36f0: 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63  gments..*/.struc
3700: 74 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72  t Fts5PageWriter
3710: 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20   {.  int pgno;  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
3740: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
3750: 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
3760: 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  r buf;          
3770: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
3780: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67 65   containing page
3790: 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73 35 42   data */.  Fts5B
37a0: 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
37b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
37c0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
37d0: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 6f 6e  previous term on
37e0: 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75   page */.};.stru
37f0: 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72  ct Fts5SegWriter
3800: 20 7b 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20   {.  int iIdx;  
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
3830: 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
3840: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3860: 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69 74 65  * Segid to write
3870: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 72   to */.  int nWr
3880: 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
3890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
38a0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
38b0: 20 61 57 72 69 74 65 72 20 2a 2f 0a 20 20 46 74   aWriter */.  Ft
38c0: 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 61 57  s5PageWriter *aW
38d0: 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 2f 2a  riter;        /*
38e0: 20 41 72 72 61 79 20 6f 66 20 50 61 67 65 57 72   Array of PageWr
38f0: 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  iter objects */.
3900: 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69 64    i64 iPrevRowid
3910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3920: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f    /* Previous do
3930: 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63  cid written to c
3940: 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20  urrent leaf */. 
3950: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3960: 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
3970: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3980: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3990: 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  in doclist */.  
39a0: 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e  u8 bFirstRowidIn
39b0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
39c0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
39d0: 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69  rowid is first i
39e0: 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 62  n page */.  u8 b
39f0: 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 3b  FirstTermInPage;
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3a10: 72 75 65 20 69 66 20 6e 65 78 74 20 74 65 72 6d  rue if next term
3a20: 20 77 69 6c 6c 20 62 65 20 66 69 72 73 74 20 69   will be first i
3a30: 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20  n leaf */.  int 
3a40: 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 20 20 20  nLeafWritten;   
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3a60: 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
3a70: 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ges written */. 
3a80: 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20 20   int nEmpty;    
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
3ab0: 6e 74 69 67 75 6f 75 73 20 74 65 72 6d 2d 6c 65  ntiguous term-le
3ac0: 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 46 74  ss nodes */.  Ft
3ad0: 73 35 42 75 66 66 65 72 20 63 64 6c 69 64 78 3b  s5Buffer cdlidx;
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3af0: 2a 20 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  * Doclist index 
3b00: 2a 2f 0a 20 20 69 36 34 20 69 44 6c 69 64 78 50  */.  i64 iDlidxP
3b10: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
3b20: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
3b30: 20 72 6f 77 69 64 20 61 70 70 65 6e 64 65 64 20   rowid appended 
3b40: 74 6f 20 64 6c 69 64 78 20 2a 2f 0a 20 20 69 6e  to dlidx */.  in
3b50: 74 20 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69  t bDlidxPrevVali
3b60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
3b70: 20 54 72 75 65 20 69 66 20 69 44 6c 69 64 78 50   True if iDlidxP
3b80: 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rev is valid */.
3b90: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  };../*.** Object
3ba0: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
3bb0: 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67 65  hrough the merge
3bc0: 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65  d results of one
3bd0: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
3be0: 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20 65  s,.** visiting e
3bf0: 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 20 70  ach term/docid p
3c00: 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67 65  air in the merge
3c10: 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53  d data..**.** nS
3c20: 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20 70  eg is always a p
3c30: 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65 61  ower of two grea
3c40: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
3c50: 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  l to the number 
3c60: 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74  of.** segments t
3c70: 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hat this object 
3c80: 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20  is merging data 
3c90: 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20 61  from. Both the a
3ca0: 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69  Seg[] and.** aFi
3cb0: 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72 65  rst[] arrays are
3cc0: 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20 65   sized at nSeg e
3cd0: 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65 67  ntries. The aSeg
3ce0: 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64 64  [] array is padd
3cf0: 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65  ed.** with zeroe
3d00: 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65 73  d objects - thes
3d10: 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73  e are handled as
3d20: 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69 74   if they were it
3d30: 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  erators opened.*
3d40: 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d 65  * on empty segme
3d50: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  nts..**.** The r
3d60: 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72  esults of compar
3d70: 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53 65  ing segments aSe
3d80: 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b  g[N] and aSeg[N+
3d90: 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20 61  1], where N is a
3da0: 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72  n.** even number
3db0: 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  , is stored in a
3dc0: 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32  First[(nSeg+N)/2
3dd0: 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22 20  ]. The "result" 
3de0: 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61  of the .** compa
3df0: 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f  rison in this co
3e00: 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e 64  ntext is the ind
3e10: 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  ex of the iterat
3e20: 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  or that currentl
3e30: 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  y.** points to t
3e40: 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f  he smaller term/
3e50: 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  rowid combinatio
3e60: 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74 20  n. Iterators at 
3e70: 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69  EOF are.** consi
3e80: 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65 61  dered to be grea
3e90: 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68  ter than all oth
3ea0: 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a  er iterators..**
3eb0: 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63 6f  .** aFirst[1] co
3ec0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
3ed0: 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74 68   in aSeg[] of th
3ee0: 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  e iterator that 
3ef0: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
3f00: 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76   smallest key ov
3f10: 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d  erall. aFirst[0]
3f20: 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f 0a   is unused. .*/.
3f30: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3f40: 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35  Fts5CResult Fts5
3f50: 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20  CResult;.struct 
3f60: 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20  Fts5CResult {.  
3f70: 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20  u16 iFirst;     
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20  /* aSeg[] index 
3fa0: 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72  of firstest iter
3fb0: 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65  ator */.  u8 bTe
3fc0: 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rmEq;           
3fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3fe0: 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61  e if the terms a
3ff0: 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a  re equal */.};..
4000: 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c 74 69  struct Fts5Multi
4010: 53 65 67 49 74 65 72 20 7b 0a 20 20 69 6e 74 20  SegIter {.  int 
4020: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
4030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4040: 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61 72  ize of aSeg[] ar
4050: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ray */.  int bRe
4060: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
4070: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
4080: 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20 72   to iterate in r
4090: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
40a0: 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74 79    int bSkipEmpty
40b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40c0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b 69    /* True to ski
40d0: 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69 65  p deleted entrie
40e0: 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
40f0: 65 72 20 2a 61 53 65 67 3b 20 20 20 20 20 20 20  er *aSeg;       
4100: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
4110: 6f 66 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  of segment itera
4120: 74 6f 72 73 20 2a 2f 0a 20 20 46 74 73 35 43 52  tors */.  Fts5CR
4130: 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20  esult *aFirst;  
4140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4150: 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65  rent merge state
4160: 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a   (see above) */.
4170: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  };../*.** Object
4180: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
4190: 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c 65 20  hrough a single 
41a0: 73 65 67 6d 65 6e 74 2c 20 76 69 73 69 74 69 6e  segment, visitin
41b0: 67 20 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69  g each term/doci
41c0: 64 0a 2a 2a 20 70 61 69 72 20 69 6e 20 74 68 65  d.** pair in the
41d0: 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
41e0: 70 53 65 67 3a 0a 2a 2a 20 20 20 54 68 65 20 73  pSeg:.**   The s
41f0: 65 67 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74  egment to iterat
4200: 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a  e through..**.**
4210: 20 69 4c 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20   iLeafPgno:.**  
4220: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   Current leaf pa
4230: 67 65 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  ge number within
4240: 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
4250: 69 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20  iLeafOffset:.** 
4260: 20 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69    Byte offset wi
4270: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
4280: 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 74 68   leaf that is th
4290: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
42a0: 74 68 65 20 0a 2a 2a 20 20 20 70 6f 73 69 74 69  the .**   positi
42b0: 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 28 6f 6e  on list data (on
42c0: 65 20 62 79 74 65 20 70 61 73 73 65 64 20 74 68  e byte passed th
42d0: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
42e0: 73 69 7a 65 20 66 69 65 6c 64 29 2e 0a 2a 2a 20  size field)..** 
42f0: 20 20 72 6f 77 69 64 20 66 69 65 6c 64 20 6f 66    rowid field of
4300: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
4310: 72 79 2e 20 55 73 75 61 6c 6c 79 20 74 68 69 73  ry. Usually this
4320: 20 69 73 20 74 68 65 20 73 69 7a 65 20 66 69 65   is the size fie
4330: 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 70  ld of the.**   p
4340: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
4350: 61 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  a. The exception
4360: 20 69 73 20 69 66 20 74 68 65 20 72 6f 77 69 64   is if the rowid
4370: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
4380: 20 65 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73 20   entry .**   is 
4390: 74 68 65 20 6c 61 73 74 20 74 68 69 6e 67 20 6f  the last thing o
43a0: 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e  n the leaf page.
43b0: 0a 2a 2a 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a  .**.** pLeaf:.**
43c0: 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69     Buffer contai
43d0: 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 6c 65 61  ning current lea
43e0: 66 20 70 61 67 65 20 64 61 74 61 2e 20 53 65 74  f page data. Set
43f0: 20 74 6f 20 4e 55 4c 4c 20 61 74 20 45 4f 46 2e   to NULL at EOF.
4400: 0a 2a 2a 0a 2a 2a 20 69 54 65 72 6d 4c 65 61 66  .**.** iTermLeaf
4410: 50 67 6e 6f 2c 20 69 54 65 72 6d 4c 65 61 66 4f  Pgno, iTermLeafO
4420: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 4c 65 61 66  ffset:.**   Leaf
4430: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 63 6f 6e   page number con
4440: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74  taining the last
4450: 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20   term read from 
4460: 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 41 6e 64  the segment. And
4470: 0a 2a 2a 20 20 20 74 68 65 20 6f 66 66 73 65 74  .**   the offset
4480: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4490: 6c 6f 77 69 6e 67 20 74 68 65 20 74 65 72 6d 20  lowing the term 
44a0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67  data..**.** flag
44b0: 73 3a 0a 2a 2a 20 20 20 4d 61 73 6b 20 6f 66 20  s:.**   Mask of 
44c0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 58 58 58  FTS5_SEGITER_XXX
44d0: 20 76 61 6c 75 65 73 2e 20 49 6e 74 65 72 70 72   values. Interpr
44e0: 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
44f0: 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45  .**.**   FTS5_SE
4500: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a  GITER_ONETERM:.*
4510: 2a 20 20 20 20 20 49 66 20 73 65 74 2c 20 73 65  *     If set, se
4520: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  t the iterator t
4530: 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20 61  o point to EOF a
4540: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
4550: 20 64 6f 63 6c 69 73 74 20 0a 2a 2a 20 20 20 20   doclist .**    
4560: 20 68 61 73 20 62 65 65 6e 20 65 78 68 61 75 73   has been exhaus
4570: 74 65 64 2e 20 44 6f 20 6e 6f 74 20 70 72 6f 63  ted. Do not proc
4580: 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  eed to the next 
4590: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
45a0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53  ent..**.**   FTS
45b0: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
45c0: 45 3a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66  E:.**     This f
45d0: 6c 61 67 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  lag is only ever
45e0: 20 73 65 74 20 69 66 20 46 54 53 35 5f 53 45 47   set if FTS5_SEG
45f0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 69 73 20  ITER_ONETERM is 
4600: 61 6c 73 6f 20 73 65 74 2e 20 49 66 0a 2a 2a 20  also set. If.** 
4610: 20 20 20 20 69 74 20 69 73 20 73 65 74 2c 20 69      it is set, i
4620: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64  terate through d
4630: 6f 63 69 64 73 20 69 6e 20 64 65 73 63 65 6e 64  ocids in descend
4640: 69 6e 67 20 6f 72 64 65 72 20 69 6e 73 74 65 61  ing order instea
4650: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  d of the.**     
4660: 64 65 66 61 75 6c 74 20 61 73 63 65 6e 64 69 6e  default ascendin
4670: 67 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 69  g order..**.** i
4680: 52 6f 77 69 64 4f 66 66 73 65 74 2f 6e 52 6f 77  RowidOffset/nRow
4690: 69 64 4f 66 66 73 65 74 2f 61 52 6f 77 69 64 4f  idOffset/aRowidO
46a0: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 20 20 54 68  ffset:.**     Th
46b0: 65 73 65 20 61 72 65 20 75 73 65 64 20 69 66 20  ese are used if 
46c0: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
46d0: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
46e0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   set..**.**     
46f0: 46 6f 72 20 65 61 63 68 20 72 6f 77 69 64 20 6f  For each rowid o
4700: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 72 72 65  n the page corre
4710: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
4720: 63 75 72 72 65 6e 74 20 74 65 72 6d 2c 20 74 68  current term, th
4730: 65 0a 2a 2a 20 20 20 20 20 63 6f 72 72 65 73 70  e.**     corresp
4740: 6f 6e 64 69 6e 67 20 61 52 6f 77 69 64 4f 66 66  onding aRowidOff
4750: 73 65 74 5b 5d 20 65 6e 74 72 79 20 69 73 20 73  set[] entry is s
4760: 65 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f  et to the byte o
4770: 66 66 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ffset of the.** 
4780: 20 20 20 20 73 74 61 72 74 20 6f 66 20 74 68 65      start of the
4790: 20 22 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2d   "position-list-
47a0: 73 69 7a 65 22 20 66 69 65 6c 64 20 77 69 74 68  size" field with
47b0: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  in the page..*/.
47c0: 73 74 72 75 63 74 20 46 74 73 35 53 65 67 49 74  struct Fts5SegIt
47d0: 65 72 20 7b 0a 20 20 46 74 73 35 53 74 72 75 63  er {.  Fts5Struc
47e0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
47f0: 67 3b 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g;     /* Segmen
4800: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
4810: 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ough */.  int iI
4820: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
4830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
4840: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
4850: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
4860: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e    /* Mask of con
4890: 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67 73  figuration flags
48a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
48b0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
48c0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
48d0: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
48e0: 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  r */.  Fts5Data 
48f0: 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  *pLeaf;         
4900: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4910: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20  t leaf data */. 
4920: 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65 74   int iLeafOffset
4930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4940: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
4950: 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c  within current l
4960: 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  eaf */..  /* The
4970: 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73 65 74   page and offset
4980: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20   from which the 
4990: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77 61 73  current term was
49a0: 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66 73 65   read. The offse
49b0: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6f  t .  ** is the o
49c0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 66 69 72  ffset of the fir
49d0: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
49e0: 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e  current doclist.
49f0: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d    */.  int iTerm
4a00: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
4a10: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
4a20: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
4a30: 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75 73  wing are only us
4a40: 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53  ed if the FTS5_S
4a50: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66  EGITER_REVERSE f
4a60: 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20  lag is set. */. 
4a70: 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65   int iRowidOffse
4a80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4a90: 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e 74 72   /* Current entr
4aa0: 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66 73 65  y in aRowidOffse
4ab0: 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  t[] */.  int nRo
4ac0: 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  widOffset;      
4ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
4ae0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 52  cated size of aR
4af0: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72  owidOffset[] arr
4b00: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f  ay */.  int *aRo
4b10: 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  widOffset;      
4b20: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4b30: 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20 72 6f   of offset to ro
4b40: 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20  wid fields */.. 
4b50: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
4b60: 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20  pDlidx;         
4b70: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
4b80: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
4b90: 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  */..  /* Variabl
4ba0: 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73  es populated bas
4bb0: 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e  ed on current en
4bc0: 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75  try. */.  Fts5Bu
4bd0: 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
4be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4bf0: 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  rent term */.  i
4c00: 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c20: 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20  * Current rowid 
4c30: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20  */.  int nPos;  
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4c60: 66 20 62 79 74 65 73 20 69 6e 20 63 75 72 72 65  f bytes in curre
4c70: 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
4c80: 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 3b 20   */.  int bDel; 
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4cb0: 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67   the delete flag
4cc0: 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a 23   is set */.};..#
4cd0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49  define FTS5_SEGI
4ce0: 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31  TER_ONETERM 0x01
4cf0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45  .#define FTS5_SE
4d00: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 30 78  GITER_REVERSE 0x
4d10: 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  02.../*.** Objec
4d20: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
4d30: 74 68 72 6f 75 67 68 20 70 61 67 69 6e 61 74 65  through paginate
4d40: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63  d data..*/.struc
4d50: 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20  t Fts5ChunkIter 
4d60: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
4d70: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
4d80: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
4d90: 65 61 66 20 64 61 74 61 2e 20 4e 55 4c 4c 20 2d  eaf data. NULL -
4da0: 3e 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 36 34 20  > EOF. */.  i64 
4db0: 69 4c 65 61 66 52 6f 77 69 64 3b 20 20 20 20 20  iLeafRowid;     
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4dd0: 62 73 6f 6c 75 74 65 20 72 6f 77 69 64 20 6f 66  bsolute rowid of
4de0: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
4df0: 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20  .  int nRem;    
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20     /* Remaining 
4e20: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 74 6f  bytes of data to
4e30: 20 72 65 61 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   read */..  /* O
4e40: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
4e50: 20 2a 2f 0a 20 20 75 38 20 2a 70 3b 20 20 20 20   */.  u8 *p;    
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
4e80: 20 74 6f 20 63 68 75 6e 6b 20 6f 66 20 64 61 74   to chunk of dat
4e90: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  a */.  int n;   
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4ec0: 66 20 62 75 66 66 65 72 20 70 20 69 6e 20 62 79  f buffer p in by
4ed0: 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  tes */.};../*.**
4ee0: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
4ef0: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20  ating through a 
4f00: 73 69 6e 67 6c 65 20 70 6f 73 69 74 69 6f 6e 20  single position 
4f10: 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  list on disk..*/
4f20: 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 49  .struct Fts5PosI
4f30: 74 65 72 20 7b 0a 20 20 46 74 73 35 43 68 75 6e  ter {.  Fts5Chun
4f40: 6b 49 74 65 72 20 63 68 75 6e 6b 3b 20 20 20 20  kIter chunk;    
4f50: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f60: 6e 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61  nt chunk of data
4f70: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
4fa0: 77 69 74 68 69 6e 20 63 68 75 6e 6b 20 64 61 74  within chunk dat
4fb0: 61 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43 6f 6c  a */..  int iCol
4fc0: 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a 7d 3b  ;.  int iPos;.};
4fd0: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66  ../*.** Object f
4fe0: 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
4ff0: 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e 74 73  ough the conents
5000: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69 6e 74   of a single int
5010: 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 0a 2a  ernal node in .*
5020: 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 72  * memory..*/.str
5030: 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65 72  uct Fts5NodeIter
5040: 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e 61 6c   {.  /* Internal
5050: 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61 67 65  . Set and manage
5060: 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49 74 65  d by fts5NodeIte
5070: 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  rXXX() functions
5080: 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a 2a 20  . Except, .  ** 
5090: 74 68 65 20 45 4f 46 20 74 65 73 74 20 66 6f 72  the EOF test for
50a0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
50b0: 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72 2e 61   (Fts5NodeIter.a
50c0: 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a 20 20  Data==0).  */.  
50d0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 3b  const u8 *aData;
50e0: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20  .  int nData;.  
50f0: 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f 2a 20  int iOff;..  /* 
5100: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
5110: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
5120: 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 45 6d   term;.  int nEm
5130: 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68 69 6c  pty;.  int iChil
5140: 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b  d;.  int bDlidx;
5150: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
5160: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
5170: 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73 20  llowing type is 
5180: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
5190: 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74  through the cont
51a0: 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f 63  ents.** of a doc
51b0: 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72  list-index recor
51c0: 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a 0a  d..**.** pData:.
51d0: 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e 74  **   Record cont
51e0: 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  aining the docli
51f0: 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a 2a  st-index data..*
5200: 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20 20  *.** bEof:.**   
5210: 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63 65  Set to true once
5220: 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72 65   iterator has re
5230: 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  ached EOF..**.**
5240: 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74 20   iOff:.**   Set 
5250: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  to the current o
5260: 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65 63  ffset within rec
5270: 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73 74  ord pData..*/.st
5280: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74  ruct Fts5DlidxIt
5290: 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  er {.  Fts5Data 
52a0: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
52b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
52c0: 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 2c 20   doclist index, 
52d0: 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
52e0: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
52f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
5300: 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 74 6f  rent offset into
5310: 20 70 44 6c 69 64 78 20 2a 2f 0a 20 20 69 6e 74   pDlidx */.  int
5320: 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20   bEof;          
5330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
5340: 20 45 4f 46 20 61 6c 72 65 61 64 79 20 2a 2f 0a   EOF already */.
5350: 20 20 69 6e 74 20 69 46 69 72 73 74 4f 66 66 3b    int iFirstOff;
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 2f 2a 20 55 73 65 64 20 62 79 20 72 65 76 65 72  /* Used by rever
5380: 73 65 20 69 74 65 72 61 74 6f 72 73 20 6f 6e 6c  se iterators onl
5390: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  y */..  /* Outpu
53a0: 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  t variables */. 
53b0: 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20   int iLeafPgno; 
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
53d0: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
53e0: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
53f0: 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ge */.  i64 iRow
5400: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
5410: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
5420: 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65  owid on leaf iLe
5430: 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  afPgno */.};.../
5440: 2a 0a 2a 2a 20 41 6e 20 46 74 73 35 42 74 72 65  *.** An Fts5Btre
5450: 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20  eIter object is 
5460: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
5470: 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72  through all entr
5480: 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d  ies in the.** b-
5490: 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20 62  tree hierarchy b
54a0: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 73 69  elonging to a si
54b0: 6e 67 6c 65 20 66 74 73 35 20 73 65 67 6d 65 6e  ngle fts5 segmen
54c0: 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
54d0: 74 68 65 0a 2a 2a 20 22 62 2d 74 72 65 65 20 68  the.** "b-tree h
54e0: 69 65 72 61 72 63 68 79 22 20 69 73 20 61 6c 6c  ierarchy" is all
54f0: 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 65 78   b-tree nodes ex
5500: 63 65 70 74 20 6c 65 61 76 65 73 2e 20 45 61 63  cept leaves. Eac
5510: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  h entry in the.*
5520: 2a 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  * b-tree hierarc
5530: 68 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  hy consists of t
5540: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
5550: 0a 2a 2a 20 20 20 69 4c 65 61 66 3a 20 20 54 68  .**   iLeaf:  Th
5560: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
5570: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 74   the leaf page t
5580: 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 20  he entry points 
5590: 74 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72 6d  to..**.**   term
55a0: 3a 20 20 20 41 20 73 70 6c 69 74 2d 6b 65 79 20  :   A split-key 
55b0: 74 68 61 74 20 61 6c 6c 20 74 65 72 6d 73 20 6f  that all terms o
55c0: 6e 20 6c 65 61 66 20 70 61 67 65 20 24 69 4c 65  n leaf page $iLe
55d0: 61 66 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  af must be great
55e0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
55f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
5600: 2e 20 54 68 65 20 22 74 65 72 6d 22 20 61 73 73  . The "term" ass
5610: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
5620: 20 66 69 72 73 74 20 62 2d 74 72 65 65 0a 2a 2a   first b-tree.**
5630: 20 20 20 20 20 20 20 20 20 20 20 68 69 65 72 61             hiera
5640: 72 63 68 79 20 65 6e 74 72 79 20 28 74 68 65 20  rchy entry (the 
5650: 6f 6e 65 20 74 68 61 74 20 70 6f 69 6e 74 73 20  one that points 
5660: 74 6f 20 6c 65 61 66 20 70 61 67 65 20 31 29 20  to leaf page 1) 
5670: 69 73 20 61 6c 77 61 79 73 20 0a 2a 2a 20 20 20  is always .**   
5680: 20 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79          an empty
5690: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20   string..**.**  
56a0: 20 6e 45 6d 70 74 79 3a 20 54 68 65 20 6e 75 6d   nEmpty: The num
56b0: 62 65 72 20 6f 66 20 65 6d 70 74 79 20 28 74 65  ber of empty (te
56c0: 72 6d 6c 65 73 73 29 20 6c 65 61 66 20 70 61 67  rmless) leaf pag
56d0: 65 73 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74  es that immediat
56e0: 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ely.**          
56f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65 61 66   following iLeaf
5700: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
5710: 42 74 72 65 65 49 74 65 72 20 6f 62 6a 65 63 74  BtreeIter object
5720: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
5730: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 74   part of the int
5740: 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63 6f 64  egrity-check cod
5750: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  e..*/.struct Fts
5760: 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20  5BtreeIterLevel 
5770: 7b 0a 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72  {.  Fts5NodeIter
5780: 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
5790: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
57a0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
57b0: 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  node */.  Fts5Da
57c0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
57d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
57e0: 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  a for the curren
57f0: 74 20 6e 6f 64 65 20 2a 2f 0a 7d 3b 0a 73 74 72  t node */.};.str
5800: 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74 65  uct Fts5BtreeIte
5810: 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r {.  Fts5Index 
5820: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
5830: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
5840: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
5850: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
5860: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
5870: 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
5880: 6f 75 67 68 20 74 68 69 73 20 73 65 67 6d 65 6e  ough this segmen
5890: 74 27 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  t's b-tree */.  
58a0: 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 2f 2a 20 49 6e 64 65 78 20 70 53 65 67 20 62 65  /* Index pSeg be
58d0: 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  longs to */.  in
58e0: 74 20 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t nLvl;         
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5900: 20 53 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d 20   Size of aLvl[] 
5910: 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 42  array */.  Fts5B
5920: 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 61  treeIterLevel *a
5930: 4c 76 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65  Lvl;       /* Le
5940: 76 65 6c 20 66 6f 72 20 65 61 63 68 20 74 69 65  vel for each tie
5950: 72 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  r of b-tree */..
5960: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
5970: 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  ables */.  Fts5B
5980: 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
5990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
59a0: 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  rrent term */.  
59b0: 69 6e 74 20 69 4c 65 61 66 3b 20 20 20 20 20 20  int iLeaf;      
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 2f 2a 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e 69  /* Leaf containi
59e0: 6e 67 20 74 65 72 6d 73 20 3e 3d 20 63 75 72 72  ng terms >= curr
59f0: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ent term */.  in
5a00: 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20  t nEmpty;       
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a20: 20 4e 75 6d 62 65 72 20 6f 66 20 22 65 6d 70 74   Number of "empt
5a30: 79 22 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  y" leaves follow
5a40: 69 6e 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20 69  ing iLeaf */.  i
5a50: 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20  nt bEof;        
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a70: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 61 74  * Set to true at
5a80: 20 45 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62 44   EOF */.  int bD
5a90: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  lidx;           
5aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
5ab0: 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
5ac0: 73 20 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b 0a  s a dlidx */.};.
5ad0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
5ae0: 73 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75  s5PutU16(u8 *aOu
5af0: 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20  t, u16 iVal){.  
5b00: 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e  aOut[0] = (iVal>
5b10: 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d  >8);.  aOut[1] =
5b20: 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a   (iVal&0xFF);.}.
5b30: 0a 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35  .static u16 fts5
5b40: 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20  GetU16(const u8 
5b50: 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  *aIn){.  return 
5b60: 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20  ((u16)aIn[0] << 
5b70: 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a  8) + aIn[1];.}..
5b80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
5b90: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 71 6c 69  copy of the sqli
5ba0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
5bb0: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74 68   routine from th
5bc0: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a 2a  e SQLite core..*
5bd0: 2a 20 45 78 63 65 70 74 2c 20 74 68 69 73 20 76  * Except, this v
5be0: 65 72 73 69 6f 6e 20 64 6f 65 73 20 68 61 6e 64  ersion does hand
5bf0: 6c 65 20 74 68 65 20 73 69 6e 67 6c 65 20 62 79  le the single by
5c00: 74 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  te case that the
5c10: 20 63 6f 72 65 0a 2a 2a 20 76 65 72 73 69 6f 6e   core.** version
5c20: 20 64 65 70 65 6e 64 73 20 6f 6e 20 62 65 69 6e   depends on bein
5c30: 67 20 68 61 6e 64 6c 65 64 20 62 65 66 6f 72 65  g handled before
5c40: 20 69 74 73 20 66 75 6e 63 74 69 6f 6e 20 69 73   its function is
5c50: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20   called..*/.int 
5c60: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
5c70: 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73  rint32(const uns
5c80: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75  igned char *p, u
5c90: 33 32 20 2a 76 29 7b 0a 20 20 75 33 32 20 61 2c  32 *v){.  u32 a,
5ca0: 62 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 31 2d 62  b;..  /* The 1-b
5cb0: 79 74 65 20 63 61 73 65 2e 20 4f 76 65 72 77 68  yte case. Overwh
5cc0: 65 6c 6d 69 6e 67 6c 79 20 74 68 65 20 6d 6f 73  elmingly the mos
5cd0: 74 20 63 6f 6d 6d 6f 6e 2e 20 2a 2f 0a 20 20 61  t common. */.  a
5ce0: 20 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70   = *p;.  /* a: p
5cf0: 30 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a  0 (unmasked) */.
5d00: 20 20 69 66 20 28 21 28 61 26 30 78 38 30 29 29    if (!(a&0x80))
5d10: 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75  .  {.    /* Valu
5d20: 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  es between 0 and
5d30: 20 31 32 37 20 2a 2f 0a 20 20 20 20 2a 76 20 3d   127 */.    *v =
5d40: 20 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   a;.    return 1
5d50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
5d60: 32 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20  2-byte case */. 
5d70: 20 70 2b 2b 3b 0a 20 20 62 20 3d 20 2a 70 3b 0a   p++;.  b = *p;.
5d80: 20 20 2f 2a 20 62 3a 20 70 31 20 28 75 6e 6d 61    /* b: p1 (unma
5d90: 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21  sked) */.  if (!
5da0: 28 62 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20  (b&0x80)).  {.  
5db0: 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77    /* Values betw
5dc0: 65 65 6e 20 31 32 38 20 61 6e 64 20 31 36 33 38  een 128 and 1638
5dd0: 33 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20 30 78  3 */.    a &= 0x
5de0: 37 66 3b 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37  7f;.    a = a<<7
5df0: 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20 62  ;.    *v = a | b
5e00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  ;.    return 2;.
5e10: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 33 2d    }..  /* The 3-
5e20: 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20 70  byte case */.  p
5e30: 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34 3b  ++;.  a = a<<14;
5e40: 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a  .  a |= *p;.  /*
5e50: 20 61 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32 20   a: p0<<14 | p2 
5e60: 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20  (unmasked) */.  
5e70: 69 66 20 28 21 28 61 26 30 78 38 30 29 29 0a 20  if (!(a&0x80)). 
5e80: 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73   {.    /* Values
5e90: 20 62 65 74 77 65 65 6e 20 31 36 33 38 34 20 61   between 16384 a
5ea0: 6e 64 20 32 30 39 37 31 35 31 20 2a 2f 0a 20 20  nd 2097151 */.  
5eb0: 20 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34    a &= (0x7f<<14
5ec0: 29 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 62 20  )|(0x7f);.    b 
5ed0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 62 20 3d  &= 0x7f;.    b =
5ee0: 20 62 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20   b<<7;.    *v = 
5ef0: 61 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75 72  a | b;.    retur
5f00: 6e 20 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  n 3;.  }..  /* A
5f10: 20 33 32 2d 62 69 74 20 76 61 72 69 6e 74 20 69   32-bit varint i
5f20: 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
5f30: 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  size information
5f40: 20 69 6e 20 62 74 72 65 65 73 2e 0a 20 20 2a 2a   in btrees..  **
5f50: 20 4f 62 6a 65 63 74 73 20 61 72 65 20 72 61 72   Objects are rar
5f60: 65 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ely larger than 
5f70: 32 4d 69 42 20 6c 69 6d 69 74 20 6f 66 20 61 20  2MiB limit of a 
5f80: 33 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20  3-byte varint.. 
5f90: 20 2a 2a 20 41 20 33 2d 62 79 74 65 20 76 61 72   ** A 3-byte var
5fa0: 69 6e 74 20 69 73 20 73 75 66 66 69 63 69 65 6e  int is sufficien
5fb0: 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  t, for example, 
5fc0: 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 69  to record the si
5fd0: 7a 65 0a 20 20 2a 2a 20 6f 66 20 61 20 31 30 34  ze.  ** of a 104
5fe0: 38 35 36 39 2d 62 79 74 65 20 42 4c 4f 42 20 6f  8569-byte BLOB o
5ff0: 72 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2a 0a 20  r string..  **. 
6000: 20 2a 2a 20 57 65 20 6f 6e 6c 79 20 75 6e 72 6f   ** We only unro
6010: 6c 6c 20 74 68 65 20 66 69 72 73 74 20 31 2d 2c  ll the first 1-,
6020: 20 32 2d 2c 20 61 6e 64 20 33 2d 20 62 79 74 65   2-, and 3- byte
6030: 20 63 61 73 65 73 2e 20 20 54 68 65 20 76 65 72   cases.  The ver
6040: 79 0a 20 20 2a 2a 20 72 61 72 65 20 6c 61 72 67  y.  ** rare larg
6050: 65 72 20 63 61 73 65 73 20 63 61 6e 20 62 65 20  er cases can be 
6060: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 73  handled by the s
6070: 6c 6f 77 65 72 20 36 34 2d 62 69 74 20 76 61 72  lower 64-bit var
6080: 69 6e 74 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  int.  ** routine
6090: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75  ..  */.  {.    u
60a0: 36 34 20 76 36 34 3b 0a 20 20 20 20 75 38 20 6e  64 v64;.    u8 n
60b0: 3b 0a 20 20 20 20 70 20 2d 3d 20 32 3b 0a 20 20  ;.    p -= 2;.  
60c0: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 47 65 74    n = sqlite3Get
60d0: 56 61 72 69 6e 74 28 70 2c 20 26 76 36 34 29 3b  Varint(p, &v64);
60e0: 0a 20 20 20 20 2a 76 20 3d 20 28 75 33 32 29 76  .    *v = (u32)v
60f0: 36 34 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  64;.    assert( 
6100: 6e 3e 33 20 26 26 20 6e 3c 3d 39 20 29 3b 0a 20  n>3 && n<=9 );. 
6110: 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 7d     return n;.  }
6120: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
6130: 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28  ts5GetVarintLen(
6140: 75 33 32 20 69 56 61 6c 29 7b 0a 20 20 69 66 28  u32 iVal){.  if(
6150: 20 69 56 61 6c 3c 28 31 20 3c 3c 20 37 20 29 20   iVal<(1 << 7 ) 
6160: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
6170: 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 31 34 29  ( iVal<(1 << 14)
6180: 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
6190: 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32 31  f( iVal<(1 << 21
61a0: 29 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  ) ) return 3;.  
61b0: 69 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32  if( iVal<(1 << 2
61c0: 38 29 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  8) ) return 4;. 
61d0: 20 72 65 74 75 72 6e 20 35 3b 0a 7d 0a 0a 2f 2a   return 5;.}../*
61e0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
61f0: 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72   return a buffer
6200: 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20   at least nByte 
6210: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
6220: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
6230: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
6240: 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  red, return NULL
6250: 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72   and set the err
6260: 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68  or code in.** th
6270: 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  e Fts5Index hand
6280: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
6290: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
62a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
62b0: 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46  *fts5IdxMalloc(F
62c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
62d0: 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20   nByte){.  void 
62e0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
62f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6300: 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  K ){.    pRet = 
6310: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
6320: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
6330: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ret==0 ){.      
6340: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
6350: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
6360: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52  .      memset(pR
6370: 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  et, 0, nByte);. 
6380: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6390: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
63a0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   Compare the con
63b0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65  tents of the pLe
63c0: 66 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74  ft buffer with t
63d0: 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74  he pRight/nRight
63e0: 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   blob..**.** Ret
63f0: 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74  urn -ve if pLeft
6400: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
6410: 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68   pRight, 0 if th
6420: 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a  ey are equal or.
6430: 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74  ** +ve if pRight
6440: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
6450: 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72   pLeft. In other
6460: 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   words:.**.**   
6470: 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d    res = *pLeft -
6480: 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74   *pRight.*/.stat
6490: 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65  ic int fts5Buffe
64a0: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20  rCompareBlob(.  
64b0: 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66  Fts5Buffer *pLef
64c0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
64d0: 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64  /* Left hand sid
64e0: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
64f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
6500: 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68  Right, int nRigh
6510: 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61  t    /* Right ha
6520: 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  nd side of compa
6530: 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rison */.){.  in
6540: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
6550: 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a  ft->n, nRight);.
6560: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
6570: 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69  mp(pLeft->p, pRi
6580: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
6590: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
65a0: 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68  pLeft->n - nRigh
65b0: 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f  t) : res);.}.../
65c0: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
65d0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
65e0: 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69   two buffers usi
65f0: 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20  ng memcmp(). If 
6600: 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73  one buffer.** is
6610: 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
6620: 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f   other, it is co
6630: 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73  nsidered the les
6640: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ser..**.** Retur
6650: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
6660: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
6670: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
6680: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
6690: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
66a0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
66b0: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
66c0: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
66d0: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
66e0: 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63  pRight.*/.static
66f0: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
6700: 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65  ompare(Fts5Buffe
6710: 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75  r *pLeft, Fts5Bu
6720: 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  ffer *pRight){. 
6730: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
6740: 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74  pLeft->n, pRight
6750: 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ->n);.  int res 
6760: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e  = memcmp(pLeft->
6770: 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43  p, pRight->p, nC
6780: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
6790: 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e  es==0 ? (pLeft->
67a0: 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a  n - pRight->n) :
67b0: 20 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66   res);.}..#ifdef
67c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
67d0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 6c 6f  atic int fts5Blo
67e0: 62 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73  bCompare(.  cons
67f0: 74 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74  t u8 *pLeft, int
6800: 20 6e 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74   nLeft, .  const
6810: 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74   u8 *pRight, int
6820: 20 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74   nRight.){.  int
6830: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66   nCmp = MIN(nLef
6840: 74 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e  t, nRight);.  in
6850: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
6860: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43  Left, pRight, nC
6870: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
6880: 65 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d  es==0 ? (nLeft -
6890: 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b   nRight) : res);
68a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
68b0: 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64  * Close the read
68c0: 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c  -only blob handl
68d0: 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  e, if it is open
68e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
68f0: 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
6900: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
6910: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
6920: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6930: 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20  blob *pReader = 
6940: 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20  p->pReader;.    
6950: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
6960: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
6970: 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b  _close(pReader);
6980: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
6990: 65 63 6b 20 69 66 20 72 6f 77 20 69 52 6f 77 69  eck if row iRowi
69a0: 64 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  d exists in the 
69b0: 25 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 61 6e  %_data table, an
69c0: 64 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  d that it contai
69d0: 6e 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 76 61 6c  ns.** a blob val
69e0: 75 65 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72  ue. If so, retur
69f0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 28  n SQLITE_ERROR (
6a00: 79 65 73 20 2d 20 53 51 4c 49 54 45 5f 45 52 52  yes - SQLITE_ERR
6a10: 4f 52 2c 20 6e 6f 74 20 0a 2a 2a 20 53 51 4c 49  OR, not .** SQLI
6a20: 54 45 5f 4f 4b 29 2e 20 49 66 20 6e 6f 74 2c 20  TE_OK). If not, 
6a30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6a40: 52 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2a 0a 2a  RRUPT_VTAB..**.*
6a50: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6a60: 63 75 72 73 20 28 65 2e 67 2e 20 4f 4f 4d 20 6f  curs (e.g. OOM o
6a70: 72 20 49 4f 45 52 52 29 2c 20 72 65 74 75 72 6e  r IOERR), return
6a80: 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 65 72   the relevant er
6a90: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
6aa0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
6ab0: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
6ac0: 65 20 65 66 66 69 63 69 65 6e 74 2e 20 49 74 20  e efficient. It 
6ad0: 69 73 20 70 61 72 74 20 6f 66 20 76 61 72 79 20  is part of vary 
6ae0: 72 61 72 65 6c 79 0a 2a 2a 20 69 6e 76 6f 6b 65  rarely.** invoke
6af0: 64 20 65 72 72 6f 72 20 68 61 6e 64 6c 69 6e 67  d error handling
6b00: 20 63 6f 64 65 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23   code only..*/.#
6b10: 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20  if 0.static int 
6b20: 66 74 73 35 43 68 65 63 6b 4d 69 73 73 69 6e 67  fts5CheckMissing
6b30: 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 20  Rowid(Fts5Index 
6b40: 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  *p, i64 iRowid){
6b50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6b60: 46 6d 74 20 3d 20 22 53 45 4c 45 43 54 20 74 79  Fmt = "SELECT ty
6b70: 70 65 6f 66 28 62 6c 6f 63 6b 29 3d 3d 27 62 6c  peof(block)=='bl
6b80: 6f 62 27 20 46 52 4f 4d 20 27 25 71 27 2e 25 51  ob' FROM '%q'.%Q
6b90: 20 57 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 3b   WHERE id=%lld";
6ba0: 0a 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a  .  int bOk = 0;.
6bb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
6bc0: 20 2a 7a 53 71 6c 3b 0a 0a 20 20 7a 53 71 6c 20   *zSql;..  zSql 
6bd0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
6be0: 66 28 7a 46 6d 74 2c 20 70 2d 3e 70 43 6f 6e 66  f(zFmt, p->pConf
6bf0: 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74  ig->zDb, p->zDat
6c00: 61 54 62 6c 2c 20 69 52 6f 77 69 64 29 3b 0a 20  aTbl, iRowid);. 
6c10: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
6c20: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6c30: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
6c40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
6c50: 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 72 63 20   *pStmt;.    rc 
6c60: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6c70: 65 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d  e_v2(p->pConfig-
6c80: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
6c90: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
6ca0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6cb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51   ){.      if( SQ
6cc0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
6cd0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
6ce0: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 73  .        bOk = s
6cf0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
6d00: 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
6d10: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
6d20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6d30: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
6d40: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6d50: 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  zSql);.  }..  if
6d60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6d70: 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 4f 6b 20  ){.    rc = bOk 
6d80: 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a  ? SQLITE_ERROR :
6d90: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
6da0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
6db0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
6dc0: 63 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35  c Fts5Data *fts5
6dd0: 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72  DataReadOrBuffer
6de0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
6df0: 2c 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  , .  Fts5Buffer 
6e00: 2a 70 42 75 66 2c 20 0a 20 20 69 36 34 20 69 52  *pBuf, .  i64 iR
6e10: 6f 77 69 64 0a 29 7b 0a 20 20 46 74 73 35 44 61  owid.){.  Fts5Da
6e20: 74 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  ta *pRet = 0;.  
6e30: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
6e40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
6e50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6e60: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61  .    if( p->pRea
6e70: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  der ){.      /* 
6e80: 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65  This call may re
6e90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
6ea0: 54 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  T if there has b
6eb0: 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a  een a savepoint.
6ec0: 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
6ed0: 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  k since it was l
6ee0: 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69  ast used. In thi
6ef0: 73 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f  s case a new blo
6f00: 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a  b handle.      *
6f10: 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  * is required.  
6f20: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
6f30: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70  _blob *pBlob = p
6f40: 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 20  ->pReader;.     
6f50: 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b   p->pReader = 0;
6f60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6f70: 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28  te3_blob_reopen(
6f80: 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a  pBlob, iRowid);.
6f90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
6fa0: 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20  >pReader==0 );. 
6fb0: 20 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20       p->pReader 
6fc0: 3d 20 70 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69  = pBlob;.      i
6fd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6fe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
6ff0: 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
7000: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7010: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  ( rc==SQLITE_ABO
7020: 52 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  RT ) rc = SQLITE
7030: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
7040: 2f 2a 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68  /* If the blob h
7050: 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20 79 65 74  andle is not yet
7060: 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20   open, open and 
7070: 73 65 65 6b 20 69 74 2e 20 4f 74 68 65 72 77 69  seek it. Otherwi
7080: 73 65 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74  se, use.    ** t
7090: 68 65 20 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29  he blob_reopen()
70a0: 20 41 50 49 20 74 6f 20 72 65 73 65 65 6b 20 74   API to reseek t
70b0: 68 65 20 65 78 69 73 74 69 6e 67 20 62 6c 6f 62  he existing blob
70c0: 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20   handle.  */.   
70d0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d   if( p->pReader=
70e0: 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  =0 && rc==SQLITE
70f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73  _OK ){.      Fts
7100: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
7110: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
7120: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7130: 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e  3_blob_open(pCon
7140: 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20  fig->db, .      
7150: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
7160: 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22  , p->zDataTbl, "
7170: 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20  block", iRowid, 
7180: 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20  0, &p->pReader. 
7190: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
71a0: 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
71b0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  of the sqlite3_b
71c0: 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  lob_open() or sq
71d0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
71e0: 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a  n() calls.    **
71f0: 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20   above returned 
7200: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65  SQLITE_ERROR, re
7210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7220: 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64  UPT_VTAB instead
7230: 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65  ..    ** All the
7240: 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66   reasons those f
7250: 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72  unctions might r
7260: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
7270: 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20  OR - missing.   
7280: 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69   ** table, missi
7290: 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62  ng row, non-blob
72a0: 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63  /text in block c
72b0: 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65  olumn - indicate
72c0: 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67   .    ** backing
72d0: 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f   store corruptio
72e0: 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  n.  */.    if( r
72f0: 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  c==SQLITE_ERROR 
7300: 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
7310: 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  UPT;..    if( rc
7320: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7330: 20 20 20 20 20 75 38 20 2a 61 4f 75 74 3b 20 20       u8 *aOut;  
7340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7350: 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61   /* Read blob da
7360: 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  ta into this buf
7370: 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  fer */.      int
7380: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
7390: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
73a0: 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69  Reader);.      i
73b0: 66 28 20 70 42 75 66 20 29 7b 0a 20 20 20 20 20  f( pBuf ){.     
73c0: 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
73d0: 6f 28 70 42 75 66 29 3b 0a 20 20 20 20 20 20 20  o(pBuf);.       
73e0: 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28   fts5BufferGrow(
73f0: 26 72 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  &rc, pBuf, nByte
7400: 29 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20  );.        aOut 
7410: 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 20 20 20  = pBuf->p;.     
7420: 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79     pBuf->n = nBy
7430: 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  te;.      }else{
7440: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70  .        int nSp
7450: 61 63 65 20 3d 20 6e 42 79 74 65 20 2b 20 46 54  ace = nByte + FT
7460: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
7470: 44 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 70 52  DING;.        pR
7480: 65 74 20 3d 20 28 46 74 73 35 44 61 74 61 2a 29  et = (Fts5Data*)
7490: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
74a0: 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63  cZero(&rc, nSpac
74b0: 65 2b 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  e+sizeof(Fts5Dat
74c0: 61 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  a));.        if(
74d0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
74e0: 20 20 20 70 52 65 74 2d 3e 6e 20 3d 20 6e 42 79     pRet->n = nBy
74f0: 74 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4f  te;.          aO
7500: 75 74 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28  ut = pRet->p = (
7510: 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20  u8*)&pRet[1];.  
7520: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52          pRet->nR
7530: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ef = 1;.        
7540: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
7550: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7560: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
7570: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
7580: 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72 2c  read(p->pReader,
7590: 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30 29   aOut, nByte, 0)
75a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
75b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
75c0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
75d0: 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29 3b  ite3_free(pRet);
75e0: 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
75f0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
7600: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b  .    p->rc = rc;
7610: 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b  .    p->nRead++;
7620: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
7630: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
7640: 74 72 69 65 76 65 20 61 20 72 65 63 6f 72 64 20  trieve a record 
7650: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
7660: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
7670: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
7680: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
7690: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c  d and an error l
76a0: 65 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46  eft in the .** F
76b0: 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  ts5Index object.
76c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 44  .*/.static Fts5D
76d0: 61 74 61 20 2a 66 74 73 35 44 61 74 61 52 65 61  ata *fts5DataRea
76e0: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
76f0: 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46  i64 iRowid){.  F
7700: 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20  ts5Data *pRet = 
7710: 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
7720: 66 66 65 72 28 70 2c 20 30 2c 20 69 52 6f 77 69  ffer(p, 0, iRowi
7730: 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  d);.  assert( (p
7740: 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21  Ret==0)==(p->rc!
7750: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20  =SQLITE_OK) );. 
7760: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
7770: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 72 65  ./*.** Read a re
7780: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  cord from the %_
7790: 64 61 74 61 20 74 61 62 6c 65 20 69 6e 74 6f 20  data table into 
77a0: 74 68 65 20 62 75 66 66 65 72 20 73 75 70 70 6c  the buffer suppl
77b0: 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73 65  ied as the.** se
77c0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
77d0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
77e0: 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
77f0: 72 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65  r is left in the
7800: 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63   Fts5Index objec
7810: 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f  t. If an.** erro
7820: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
7830: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
7840: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7850: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 0a 2a 2a  led, it is a .**
7860: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
7870: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 42  c void fts5DataB
7880: 75 66 66 65 72 28 46 74 73 35 49 6e 64 65 78 20  uffer(Fts5Index 
7890: 2a 70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  *p, Fts5Buffer *
78a0: 70 42 75 66 2c 20 69 36 34 20 69 52 6f 77 69 64  pBuf, i64 iRowid
78b0: 29 7b 0a 20 20 28 76 6f 69 64 29 66 74 73 35 44  ){.  (void)fts5D
78c0: 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28  ataReadOrBuffer(
78d0: 70 2c 20 70 42 75 66 2c 20 69 52 6f 77 69 64 29  p, pBuf, iRowid)
78e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
78f0: 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  se a reference t
7900: 6f 20 64 61 74 61 20 72 65 63 6f 72 64 20 72 65  o data record re
7910: 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72  turned by an ear
7920: 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  lier call to.** 
7930: 66 74 73 35 44 61 74 61 52 65 61 64 28 29 2e 0a  fts5DataRead()..
7940: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7950: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 46  ts5DataRelease(F
7960: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b  ts5Data *pData){
7970: 0a 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a  .  if( pData ){.
7980: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 61 74      assert( pDat
7990: 61 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  a->nRef>0 );.   
79a0: 20 70 44 61 74 61 2d 3e 6e 52 65 66 2d 2d 3b 0a   pData->nRef--;.
79b0: 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 6e      if( pData->n
79c0: 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  Ref==0 ) sqlite3
79d0: 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20  _free(pData);.  
79e0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
79f0: 20 66 74 73 35 44 61 74 61 52 65 66 65 72 65 6e   fts5DataReferen
7a00: 63 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61  ce(Fts5Data *pDa
7a10: 74 61 29 7b 0a 20 20 70 44 61 74 61 2d 3e 6e 52  ta){.  pData->nR
7a20: 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ef++;.}../*.** I
7a30: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
7a40: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
7a50: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
7a60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7a70: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74  fts5DataWrite(Ft
7a80: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
7a90: 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38  iRowid, const u8
7aa0: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
7ab0: 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ta){.  if( p->rc
7ac0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
7ad0: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  turn;..  if( p->
7ae0: 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20  pWriter==0 ){.  
7af0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74    int rc;.    Ft
7b00: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
7b10: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
7b20: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
7b30: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
7b40: 28 0a 20 20 20 20 20 20 20 20 22 52 45 50 4c 41  (.        "REPLA
7b50: 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 25 51 28  CE INTO '%q'.%Q(
7b60: 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45  id, block) VALUE
7b70: 53 28 3f 2c 3f 29 22 2c 20 70 43 6f 6e 66 69 67  S(?,?)", pConfig
7b80: 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54  ->zDb, p->zDataT
7b90: 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  bl.    );.    if
7ba0: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
7bb0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7bc0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
7bd0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7be0: 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
7bf0: 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c  Config->db, zSql
7c00: 2c 20 2d 31 2c 20 26 70 2d 3e 70 57 72 69 74 65  , -1, &p->pWrite
7c10: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
7c20: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
7c30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
7c40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7c50: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
7c60: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
7c70: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c      }.  }..  sql
7c80: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
7c90: 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69  p->pWriter, 1, i
7ca0: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
7cb0: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
7cc0: 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61  Writer, 2, pData
7cd0: 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , nData, SQLITE_
7ce0: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
7cf0: 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74  e3_step(p->pWrit
7d00: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
7d10: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
7d20: 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  pWriter);.}../*.
7d30: 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 66  ** Execute the f
7d40: 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a  ollowing SQL:.**
7d50: 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 46  .**     DELETE F
7d60: 52 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52 45  ROM %_data WHERE
7d70: 20 69 64 20 42 45 54 57 45 45 4e 20 24 69 46 69   id BETWEEN $iFi
7d80: 72 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a  rst AND $iLast.*
7d90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
7da0: 73 35 44 61 74 61 44 65 6c 65 74 65 28 46 74 73  s5DataDelete(Fts
7db0: 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
7dc0: 46 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73 74  First, i64 iLast
7dd0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  ){.  if( p->rc!=
7de0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7df0: 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44  rn;..  if( p->pD
7e00: 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  eleter==0 ){.   
7e10: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73   int rc;.    Fts
7e20: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
7e30: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
7e40: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
7e50: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
7e60: 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
7e70: 20 46 52 4f 4d 20 27 25 71 27 2e 25 51 20 57 48   FROM '%q'.%Q WH
7e80: 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64  ERE id>=? AND id
7e90: 3c 3d 3f 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  <=?", pConfig->z
7ea0: 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 0a  Db, p->zDataTbl.
7eb0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a      );.    if( z
7ec0: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
7ed0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7ee0: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
7ef0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7f00: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e  _prepare_v2(pCon
7f10: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
7f20: 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c  1, &p->pDeleter,
7f30: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
7f40: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
7f50: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
7f60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7f70: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
7f80: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
7f90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
7fa0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d  e3_bind_int64(p-
7fb0: 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46  >pDeleter, 1, iF
7fc0: 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  irst);.  sqlite3
7fd0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
7fe0: 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73  Deleter, 2, iLas
7ff0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  t);.  sqlite3_st
8000: 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ep(p->pDeleter);
8010: 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
8020: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c  e3_reset(p->pDel
8030: 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eter);.}../*.** 
8040: 43 6c 6f 73 65 20 74 68 65 20 73 71 6c 69 74 65  Close the sqlite
8050: 33 5f 62 6c 6f 62 20 68 61 6e 64 6c 65 20 75 73  3_blob handle us
8060: 65 64 20 74 6f 20 72 65 61 64 20 72 65 63 6f 72  ed to read recor
8070: 64 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  ds from the %_da
8080: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 41 6e 64  ta table..** And
8090: 20 64 69 73 63 61 72 64 20 61 6e 79 20 63 61 63   discard any cac
80a0: 68 65 64 20 72 65 61 64 73 2e 20 54 68 69 73 20  hed reads. This 
80b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
80c0: 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
80d0: 0a 2a 2a 20 61 20 72 65 61 64 20 74 72 61 6e 73  .** a read trans
80e0: 61 63 74 69 6f 6e 20 6f 72 20 77 68 65 6e 20 61  action or when a
80f0: 6e 79 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  ny sub-transacti
8100: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
8110: 6b 2e 0a 2a 2f 0a 23 69 66 20 30 0a 73 74 61 74  k..*/.#if 0.stat
8120: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
8130: 52 65 73 65 74 28 46 74 73 35 49 6e 64 65 78 20  Reset(Fts5Index 
8140: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52  *p){.  if( p->pR
8150: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  eader ){.    sql
8160: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
8170: 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20  p->pReader);.   
8180: 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b   p->pReader = 0;
8190: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
81a0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
81b0: 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74  records associat
81c0: 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20  ed with segment 
81d0: 69 53 65 67 69 64 20 69 6e 20 69 6e 64 65 78 20  iSegid in index 
81e0: 69 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iIdx..*/.static 
81f0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6d  void fts5DataRem
8200: 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49  oveSegment(Fts5I
8210: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64  ndex *p, int iId
8220: 78 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b 0a  x, int iSegid){.
8230: 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 46    i64 iFirst = F
8240: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
8250: 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
8260: 30 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61  0, 0);.  i64 iLa
8270: 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  st = FTS5_SEGMEN
8280: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53  T_ROWID(iIdx, iS
8290: 65 67 69 64 2b 31 2c 20 30 2c 20 30 29 2d 31 3b  egid+1, 0, 0)-1;
82a0: 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  .  fts5DataDelet
82b0: 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61  e(p, iFirst, iLa
82c0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
82d0: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
82e0: 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75  e to an Fts5Stru
82f0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74  cture object ret
8300: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
8310: 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ier .** call to 
8320: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
8330: 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75 63  d() or fts5Struc
8340: 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f  tureDecode()..*/
8350: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8360: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
8370: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e(Fts5Structure 
8380: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28  *pStruct){.  if(
8390: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
83a0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
83b0: 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e  =0; i<pStruct->n
83c0: 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
83d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
83e0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
83f0: 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d 0a  i].aSeg);.    }.
8400: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8410: 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 7d  (pStruct);.  }.}
8420: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
8430: 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ize and return t
8440: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 63  he structure rec
8450: 6f 72 64 20 63 75 72 72 65 6e 74 6c 79 20 73 74  ord currently st
8460: 6f 72 65 64 20 69 6e 20 73 65 72 69 61 6c 69 7a  ored in serializ
8470: 65 64 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69  ed.** form withi
8480: 6e 20 62 75 66 66 65 72 20 70 44 61 74 61 2f 6e  n buffer pData/n
8490: 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Data..**.** The 
84a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c  Fts5Structure.aL
84b0: 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20  evel[] and each 
84c0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
84d0: 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a  el.aSeg[] array.
84e0: 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f  ** are over-allo
84f0: 63 61 74 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f  cated by one slo
8500: 74 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  t. This allows t
8510: 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  he structure con
8520: 74 65 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d  tents.** to be m
8530: 6f 72 65 20 65 61 73 69 6c 79 20 65 64 69 74 65  ore easily edite
8540: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
8550: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70  rror occurs, *pp
8560: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55  Out is set to NU
8570: 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65  LL and an SQLite
8580: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72   error code.** r
8590: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
85a0: 73 65 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65  se, *ppOut is se
85b0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
85c0: 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64  e new object and
85d0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
85e0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
85f0: 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74  c int fts5Struct
8600: 75 72 65 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e  ureDecode(.  con
8610: 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 20 20  st u8 *pData,   
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8630: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
8640: 67 20 73 65 72 69 61 6c 69 7a 65 64 20 73 74 72  g serialized str
8650: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
8660: 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  nData,          
8670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8680: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 44  ize of buffer pD
8690: 61 74 61 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ata in bytes */.
86a0: 20 20 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c    int *piCookie,
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
86d0: 6f 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  on cookie value 
86e0: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
86f0: 72 65 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  re **ppOut      
8700: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73       /* OUT: Des
8710: 65 72 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74  erialized object
8720: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
8730: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
8740: 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
8750: 69 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76  iLvl;.  int nLev
8760: 65 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53  el = 0;.  int nS
8770: 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  egment = 0;.  in
8780: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
87a0: 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
87b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 74 20 70  to allocate at p
87c0: 52 65 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  Ret */.  Fts5Str
87d0: 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30  ucture *pRet = 0
87e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75  ;        /* Stru
87f0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 74 6f 20  cture object to 
8800: 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  return */..  /* 
8810: 47 72 61 62 20 74 68 65 20 63 6f 6f 6b 69 65 20  Grab the cookie 
8820: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 70  value */.  if( p
8830: 69 43 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f  iCookie ) *piCoo
8840: 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73  kie = sqlite3Fts
8850: 35 47 65 74 33 32 28 70 44 61 74 61 29 3b 0a 20  5Get32(pData);. 
8860: 20 69 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65   i = 4;..  /* Re
8870: 61 64 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  ad the total num
8880: 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e  ber of levels an
8890: 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  d segments from 
88a0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
88b0: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20  .  ** structure 
88c0: 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20  record.  */.  i 
88d0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
88e0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c  32(&pData[i], nL
88f0: 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74  evel);.  i += ft
8900: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8910: 44 61 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e  Data[i], nSegmen
8920: 74 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a  t);.  nByte = (.
8930: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
8940: 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20  5Structure) +   
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75   /* Main structu
8970: 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  re */.      size
8980: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
8990: 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c  Level) * (nLevel
89a0: 29 20 20 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c  )      /* aLevel
89b0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b  [] array */.  );
89c0: 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 53  .  pRet = (Fts5S
89d0: 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65  tructure*)sqlite
89e0: 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
89f0: 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  &rc, nByte);..  
8a00: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
8a10: 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e  pRet->nLevel = n
8a20: 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52 65 74 2d  Level;.    pRet-
8a30: 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53 65 67  >nSegment = nSeg
8a40: 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d 20 73  ment;.    i += s
8a50: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
8a60: 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74  &pData[i], &pRet
8a70: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
8a80: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  ;..    for(iLvl=
8a90: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
8aa0: 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b   && iLvl<nLevel;
8ab0: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
8ac0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
8ad0: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74  el *pLvl = &pRet
8ae0: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
8af0: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c        int nTotal
8b00: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
8b10: 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  ;..      i += ft
8b20: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8b30: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
8b40: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20  Merge);.      i 
8b50: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
8b60: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
8b70: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  otal);.      ass
8b80: 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76  ert( nTotal>=pLv
8b90: 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20  l->nMerge );.   
8ba0: 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
8bb0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
8bc0: 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
8bd0: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
8be0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f  , .          nTo
8bf0: 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  tal * sizeof(Fts
8c00: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
8c10: 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  t).      );..   
8c20: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8c30: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
8c40: 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f  pLvl->nSeg = nTo
8c50: 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  tal;.        for
8c60: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54  (iSeg=0; iSeg<nT
8c70: 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  otal; iSeg++){. 
8c80: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
8c90: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8ca0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
8cb0: 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
8cc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
8cd0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
8ce0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
8cf0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48  l->aSeg[iSeg].nH
8d00: 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  eight);.        
8d10: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
8d20: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
8d30: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
8d40: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
8d50: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
8d60: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8d70: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
8d80: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61  Seg[iSeg].pgnoLa
8d90: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
8da0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8db0: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
8dc0: 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a  eRelease(pRet);.
8dd0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
8de0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8df0: 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20    }..  *ppOut = 
8e00: 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  pRet;.  return r
8e10: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  c;.}../*.**.*/.s
8e20: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
8e30: 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
8e40: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53  (int *pRc, Fts5S
8e50: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
8e60: 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  uct){.  if( *pRc
8e70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8e80: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
8e90: 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
8ea0: 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e  truct;.    int n
8eb0: 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
8ec0: 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74  >nLevel;.    int
8ed0: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
8ee0: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
8ef0: 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20  ructure) +      
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8f10: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
8f20: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
8f30: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
8f40: 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29  el) * (nLevel+1)
8f50: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
8f60: 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20  ray */.    );.. 
8f70: 20 20 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c     pStruct = sql
8f80: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74  ite3_realloc(pSt
8f90: 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ruct, nByte);.  
8fa0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
8fb0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
8fc0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e  Struct->aLevel[n
8fd0: 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f  Level], 0, sizeo
8fe0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
8ff0: 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53  evel));.      pS
9000: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b  truct->nLevel++;
9010: 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74  .      *ppStruct
9020: 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20   = pStruct;.    
9030: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
9040: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
9050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9060: 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65  *.** Extend leve
9070: 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74  l iLvl so that t
9080: 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
9090: 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61   at least nExtra
90a0: 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74   more.** segment
90b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
90c0: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45  d fts5StructureE
90d0: 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e  xtendLevel(.  in
90e0: 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53  t *pRc, .  Fts5S
90f0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
9100: 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  t, .  int iLvl, 
9110: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a  .  int nExtra, .
9120: 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b    int bInsert.){
9130: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
9140: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
9150: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9160: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
9170: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
9180: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
9190: 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b  reSegment *aNew;
91a0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  .    int nByte;.
91b0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 70 4c  .    nByte = (pL
91c0: 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72  vl->nSeg + nExtr
91d0: 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  a) * sizeof(Fts5
91e0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
91f0: 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  );.    aNew = sq
9200: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c  lite3_realloc(pL
9210: 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65 29  vl->aSeg, nByte)
9220: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 20 29  ;.    if( aNew )
9230: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 73  {.      if( bIns
9240: 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ert==0 ){.      
9250: 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70    memset(&aNew[p
9260: 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73  Lvl->nSeg], 0, s
9270: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
9280: 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45  ureSegment) * nE
9290: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtra);.      }el
92a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
92b0: 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nMove = pLvl->nS
92c0: 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  eg * sizeof(Fts5
92d0: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
92e0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
92f0: 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d  ve(&aNew[nExtra]
9300: 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a  , aNew, nMove);.
9310: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
9320: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  New, 0, sizeof(F
9330: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
9340: 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a  ent) * nExtra);.
9350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
9360: 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b  vl->aSeg = aNew;
9370: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9380: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
9390: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
93a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20  .}../*.** Read, 
93b0: 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  deserialize and 
93c0: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
93d0: 74 75 72 65 20 72 65 63 6f 72 64 20 66 6f 72 20  ture record for 
93e0: 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2a 0a 2a  index iIdx..**.*
93f0: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
9400: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
9410: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
9420: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
9430: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
9440: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 64  r-allocated as d
9450: 65 73 63 72 69 62 65 64 20 66 6f 72 20 66 75 6e  escribed for fun
9460: 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63 74  ction fts5Struct
9470: 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20  ureDecode() .** 
9480: 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  above..**.** If 
9490: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
94a0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
94b0: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  d and an error c
94c0: 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a  ode left in the.
94d0: 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ** Fts5Index han
94e0: 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  dle. If an error
94f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
9500: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
9510: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
9520: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
9530: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
9540: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66  Fts5Structure *f
9550: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
9560: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
9570: 6e 74 20 69 49 64 78 29 7b 0a 20 20 46 74 73 35  nt iIdx){.  Fts5
9580: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
9590: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
95a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
95b0: 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ret = 0;        
95c0: 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72 65 74  /* Object to ret
95d0: 75 72 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  urn */.  Fts5Dat
95e0: 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  a *pData;       
95f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 25 5f 64 61           /* %_da
9600: 74 61 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e  ta entry contain
9610: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65  ing structure re
9620: 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43  cord */.  int iC
9630: 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20  ookie;          
9640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
9650: 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69  figuration cooki
9660: 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
9670: 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
9680: 50 72 65 66 69 78 20 29 3b 0a 20 20 70 44 61 74  Prefix );.  pDat
9690: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
96a0: 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  (p, FTS5_STRUCTU
96b0: 52 45 5f 52 4f 57 49 44 28 69 49 64 78 29 29 3b  RE_ROWID(iIdx));
96c0: 0a 20 20 69 66 28 20 21 70 44 61 74 61 20 29 20  .  if( !pData ) 
96d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 72  return 0;.  p->r
96e0: 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  c = fts5Structur
96f0: 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70  eDecode(pData->p
9700: 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26 69 43 6f  , pData->n, &iCo
9710: 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a 0a 20  okie, &pRet);.. 
9720: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9730: 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67  TE_OK && pConfig
9740: 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b  ->iCookie!=iCook
9750: 69 65 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ie ){.    p->rc 
9760: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e  = sqlite3Fts5Con
9770: 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c  figLoad(pConfig,
9780: 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 0a   iCookie);.  }..
9790: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
97a0: 65 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20  e(pData);.  if( 
97b0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
97c0: 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75   ){.    fts5Stru
97d0: 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65  ctureRelease(pRe
97e0: 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  t);.    pRet = 0
97f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
9800: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
9810: 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
9820: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
9830: 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63  s in index struc
9840: 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
9850: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
9860: 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64  s only ever used
9870: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
9880: 72 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e  rt() conditions.
9890: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
98a0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
98b0: 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65  nt fts5Structure
98c0: 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74  CountSegments(Ft
98d0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
98e0: 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65  ruct){.  int nSe
98f0: 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  gment = 0;      
9900: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
9910: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
9920: 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53  ents */.  if( pS
9930: 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74  truct ){.    int
9940: 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20   iLvl;          
9950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
9960: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
9970: 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
9980: 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
9990: 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
99a0: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
99b0: 20 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d       nSegment +=
99c0: 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
99d0: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20  [iLvl].nSeg;.   
99e0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
99f0: 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e   nSegment;.}.#en
9a00: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61  dif../*.** Seria
9a10: 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74  lize and store t
9a20: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
9a30: 65 63 6f 72 64 20 66 6f 72 20 69 6e 64 65 78 20  ecord for index 
9a40: 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iIdx..**.** If a
9a50: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
9a60: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
9a70: 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49  ode in the Fts5I
9a80: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20  ndex object. If 
9a90: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20  an.** error has 
9aa0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
9ab0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
9ac0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
9ad0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
9ae0: 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74  tructureWrite(Ft
9af0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
9b00: 69 49 64 78 2c 20 46 74 73 35 53 74 72 75 63 74  iIdx, Fts5Struct
9b10: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
9b20: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9b30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
9b40: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
9b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
9b60: 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a  ffer to serializ
9b70: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f  e record into */
9b80: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
9b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ba0: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
9bb0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
9bc0: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  vels */.    int 
9bd0: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
9be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f            /* Coo
9bf0: 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f  kie value to sto
9c00: 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  re */..    asser
9c10: 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
9c20: 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
9c30: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
9c40: 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
9c50: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
9c60: 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
9c70: 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  er));..    /* Ap
9c80: 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  pend the current
9c90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
9ca0: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f  ookie */.    iCo
9cb0: 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  okie = p->pConfi
9cc0: 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20  g->iCookie;.    
9cd0: 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20  if( iCookie<0 ) 
9ce0: 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 20  iCookie = 0;.   
9cf0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
9d00: 64 33 32 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  d32(&p->rc, &buf
9d10: 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20 20  , iCookie);..   
9d20: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
9d30: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
9d40: 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e  &buf, pStruct->n
9d50: 4c 65 76 65 6c 29 3b 0a 20 20 20 20 66 74 73 35  Level);.    fts5
9d60: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9d70: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9d80: 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
9d90: 6e 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  nt);.    fts5Buf
9da0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
9db0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69  &p->rc, &buf, (i
9dc0: 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69  64)pStruct->nWri
9dd0: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  teCounter);..   
9de0: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
9df0: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
9e00: 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
9e10: 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e30: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
9e40: 74 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65  te through segme
9e50: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  nts */.      Fts
9e60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9e70: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
9e80: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
9e90: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9ea0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9eb0: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9ec0: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
9ed0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
9ee0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
9ef0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29  buf, pLvl->nSeg)
9f00: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9f10: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
9f20: 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20  vl->nSeg );..   
9f30: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
9f40: 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20  Seg<pLvl->nSeg; 
9f50: 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
9f60: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
9f70: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
9f80: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
9f90: 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a  [iSeg].iSegid);.
9fa0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
9fb0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
9fc0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
9fd0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48  l->aSeg[iSeg].nH
9fe0: 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  eight);.        
9ff0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
a000: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
a010: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
a020: 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29  iSeg].pgnoFirst)
a030: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
a040: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
a050: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
a060: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
a070: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20  pgnoLast);.     
a080: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74   }.    }..    ft
a090: 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
a0a0: 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
a0b0: 57 49 44 28 69 49 64 78 29 2c 20 62 75 66 2e 70  WID(iIdx), buf.p
a0c0: 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74  , buf.n);.    ft
a0d0: 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
a0e0: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30  f);.  }.}..#if 0
a0f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
a100: 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
a110: 69 6e 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a  int*,Fts5Buffer*
a120: 2c 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  ,Fts5Structure*)
a130: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ;.static void ft
a140: 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65  s5PrintStructure
a150: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61  (const char *zCa
a160: 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63  ption, Fts5Struc
a170: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
a180: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a190: 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66  E_OK;.  Fts5Buff
a1a0: 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74  er buf;.  memset
a1b0: 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  (&buf, 0, sizeof
a1c0: 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65  (buf));.  fts5De
a1d0: 62 75 67 53 74 72 75 63 74 75 72 65 28 26 72 63  bugStructure(&rc
a1e0: 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 29  , &buf, pStruct)
a1f0: 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f  ;.  fprintf(stdo
a200: 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20  ut, "%s: %s\n", 
a210: 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29  zCaption, buf.p)
a220: 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75  ;.  fflush(stdou
a230: 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  t);.  fts5Buffer
a240: 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65  Free(&buf);.}.#e
a250: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
a260: 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28  5PrintStructure(
a270: 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61  x,y).#endif..sta
a280: 74 69 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d  tic int fts5Segm
a290: 65 6e 74 53 69 7a 65 28 46 74 73 35 53 74 72 75  entSize(Fts5Stru
a2a0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
a2b0: 65 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20  eg){.  return 1 
a2c0: 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  + pSeg->pgnoLast
a2d0: 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   - pSeg->pgnoFir
a2e0: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  st;.}../*.** Ret
a2f0: 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e  urn a copy of in
a300: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53  dex structure pS
a310: 74 72 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70  truct. Except, p
a320: 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a  romote as many .
a330: 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70  ** segments as p
a340: 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c  ossible to level
a350: 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e   iPromote. If an
a360: 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c   OOM occurs, NUL
a370: 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  L is .** returne
a380: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
a390: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50  d fts5StructureP
a3a0: 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35  romoteTo(.  Fts5
a3b0: 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20  Index *p,.  int 
a3c0: 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20  iPromote,.  int 
a3d0: 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73  szPromote,.  Fts
a3e0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
a3f0: 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c  uct.){.  int il,
a400: 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63   is;.  Fts5Struc
a410: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20  tureLevel *pOut 
a420: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
a430: 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20  el[iPromote];.. 
a440: 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67   if( pOut->nMerg
a450: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  e==0 ){.    for(
a460: 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69  il=iPromote+1; i
a470: 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
a480: 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  l; il++){.      
a490: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
a4a0: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
a4b0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b  uct->aLevel[il];
a4c0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
a4d0: 3e 6e 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e  >nMerge ) return
a4e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70  ;.      for(is=p
a4f0: 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e  Lvl->nSeg-1; is>
a500: 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20  =0; is--){.     
a510: 20 20 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35     int sz = fts5
a520: 53 65 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76  SegmentSize(&pLv
a530: 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20  l->aSeg[is]);.  
a540: 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50        if( sz>szP
a550: 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b  romote ) return;
a560: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72  .        fts5Str
a570: 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
a580: 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
a590: 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20  t, iPromote, 1, 
a5a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
a5b0: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
a5c0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
a5d0: 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c  Out->aSeg, &pLvl
a5e0: 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65  ->aSeg[is], size
a5f0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
a600: 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20  Segment));.     
a610: 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b     pOut->nSeg++;
a620: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e  .        pLvl->n
a630: 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  Seg--;.      }. 
a640: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a650: 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  * A new segment 
a660: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72  has just been wr
a670: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69  itten to level i
a680: 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72  Lvl of index str
a690: 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63  ucture.** pStruc
a6a0: 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
a6b0: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
a6c0: 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75  ny segments shou
a6d0: 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a  ld be promoted.*
a6e0: 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53  * as a result. S
a6f0: 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d  egments are prom
a700: 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e  oted in two scen
a710: 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
a720: 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74  ) If the segment
a730: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73   just written is
a740: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e   smaller than on
a750: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
a760: 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69  ts.**      withi
a770: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  n the previous p
a780: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20  opulated level, 
a790: 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74  it is promoted t
a7a0: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  o the previous.*
a7b0: 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64  *      populated
a7c0: 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20   level..**.**   
a7d0: 62 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e  b) If the segmen
a7e0: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69  t just written i
a7f0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
a800: 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74  e newest segment
a810: 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20   on.**      the 
a820: 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c  next populated l
a830: 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20  evel, then that 
a840: 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79  segment, and any
a850: 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a   other adjacent.
a860: 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73  **      segments
a870: 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
a880: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
a890: 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  one just written
a8a0: 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70  , are .**      p
a8b0: 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  romoted. .**.** 
a8c0: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  If one or more s
a8d0: 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d  egments are prom
a8e0: 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75 63 74  oted, the struct
a8f0: 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70  ure object is up
a900: 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c  dated.** to refl
a910: 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ect this..*/.sta
a920: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
a930: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20  ucturePromote(. 
a940: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a960: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
a970: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
a980: 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9a0: 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74  Index level just
a9b0: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74   updated */.  Ft
a9c0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
a9d0: 72 75 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a  ruct          /*
a9e0: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
a9f0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
aa00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
aa10: 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20  .    int iTst;. 
aa20: 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20     int iPromote 
aa30: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a  = -1;.    int sz
aa40: 50 72 6f 6d 6f 74 65 3b 20 20 20 20 20 20 20 20  Promote;        
aa50: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f          /* Promo
aa60: 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73  te anything this
aa70: 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72   size or smaller
aa80: 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75   */.    Fts5Stru
aa90: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
aaa0: 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74  eg;   /* Segment
aab0: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
aac0: 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20  .    int szSeg; 
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65     /* Size of se
aaf0: 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74  gment just writt
ab00: 65 6e 20 2a 2f 0a 0a 0a 20 20 20 20 70 53 65 67  en */...    pSeg
ab10: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
ab20: 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70  vel[iLvl].aSeg[p
ab30: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
ab40: 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20  Lvl].nSeg-1];.  
ab50: 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70    szSeg = (1 + p
ab60: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
ab70: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29  pSeg->pgnoFirst)
ab80: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
ab90: 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61  for condition (a
aba0: 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73  ) */.    for(iTs
abb0: 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d  t=iLvl-1; iTst>=
abc0: 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  0 && pStruct->aL
abd0: 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d  evel[iTst].nSeg=
abe0: 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20  =0; iTst--);.   
abf0: 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a   if( iTst>=0 ){.
ac00: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
ac10: 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30     int szMax = 0
ac20: 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  ;.      Fts5Stru
ac30: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74  ctureLevel *pTst
ac40: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
ac50: 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20  vel[iTst];.     
ac60: 20 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e   assert( pTst->n
ac70: 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Merge==0 );.    
ac80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73    for(i=0; i<pTs
ac90: 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  t->nSeg; i++){. 
aca0: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
acb0: 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67  pTst->aSeg[i].pg
acc0: 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61  noLast - pTst->a
acd0: 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74  Seg[i].pgnoFirst
ace0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   + 1;.        if
acf0: 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d  ( sz>szMax ) szM
ad00: 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d  ax = sz;.      }
ad10: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78  .      if( szMax
ad20: 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20  >=szSeg ){.     
ad30: 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20     /* Condition 
ad40: 28 61 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f  (a) is true. Pro
ad50: 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74 20  mote the newest 
ad60: 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c  segment on level
ad70: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76   .        ** iLv
ad80: 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e  l to level iTst.
ad90: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72    */.        iPr
ada0: 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20  omote = iTst;.  
adb0: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
adc0: 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d  = szMax;.      }
add0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
ade0: 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  f condition (a) 
adf0: 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75  is not met, assu
ae00: 6d 65 20 28 62 29 20 69 73 20 74 72 75 65 2e 20  me (b) is true. 
ae10: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
ae20: 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61  To().    ** is a
ae30: 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20   no-op if it is 
ae40: 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  not.  */.    if(
ae50: 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20   iPromote<0 ){. 
ae60: 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20       iPromote = 
ae70: 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72  iLvl;.      szPr
ae80: 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20  omote = szSeg;. 
ae90: 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
aea0: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
aeb0: 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50  p, iPromote, szP
aec0: 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29  romote, pStruct)
aed0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
aee0: 49 66 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f  If the pIter->iO
aef0: 66 66 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e  ff offset curren
af00: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  tly points to an
af10: 20 65 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e   entry indicatin
af20: 67 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65  g one.** or more
af30: 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73   term-less nodes
af40: 2c 20 61 64 76 61 6e 63 65 20 70 61 73 74 20 69  , advance past i
af50: 74 20 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d  t and set pIter-
af60: 3e 6e 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68  >nEmpty to.** th
af70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74  e number of empt
af80: 79 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a  y child nodes..*
af90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
afa0: 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65  s5NodeIterGobble
afb0: 4e 45 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49  NEmpty(Fts5NodeI
afc0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
afd0: 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70  f( pIter->iOff<p
afe0: 49 74 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30  Iter->nData && 0
aff0: 3d 3d 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  ==(pIter->aData[
b000: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30  pIter->iOff] & 0
b010: 78 66 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65  xfe) ){.    pIte
b020: 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65  r->bDlidx = pIte
b030: 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e  r->aData[pIter->
b040: 69 4f 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20  iOff] & 0x01;.  
b050: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b    pIter->iOff++;
b060: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
b070: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
b080: 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74  t32(&pIter->aDat
b090: 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20  a[pIter->iOff], 
b0a0: 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a  pIter->nEmpty);.
b0b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
b0c0: 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a  er->nEmpty = 0;.
b0d0: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64      pIter->bDlid
b0e0: 78 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  x = 0;.  }.}../*
b0f0: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74  .** Advance to t
b100: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 77 69  he next entry wi
b110: 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 2e 0a 2a  thin the node..*
b120: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
b130: 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 69  s5NodeIterNext(i
b140: 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 4e 6f 64  nt *pRc, Fts5Nod
b150: 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  eIter *pIter){. 
b160: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66   if( pIter->iOff
b170: 3e 3d 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 29  >=pIter->nData )
b180: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 44 61  {.    pIter->aDa
b190: 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65  ta = 0;.    pIte
b1a0: 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 70 49 74  r->iChild += pIt
b1b0: 65 72 2d 3e 6e 45 6d 70 74 79 3b 0a 20 20 7d 65  er->nEmpty;.  }e
b1c0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 50 72  lse{.    int nPr
b1d0: 65 2c 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74  e, nNew;.    pIt
b1e0: 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  er->iOff += fts5
b1f0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
b200: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
b210: 3e 69 4f 66 66 5d 2c 20 6e 50 72 65 29 3b 0a 20  >iOff], nPre);. 
b220: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
b230: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
b240: 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  2(&pIter->aData[
b250: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 4e  pIter->iOff], nN
b260: 65 77 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ew);.    pIter->
b270: 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d 32 3b  term.n = nPre-2;
b280: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
b290: 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 26  ppendBlob(pRc, &
b2a0: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65  pIter->term, nNe
b2b0: 77 2c 20 70 49 74 65 72 2d 3e 61 44 61 74 61 2b  w, pIter->aData+
b2c0: 70 49 74 65 72 2d 3e 69 4f 66 66 29 3b 0a 20 20  pIter->iOff);.  
b2d0: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
b2e0: 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72   nNew;.    pIter
b2f0: 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 28 31 20 2b  ->iChild += (1 +
b300: 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b   pIter->nEmpty);
b310: 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
b320: 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49  rGobbleNEmpty(pI
b330: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  ter);.    if( *p
b340: 52 63 20 29 20 70 49 74 65 72 2d 3e 61 44 61 74  Rc ) pIter->aDat
b350: 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  a = 0;.  }.}.../
b360: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b370: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
b380: 65 63 74 20 70 49 74 65 72 20 74 6f 20 69 74 65  ect pIter to ite
b390: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
b3a0: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73 65 67   internal.** seg
b3b0: 6d 65 6e 74 20 6e 6f 64 65 20 69 6e 20 70 44 61  ment node in pDa
b3c0: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
b3d0: 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49  id fts5NodeIterI
b3e0: 6e 69 74 28 63 6f 6e 73 74 20 75 38 20 2a 61 44  nit(const u8 *aD
b3f0: 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20  ata, int nData, 
b400: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49  Fts5NodeIter *pI
b410: 74 65 72 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  ter){.  memset(p
b420: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
b430: 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
b440: 72 2d 3e 61 44 61 74 61 20 3d 20 61 44 61 74 61  r->aData = aData
b450: 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 44 61 74 61  ;.  pIter->nData
b460: 20 3d 20 6e 44 61 74 61 3b 0a 20 20 70 49 74 65   = nData;.  pIte
b470: 72 2d 3e 69 4f 66 66 20 3d 20 66 74 73 35 47 65  r->iOff = fts5Ge
b480: 74 56 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c  tVarint32(aData,
b490: 20 70 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b   pIter->iChild);
b4a0: 0a 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47  .  fts5NodeIterG
b4b0: 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65  obbleNEmpty(pIte
b4c0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
b4d0: 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c  e any memory all
b4e0: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  ocated by the it
b4f0: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  erator object..*
b500: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
b510: 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46  s5NodeIterFree(F
b520: 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74  ts5NodeIter *pIt
b530: 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  er){.  fts5Buffe
b540: 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65  rFree(&pIter->te
b550: 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  rm);.}../*.** Th
b560: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
b570: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
b580: 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20  rgument has the 
b590: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
b5a0: 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f   set.** as follo
b5b0: 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ws. This functio
b5c0: 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72 65  n sets up the re
b5d0: 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  st of the iterat
b5e0: 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  or so that it.**
b5f0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
b600: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
b610: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  e doclist-index.
b620: 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 20  .**.**   pData: 
b630: 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69  pointer to docli
b640: 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  st-index record,
b650: 20 0a 2a 2a 20 20 20 69 4c 65 61 66 50 67 6e 6f   .**   iLeafPgno
b660: 3a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  : page number th
b670: 61 74 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2d  at this doclist-
b680: 69 6e 64 65 78 20 69 73 20 61 73 73 6f 63 69 61  index is associa
b690: 74 65 64 20 77 69 74 68 2e 0a 2a 2a 0a 2a 2a 20  ted with..**.** 
b6a0: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
b6b0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74  on is called pIt
b6c0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73  er->iLeafPgno is
b6d0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
b6e0: 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20   the.** doclist 
b6f0: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
b700: 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74  th (the one feat
b710: 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e  uring the term).
b720: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
b730: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
b740: 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t(Fts5DlidxIter 
b750: 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44  *pIter){.  Fts5D
b760: 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70 49 74  ata *pData = pIt
b770: 65 72 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e 74  er->pData;.  int
b780: 20 69 3b 0a 20 20 69 6e 74 20 62 50 72 65 73 65   i;.  int bPrese
b790: 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  nt;..  assert( p
b7a0: 49 74 65 72 2d 3e 70 44 61 74 61 20 29 3b 0a 20  Iter->pData );. 
b7b0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
b7c0: 69 4c 65 61 66 50 67 6e 6f 3e 30 20 29 3b 0a 0a  iLeafPgno>0 );..
b7d0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
b7e0: 72 73 74 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  rst rowid value.
b7f0: 20 41 6e 64 20 74 68 65 20 22 70 72 65 73 65 6e   And the "presen
b800: 74 22 20 66 6c 61 67 20 74 68 61 74 20 66 6f 6c  t" flag that fol
b810: 6c 6f 77 73 20 69 74 2e 20 2a 2f 0a 20 20 70 49  lows it. */.  pI
b820: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74  ter->iOff += get
b830: 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
b840: 5b 30 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  [0], (u64*)&pIte
b850: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 62 50  r->iRowid);.  bP
b860: 72 65 73 65 6e 74 20 3d 20 70 44 61 74 61 2d 3e  resent = pData->
b870: 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 5d  p[pIter->iOff++]
b880: 3b 0a 20 20 69 66 28 20 62 50 72 65 73 65 6e 74  ;.  if( bPresent
b890: 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20   ){.    i = 0;. 
b8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
b8b0: 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
b8c0: 6f 66 20 6c 65 61 64 69 6e 67 20 30 78 30 30 20  of leading 0x00 
b8d0: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 66 6f  bytes. */.    fo
b8e0: 72 28 69 3d 31 3b 20 70 49 74 65 72 2d 3e 69 4f  r(i=1; pIter->iO
b8f0: 66 66 3c 70 44 61 74 61 2d 3e 6e 3b 20 69 2b 2b  ff<pData->n; i++
b900: 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 70 44  ){ .      if( pD
b910: 61 74 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4f  ata->p[pIter->iO
b920: 66 66 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ff] ) break;.   
b930: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b     pIter->iOff++
b940: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b950: 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 61 6c  Unless we are al
b960: 72 65 61 64 79 20 61 74 20 74 68 65 20 65 6e 64  ready at the end
b970: 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2d   of the doclist-
b980: 69 6e 64 65 78 2c 20 6c 6f 61 64 20 74 68 65 20  index, load the 
b990: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 72 6f 77  first.    ** row
b9a0: 69 64 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  id value.  */.  
b9b0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66    if( pIter->iOf
b9c0: 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20  f<pData->n ){.  
b9d0: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
b9e0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
b9f0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 44  += getVarint(&pD
ba00: 61 74 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4f  ata->p[pIter->iO
ba10: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
ba20: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
ba30: 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iRowid += iVal;.
ba40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ba50: 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
ba60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  ;.    }.  }.  pI
ba70: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b  ter->iLeafPgno +
ba80: 3d 20 28 69 2b 31 29 3b 0a 0a 20 20 70 49 74 65  = (i+1);..  pIte
ba90: 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70  r->iFirstOff = p
baa0: 49 74 65 72 2d 3e 69 4f 66 66 3b 0a 20 20 72 65  Iter->iOff;.  re
bab0: 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66  turn pIter->bEof
bac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
bad0: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
bae0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
baf0: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
bb00: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
bb10: 6c 69 64 78 49 74 65 72 4e 65 78 74 28 46 74 73  lidxIterNext(Fts
bb20: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
bb30: 72 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  r){.  Fts5Data *
bb40: 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  pData = pIter->p
bb50: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Data;.  int iOff
bb60: 3b 0a 0a 20 20 66 6f 72 28 69 4f 66 66 3d 70 49  ;..  for(iOff=pI
bb70: 74 65 72 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c  ter->iOff; iOff<
bb80: 70 44 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b  pData->n; iOff++
bb90: 29 7b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  ){.    if( pData
bba0: 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61  ->p[iOff] ) brea
bbb0: 6b 3b 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  k; .  }..  if( i
bbc0: 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a  Off<pData->n ){.
bbd0: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
bbe0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
bbf0: 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 49  no += (iOff - pI
bc00: 74 65 72 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a  ter->iOff) + 1;.
bc10: 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56      iOff += getV
bc20: 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
bc30: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56  iOff], (u64*)&iV
bc40: 61 6c 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  al);.    pIter->
bc50: 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iRowid += iVal;.
bc60: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
bc70: 3d 20 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  = iOff;.  }else{
bc80: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
bc90: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 1;.  }..  ret
bca0: 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b  urn pIter->bEof;
bcb0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
bcc0: 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
bcd0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
bce0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bcf0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49  er){.  return pI
bd00: 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74  ter->bEof;.}..st
bd10: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
bd20: 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35  idxIterLast(Fts5
bd30: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
bd40: 29 7b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  ){.  if( fts5Dli
bd50: 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74 65  dxIterFirst(pIte
bd60: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  r)==0 ){.    whi
bd70: 6c 65 28 20 30 3d 3d 66 74 73 35 44 6c 69 64 78  le( 0==fts5Dlidx
bd80: 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 20  IterNext(pIter) 
bd90: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45  );.    pIter->bE
bda0: 6f 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73  of = 0;.  }.}..s
bdb0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
bdc0: 69 64 78 49 74 65 72 50 72 65 76 28 46 74 73 35  idxIterPrev(Fts5
bdd0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
bde0: 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
bdf0: 70 49 74 65 72 2d 3e 69 4f 66 66 3b 0a 0a 20 20  pIter->iOff;..  
be00: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62  assert( pIter->b
be10: 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Eof==0 );.  if( 
be20: 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69 46 69  iOff<=pIter->iFi
be30: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 49  rstOff ){.    pI
be40: 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  ter->bEof = 1;. 
be50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a   }else{.    u8 *
be60: 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61 74 61  a = pIter->pData
be70: 2d 3e 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61  ->p;.    i64 iVa
be80: 6c 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  l;.    int iLimi
be90: 74 3b 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65  t;..    /* Curre
bea0: 6e 74 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73  ntly iOff points
beb0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
bec0: 74 65 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20  te of a varint. 
bed0: 54 68 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20  This block .    
bee0: 2a 2a 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f  ** decrements iO
bef0: 66 66 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e  ff until it poin
bf00: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
bf10: 62 79 74 65 20 6f 66 20 74 68 65 20 70 72 65 76  byte of the prev
bf20: 69 6f 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72  ious .    ** var
bf30: 69 6e 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65  int. Taking care
bf40: 20 6e 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79   not to read any
bf50: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
bf60: 73 20 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20  s that occur.   
bf70: 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62   ** before the b
bf80: 75 66 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e  uffer in memory.
bf90: 20 20 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20    */.    iLimit 
bfa0: 3d 20 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66  = (iOff>9 ? iOff
bfb0: 2d 39 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72  -9 : 0);.    for
bfc0: 28 69 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c  (iOff--; iOff>iL
bfd0: 69 6d 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20  imit; iOff--){. 
bfe0: 20 20 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66       if( (a[iOff
bff0: 2d 31 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29  -1] & 0x80)==0 )
c000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
c010: 20 20 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b     getVarint(&a[
c020: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56  iOff], (u64*)&iV
c030: 61 6c 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  al);.    pIter->
c040: 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a  iRowid -= iVal;.
c050: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
c060: 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20  Pgno--;..    /* 
c070: 53 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20 70  Skip backwards p
c080: 61 73 73 65 64 20 61 6e 79 20 30 78 30 30 20 62  assed any 0x00 b
c090: 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 77 68 69  ytes. */.    whi
c0a0: 6c 65 28 20 69 4f 66 66 3e 70 49 74 65 72 2d 3e  le( iOff>pIter->
c0b0: 69 46 69 72 73 74 4f 66 66 20 0a 20 20 20 20 20  iFirstOff .     
c0c0: 20 20 20 26 26 20 61 5b 69 4f 66 66 2d 31 5d 3d     && a[iOff-1]=
c0d0: 3d 30 78 30 30 20 26 26 20 28 61 5b 69 4f 66 66  =0x00 && (a[iOff
c0e0: 2d 32 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 0a  -2] & 0x80)==0 .
c0f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 4f 66      ){.      iOf
c100: 66 2d 2d 3b 0a 20 20 20 20 20 20 70 49 74 65 72  f--;.      pIter
c110: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20  ->iLeafPgno--;. 
c120: 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e     }.    pIter->
c130: 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 7d  iOff = iOff;.  }
c140: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ..  return pIter
c150: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69  ->bEof;.}..stati
c160: 63 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  c Fts5DlidxIter 
c170: 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  *fts5DlidxIterIn
c180: 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
c190: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c1a0: 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61        /* Fts5 Ba
c1b0: 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
c1c0: 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74   within */.  int
c1d0: 20 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20   bRev,          
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1f0: 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42  True for ORDER B
c200: 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69  Y ASC */.  int i
c210: 49 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64 2c  Idx, int iSegid,
c220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c230: 67 6d 65 6e 74 20 69 53 65 67 69 64 20 77 69 74  gment iSegid wit
c240: 68 69 6e 20 69 6e 64 65 78 20 69 49 64 78 20 2a  hin index iIdx *
c250: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 20  /.  int iLeafPg 
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
c280: 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20   number to load 
c290: 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a  dlidx for */.){.
c2a0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
c2b0: 2a 70 49 74 65 72 3b 0a 0a 20 20 70 49 74 65 72  *pIter;..  pIter
c2c0: 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74 65   = (Fts5DlidxIte
c2d0: 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
c2e0: 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
c2f0: 6c 69 64 78 49 74 65 72 29 29 3b 0a 20 20 69 66  lidxIter));.  if
c300: 28 20 70 49 74 65 72 3d 3d 30 20 29 20 72 65 74  ( pIter==0 ) ret
c310: 75 72 6e 20 30 3b 0a 0a 20 20 70 49 74 65 72 2d  urn 0;..  pIter-
c320: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
c330: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 44 4f  aRead(p, FTS5_DO
c340: 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57 49 44 28  CLIST_IDX_ROWID(
c350: 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c  iIdx, iSegid, iL
c360: 65 61 66 50 67 29 29 3b 0a 20 20 69 66 28 20 70  eafPg));.  if( p
c370: 49 74 65 72 2d 3e 70 44 61 74 61 3d 3d 30 20 29  Iter->pData==0 )
c380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
c390: 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70  ee(pIter);.    p
c3a0: 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Iter = 0;.  }els
c3b0: 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  e{.    pIter->iL
c3c0: 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
c3d0: 67 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d  g;.    if( bRev=
c3e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
c3f0: 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 70  DlidxIterFirst(p
c400: 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Iter);.    }else
c410: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
c420: 78 49 74 65 72 4c 61 73 74 28 70 49 74 65 72 29  xIterLast(pIter)
c430: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
c440: 65 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a  eturn pIter;.}..
c450: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63  /*.** Free a doc
c460: 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61  list-index itera
c470: 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  tor object alloc
c480: 61 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64  ated by fts5Dlid
c490: 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a  xIterInit()..*/.
c4a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c4b0: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74  DlidxIterFree(Ft
c4c0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
c4d0: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
c4e0: 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61   ){.    fts5Data
c4f0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
c500: 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74  Data);.    sqlit
c510: 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
c520: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
c530: 69 64 20 66 74 73 35 4c 65 61 66 48 65 61 64 65  id fts5LeafHeade
c540: 72 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61  r(Fts5Data *pLea
c550: 66 2c 20 69 6e 74 20 2a 70 69 52 6f 77 69 64 2c  f, int *piRowid,
c560: 20 69 6e 74 20 2a 70 69 54 65 72 6d 29 7b 0a 20   int *piTerm){. 
c570: 20 2a 70 69 52 6f 77 69 64 20 3d 20 28 69 6e 74   *piRowid = (int
c580: 29 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65  )fts5GetU16(&pLe
c590: 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 2a 70 69  af->p[0]);.  *pi
c5a0: 54 65 72 6d 20 3d 20 28 69 6e 74 29 66 74 73 35  Term = (int)fts5
c5b0: 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
c5c0: 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  [2]);.}../*.** L
c5d0: 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61  oad the next lea
c5e0: 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  f page into the 
c5f0: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
c600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c610: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
c620: 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
c630: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
c640: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
c650: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
c660: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
c670: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
c680: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
c690: 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65  to advance to ne
c6a0: 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  xt page */.){.  
c6b0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
c6c0: 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74  ment *pSeg = pIt
c6d0: 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35  er->pSeg;.  fts5
c6e0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
c6f0: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74  r->pLeaf);.  pIt
c700: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b  er->iLeafPgno++;
c710: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c  .  if( pIter->iL
c720: 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  eafPgno<=pSeg->p
c730: 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
c740: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74  Iter->pLeaf = ft
c750: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
c760: 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d         FTS5_SEGM
c770: 45 4e 54 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  ENT_ROWID(pIter-
c780: 3e 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65  >iIdx, pSeg->iSe
c790: 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69  gid, 0, pIter->i
c7a0: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b  LeafPgno).    );
c7b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
c7c0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
c7d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67    }.}../*.** Arg
c7e0: 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74  ument p points t
c7f0: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
c800: 69 6e 69 6e 67 20 61 20 76 61 72 69 6e 74 20 74  ining a varint t
c810: 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64  o be interpreted
c820: 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f   as a.** positio
c830: 6e 20 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n list size fiel
c840: 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 72 69  d. Read the vari
c850: 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  nt and return th
c860: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
c870: 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f 72  s.** read. Befor
c880: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74  e returning, set
c890: 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75   *pnSz to the nu
c8a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
c8b0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a   the position.**
c8c0: 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62 44 65   list, and *pbDe
c8d0: 6c 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65  l to true if the
c8e0: 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20   delete flag is 
c8f0: 73 65 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  set, or false ot
c900: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
c910: 69 63 20 69 6e 74 20 66 74 73 35 47 65 74 50 6f  ic int fts5GetPo
c920: 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73 74 20  slistSize(const 
c930: 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a  u8 *p, int *pnSz
c940: 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20  , int *pbDel){. 
c950: 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20   int nSz;.  int 
c960: 6e 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  n = fts5GetVarin
c970: 74 33 32 28 70 2c 20 6e 53 7a 29 3b 0a 20 20 61  t32(p, nSz);.  a
c980: 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30  ssert_nc( nSz>=0
c990: 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53   );.  *pnSz = nS
c9a0: 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20  z/2;.  *pbDel = 
c9b0: 6e 53 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20  nSz & 0x0001;.  
c9c0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
c9d0: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
c9e0: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
c9f0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
ca00: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
ca10: 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c   a.** position-l
ca20: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
ca30: 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
ca40: 66 20 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20  f the field and 
ca50: 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74  store it.** in t
ca60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
ca70: 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  iables:.**.**   
ca80: 46 74 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73  Fts5SegIter.nPos
ca90: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
caa0: 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61  r.bDel.**.** Lea
cab0: 76 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ve Fts5SegIter.i
cac0: 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74  LeafOffset point
cad0: 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
cae0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a   byte of the .**
caf0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
cb00: 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e  ontent (if any).
cb10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cb20: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
cb30: 50 6f 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Pos(Fts5Index *p
cb40: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
cb50: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Iter){.  if( p->
cb60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
cb70: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  .    int iOff = 
cb80: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
cb90: 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  et;  /* Offset t
cba0: 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20  o read at */.   
cbb0: 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72   if( iOff>=pIter
cbc0: 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20  ->pLeaf->n ){.  
cbd0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
cbe0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
cbf0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
cc00: 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d   u8 *a = &pIter-
cc10: 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3b  >pLeaf->p[iOff];
cc20: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
cc30: 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73  eafOffset += fts
cc40: 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
cc50: 61 2c 20 26 70 49 74 65 72 2d 3e 6e 50 6f 73 2c  a, &pIter->nPos,
cc60: 20 26 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a   &pIter->bDel);.
cc70: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
cc80: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
cc90: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
cca0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
ccb0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
ccc0: 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69   the .** "nSuffi
ccd0: 78 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65  x" field of a te
cce0: 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72  rm. Function par
ccf0: 61 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e  ameter nKeep con
cd00: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a  tains the value.
cd10: 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66  ** of the "nPref
cd20: 69 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68  ix" field (if th
cd30: 65 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74  ere was one - it
cd40: 20 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20   is passed 0 if 
cd50: 74 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  this is.** the f
cd60: 69 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  irst term in the
cd70: 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a   segment)..**.**
cd80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
cd90: 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  opulates:.**.** 
cda0: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 74 65    Fts5SegIter.te
cdb0: 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  rm.**   Fts5SegI
cdc0: 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  ter.rowid.**.** 
cdd0: 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20  accordingly and 
cde0: 6c 65 61 76 65 73 20 28 46 74 73 35 53 65 67 49  leaves (Fts5SegI
cdf0: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29  ter.iLeafOffset)
ce00: 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74   set to the cont
ce10: 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  ent of.** the fi
ce20: 72 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  rst position lis
ce30: 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20  t. The position 
ce40: 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74  list belonging t
ce50: 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28  o document .** (
ce60: 46 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77  Fts5SegIter.iRow
ce70: 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
ce80: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
ce90: 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65  oadTerm(Fts5Inde
cea0: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
ceb0: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b  r *pIter, int nK
cec0: 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  eep){.  u8 *a = 
ced0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
cee0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
cef0: 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  r to read data f
cf00: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  rom */.  int iOf
cf10: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
cf20: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
cf30: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
cf40: 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e     /* Bytes of n
cf70: 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f  ew data */..  iO
cf80: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
cf90: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
cfa0: 6e 4e 65 77 29 3b 0a 20 20 70 49 74 65 72 2d 3e  nNew);.  pIter->
cfb0: 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a  term.n = nKeep;.
cfc0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
cfd0: 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
cfe0: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65  pIter->term, nNe
cff0: 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  w, &a[iOff]);.  
d000: 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20  iOff += nNew;.  
d010: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
d020: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
d030: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
d040: 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
d050: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 66 28 20  LeafPgno;.  if( 
d060: 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65  iOff>=pIter->pLe
d070: 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 66 74 73  af->n ){.    fts
d080: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
d090: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
d0a0: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
d0b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
d0c0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d0d0: 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  K ) p->rc = FTS5
d0e0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
d0f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
d100: 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20    iOff = 4;.    
d110: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
d120: 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20  ->p;.  }.  iOff 
d130: 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
d140: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
d150: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
d160: 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  id);.  pIter->iL
d170: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
d180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
d190: 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74  alize the iterat
d1a0: 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20  or object pIter 
d1b0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
d1c0: 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69  gh the entries i
d1d0: 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65  n.** segment pSe
d1e0: 67 20 77 69 74 68 69 6e 20 69 6e 64 65 78 20 69  g within index i
d1f0: 49 64 78 2e 20 54 68 65 20 69 74 65 72 61 74 6f  Idx. The iterato
d200: 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
d210: 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69  ng to the .** fi
d220: 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20 74  rst entry when t
d230: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
d240: 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  urns..**.** If a
d250: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
d260: 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
d270: 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
d280: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
d290: 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
d2a0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
d2b0: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
d2c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d2d0: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
d2e0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
d2f0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e  id fts5SegIterIn
d300: 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
d310: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 0a 20 20  *p,          .  
d320: 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
d330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d340: 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b  /* Config.aHash[
d350: 5d 20 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69  ] index of FTS i
d360: 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74  ndex */.  Fts5St
d370: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
d380: 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73  pSeg,     /* Des
d390: 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d  cription of segm
d3a0: 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ent */.  Fts5Seg
d3b0: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
d3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
d3d0: 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
d3e0: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d  /.){.  if( pSeg-
d3f0: 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b  >pgnoFirst==0 ){
d400: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
d410: 70 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d  pens if the segm
d420: 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65  ent is being use
d430: 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f  d as an input to
d440: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a   an incremental.
d450: 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64      ** merge and
d460: 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c   all data has al
d470: 72 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d  ready been "trim
d480: 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69  med". See functi
d490: 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72  on.    ** fts5Tr
d4a0: 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72  imSegments() for
d4b0: 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69   details. In thi
d4c0: 73 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65  s case leave the
d4d0: 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e   iterator empty.
d4e0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
d4f0: 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20  er will see the 
d500: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30  (pIter->pLeaf==0
d510: 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65  ) and assume the
d520: 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20   iterator is.   
d530: 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61   ** at EOF alrea
d540: 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  dy. */.    asser
d550: 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  t( pIter->pLeaf=
d560: 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
d570: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
d580: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d590: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
d5a0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
d5b0: 74 65 72 29 29 3b 0a 20 20 20 20 70 49 74 65 72  ter));.    pIter
d5c0: 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20  ->pSeg = pSeg;. 
d5d0: 20 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d     pIter->iIdx =
d5e0: 20 69 49 64 78 3b 0a 20 20 20 20 70 49 74 65 72   iIdx;.    pIter
d5f0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53  ->iLeafPgno = pS
d600: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b  eg->pgnoFirst-1;
d610: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
d620: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
d630: 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
d640: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d650: 29 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  ){.    u8 *a = p
d660: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
d670: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d680: 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
d690: 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
d6a0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
d6b0: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29  erm(p, pIter, 0)
d6c0: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
d6d0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
d6e0: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
d6f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d700: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
d710: 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73  led on iterators
d720: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
d730: 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65  s to.** Fts5Inde
d740: 78 51 75 65 72 79 28 29 20 77 69 74 68 20 74 68  xQuery() with th
d750: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
d760: 59 5f 44 45 53 43 20 66 6c 61 67 20 73 65 74 2e  Y_DESC flag set.
d770: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
d780: 74 6f 72 20 69 73 20 69 6e 20 61 6e 20 75 6e 75  tor is in an unu
d790: 73 75 61 6c 20 73 74 61 74 65 20 77 68 65 6e 20  sual state when 
d7a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
d7b0: 20 63 61 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20   called: the.** 
d7c0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
d7d0: 66 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c 65  fOffset variable
d7e0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
d7f0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 73 74 61  ffset of the sta
d800: 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73  rt of.** the pos
d810: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
d820: 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 66 69  field for the fi
d830: 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  rst relevant row
d840: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  id on the page..
d850: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 72  ** Fts5SegIter.r
d860: 6f 77 69 64 20 69 73 20 73 65 74 2c 20 62 75 74  owid is set, but
d870: 20 6e 50 6f 73 20 61 6e 64 20 62 44 65 6c 20 61   nPos and bDel a
d880: 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  re not..**.** Th
d890: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64 76 61  is function adva
d8a0: 6e 63 65 73 20 74 68 65 20 69 74 65 72 61 74 6f  nces the iterato
d8b0: 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
d8c0: 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
d8d0: 0a 2a 2a 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  .** relevant row
d8e0: 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  id on the page a
d8f0: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
d900: 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  , initializes th
d910: 65 20 0a 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73  e .** aRowidOffs
d920: 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f  et[] and iRowidO
d930: 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e  ffset variables.
d940: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
d950: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69  he iterator.** i
d960: 73 20 69 6e 20 69 74 73 20 72 65 67 75 6c 61 72  s in its regular
d970: 20 73 74 61 74 65 20 2d 20 46 74 73 35 53 65 67   state - Fts5Seg
d980: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
d990: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
d9a0: 69 72 73 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20  irst.** byte of 
d9b0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
d9c0: 74 20 63 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69  t content associ
d9d0: 61 74 65 64 20 77 69 74 68 20 73 61 69 64 20 72  ated with said r
d9e0: 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owid..*/.static 
d9f0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
da00: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
da10: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
da20: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
da30: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74  ){.  int n = pIt
da40: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 20 20  er->pLeaf->n;.  
da50: 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69  int i = pIter->i
da60: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38  LeafOffset;.  u8
da70: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
da80: 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f  af->p;.  int iRo
da90: 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  widOffset = 0;..
daa0: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
dab0: 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30    i64 iDelta = 0
dac0: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  ;.    int nPos;.
dad0: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
dae0: 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65  .    i += fts5Ge
daf0: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
db00: 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  i], &nPos, &bDum
db10: 6d 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50  my);.    i += nP
db20: 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e  os;.    if( i>=n
db30: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20   ) break;.    i 
db40: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b  += getVarint(&a[
db50: 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  i], (u64*)&iDelt
db60: 61 29 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c  a);.    if( iDel
db70: 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ta==0 ) break;. 
db80: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
db90: 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20   += iDelta;..   
dba0: 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65   if( iRowidOffse
dbb0: 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64  t>=pIter->nRowid
dbc0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
dbd0: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72  int nNew = pIter
dbe0: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b  ->nRowidOffset +
dbf0: 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   8;.      int *a
dc00: 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  New = (int*)sqli
dc10: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65  te3_realloc(pIte
dc20: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c  r->aRowidOffset,
dc30: 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74   nNew*sizeof(int
dc40: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e  ));.      if( aN
dc50: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
dc60: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
dc70: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
dc80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
dc90: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
dca0: 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a  dOffset = aNew;.
dcb0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f        pIter->nRo
dcc0: 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77  widOffset = nNew
dcd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74  ;.    }..    pIt
dce0: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
dcf0: 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d  [iRowidOffset++]
dd00: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
dd10: 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72  ffset;.    pIter
dd20: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
dd30: 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  i;.  }.  pIter->
dd40: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69  iRowidOffset = i
dd50: 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66  RowidOffset;.  f
dd60: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
dd70: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  os(p, pIter);.}.
dd80: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
dd90: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
dda0: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
ddb0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
ddc0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
ddd0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
dde0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
ddf0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
de00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
de10: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
de20: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
de30: 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61  M );..  fts5Data
de40: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
de50: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
de60: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69  pLeaf = 0;.  whi
de70: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
de80: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69  E_OK && pIter->i
de90: 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
dea0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
deb0: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
dec0: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
ded0: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
dee0: 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61   pNew = fts5Data
def0: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
df00: 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20  MENT_ROWID(.    
df10: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 49 64        pIter->iId
df20: 78 2c 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e  x, pIter->pSeg->
df30: 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72  iSegid, 0, pIter
df40: 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20  ->iLeafPgno.    
df50: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
df60: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
df70: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d  ter->iLeafPgno==
df80: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
df90: 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
dfa0: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
dfb0: 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d  LeafOffset<pNew-
dfc0: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
dfd0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
dfe0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
dff0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e000: 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  t = pIter->iTerm
e010: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
e020: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
e030: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
e040: 52 6f 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b  RowidOff, dummy;
e050: 0a 20 20 20 20 20 20 20 20 66 74 73 35 4c 65 61  .        fts5Lea
e060: 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69  fHeader(pNew, &i
e070: 52 6f 77 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79  RowidOff, &dummy
e080: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
e090: 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20  RowidOff ){.    
e0a0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
e0b0: 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  af = pNew;.     
e0c0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e0d0: 66 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64  fOffset = iRowid
e0e0: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Off;.        }. 
e0f0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
e100: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
e110: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20  {.        u8 *a 
e120: 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  = &pIter->pLeaf-
e130: 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  >p[pIter->iLeafO
e140: 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  ffset];.        
e150: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e160: 65 74 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  et += getVarint(
e170: 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  a, (u64*)&pIter-
e180: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
e190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e1a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
e1b0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e  s5DataRelease(pN
e1c0: 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
e1d0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
e1e0: 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
e1f0: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
e200: 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
e210: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
e220: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
e230: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
e240: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
e250: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
e260: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
e270: 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20 6d  ts to a delete m
e280: 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65 20  arker. A delete 
e290: 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e 74  marker is an ent
e2a0: 72 79 20 77 69 74 68 20 61 20 30 20 62 79 74 65  ry with a 0 byte
e2b0: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
e2c0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
e2d0: 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
e2e0: 45 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78 20  Empty(Fts5Index 
e2f0: 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
e300: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
e310: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
e320: 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
e330: 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31  [pIter->aFirst[1
e340: 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74  ].iFirst];.  ret
e350: 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
e360: 54 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70  TE_OK && pSeg->p
e370: 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50  Leaf && pSeg->nP
e380: 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  os==0);.}../*.**
e390: 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
e3a0: 72 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e  r pIter to the n
e3b0: 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a  ext entry. .**.*
e3c0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
e3d0: 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
e3e0: 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
e3f0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
e400: 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69  r code. It .** i
e410: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
e420: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65   an error if the
e430: 20 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65   iterator reache
e440: 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72  s EOF. If an err
e450: 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
e460: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
e470: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
e480: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
e490: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
e4a0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
e4b0: 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49  terNext(.  Fts5I
e4c0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
e4d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
e4e0: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
e4f0: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
e500: 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
e510: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
e520: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
e530: 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
e540: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
e550: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66     /* OUT: Set f
e560: 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29  or new term */.)
e570: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 62 4e 65  {.  assert( pbNe
e580: 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e  wTerm==0 || *pbN
e590: 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 69  ewTerm==0 );.  i
e5a0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
e5b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
e5c0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
e5d0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
e5e0: 53 45 20 29 7b 0a 0a 20 20 20 20 20 20 69 66 28  SE ){..      if(
e5f0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
e600: 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  fset>0 ){.      
e610: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
e620: 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20  >pLeaf->p;.     
e630: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
e640: 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20       int nPos;. 
e650: 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d         int bDumm
e660: 79 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  y;.        i64 i
e670: 44 65 6c 74 61 3b 0a 0a 20 20 20 20 20 20 20 20  Delta;..        
e680: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
e690: 73 65 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70  set--;.        p
e6a0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e6b0: 74 20 3d 20 69 4f 66 66 20 3d 20 70 49 74 65 72  t = iOff = pIter
e6c0: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 70  ->aRowidOffset[p
e6d0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
e6e0: 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  et];.        iOf
e6f0: 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  f += fts5GetPosl
e700: 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d  istSize(&a[iOff]
e710: 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
e720: 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  );.        iOff 
e730: 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  += nPos;.       
e740: 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f   getVarint(&a[iO
e750: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
e760: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  ta);.        pIt
e770: 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44  er->iRowid -= iD
e780: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 66 74  elta;.        ft
e790: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
e7a0: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
e7b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e7c0: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
e7d0: 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
e7e0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
e7f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e800: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
e810: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a  = pIter->pLeaf;.
e820: 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
e830: 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65        int bNewTe
e840: 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  rm = 0;.      in
e850: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20  t nKeep = 0;..  
e860: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
e870: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
e880: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77   position list w
e890: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
e8a0: 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  t page. */.     
e8b0: 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e   u8 *a = pLeaf->
e8c0: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  p;.      int n =
e8d0: 20 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20   pLeaf->n;..    
e8e0: 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
e8f0: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49  iLeafOffset + pI
e900: 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 20 20  ter->nPos;..    
e910: 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
e920: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
e930: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20  ext entry is on 
e940: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
e950: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 36 34 20   */.        u64 
e960: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
e970: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
e980: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
e990: 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  ], &iDelta);.   
e9a0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e9b0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
e9c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 44 65 6c          if( iDel
e9d0: 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
e9e0: 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b     bNewTerm = 1;
e9f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
ea00: 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Off>=n ){.      
ea10: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
ea20: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
ea30: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
ea40: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
ea50: 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  set = 4;.       
ea60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 4f 66     }else if( iOf
ea70: 66 21 3d 66 74 73 35 47 65 74 55 31 36 28 26 61  f!=fts5GetU16(&a
ea80: 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [2]) ){.        
ea90: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
eaa0: 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65  Offset += fts5Ge
eab0: 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
eac0: 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
ead0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
eae0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
eaf0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
eb00: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
eb10: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
eb20: 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d  if( pIter->pSeg=
eb30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
eb40: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
eb50: 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  0;.        const
eb60: 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 0a 20 20   char *zTerm;.  
eb70: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b        int nList;
eb80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
eb90: 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
eba0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
ebb0: 54 45 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 20  TERM) ){.       
ebc0: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
ebd0: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 61 70  shScanNext(p->ap
ebe0: 48 61 73 68 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Hash[0]);.      
ebf0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
ec00: 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e  ashScanEntry(p->
ec10: 61 70 48 61 73 68 5b 30 5d 2c 20 26 7a 54 65 72  apHash[0], &zTer
ec20: 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  m, &pList, &nLis
ec30: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
ec40: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d        if( pList=
ec50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ec60: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
ec70: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
ec80: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ec90: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  pLeaf = 0;.     
eca0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ecb0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
ecc0: 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74  ->p = (u8*)pList
ecd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
ece0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 3d 20 6e 4c  r->pLeaf->n = nL
ecf0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ist;.          s
ed00: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
ed10: 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
ed20: 65 72 2d 3e 74 65 72 6d 2c 20 73 74 72 6c 65 6e  er->term, strlen
ed30: 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54  (zTerm), (u8*)zT
ed40: 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  erm);.          
ed50: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ed60: 65 74 20 3d 20 67 65 74 56 61 72 69 6e 74 28 70  et = getVarint(p
ed70: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
ed80: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
ed90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
eda0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  se{.        iOff
edb0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a   = 0;.        /*
edc0: 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e   Next entry is n
edd0: 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ot on the curren
ede0: 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  t page */.      
edf0: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30    while( iOff==0
ee00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
ee10: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
ee20: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
ee30: 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70         pLeaf = p
ee40: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20  Iter->pLeaf;.   
ee50: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
ee60: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ee70: 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66         if( (iOff
ee80: 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
ee90: 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20 29 7b 0a  Leaf->p[0])) ){.
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
eeb0: 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61   += sqlite3GetVa
eec0: 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
eed0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
eee0: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
eef0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ef00: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
ef10: 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ff;.          }.
ef20: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
ef30: 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35 47  f( (iOff = fts5G
ef40: 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
ef50: 32 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  2])) ){.        
ef60: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ef70: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
ef80: 20 20 20 20 20 20 20 20 20 20 20 62 4e 65 77 54             bNewT
ef90: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
efa0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
efb0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
efc0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 74   Check if the it
efd0: 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74  erator is now at
efe0: 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74   EOF. If so, ret
eff0: 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20  urn early. */.  
f000: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
f010: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
f020: 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a  if( bNewTerm ){.
f030: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
f040: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
f050: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
f060: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  M ){.           
f070: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
f080: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
f090: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
f0a0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
f0b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
f0c0: 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
f0d0: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
f0e0: 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b  , pIter, nKeep);
f0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
f100: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
f110: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
f120: 20 20 20 20 20 20 20 20 69 66 28 20 70 62 4e 65          if( pbNe
f130: 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65  wTerm ) *pbNewTe
f140: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
f150: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
f160: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  e{.          fts
f170: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
f180: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
f190: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f1a0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69    }.  }.}..#defi
f1b0: 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61 2c  ne SWAPVAL(T, a,
f1c0: 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d 70   b) { T tmp; tmp
f1d0: 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b 20  =a; a=b; b=tmp; 
f1e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
f1f0: 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
f200: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
f210: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61  first rowid in a
f220: 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a   doclist. This.*
f230: 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  * function sets 
f240: 74 68 65 20 69 74 65 72 61 74 6f 72 20 75 70 20  the iterator up 
f250: 73 6f 20 74 68 61 74 20 69 74 65 72 61 74 65 73  so that iterates
f260: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
f270: 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65  r through.** the
f280: 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61   doclist..*/.sta
f290: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
f2a0: 49 74 65 72 52 65 76 65 72 73 65 28 46 74 73 35  IterReverse(Fts5
f2b0: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49  Index *p, int iI
f2c0: 64 78 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  dx, Fts5SegIter 
f2d0: 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44  *pIter){.  Fts5D
f2e0: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
f2f0: 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78   = pIter->pDlidx
f300: 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  ;.  Fts5Data *pL
f310: 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ast = 0;.  int p
f320: 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20  gnoLast = 0;..  
f330: 69 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20 20  if( pDlidx ){.  
f340: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 6f 63 6c    /* If the docl
f350: 69 73 74 2d 69 74 65 72 61 74 6f 72 20 69 73 20  ist-iterator is 
f360: 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46 2c 20  already at EOF, 
f370: 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
f380: 20 64 6f 63 6c 69 73 74 0a 20 20 20 20 2a 2a 20   doclist.    ** 
f390: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 65 6e 74 72  contains no entr
f3a0: 69 65 73 20 65 78 63 65 70 74 20 74 68 6f 73 65  ies except those
f3b0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
f3c0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  page. */.    if(
f3d0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
f3e0: 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 20  f(p, pDlidx)==0 
f3f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  ){.      int iSe
f400: 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  gid = pIter->pSe
f410: 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20  g->iSegid;.     
f420: 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 44 6c 69   pgnoLast = pDli
f430: 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  dx->iLeafPgno;. 
f440: 20 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74 73       pLast = fts
f450: 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
f460: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
f470: 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c  iIdx, iSegid, 0,
f480: 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 20   pgnoLast));.   
f490: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
f4a0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
f4b0: 20 2d 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   -= sqlite3Fts5G
f4c0: 65 74 56 61 72 69 6e 74 4c 65 6e 28 70 49 74 65  etVarintLen(pIte
f4d0: 72 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74 65 72 2d  r->nPos*2+pIter-
f4e0: 3e 62 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  >bDel);.    }.  
f4f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
f500: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
f530: 74 20 77 69 74 68 69 6e 20 70 4c 65 61 66 20 2a  t within pLeaf *
f540: 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
f550: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
f560: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  Leaf;         /*
f570: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
f580: 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75  ta */..    /* Cu
f590: 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67  rrently, Fts5Seg
f5a0: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
f5b0: 20 28 61 6e 64 20 69 4f 66 66 29 20 70 6f 69 6e   (and iOff) poin
f5c0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
f5d0: 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 66 20  .    ** byte of 
f5e0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f  position-list co
f5f0: 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75  ntent for the cu
f600: 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63  rrent rowid. Bac
f610: 6b 20 69 74 20 75 70 0a 20 20 20 20 2a 2a 20 73  k it up.    ** s
f620: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
f630: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
f640: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
f650: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a  st size field. *
f660: 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  /.    pIter->iLe
f670: 61 66 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69  afOffset -= sqli
f680: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
f690: 4c 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a  Len(pIter->nPos*
f6a0: 32 2b 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a  2+pIter->bDel);.
f6b0: 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72      iOff = pIter
f6c0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
f6d0: 20 20 20 61 73 73 65 72 74 28 20 69 4f 66 66 3e     assert( iOff>
f6e0: 3d 34 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  =4 );..    /* Se
f6f0: 61 72 63 68 20 66 6f 72 20 61 20 6e 65 77 20 74  arch for a new t
f700: 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63  erm within the c
f710: 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 49 66 20  urrent leaf. If 
f720: 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  one can be found
f730: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
f740: 69 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  is page contains
f750: 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77   the largest row
f760: 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  id for the curre
f770: 6e 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  nt term. */.    
f780: 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61  while( iOff<pLea
f790: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e  f->n ){.      in
f7a0: 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 36  t nPos;.      i6
f7b0: 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
f7c0: 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20  int bDummy;..   
f7d0: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70     /* Read the p
f7e0: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
f7f0: 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20  e field */.     
f800: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
f810: 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 4c 65  PoslistSize(&pLe
f820: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e 50  af->p[iOff], &nP
f830: 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
f840: 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73      iOff += nPos
f850: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
f860: 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 20 62 72 65  >=pLeaf->n ) bre
f870: 61 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 6f  ak;..      /* Ro
f880: 77 69 64 20 64 65 6c 74 61 2e 20 4f 72 2c 20 69  wid delta. Or, i
f890: 66 20 30 78 30 30 2c 20 74 68 65 20 65 6e 64 20  f 0x00, the end 
f8a0: 6f 66 20 64 6f 63 6c 69 73 74 20 6d 61 72 6b 65  of doclist marke
f8b0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73  r. */.      nPos
f8c0: 20 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c   = getVarint(&pL
f8d0: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
f8e0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
f8f0: 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d      if( iDelta==
f900: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
f910: 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20   iOff += nPos;. 
f920: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
f930: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
f940: 73 20 74 72 75 65 20 74 68 65 6e 20 74 68 65 20  s true then the 
f950: 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f  largest rowid fo
f960: 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  r the current.  
f970: 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f    ** term may no
f980: 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74  t be stored on t
f990: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
f9a0: 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61   So search forwa
f9b0: 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65  rd to.    ** see
f9c0: 20 77 68 65 72 65 20 73 61 69 64 20 72 6f 77 69   where said rowi
f9d0: 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f  d really is.  */
f9e0: 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  .    if( iOff>=p
f9f0: 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Leaf->n ){.     
fa00: 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20   int pgno;.     
fa10: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
fa20: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
fa30: 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20  ter->pSeg;..    
fa40: 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f    /* The last ro
fa50: 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69  wid in the docli
fa60: 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e  st may not be on
fa70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
fa80: 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20 20  e. Search.      
fa90: 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69  ** forward to fi
faa0: 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  nd the page cont
fab0: 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20  aining the last 
fac0: 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20  rowid.  */.     
fad0: 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d   for(pgno=pIter-
fae0: 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70  >iLeafPgno+1; !p
faf0: 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53  ->rc && pgno<=pS
fb00: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67  eg->pgnoLast; pg
fb10: 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  no++){.        i
fb20: 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53  64 iAbs = FTS5_S
fb30: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
fb40: 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  x, pSeg->iSegid,
fb50: 20 30 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20   0, pgno);.     
fb60: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65     Fts5Data *pNe
fb70: 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  w = fts5DataRead
fb80: 28 70 2c 20 69 41 62 73 29 3b 0a 20 20 20 20 20  (p, iAbs);.     
fb90: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
fba0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f           int iRo
fbb0: 77 69 64 2c 20 69 54 65 72 6d 3b 0a 20 20 20 20  wid, iTerm;.    
fbc0: 20 20 20 20 20 20 66 74 73 35 4c 65 61 66 48 65        fts5LeafHe
fbd0: 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52 6f 77  ader(pNew, &iRow
fbe0: 69 64 2c 20 26 69 54 65 72 6d 29 3b 0a 20 20 20  id, &iTerm);.   
fbf0: 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69         if( iRowi
fc00: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
fc10: 20 53 57 41 50 56 41 4c 28 46 74 73 35 44 61 74   SWAPVAL(Fts5Dat
fc20: 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74 29  a*, pNew, pLast)
fc30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 67  ;.            pg
fc40: 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20  noLast = pgno;. 
fc50: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
fc60: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
fc70: 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
fc80: 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 20        if( iTerm 
fc90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
fca0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
fcb0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  .  }..  /* If pL
fcc0: 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74  ast is NULL at t
fcd0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
fce0: 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66  the last rowid f
fcf0: 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a  or this doclist.
fd00: 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65    ** lies on the
fd10: 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
fd20: 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65  indicated by the
fd30: 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68   iterator. In th
fd40: 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49  is case .  ** pI
fd50: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
fd60: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 20   is already set 
fd70: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
fd80: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
fd90: 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73  ze.  ** field as
fda0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
fdb0: 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74  e first relevant
fdc0: 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61   rowid on the pa
fdd0: 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72  ge..  **.  ** Or
fde0: 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f  , if pLast is no
fdf0: 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  n-NULL, then it 
fe00: 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
fe10: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61   contains the la
fe20: 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49  st.  ** rowid. I
fe30: 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66  n this case conf
fe40: 69 67 75 72 65 20 74 68 65 20 69 74 65 72 61 74  igure the iterat
fe50: 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
fe60: 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ints to the.  **
fe70: 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
fe80: 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  this page..  */.
fe90: 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20    if( pLast ){. 
fea0: 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20     int dummy;.  
feb0: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
fec0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
fed0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
fee0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
fef0: 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74  = pLast;.    pIt
ff00: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
ff10: 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 66 74  pgnoLast;.    ft
ff20: 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4c 61  s5LeafHeader(pLa
ff30: 73 74 2c 20 26 69 4f 66 66 2c 20 26 64 75 6d 6d  st, &iOff, &dumm
ff40: 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  y);.    iOff += 
ff50: 67 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74  getVarint(&pLast
ff60: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
ff70: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
ff80: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
ff90: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
ffa0: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
ffb0: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
ffc0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  ge(p, pIter);.}.
ffd0: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
ffe0: 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
fff0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
10000 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64  rst rowid of a d
10010 6f 63 6c 69 73 74 20 77 69 74 68 69 6e 0a 2a 2a  oclist within.**
10020 20 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68 65   index iIdx. The
10030 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
10040 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
10050 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20   with the final 
10060 74 65 72 6d 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  term on.** the c
10070 75 72 72 65 6e 74 20 70 61 67 65 2e 20 49 66 20  urrent page. If 
10080 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
10090 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65 72   is the last ter
100a0 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 0a  m on the page, .
100b0 2a 2a 20 6c 6f 61 64 20 74 68 65 20 64 6f 63 6c  ** load the docl
100c0 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64  ist-index from d
100d0 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  isk and initiali
100e0 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61  ze an iterator a
100f0 74 20 0a 2a 2a 20 28 70 49 74 65 72 2d 3e 70 44  t .** (pIter->pD
10100 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lidx)..*/.static
10110 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
10120 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49  rLoadDlidx(Fts5I
10130 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64  ndex *p, int iId
10140 78 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  x, Fts5SegIter *
10150 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53  pIter){.  int iS
10160 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
10170 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20  ->iSegid;.  int 
10180 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66  bRev = (pIter->f
10190 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
101a0 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20  TER_REVERSE);.  
101b0 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
101c0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20  = pIter->pLeaf; 
101d0 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
101e0 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  data */..  asser
101f0 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
10200 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  & FTS5_SEGITER_O
10210 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65  NETERM );.  asse
10220 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  rt( pIter->pDlid
10230 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  x==0 );..  /* Ch
10240 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65  eck if the curre
10250 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20  nt doclist ends 
10260 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49 66  on this page. If
10270 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e   it does, return
10280 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68  .  ** early with
10290 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20  out loading the 
102a0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61  doclist-index (a
102b0 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20  s it belongs to 
102c0 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a  a different.  **
102d0 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20   term. */.  if( 
102e0 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
102f0 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno==pIter->iLe
10300 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 69 6e  afPgno ){.    in
10310 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
10320 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49  iLeafOffset + pI
10330 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 77  ter->nPos;.    w
10340 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66  hile( iOff<pLeaf
10350 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ->n ){.      int
10360 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 69   bDummy;.      i
10370 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69  nt nPos;.      i
10380 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  64 iDelta;..    
10390 20 20 2f 2a 20 69 4f 66 66 20 69 73 20 63 75 72    /* iOff is cur
103a0 72 65 6e 74 6c 79 20 74 68 65 20 6f 66 66 73 65  rently the offse
103b0 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f  t of the start o
103c0 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  f position list 
103d0 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 4f  data */.      iO
103e0 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  ff += getVarint(
103f0 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
10400 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
10410 0a 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74  .      if( iDelt
10420 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  a==0 ) return;. 
10430 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
10440 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 3b  iOff<pLeaf->n );
10450 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
10460 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
10470 65 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  e(&pLeaf->p[iOff
10480 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d  ], &nPos, &bDumm
10490 79 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  y);.      iOff +
104a0 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20 20  = nPos;.    }.  
104b0 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 6c 69  }..  pIter->pDli
104c0 64 78 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  dx = fts5DlidxIt
104d0 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c 20  erInit(p, bRev, 
104e0 69 49 64 78 2c 20 69 53 65 67 2c 20 70 49 74 65  iIdx, iSeg, pIte
104f0 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
10500 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
10510 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
10520 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
10530 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
10540 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d  Term within segm
10550 65 6e 74 0a 2a 2a 20 70 53 65 67 2c 20 69 6e 64  ent.** pSeg, ind
10560 65 78 20 69 49 64 78 2e 20 49 66 20 74 68 65 72  ex iIdx. If ther
10570 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72  e is no such ter
10580 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  m in the index, 
10590 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20  the iterator.** 
105a0 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a  is set to EOF..*
105b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
105c0 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
105d0 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
105e0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
105f0 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
10600 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
10610 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
10620 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
10630 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
10640 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10650 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
10660 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
10670 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
106a0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  nd */.  int iIdx
106b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
106c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
106d0 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20  g.aHash[] index 
106e0 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a  of FTS index */.
106f0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
10700 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
10710 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
10720 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  k to */.  int fl
10730 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
10740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
10750 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58  k of FTS5INDEX_X
10760 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  XX flags */.  Ft
10770 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
10780 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
10790 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
107a0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
107b0 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
107d0 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
107e0 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
107f0 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 68 3b  Pg = 1;.  int h;
10800 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28 28 66  .  int bGe = ((f
10810 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
10820 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29 20 26  _QUERY_PREFIX) &
10830 26 20 69 49 64 78 3d 3d 30 29 3b 0a 20 20 69 6e  & iIdx==0);.  in
10840 74 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20  t bDlidx = 0;   
10850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10860 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69   True if there i
10870 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
10880 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  x */..  assert( 
10890 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  bGe==0 || (flags
108a0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
108b0 52 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20  RY_DESC)==0 );. 
108c0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 20 26   assert( pTerm &
108d0 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d  & nTerm );.  mem
108e0 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
108f0 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
10900 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
10910 53 65 67 3b 0a 20 20 70 49 74 65 72 2d 3e 69 49  Seg;.  pIter->iI
10920 64 78 20 3d 20 69 49 64 78 3b 0a 0a 20 20 2f 2a  dx = iIdx;..  /*
10930 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73   This block sets
10940 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20   stack variable 
10950 69 50 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20  iPg to the leaf 
10960 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
10970 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69   may.  ** contai
10980 6e 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54  n term (pTerm/nT
10990 65 72 6d 29 2c 20 69 66 20 69 74 20 69 73 20 70  erm), if it is p
109a0 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 65  resent in the se
109b0 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  gment. */.  for(
109c0 68 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d  h=pSeg->nHeight-
109d0 31 3b 20 68 3e 30 3b 20 68 2d 2d 29 7b 0a 20 20  1; h>0; h--){.  
109e0 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 6e    Fts5NodeIter n
109f0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
10a00 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69    /* For iterati
10a10 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 74 65 72  ng through inter
10a20 6e 61 6c 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 20  nal nodes */.   
10a30 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54   i64 iRowid = FT
10a40 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
10a50 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65  (iIdx, pSeg->iSe
10a60 67 69 64 2c 20 68 2c 20 69 50 67 29 3b 0a 20 20  gid, h, iPg);.  
10a70 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 6f 64    Fts5Data *pNod
10a80 65 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  e = fts5DataRead
10a90 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  (p, iRowid);.   
10aa0 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29 20   if( pNode==0 ) 
10ab0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 66 74 73 35  break;..    fts5
10ac0 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70 4e 6f  NodeIterInit(pNo
10ad0 64 65 2d 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c  de->p, pNode->n,
10ae0 20 26 6e 6f 64 65 29 3b 0a 20 20 20 20 61 73 73   &node);.    ass
10af0 65 72 74 28 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e  ert( node.term.n
10b00 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 50 67 20  ==0 );..    iPg 
10b10 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20  = node.iChild;. 
10b20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65     bDlidx = node
10b30 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20 66 6f 72  .bDlidx;.    for
10b40 28 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78  (fts5NodeIterNex
10b50 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29  t(&p->rc, &node)
10b60 3b 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 2e 61  ;.        node.a
10b70 44 61 74 61 20 26 26 20 66 74 73 35 42 75 66 66  Data && fts5Buff
10b80 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 6e  erCompareBlob(&n
10b90 6f 64 65 2e 74 65 72 6d 2c 20 70 54 65 72 6d 2c  ode.term, pTerm,
10ba0 20 6e 54 65 72 6d 29 3c 3d 30 3b 0a 20 20 20 20   nTerm)<=0;.    
10bb0 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
10bc0 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f  Next(&p->rc, &no
10bd0 64 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  de).    ){.     
10be0 20 69 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69   iPg = node.iChi
10bf0 6c 64 3b 0a 20 20 20 20 20 20 62 44 6c 69 64 78  ld;.      bDlidx
10c00 20 3d 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a   = node.bDlidx;.
10c10 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f      }.    fts5No
10c20 64 65 49 74 65 72 46 72 65 65 28 26 6e 6f 64 65  deIterFree(&node
10c30 29 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  );.    fts5DataR
10c40 65 6c 65 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20  elease(pNode);. 
10c50 20 7d 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53   }..  if( iPg<pS
10c60 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b  eg->pgnoFirst ){
10c70 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d  .    iPg = pSeg-
10c80 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20  >pgnoFirst;.    
10c90 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a  bDlidx = 0;.  }.
10ca0 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  .  pIter->iLeafP
10cb0 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20  gno = iPg - 1;. 
10cc0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
10cd0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
10ce0 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
10cf0 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eaf ){.    int r
10d00 65 73 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  es;.    pIter->i
10d10 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
10d20 35 47 65 74 55 31 36 28 26 70 49 74 65 72 2d 3e  5GetU16(&pIter->
10d30 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20  pLeaf->p[2]);.  
10d40 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
10d50 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20  dTerm(p, pIter, 
10d60 30 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  0);.    fts5SegI
10d70 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
10d80 49 74 65 72 29 3b 0a 20 20 20 20 64 6f 20 7b 0a  Iter);.    do {.
10d90 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35        res = fts5
10da0 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f  BufferCompareBlo
10db0 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  b(&pIter->term, 
10dc0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
10dd0 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20       if( res>=0 
10de0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
10df0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
10e00 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20  , pIter, 0);.   
10e10 20 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d 3e   }while( pIter->
10e20 70 4c 65 61 66 20 26 26 20 70 2d 3e 72 63 3d 3d  pLeaf && p->rc==
10e30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
10e40 20 20 69 66 28 20 62 47 65 3d 3d 30 20 26 26 20    if( bGe==0 && 
10e50 72 65 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  res ){.      /* 
10e60 53 65 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20  Set iterator to 
10e70 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20 2a 2f 0a  point to EOF */.
10e80 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
10e90 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
10ea0 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  af);.      pIter
10eb0 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
10ec0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d   }.  }..  if( p-
10ed0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
10ee0 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20  & bGe==0 ){.    
10ef0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
10f00 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
10f10 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49  TERM;.    if( pI
10f20 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
10f30 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
10f40 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
10f50 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20  DESC ){.        
10f60 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
10f70 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
10f80 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ERSE;.      }.  
10f90 20 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29      if( bDlidx )
10fa0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
10fb0 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70  gIterLoadDlidx(p
10fc0 2c 20 69 49 64 78 2c 20 70 49 74 65 72 29 3b 0a  , iIdx, pIter);.
10fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10fe0 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
10ff0 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29  DEX_QUERY_DESC )
11000 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
11010 67 49 74 65 72 52 65 76 65 72 73 65 28 70 2c 20  gIterReverse(p, 
11020 69 49 64 78 2c 20 70 49 74 65 72 29 3b 0a 20 20  iIdx, pIter);.  
11030 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11040 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
11050 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
11060 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
11070 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
11080 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
11090 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
110a0 61 62 6c 65 20 69 49 64 78 2e 20 49 66 20 74 68  able iIdx. If th
110b0 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74  ere is no such t
110c0 65 72 6d 20 69 6e 20 74 68 65 20 74 61 62 6c 65  erm in the table
110d0 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
110e0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
110f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
11100 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
11110 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
11120 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
11130 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
11140 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
11150 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
11160 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
11170 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
11180 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
11190 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
111a0 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
111b0 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
111c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
111d0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
111e0 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ckend */.  int i
111f0 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
11200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
11210 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64  nfig.aHash[] ind
11220 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20  ex of FTS index 
11230 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
11240 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
11250 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
11260 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  seek to */.  int
11270 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11290 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
112a0 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  X_XXX flags */. 
112b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
112c0 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
112d0 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f   /* Object to po
112e0 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 46  pulate */.){.  F
112f0 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d  ts5Hash *pHash =
11300 20 70 2d 3e 61 70 48 61 73 68 5b 69 49 64 78 5d   p->apHash[iIdx]
11310 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c  ;.  const u8 *pL
11320 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ist = 0;.  int n
11330 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  List = 0;.  cons
11340 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20 69  t u8 *z = 0;.  i
11350 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nt n = 0;..  ass
11360 65 72 74 28 20 70 48 61 73 68 20 29 3b 0a 20 20  ert( pHash );.  
11370 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
11380 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69  QLITE_OK );..  i
11390 66 28 20 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28  f( pTerm==0 || (
113a0 69 49 64 78 3d 3d 30 20 26 26 20 28 66 6c 61 67  iIdx==0 && (flag
113b0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
113c0 45 52 59 5f 50 52 45 46 49 58 29 29 20 29 7b 0a  ERY_PREFIX)) ){.
113d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
113e0 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49  te3Fts5HashScanI
113f0 6e 69 74 28 70 48 61 73 68 2c 20 28 63 6f 6e 73  nit(pHash, (cons
11400 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e  t char*)pTerm, n
11410 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74  Term);.    sqlit
11420 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
11430 74 72 79 28 70 48 61 73 68 2c 20 28 63 6f 6e 73  try(pHash, (cons
11440 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c  t char**)&z, &pL
11450 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
11460 20 20 6e 20 3d 20 28 7a 20 3f 20 73 74 72 6c 65    n = (z ? strle
11470 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  n((const char*)z
11480 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ) : 0);.  }else{
11490 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
114a0 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
114b0 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73  R_ONETERM;.    s
114c0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75  qlite3Fts5HashQu
114d0 65 72 79 28 70 48 61 73 68 2c 20 28 63 6f 6e 73  ery(pHash, (cons
114e0 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e  t char*)pTerm, n
114f0 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  Term, &pList, &n
11500 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70  List);.    z = p
11510 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54  Term;.    n = nT
11520 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  erm;.  }..  if( 
11530 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74 73  pList ){.    Fts
11540 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20  5Data *pLeaf;.  
11550 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
11560 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
11570 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20  pIter->term, n, 
11580 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20  z);.    pLeaf = 
11590 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
115a0 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61   sizeof(Fts5Data
115b0 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61  ));.    if( pLea
115c0 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  f==0 ) return;. 
115d0 20 20 20 70 4c 65 61 66 2d 3e 6e 52 65 66 20 3d     pLeaf->nRef =
115e0 20 31 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70   1;.    pLeaf->p
115f0 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20   = (u8*)pList;. 
11600 20 20 20 70 4c 65 61 66 2d 3e 6e 20 3d 20 6e 4c     pLeaf->n = nL
11610 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ist;.    pIter->
11620 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20  pLeaf = pLeaf;. 
11630 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
11640 66 66 73 65 74 20 3d 20 67 65 74 56 61 72 69 6e  ffset = getVarin
11650 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36 34  t(pLeaf->p, (u64
11660 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
11670 29 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 67  );..    if( flag
11680 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
11690 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  ERY_DESC ){.    
116a0 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
116b0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
116c0 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66 74  EVERSE;.      ft
116d0 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
116e0 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
116f0 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
11700 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
11710 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
11720 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
11730 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20  ./*.** Zero the 
11740 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
11750 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
11760 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
11770 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
11780 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74 65  Clear(Fts5SegIte
11790 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73  r *pIter){.  fts
117a0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
117b0 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73  er->term);.  fts
117c0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
117d0 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74  er->pLeaf);.  ft
117e0 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
117f0 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a  pIter->pDlidx);.
11800 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11810 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
11820 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  et);.  memset(pI
11830 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
11840 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a  ts5SegIter));.}.
11850 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
11860 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  EBUG../*.** This
11870 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
11880 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
11890 20 62 69 67 20 61 73 73 65 72 74 28 29 20 70 72   big assert() pr
118a0 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e  ocedure implemen
118b0 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41 73  ted by.** fts5As
118c0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
118d0 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65 73  up(). It ensures
118e0 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
118f0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
11900 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69 73  d.** in *pRes is
11910 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73   the correct res
11920 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  ult of comparing
11930 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
11940 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a  itions of the.**
11950 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a   two iterators..
11960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11970 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
11980 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74 73  sonResult(.  Fts
11990 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
119a0 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67  Iter, .  Fts5Seg
119b0 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35  Iter *p1,.  Fts5
119c0 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46  SegIter *p2,.  F
119d0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
119e0 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70  .){.  int i1 = p
119f0 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  1 - pIter->aSeg;
11a00 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d  .  int i2 = p2 -
11a10 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20   pIter->aSeg;.. 
11a20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c   if( p1->pLeaf |
11a30 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  | p2->pLeaf ){. 
11a40 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66     if( p1->pLeaf
11a50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
11a60 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
11a70 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i2 );.    }el
11a80 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
11a90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
11aa0 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
11ab0 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i1 );.    }el
11ac0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d  se{.      int nM
11ad0 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72  in = MIN(p1->ter
11ae0 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29  m.n, p2->term.n)
11af0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20  ;.      int res 
11b00 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72  = memcmp(p1->ter
11b10 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c  m.p, p2->term.p,
11b20 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66   nMin);.      if
11b30 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
11b40 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32   p1->term.n - p2
11b50 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20  ->term.n;..     
11b60 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
11b70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11b80 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20  Res->bTermEq==1 
11b90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
11ba0 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70  t( p1->iRowid!=p
11bb0 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  2->iRowid );.   
11bc0 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
11bd0 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52  >iRowid > p2->iR
11be0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
11bf0 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20  ev) ? -1 : 1;.  
11c00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c10 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
11c20 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20  >bTermEq==0 );. 
11c30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
11c40 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
11c50 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
11c60 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20  >iFirst==i1 );. 
11c70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11c80 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
11c90 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
11ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11cb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
11cc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
11cd0 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54  -op unless SQLIT
11ce0 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
11cf0 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64  ed when this mod
11d00 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c  ule.** is compil
11d10 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ed. In that case
11d20 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
11d30 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61  is essentially a
11d40 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73  n assert() .** s
11d50 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f  tatement used to
11d60 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
11d70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
11d80 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d   pIter->aFirst[]
11d90 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f   array.** are co
11da0 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
11db0 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74   void fts5Assert
11dc0 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 46  MultiIterSetup(F
11dd0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
11de0 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
11df0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Iter){.  if( p->
11e00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11e10 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
11e20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
11e30 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20  ->nSeg; i+=2){. 
11e40 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
11e50 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p1 = &pIter->a
11e60 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74  Seg[i];.      Ft
11e70 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20  s5SegIter *p2 = 
11e80 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31  &pIter->aSeg[i+1
11e90 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ];.      Fts5CRe
11ea0 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
11eb0 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49 74  ter->aFirst[(pIt
11ec0 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20  er->nSeg + i) / 
11ed0 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73  2];.      fts5As
11ee0 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
11ef0 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20  sult(pIter, p1, 
11f00 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  p2, pRes);.    }
11f10 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ..    for(i=1; i
11f20 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20  <(pIter->nSeg / 
11f30 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  2); i+=2){.     
11f40 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52   Fts5CResult *pR
11f50 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69  es = &pIter->aFi
11f60 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74  rst[i];.      Ft
11f70 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
11f80 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
11f90 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 5d  ter->aFirst[i*2]
11fa0 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20  .iFirst ];.     
11fb0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
11fc0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
11fd0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
11fe0 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  *2+1].iFirst ];.
11ff0 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
12000 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
12010 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c  t(pIter, p1, p2,
12020 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20   pRes);.    }.  
12030 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
12040 6e 65 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c  ne fts5AssertMul
12050 74 69 49 74 65 72 53 65 74 75 70 28 78 2c 79 29  tiIterSetup(x,y)
12060 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
12070 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
12080 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f   necessary to po
12090 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46  pulate pIter->aF
120a0 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a  irst[iOut]..**.*
120b0 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65  * If the returne
120c0 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a  d value is non-z
120d0 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
120e0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20  the index of an 
120f0 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20  entry.** in the 
12100 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72  pIter->aSeg[] ar
12110 72 61 79 20 74 68 61 74 20 69 73 20 28 61 29 20  ray that is (a) 
12120 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20  not at EOF, and 
12130 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  (b) pointing.** 
12140 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69 73  to a key that is
12150 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20   a duplicate of 
12160 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20  another, higher 
12170 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65  priority, .** se
12180 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69  gment-iterator i
12190 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67  n the pSeg->aSeg
121a0 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
121b0 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
121c0 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46  iIterDoCompare(F
121d0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
121e0 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74  *pIter, int iOut
121f0 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20  ){.  int i1;    
12200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12210 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
12220 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   left-hand Fts5S
12230 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
12240 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i2;             
12250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12260 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61  ndex of right-ha
12270 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
12280 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20  /.  int iRes;.  
12290 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b  Fts5SegIter *p1;
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73  /* Left-hand Fts
122c0 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
122d0 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20  s5SegIter *p2;  
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
122f0 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   Right-hand Fts5
12300 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73  SegIter */.  Fts
12310 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
12320 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
12330 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iOut];..  assert
12340 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53  ( iOut<pIter->nS
12350 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a  eg && iOut>0 );.
12360 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
12370 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65  >bRev==0 || pIte
12380 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20  r->bRev==1 );.. 
12390 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65   if( iOut>=(pIte
123a0 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20  r->nSeg/2) ){.  
123b0 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70    i1 = (iOut - p
123c0 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20  Iter->nSeg/2) * 
123d0 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b  2;.    i2 = i1 +
123e0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
123f0 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69   i1 = pIter->aFi
12400 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72  rst[iOut*2].iFir
12410 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74  st;.    i2 = pIt
12420 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
12430 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d  2+1].iFirst;.  }
12440 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  .  p1 = &pIter->
12450 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d  aSeg[i1];.  p2 =
12460 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32   &pIter->aSeg[i2
12470 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72  ];..  pRes->bTer
12480 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  mEq = 0;.  if( p
12490 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  1->pLeaf==0 ){  
124a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
124b0 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  1 is at EOF */. 
124c0 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
124d0 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
124e0 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a  eaf==0 ){     /*
124f0 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f 46   If p2 is at EOF
12500 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
12510 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
12520 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42 75  int res = fts5Bu
12530 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d  fferCompare(&p1-
12540 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d  >term, &p2->term
12550 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  );.    if( res==
12560 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
12570 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20  t( i2>i1 );.    
12580 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30 20    assert( i2!=0 
12590 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62  );.      pRes->b
125a0 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20  TermEq = 1;.    
125b0 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64    if( p1->iRowid
125c0 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ==p2->iRowid ){.
125d0 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c          p1->bDel
125e0 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20   = p2->bDel;.   
125f0 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a       return i2;.
12600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
12610 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
12620 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
12630 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
12640 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  1 : +1;.    }.  
12650 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30    assert( res!=0
12660 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c   );.    if( res<
12670 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20  0 ){.      iRes 
12680 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = i1;.    }else{
12690 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 32  .      iRes = i2
126a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
126b0 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 69 52  Res->iFirst = iR
126c0 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  es;.  return 0;.
126d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
126e0 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68  e seg-iter so th
126f0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
12700 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
12710 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e  on page iLeafPgn
12720 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65  o..** It is an e
12730 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65  rror if leaf iLe
12740 61 66 50 67 6e 6f 20 63 6f 6e 74 61 69 6e 73 20  afPgno contains 
12750 6e 6f 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61  no rowid..*/.sta
12760 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
12770 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20 20  IterGotoPage(.  
12780 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
127b0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
127c0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
127d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
127e0 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
127f0 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  ce */.  int iLea
12800 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72  fPgno.){.  asser
12810 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74  t( iLeafPgno>pIt
12820 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b  er->iLeafPgno );
12830 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  .  pIter->iLeafP
12840 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d  gno = iLeafPgno-
12850 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  1;.  fts5SegIter
12860 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
12870 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  r);.  assert( p-
12880 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
12890 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  | pIter->iLeafPg
128a0 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b  no==iLeafPgno );
128b0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
128c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
128d0 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 75 38  int iOff;.    u8
128e0 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
128f0 61 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 6e  af->p;.    int n
12900 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
12910 3e 6e 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20  >n;..    iOff = 
12920 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d  fts5GetU16(&a[0]
12930 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c  );.    if( iOff<
12940 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a  4 || iOff>=n ){.
12950 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
12960 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
12970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66  }else{.      iOf
12980 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  f += getVarint(&
12990 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
129a0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
129b0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
129c0 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
129d0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
129e0 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
129f0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
12a00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
12a10 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
12a20 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
12a30 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69  nd argument unti
12a40 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a  l it is at or .*
12a50 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72  * past rowid iFr
12a60 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  om. Regardless o
12a70 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  f the value of i
12a80 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74  From, the iterat
12a90 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  or is.** always 
12aa0 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73  advanced at leas
12ab0 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  t once..*/.stati
12ac0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
12ad0 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
12ae0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12b00 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
12b10 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
12b20 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
12b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
12b40 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
12b50 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68   */.  i64 iMatch
12b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b70 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
12b80 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61   iterator at lea
12b90 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29  st this far */.)
12ba0 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28  {.  int bRev = (
12bb0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
12bc0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
12bd0 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64  RSE);.  Fts5Dlid
12be0 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
12bf0 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20  pIter->pDlidx;. 
12c00 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d   int iLeafPgno =
12c10 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
12c20 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d  o;.  int bMove =
12c30 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   1;..  assert( p
12c40 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
12c50 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
12c60 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RM );.  assert( 
12c70 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b  pIter->pDlidx );
12c80 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
12c90 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66  ->pLeaf );..  if
12ca0 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
12cb0 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
12cc0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
12cd0 64 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68  dx)==0 && iMatch
12ce0 3e 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  >pDlidx->iRowid 
12cf0 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67  ){.      iLeafPg
12d00 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65  no = pDlidx->iLe
12d10 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74  afPgno;.      ft
12d20 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
12d30 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20  pDlidx);.    }. 
12d40 20 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66     assert( iLeaf
12d50 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno>=pIter->iLe
12d60 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20  afPgno || p->rc 
12d70 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66  );.    if( iLeaf
12d80 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
12d90 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66  fPgno ){.      f
12da0 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
12db0 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65  ge(p, pIter, iLe
12dc0 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62  afPgno);.      b
12dd0 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
12de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
12df0 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65  ert( iMatch<pIte
12e00 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  r->iRowid );.   
12e10 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
12e20 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
12e30 64 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68  dx)==0 && iMatch
12e40 3c 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  <pDlidx->iRowid 
12e50 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
12e60 64 78 49 74 65 72 50 72 65 76 28 70 44 6c 69 64  dxIterPrev(pDlid
12e70 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c  x);.    }.    iL
12e80 65 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64 78  eafPgno = pDlidx
12e90 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20  ->iLeafPgno;..  
12ea0 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c    assert( fts5Dl
12eb0 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
12ec0 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67  lidx) || iLeafPg
12ed0 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no<=pIter->iLeaf
12ee0 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28  Pgno );..    if(
12ef0 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72   iLeafPgno<pIter
12f00 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
12f10 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
12f20 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
12f30 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53  o+1;.      fts5S
12f40 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
12f50 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
12f60 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b        bMove = 0;
12f70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68  .    }.  }..  wh
12f80 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
12f90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
12fa0 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65 67   bMove ) fts5Seg
12fb0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
12fc0 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
12fd0 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
12fe0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
12ff0 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72  bRev==0 && pIter
13000 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68  ->iRowid>=iMatch
13010 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
13020 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74  ( bRev!=0 && pIt
13030 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74  er->iRowid<=iMat
13040 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
13050 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d  bMove = 1;.  }.}
13060 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  .../*.** Free th
13070 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
13080 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
13090 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
130a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
130b0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
130c0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
130d0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
130e0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
130f0 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
13100 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
13110 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
13120 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
13130 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49  SegIterClear(&pI
13140 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20  ter->aSeg[i]);. 
13150 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13160 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
13170 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
13180 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
13190 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e  vanced(.  Fts5In
131a0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
131b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
131c0 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
131d0 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
131e0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
131f0 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
13200 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
13210 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20  update aFirst[] 
13220 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69  array for */.  i
13230 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20  nt iChanged,    
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13250 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69  * Index of sub-i
13260 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76  terator just adv
13270 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
13280 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20 20  Minset          
13290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
132a0 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61  nimum entry in a
132b0 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a  First[] to set *
132c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
132d0 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53  for(i=(pIter->nS
132e0 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20  eg+iChanged)/2; 
132f0 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d  i>=iMinset && p-
13300 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
13310 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20  i=i/2){.    int 
13320 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45  iEq;.    if( (iE
13330 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
13340 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72  rDoCompare(pIter
13350 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 66  , i)) ){.      f
13360 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
13370 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  , &pIter->aSeg[i
13380 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Eq], 0);.      i
13390 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b   = pIter->nSeg +
133a0 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iEq;.    }.  }.
133b0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
133c0 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
133d0 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49  ceRowid(.  Fts5I
133e0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
133f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
13400 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
13410 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
13420 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
13430 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
13440 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
13450 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
13460 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
13470 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20 20  int iChanged    
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13490 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
134a0 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
134b0 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  vanced */.){.  i
134c0 6e 74 20 69 3b 0a 20 20 46 74 73 35 53 65 67 49  nt i;.  Fts5SegI
134d0 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74  ter *pNew = &pIt
134e0 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65  er->aSeg[iChange
134f0 64 5d 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65  d];.  Fts5SegIte
13500 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49 74  r *pOther = &pIt
13510 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65  er->aSeg[iChange
13520 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 0a 20 20  d ^ 0x0001];..  
13530 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53  for(i=(pIter->nS
13540 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20  eg+iChanged)/2; 
13550 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13560 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 46 74  ; i=i/2){.    Ft
13570 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
13580 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
13590 5b 69 5d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  [i];..    assert
135a0 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b  ( pNew->pLeaf );
135b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
135c0 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c  s->bTermEq==0 ||
135d0 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20 29   pOther->pLeaf )
135e0 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  ;.    .    if( p
135f0 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a  Res->bTermEq ){.
13600 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
13610 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e  iRowid==pOther->
13620 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
13630 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
13640 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74    }else if( (pOt
13650 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77  her->iRowid>pNew
13660 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
13670 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
13680 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b    pNew = pOther;
13690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
136a0 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20     pRes->iFirst 
136b0 3d 20 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d  = (pNew - pIter-
136c0 3e 61 53 65 67 29 3b 0a 20 20 20 20 69 66 28 20  >aSeg);.    if( 
136d0 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20  i==1 ) break;.. 
136e0 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74     pOther = &pIt
136f0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13700 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30  >aFirst[i ^ 0x00
13710 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  01].iFirst ];.  
13720 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
13730 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
13740 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65   iterator to the
13750 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a   next entry. .**
13760 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
13770 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
13780 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
13790 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
137a0 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e  t is not .** con
137b0 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72  sidered an error
137c0 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
137d0 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72   reaches EOF, or
137e0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
137f0 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65  y at .** EOF whe
13800 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
13810 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
13820 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
13830 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46  ltiIterNext(.  F
13840 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
13850 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
13860 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62   *pIter,.  int b
13870 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
13880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
13890 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  ue if argument i
138a0 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f  From is valid */
138b0 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20  .  i64 iFrom    
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74     /* Advance at
138e0 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61 73   least as far as
138f0 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66   this */.){.  if
13900 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
13910 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55  OK ){.    int bU
13920 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a  seFrom = bFrom;.
13930 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
13940 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74 65  nt iFirst = pIte
13950 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
13960 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  rst;.      int b
13970 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
13980 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13990 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
139a0 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20  Seg[iFirst];.   
139b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
139c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
139d0 20 20 20 20 20 69 66 28 20 62 55 73 65 46 72 6f       if( bUseFro
139e0 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64  m && pSeg->pDlid
139f0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  x ){.        fts
13a00 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d  5SegIterNextFrom
13a10 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29  (p, pSeg, iFrom)
13a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a30 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
13a40 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  erNext(p, pSeg, 
13a50 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20  &bNewTerm);.    
13a60 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
13a70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c  Seg->pLeaf==0 ||
13a80 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20   bNewTerm .     
13a90 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74    || fts5MultiIt
13aa0 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70  erAdvanceRowid(p
13ab0 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 29  , pIter, iFirst)
13ac0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
13ad0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
13ae0 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72  dvanced(p, pIter
13af0 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20  , iFirst, 1);.  
13b00 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
13b10 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
13b20 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a  etup(p, pIter);.
13b30 0a 20 20 20 20 20 20 62 55 73 65 46 72 6f 6d 20  .      bUseFrom 
13b40 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
13b50 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70   pIter->bSkipEmp
13b60 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49  ty && fts5MultiI
13b70 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49  terIsEmpty(p, pI
13b80 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ter) );.  }.}../
13b90 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
13ba0 6e 65 77 20 46 74 73 35 4d 75 6c 74 69 53 65 67  new Fts5MultiSeg
13bb0 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Iter object..**.
13bc0 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
13bd0 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
13be0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
13bf0 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63 74  h data in struct
13c00 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20  ure pStruct..** 
13c10 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65  If iLevel is -ve
13c20 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  , then all data 
13c30 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  in all segments 
13c40 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69  is merged. Or, i
13c50 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a  f iLevel.** is z
13c60 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20  ero or greater, 
13c70 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69  data from the fi
13c80 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67  rst nSegment seg
13c90 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69  ments on level i
13ca0 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67  Level.** is merg
13cb0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74  ed..**.** The it
13cc0 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79  erator initially
13cd0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
13ce0 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20  irst term/rowid 
13cf0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a  entry in the .**
13d00 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a   iterated data..
13d10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
13d20 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
13d30 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
13d60 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
13d70 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74  thin */.  Fts5St
13d80 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
13d90 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  ,         /* Str
13da0 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69 66  ucture of specif
13db0 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ic index */.  in
13dc0 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13de0 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20   Config.aHash[] 
13df0 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64  index of FTS ind
13e00 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69  ex */.  int bSki
13e10 70 45 6d 70 74 79 2c 20 20 20 20 20 20 20 20 20  pEmpty,         
13e20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
13e30 74 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65 74 65  to ignore delete
13e40 2d 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74 20 66  -keys */.  int f
13e50 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
13e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
13e70 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58  S5INDEX_QUERY_XX
13e80 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  X flags */.  con
13e90 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
13ea0 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
13eb0 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
13ec0 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20  (or NULL/0) */. 
13ed0 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20   int iLevel,    
13ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ef0 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65   /* Level to ite
13f00 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c  rate (-1 for all
13f10 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  ) */.  int nSegm
13f20 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
13f30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
13f40 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20   of segments to 
13f50 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30  merge (iLevel>=0
13f60 29 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69  ) */.  Fts5Multi
13f70 53 65 67 49 74 65 72 20 2a 2a 70 70 4f 75 74 20  SegIter **ppOut 
13f80 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
13f90 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ject */.){.  int
13fa0 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13fc0 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
13fd0 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a  t-iters in use *
13fe0 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 20 3d 20  /.  int nSlot = 
13ff0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14000 20 20 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20      /* Power of 
14010 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 20  two >= nSeg */. 
14020 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20   int iIter = 0; 
14030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14040 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65   /* */.  int iSe
14050 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
14060 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
14070 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
14080 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ugh segments */.
14090 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
140a0 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74  evel *pLvl;.  Ft
140b0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
140c0 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28  pNew;..  assert(
140d0 20 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54   (pTerm==0 && nT
140e0 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65  erm==0) || iLeve
140f0 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  l<0 );..  /* All
14100 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
14110 74 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65  the new multi-se
14120 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20  g-iterator. */. 
14130 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14140 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
14150 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
14160 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
14170 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74  ct->nSegment==ft
14180 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
14190 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74  Segments(pStruct
141a0 29 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20  ) );.      nSeg 
141b0 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  = pStruct->nSegm
141c0 65 6e 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20  ent;.      nSeg 
141d0 2b 3d 20 28 70 2d 3e 61 70 48 61 73 68 20 3f 20  += (p->apHash ? 
141e0 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  1 : 0);.    }els
141f0 65 7b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20  e{.      nSeg = 
14200 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65  MIN(pStruct->aLe
14210 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67  vel[iLevel].nSeg
14220 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  , nSegment);.   
14230 20 7d 0a 20 20 20 20 66 6f 72 28 6e 53 6c 6f 74   }.    for(nSlot
14240 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20  =2; nSlot<nSeg; 
14250 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a  nSlot=nSlot*2);.
14260 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20    }..  *ppOut = 
14270 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61  pNew = fts5IdxMa
14280 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73  lloc(p, .      s
14290 69 7a 65 6f 66 28 46 74 73 35 4d 75 6c 74 69 53  izeof(Fts5MultiS
142a0 65 67 49 74 65 72 29 20 2b 20 20 20 20 20 20 20  egIter) +       
142b0 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20     /* pNew */.  
142c0 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
142d0 65 67 49 74 65 72 29 20 2a 20 6e 53 6c 6f 74 20  egIter) * nSlot 
142e0 2b 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d  +       /* pNew-
142f0 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20  >aSeg[] */.     
14300 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65 73   sizeof(Fts5CRes
14310 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20  ult) * nSlot    
14320 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46       /* pNew->aF
14330 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20  irst[] */.  );. 
14340 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
14350 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 6e  eturn;.  pNew->n
14360 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 70  Seg = nSlot;.  p
14370 4e 65 77 2d 3e 61 53 65 67 20 3d 20 28 46 74 73  New->aSeg = (Fts
14380 35 53 65 67 49 74 65 72 2a 29 26 70 4e 65 77 5b  5SegIter*)&pNew[
14390 31 5d 3b 0a 20 20 70 4e 65 77 2d 3e 61 46 69 72  1];.  pNew->aFir
143a0 73 74 20 3d 20 28 46 74 73 35 43 52 65 73 75 6c  st = (Fts5CResul
143b0 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e  t*)&pNew->aSeg[n
143c0 53 6c 6f 74 5d 3b 0a 20 20 70 4e 65 77 2d 3e 62  Slot];.  pNew->b
143d0 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73  Rev = (0!=(flags
143e0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
143f0 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65  RY_DESC));.  pNe
14400 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20  w->bSkipEmpty = 
14410 62 53 6b 69 70 45 6d 70 74 79 3b 0a 0a 20 20 2f  bSkipEmpty;..  /
14420 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65 61 63  * Initialize eac
14430 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65  h of the compone
14440 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  nt segment itera
14450 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 69  tors. */.  if( i
14460 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 46  Level<0 ){.    F
14470 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
14480 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74 72 75  l *pEnd = &pStru
14490 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75  ct->aLevel[pStru
144a0 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20  ct->nLevel];.   
144b0 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 20 29   if( p->apHash )
144c0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61  {.      /* Add a
144d0 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
144e0 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  r for the curren
144f0 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
14500 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f  e hash table. */
14510 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
14520 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
14530 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
14540 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  ;.      fts5SegI
14550 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c 20 69  terHashInit(p, i
14560 49 64 78 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  Idx, pTerm, nTer
14570 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72 29  m, flags, pIter)
14580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
14590 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61  pLvl=&pStruct->a
145a0 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70  Level[0]; pLvl<p
145b0 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20  End; pLvl++){.  
145c0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76      for(iSeg=pLv
145d0 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e  l->nSeg-1; iSeg>
145e0 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20  =0; iSeg--){.   
145f0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
14600 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
14610 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
14620 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73  eg];.        Fts
14630 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
14640 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
14650 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  ter++];.        
14660 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a  if( pTerm==0 ){.
14670 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
14680 67 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64  gIterInit(p, iId
14690 78 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  x, pSeg, pIter);
146a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
146b0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
146c0 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c  gIterSeekInit(p,
146d0 20 69 49 64 78 2c 20 70 54 65 72 6d 2c 20 6e 54   iIdx, pTerm, nT
146e0 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67  erm, flags, pSeg
146f0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
14700 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14710 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
14720 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
14730 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a  aLevel[iLevel];.
14740 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65      for(iSeg=nSe
14750 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
14760 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73  eg--){.      fts
14770 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
14780 69 49 64 78 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  iIdx, &pLvl->aSe
14790 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e  g[iSeg], &pNew->
147a0 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a  aSeg[iIter++]);.
147b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
147c0 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20  rt( iIter==nSeg 
147d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
147e0 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73  above was succes
147f0 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f  sful, each compo
14800 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e  nent iterators n
14810 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20  ow points .  ** 
14820 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
14830 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e  ry in its segmen
14840 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
14850 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a  initialize the .
14860 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72    ** aFirst[] ar
14870 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ray. Or, if an e
14880 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
14890 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72  d, free the iter
148a0 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  ator.  ** object
148b0 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74   and set the out
148c0 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
148d0 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
148e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
148f0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65   ){.    for(iIte
14900 72 3d 6e 53 6c 6f 74 2d 31 3b 20 69 49 74 65 72  r=nSlot-1; iIter
14910 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20  >0; iIter--){.  
14920 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20      int iEq;.   
14930 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
14940 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
14950 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72  pare(pNew, iIter
14960 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  )) ){.        ft
14970 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
14980 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71   &pNew->aSeg[iEq
14990 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66  ], 0);.        f
149a0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
149b0 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45  nced(p, pNew, iE
149c0 71 2c 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20  q, iIter);.     
149d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73   }.    }.    fts
149e0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
149f0 53 65 74 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a  Setup(p, pNew);.
14a00 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 62  .    if( pNew->b
14a10 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66 74 73  SkipEmpty && fts
14a20 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
14a30 79 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20  y(p, pNew) ){.  
14a40 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
14a50 72 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c 20 30  rNext(p, pNew, 0
14a60 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
14a70 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c  lse{.    fts5Mul
14a80 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 4e  tiIterFree(p, pN
14a90 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20  ew);.    *ppOut 
14aa0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
14ab0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
14ac0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
14ad0 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e   at EOF or if an
14ae0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
14af0 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f  red. .** False o
14b00 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
14b10 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
14b20 69 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  iIterEof(Fts5Ind
14b30 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69  ex *p, Fts5Multi
14b40 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
14b50 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63  .  return (p->rc
14b60 20 7c 7c 20 70 49 74 65 72 2d 3e 61 53 65 67 5b   || pIter->aSeg[
14b70 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
14b80 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
14b90 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ==0);.}../*.** R
14ba0 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20  eturn the rowid 
14bb0 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  of the entry tha
14bc0 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
14bd0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a  urrently points.
14be0 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74  ** to. If the it
14bf0 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
14c00 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66   EOF when this f
14c10 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
14c20 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  d the.** results
14c30 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a   are undefined..
14c40 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  */.static i64 ft
14c50 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
14c60 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65  (Fts5MultiSegIte
14c70 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
14c80 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67  ert( pIter->aSeg
14c90 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
14ca0 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61  1].iFirst ].pLea
14cb0 66 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  f );.  return pI
14cc0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
14cd0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
14ce0 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a  st ].iRowid;.}..
14cf0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
14d00 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
14d10 65 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20  ext entry at or 
14d20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68  following iMatch
14d30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14d40 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
14d50 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e  xtFrom(.  Fts5In
14d60 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 4d  dex *p, .  Fts5M
14d70 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
14d80 65 72 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63  er, .  i64 iMatc
14d90 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20  h.){.  while( 1 
14da0 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
14db0 64 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  d;.    fts5Multi
14dc0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
14dd0 72 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20  r, 1, iMatch);. 
14de0 20 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69     if( fts5Multi
14df0 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
14e00 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  ) ) break;.    i
14e10 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74  Rowid = fts5Mult
14e20 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
14e30 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
14e40 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f  ->bRev==0 && iRo
14e50 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
14e60 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74  eak;.    if( pIt
14e70 65 72 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69  er->bRev!=0 && i
14e80 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20  Rowid<=iMatch ) 
14e90 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
14ea0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
14eb0 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
14ec0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
14ed0 74 65 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20  term associated 
14ee0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74  with the .** ent
14ef0 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ry that the iter
14f00 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  ator currently p
14f10 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  oints to..*/.sta
14f20 74 69 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74  tic const u8 *ft
14f30 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
14f40 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
14f50 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e   *pIter, int *pn
14f60 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
14f70 20 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   *p = &pIter->aS
14f80 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
14f90 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
14fa0 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e   *pn = p->term.n
14fb0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65  ;.  return p->te
14fc0 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rm.p;.}../*.** R
14fd0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
14fe0 65 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f 72  e chunk iterator
14ff0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
15000 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
15010 73 0a 2a 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20  s.** at EOF. Or 
15020 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
15030 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
15040 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74  . Otherwise, ret
15050 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74  urn false..*/.st
15060 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 68 75  atic int fts5Chu
15070 6e 6b 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  nkIterEof(Fts5In
15080 64 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e  dex *p, Fts5Chun
15090 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  kIter *pIter){. 
150a0 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c   return (p->rc |
150b0 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  | pIter->pLeaf==
150c0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  0);.}../*.** Adv
150d0 61 6e 63 65 20 74 68 65 20 63 68 75 6e 6b 2d 69  ance the chunk-i
150e0 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
150f0 65 78 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74  ext chunk of dat
15100 61 20 74 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74  a to read..*/.st
15110 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68  atic void fts5Ch
15120 75 6e 6b 49 74 65 72 4e 65 78 74 28 46 74 73 35  unkIterNext(Fts5
15130 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 43 68  Index *p, Fts5Ch
15140 75 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b  unkIter *pIter){
15150 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
15160 2d 3e 6e 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e  ->nRem>=pIter->n
15170 20 29 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65   );.  pIter->nRe
15180 6d 20 2d 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20  m -= pIter->n;. 
15190 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
151a0 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
151b0 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
151c0 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d   0;.  pIter->p =
151d0 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d   0;.  if( pIter-
151e0 3e 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46  >nRem>0 ){.    F
151f0 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a  ts5Data *pLeaf;.
15200 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
15210 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65  Rowid++;.    pLe
15220 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
15230 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
15240 28 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  (p, pIter->iLeaf
15250 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  Rowid);.    if( 
15260 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  pLeaf ){.      p
15270 49 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49  Iter->n = MIN(pI
15280 74 65 72 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66  ter->nRem, pLeaf
15290 2d 3e 6e 2d 34 29 3b 0a 20 20 20 20 20 20 70 49  ->n-4);.      pI
152a0 74 65 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e  ter->p = pLeaf->
152b0 70 2b 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  p+4;.    }.  }.}
152c0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a  ../*.** Intializ
152d0 65 20 74 68 65 20 63 68 75 6e 6b 20 69 74 65 72  e the chunk iter
152e0 61 74 6f 72 20 74 6f 20 72 65 61 64 20 74 68 65  ator to read the
152f0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
15300 61 74 61 20 66 6f 72 20 77 68 69 63 68 20 0a 2a  ata for which .*
15310 2a 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64  * the size field
15320 20 69 73 20 61 74 20 6f 66 66 73 65 74 20 69 4f   is at offset iO
15330 66 66 20 6f 66 20 6c 65 61 66 20 70 4c 65 61 66  ff of leaf pLeaf
15340 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
15350 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49  d fts5ChunkIterI
15360 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
15370 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15380 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
15390 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
153a0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
153b0 70 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20  pSeg,           
153c0 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74     /* Segment it
153d0 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70  erator to read p
153e0 6f 73 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20  oslist from */. 
153f0 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a   Fts5ChunkIter *
15400 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
15410 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
15420 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
15430 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
15440 61 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66  af = pSeg->pLeaf
15450 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70  ;.  int iOff = p
15460 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
15470 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ;..  memset(pIte
15480 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
15490 74 65 72 29 29 3b 0a 20 20 2f 2a 20 49 66 20 46  ter));.  /* If F
154a0 74 73 35 53 65 67 49 74 65 72 2e 70 53 65 67 20  ts5SegIter.pSeg 
154b0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
154c0 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72  is iterator iter
154d0 61 74 65 73 20 74 68 72 6f 75 67 68 20 64 61 74  ates through dat
154e0 61 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c 79  a.  ** currently
154f0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 68 61 73   stored in a has
15500 68 20 74 61 62 6c 65 2e 20 49 6e 20 74 68 69 73  h table. In this
15510 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e   case there is n
15520 6f 20 6c 65 61 66 2d 72 6f 77 69 64 0a 20 20 2a  o leaf-rowid.  *
15530 2a 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 2e 20  * to calculate. 
15540 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 67 2d 3e   */.  if( pSeg->
15550 70 53 65 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  pSeg ){.    int 
15560 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67  iId = pSeg->pSeg
15570 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 69 36  ->iSegid;.    i6
15580 34 20 72 6f 77 69 64 20 3d 20 46 54 53 35 5f 53  4 rowid = FTS5_S
15590 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
155a0 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20 30 2c  g->iIdx, iId, 0,
155b0 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f   pSeg->iLeafPgno
155c0 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
155d0 65 61 66 52 6f 77 69 64 20 3d 20 72 6f 77 69 64  eafRowid = rowid
155e0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74  ;.  }..  fts5Dat
155f0 61 52 65 66 65 72 65 6e 63 65 28 70 4c 65 61 66  aReference(pLeaf
15600 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
15610 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20 70 49 74  f = pLeaf;.  pIt
15620 65 72 2d 3e 6e 52 65 6d 20 3d 20 70 53 65 67 2d  er->nRem = pSeg-
15630 3e 6e 50 6f 73 3b 0a 20 20 70 49 74 65 72 2d 3e  >nPos;.  pIter->
15640 6e 20 3d 20 4d 49 4e 28 70 4c 65 61 66 2d 3e 6e  n = MIN(pLeaf->n
15650 20 2d 20 69 4f 66 66 2c 20 70 49 74 65 72 2d 3e   - iOff, pIter->
15660 6e 52 65 6d 29 3b 0a 20 20 70 49 74 65 72 2d 3e  nRem);.  pIter->
15670 70 20 3d 20 70 4c 65 61 66 2d 3e 70 20 2b 20 69  p = pLeaf->p + i
15680 4f 66 66 3b 0a 20 20 69 66 28 20 70 49 74 65 72  Off;.  if( pIter
15690 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  ->n==0 ){.    ft
156a0 73 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28  s5ChunkIterNext(
156b0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
156c0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
156d0 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61  s5ChunkIterRelea
156e0 73 65 28 46 74 73 35 43 68 75 6e 6b 49 74 65 72  se(Fts5ChunkIter
156f0 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35   *pIter){.  fts5
15700 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
15710 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74  r->pLeaf);.  pIt
15720 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d  er->pLeaf = 0;.}
15730 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
15740 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
15750 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  id for the struc
15760 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
15770 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a  e new segment.**
15780 20 69 64 20 6d 75 73 74 20 62 65 20 62 65 74 77   id must be betw
15790 65 65 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20  een 1 and 65335 
157a0 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d  inclusive, and m
157b0 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20  ust not be used 
157c0 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65  by .** any curre
157d0 6e 74 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65  ntly existing se
157e0 67 6d 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65  gment. If a free
157f0 20 73 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e   segment id cann
15800 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  ot be found,.** 
15810 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72  SQLITE_FULL is r
15820 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
15830 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
15840 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
15850 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
15860 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20  s a no-op. 0 is 
15870 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
15880 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
15890 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c  atic int fts5All
158a0 6f 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49  ocateSegid(Fts5I
158b0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72  ndex *p, Fts5Str
158c0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
158d0 7b 0a 20 20 75 33 32 20 69 53 65 67 69 64 20 3d  {.  u32 iSegid =
158e0 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
158f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15900 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
15910 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d  nSegment>=FTS5_M
15920 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
15930 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
15940 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TE_FULL;.    }el
15950 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  se{.      while(
15960 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
15970 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20        int iLvl, 
15980 69 53 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71  iSeg;.        sq
15990 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
159a0 28 73 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76  (sizeof(u32), (v
159b0 6f 69 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20  oid*)&iSegid);. 
159c0 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20         iSegid = 
159d0 28 69 53 65 67 69 64 20 25 20 28 28 31 20 3c 3c  (iSegid % ((1 <<
159e0 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29   FTS5_DATA_ID_B)
159f0 20 2d 20 32 29 29 20 2b 20 31 3b 0a 20 20 20 20   - 2)) + 1;.    
15a00 20 20 20 20 61 73 73 65 72 74 28 20 69 53 65 67      assert( iSeg
15a10 69 64 3e 30 20 26 26 20 69 53 65 67 69 64 3c 3d  id>0 && iSegid<=
15a20 36 35 35 33 35 20 29 3b 0a 20 20 20 20 20 20 20  65535 );.       
15a30 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
15a40 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
15a50 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
15a60 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
15a70 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
15a80 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
15a90 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
15aa0 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 67          if( iSeg
15ab0 69 64 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65  id==pStruct->aLe
15ac0 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
15ad0 53 65 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20  Seg].iSegid ){. 
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 53 65               iSe
15af0 67 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gid = 0;.       
15b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15b10 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
15b20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15b30 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 69 53    return (int)iS
15b40 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  egid;.}../*.** D
15b50 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20  iscard all data 
15b60 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
15b70 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62   in the hash-tab
15b80 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
15b90 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44 69 73  oid fts5IndexDis
15ba0 63 61 72 64 44 61 74 61 28 46 74 73 35 49 6e 64  cardData(Fts5Ind
15bb0 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ex *p){.  assert
15bc0 28 20 70 2d 3e 61 70 48 61 73 68 20 7c 7c 20 70  ( p->apHash || p
15bd0 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d  ->nPendingData==
15be0 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  0 );.  if( p->ap
15bf0 48 61 73 68 20 29 7b 0a 20 20 20 20 46 74 73 35  Hash ){.    Fts5
15c00 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
15c10 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
15c20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
15c30 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67  (i=0; i<=pConfig
15c40 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b  ->nPrefix; i++){
15c50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
15c60 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 61  s5HashClear(p->a
15c70 70 48 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 7d  pHash[i]);.    }
15c80 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
15c90 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Data = 0;.  }.}.
15ca0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
15cb0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72  e size of the pr
15cc0 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c 20  efix, in bytes, 
15cd0 74 68 61 74 20 62 75 66 66 65 72 20 28 6e 4e 65  that buffer (nNe
15ce0 77 2f 70 4e 65 77 29 20 73 68 61 72 65 73 0a 2a  w/pNew) shares.*
15cf0 2a 20 77 69 74 68 20 62 75 66 66 65 72 20 28 6e  * with buffer (n
15d00 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74  Old/pOld)..*/.st
15d10 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 72 65  atic int fts5Pre
15d20 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 69  fixCompress(.  i
15d30 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75  nt nOld, const u
15d40 38 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e  8 *pOld,.  int n
15d50 4e 65 77 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  New, const u8 *p
15d60 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  New.){.  int i;.
15d70 20 20 61 73 73 65 72 74 28 20 66 74 73 35 42 6c    assert( fts5Bl
15d80 6f 62 43 6f 6d 70 61 72 65 28 70 4f 6c 64 2c 20  obCompare(pOld, 
15d90 6e 4f 6c 64 2c 20 70 4e 65 77 2c 20 6e 4e 65 77  nOld, pNew, nNew
15da0 29 3c 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  )<0 );.  for(i=0
15db0 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
15dc0 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21      if( pOld[i]!
15dd0 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b  =pNew[i] ) break
15de0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
15df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  ;.}../*.** If an
15e00 20 22 6e 45 6d 70 74 79 22 20 72 65 63 6f 72 64   "nEmpty" record
15e10 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
15e20 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 62   to the b-tree b
15e30 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 0a 2a  efore the next.*
15e40 2a 20 74 65 72 6d 2c 20 77 72 69 74 65 20 69 74  * term, write it
15e50 20 6e 6f 77 2e 20 0a 2a 2f 0a 73 74 61 74 69 63   now. .*/.static
15e60 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
15e70 74 72 65 65 4e 45 6d 70 74 79 28 46 74 73 35 49  treeNEmpty(Fts5I
15e80 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
15e90 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
15ea0 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  {.  if( pWriter-
15eb0 3e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 69  >nEmpty ){.    i
15ec0 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20  nt bFlag = 0;.  
15ed0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
15ee0 20 2a 70 50 67 3b 0a 20 20 20 20 70 50 67 20 3d   *pPg;.    pPg =
15ef0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
15f00 65 72 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70  er[1];.    if( p
15f10 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d  Writer->nEmpty>=
15f20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
15f30 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 69 36 34  IZE ){.      i64
15f40 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 44 4f 43   iKey = FTS5_DOC
15f50 4c 49 53 54 5f 49 44 58 5f 52 4f 57 49 44 28 0a  LIST_IDX_ROWID(.
15f60 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65            pWrite
15f70 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72  r->iIdx, pWriter
15f80 2d 3e 69 53 65 67 69 64 2c 20 0a 20 20 20 20 20  ->iSegid, .     
15f90 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 57       pWriter->aW
15fa0 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 2d 20  riter[0].pgno - 
15fb0 31 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  1 - pWriter->nEm
15fc0 70 74 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  pty.      );.   
15fd0 20 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74     assert( pWrit
15fe0 65 72 2d 3e 63 64 6c 69 64 78 2e 6e 3e 30 20 29  er->cdlidx.n>0 )
15ff0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
16000 57 72 69 74 65 28 70 2c 20 69 4b 65 79 2c 20 70  Write(p, iKey, p
16010 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2e 70  Writer->cdlidx.p
16020 2c 20 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64  , pWriter->cdlid
16030 78 2e 6e 29 3b 0a 20 20 20 20 20 20 62 46 6c 61  x.n);.      bFla
16040 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
16050 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
16060 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
16070 26 70 50 67 2d 3e 62 75 66 2c 20 62 46 6c 61 67  &pPg->buf, bFlag
16080 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
16090 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
160a0 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c  ->rc, &pPg->buf,
160b0 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
160c0 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  );.    pWriter->
160d0 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  nEmpty = 0;.  }.
160e0 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72  .  /* Whether or
160f0 20 6e 6f 74 20 69 74 20 77 61 73 20 77 72 69 74   not it was writ
16100 74 65 6e 20 74 6f 20 64 69 73 6b 2c 20 7a 65 72  ten to disk, zer
16110 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 6e  o the doclist in
16120 64 65 78 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  dex at this.  **
16130 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 73 71 6c 69   point */.  sqli
16140 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72  te3Fts5BufferZer
16150 6f 28 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69  o(&pWriter->cdli
16160 64 78 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  dx);.  pWriter->
16170 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 20  bDlidxPrevValid 
16180 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  = 0;.}..static v
16190 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
161a0 65 65 47 72 6f 77 28 46 74 73 35 49 6e 64 65 78  eeGrow(Fts5Index
161b0 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
161c0 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
161d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
161e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
161f0 50 61 67 65 57 72 69 74 65 72 20 2a 61 4e 65 77  PageWriter *aNew
16200 3b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  ;.    Fts5PageWr
16210 69 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20  iter *pNew;.    
16220 69 6e 74 20 6e 4e 65 77 20 3d 20 73 69 7a 65 6f  int nNew = sizeo
16230 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72  f(Fts5PageWriter
16240 29 20 2a 20 28 70 57 72 69 74 65 72 2d 3e 6e 57  ) * (pWriter->nW
16250 72 69 74 65 72 2b 31 29 3b 0a 0a 20 20 20 20 61  riter+1);..    a
16260 4e 65 77 20 3d 20 28 46 74 73 35 50 61 67 65 57  New = (Fts5PageW
16270 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72  riter*)sqlite3_r
16280 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e  ealloc(pWriter->
16290 61 57 72 69 74 65 72 2c 20 6e 4e 65 77 29 3b 0a  aWriter, nNew);.
162a0 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
162b0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
162c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
162d0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
162e0 20 7d 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 26   }..    pNew = &
162f0 61 4e 65 77 5b 70 57 72 69 74 65 72 2d 3e 6e 57  aNew[pWriter->nW
16300 72 69 74 65 72 5d 3b 0a 20 20 20 20 6d 65 6d 73  riter];.    mems
16310 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
16320 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65  of(Fts5PageWrite
16330 72 29 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  r));.    pNew->p
16340 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 66 74 73  gno = 1;.    fts
16350 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
16360 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 4e 65  int(&p->rc, &pNe
16370 77 2d 3e 62 75 66 2c 20 31 29 3b 0a 0a 20 20 20  w->buf, 1);..   
16380 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65   pWriter->nWrite
16390 72 2b 2b 3b 0a 20 20 20 20 70 57 72 69 74 65 72  r++;.    pWriter
163a0 2d 3e 61 57 72 69 74 65 72 20 3d 20 61 4e 65 77  ->aWriter = aNew
163b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
163c0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  his is called on
163d0 63 65 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66  ce for each leaf
163e0 20 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65   page except the
163f0 20 66 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74   first that cont
16400 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74  ains.** at least
16410 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d   one term. Argum
16420 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d  ent (nTerm/pTerm
16430 29 20 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b  ) is the split-k
16440 65 79 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74  ey - a term that
16450 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68  .** is larger th
16460 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69  an all terms wri
16470 74 74 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20  tten to earlier 
16480 6c 65 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61  leaves, and equa
16490 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c  l to or.** small
164a0 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73  er than the firs
164b0 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65  t term on the ne
164c0 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66  w leaf..**.** If
164d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
164e0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
164f0 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49  is left in Fts5I
16500 6e 64 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65  ndex.rc. If an e
16510 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65  rror.** has alre
16520 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
16530 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
16540 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
16550 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
16560 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
16570 74 65 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46  teBtreeTerm(.  F
16580 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
165a0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
165b0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
165c0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
165d0 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r,         /* Wr
165e0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
165f0 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73   int nTerm, cons
16600 74 20 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20  t u8 *pTerm     
16610 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f   /* First term o
16620 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b  n new page */.){
16630 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 3b 0a  .  int iHeight;.
16640 20 20 66 6f 72 28 69 48 65 69 67 68 74 3d 31 3b    for(iHeight=1;
16650 20 31 3b 20 69 48 65 69 67 68 74 2b 2b 29 7b 0a   1; iHeight++){.
16660 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
16670 65 72 20 2a 70 50 61 67 65 3b 0a 0a 20 20 20 20  er *pPage;..    
16680 69 66 28 20 69 48 65 69 67 68 74 3e 3d 70 57 72  if( iHeight>=pWr
16690 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 29 7b  iter->nWriter ){
166a0 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
166b0 42 74 72 65 65 47 72 6f 77 28 70 2c 20 70 57 72  BtreeGrow(p, pWr
166c0 69 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  iter);.      if(
166d0 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
166e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
166f0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
16700 69 74 65 72 5b 69 48 65 69 67 68 74 5d 3b 0a 0a  iter[iHeight];..
16710 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
16720 65 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72 69  eeNEmpty(p, pWri
16730 74 65 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ter);..    if( p
16740 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e  Page->buf.n>=p->
16750 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
16760 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
16770 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20  will be written 
16780 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 74 65 72  to disk. The ter
16790 6d 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65  m will be writte
167a0 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  n into the.     
167b0 20 2a 2a 20 70 61 72 65 6e 74 20 6f 66 20 70 50   ** parent of pP
167c0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  age.  */.      i
167d0 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
167e0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a  _SEGMENT_ROWID(.
167f0 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65            pWrite
16800 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72  r->iIdx, pWriter
16810 2d 3e 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  ->iSegid, iHeigh
16820 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  t, pPage->pgno. 
16830 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74       );.      ft
16840 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69  s5DataWrite(p, i
16850 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75  Rowid, pPage->bu
16860 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  f.p, pPage->buf.
16870 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  n);.      fts5Bu
16880 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d  fferZero(&pPage-
16890 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 66 74 73  >buf);.      fts
168a0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
168b0 67 65 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 20  ge->term);.     
168c0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
168d0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
168e0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61  &pPage->buf, pPa
168f0 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20  ge[-1].pgno);.  
16900 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b      pPage->pgno+
16910 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
16920 20 20 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 66      int nPre = f
16930 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
16940 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c  s(pPage->term.n,
16950 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
16960 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
16970 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
16980 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
16990 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
169a0 20 6e 50 72 65 2b 32 29 3b 0a 20 20 20 20 20 20   nPre+2);.      
169b0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
169c0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
169d0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
169e0 6d 2d 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66  m-nPre);.      f
169f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
16a00 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
16a10 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2d 6e  ge->buf, nTerm-n
16a20 50 72 65 2c 20 70 54 65 72 6d 2b 6e 50 72 65 29  Pre, pTerm+nPre)
16a30 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
16a40 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
16a50 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72  Page->term, nTer
16a60 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
16a70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
16a80 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
16a90 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
16aa0 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  oTerm(.  Fts5Ind
16ab0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
16ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
16ad0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
16ae0 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
16af0 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20  er *pWriter     
16b00 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
16b10 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 66  bject */.){.  if
16b20 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
16b30 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
16b40 20 20 20 20 2f 2a 20 4e 6f 20 72 6f 77 69 64 73      /* No rowids
16b50 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 41   on this page. A
16b60 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79  ppend an 0x00 by
16b70 74 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  te to the curren
16b80 74 20 0a 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73  t .    ** doclis
16b90 74 2d 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  t-index */.    i
16ba0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69  f( pWriter->bDli
16bb0 64 78 50 72 65 76 56 61 6c 69 64 3d 3d 30 20 29  dxPrevValid==0 )
16bc0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
16bd0 69 64 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 50  id = pWriter->iP
16be0 72 65 76 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  revRowid;.      
16bf0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
16c00 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
16c10 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e  ->rc, &pWriter->
16c20 63 64 6c 69 64 78 2c 20 69 52 6f 77 69 64 29 3b  cdlidx, iRowid);
16c30 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
16c40 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 20  bDlidxPrevValid 
16c50 3d 20 31 3b 0a 20 20 20 20 20 20 70 57 72 69 74  = 1;.      pWrit
16c60 65 72 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 3d  er->iDlidxPrev =
16c70 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 20   iRowid;.    }. 
16c80 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
16c90 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
16ca0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
16cb0 72 2d 3e 63 64 6c 69 64 78 2c 20 30 29 3b 0a 20  r->cdlidx, 0);. 
16cc0 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45   }.  pWriter->nE
16cd0 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpty++;.}../*.**
16ce0 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61   Rowid iRowid ha
16cf0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65  s just been appe
16d00 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
16d10 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 41  ent leaf page. A
16d20 73 20 69 74 20 69 73 0a 2a 2a 20 74 68 65 20 66  s it is.** the f
16d30 69 72 73 74 20 6f 6e 20 69 74 73 20 70 61 67 65  irst on its page
16d40 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 6e 74 72  , append an entr
16d50 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  y to the current
16d60 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a   doclist-index..
16d70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
16d80 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
16d90 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  end(.  Fts5Index
16da0 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
16db0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
16dc0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
16dd0 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 69  .  i64 iVal;.  i
16de0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69  f( pWriter->bDli
16df0 64 78 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20  dxPrevValid ){. 
16e00 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
16e10 20 2d 20 70 57 72 69 74 65 72 2d 3e 69 44 6c 69   - pWriter->iDli
16e20 64 78 50 72 65 76 3b 0a 20 20 7d 65 6c 73 65 7b  dxPrev;.  }else{
16e30 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
16e40 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
16e50 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  nt(&p->rc, &pWri
16e60 74 65 72 2d 3e 63 64 6c 69 64 78 2c 20 69 52 6f  ter->cdlidx, iRo
16e70 77 69 64 29 3b 0a 20 20 20 20 69 56 61 6c 20 3d  wid);.    iVal =
16e80 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
16e90 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
16ea0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
16eb0 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78  &pWriter->cdlidx
16ec0 2c 20 69 56 61 6c 29 3b 0a 20 20 70 57 72 69 74  , iVal);.  pWrit
16ed0 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61  er->bDlidxPrevVa
16ee0 6c 69 64 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  lid = 1;.  pWrit
16ef0 65 72 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 3d  er->iDlidxPrev =
16f00 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61 74   iRowid;.}..stat
16f10 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
16f20 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49  eFlushLeaf(Fts5I
16f30 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
16f40 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
16f50 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
16f60 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30   u8 zero[] = { 0
16f70 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
16f80 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50   0x00 };.  Fts5P
16f90 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
16fa0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
16fb0 69 74 65 72 5b 30 5d 3b 0a 20 20 69 36 34 20 69  iter[0];.  i64 i
16fc0 52 6f 77 69 64 3b 0a 0a 20 20 69 66 28 20 70 57  Rowid;..  if( pW
16fd0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
16fe0 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f  mInPage ){.    /
16ff0 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77 72  * No term was wr
17000 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70 61  itten to this pa
17010 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
17020 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36  t( 0==fts5GetU16
17030 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32  (&pPage->buf.p[2
17040 5d 29 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72  ]) );.    fts5Wr
17050 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70  iteBtreeNoTerm(p
17060 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
17070 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
17080 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
17090 74 68 65 20 64 62 2e 20 2a 2f 0a 20 20 69 52 6f  the db. */.  iRo
170a0 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
170b0 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
170c0 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72 2d  ->iIdx, pWriter-
170d0 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 50 61 67  >iSegid, 0, pPag
170e0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35  e->pgno);.  fts5
170f0 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f  DataWrite(p, iRo
17100 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  wid, pPage->buf.
17110 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  p, pPage->buf.n)
17120 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
17130 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ze the next page
17140 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
17150 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75  rZero(&pPage->bu
17160 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  f);.  fts5Buffer
17170 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
17180 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
17190 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67  4, zero);.  pPag
171a0 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a  e->pgno++;..  /*
171b0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6c 65   Increase the le
171c0 61 76 65 73 20 77 72 69 74 74 65 6e 20 63 6f 75  aves written cou
171d0 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72 69 74 65  nter */.  pWrite
171e0 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b  r->nLeafWritten+
171f0 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77  +;..  /* The new
17200 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74   leaf holds no t
17210 65 72 6d 73 20 6f 72 20 72 6f 77 69 64 73 20 2a  erms or rowids *
17220 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  /.  pWriter->bFi
17230 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
17240 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  1;.  pWriter->bF
17250 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
17260 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  = 1;.}../*.** Ap
17270 70 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d 2f  pend term pTerm/
17280 6e 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67  nTerm to the seg
17290 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74 74  ment being writt
172a0 65 6e 20 62 79 20 74 68 65 20 77 72 69 74 65 72  en by the writer
172b0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
172c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
172d0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
172e0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
172f0 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72   the Fts5Index.r
17300 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  c error code. If
17310 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
17320 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
17330 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
17340 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
17350 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17360 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
17370 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
17380 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
17390 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
173a0 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20  nt nTerm, const 
173b0 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20  u8 *pTerm .){.  
173c0 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20  int nPrefix;    
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65 66  /* Bytes of pref
173f0 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66  ix compression f
17400 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73  or term */.  Fts
17410 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
17420 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  ge = &pWriter->a
17430 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 61 73  Writer[0];..  as
17440 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66  sert( pPage->buf
17450 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  .n==0 || pPage->
17460 62 75 66 2e 6e 3e 34 20 29 3b 0a 20 20 69 66 28  buf.n>4 );.  if(
17470 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30   pPage->buf.n==0
17480 20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20   ){.    /* Zero 
17490 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 61  the first term a
174a0 6e 64 20 66 69 72 73 74 20 64 6f 63 69 64 20 66  nd first docid f
174b0 69 65 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74 61  ields */.    sta
174c0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
174d0 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78  o[] = { 0x00, 0x
174e0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d  00, 0x00, 0x00 }
174f0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
17500 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
17510 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
17520 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61 73  4, zero);.    as
17530 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 62  sert( pWriter->b
17540 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
17550 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
17560 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 0a  rc ) return;.  .
17570 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
17580 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
17590 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ){.    /* Update
175a0 20 74 68 65 20 22 66 69 72 73 74 20 74 65 72 6d   the "first term
175b0 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  " field of the p
175c0 61 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  age header. */. 
175d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
175e0 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26  ->buf.p[2]==0 &&
175f0 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d   pPage->buf.p[3]
17600 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 50  ==0 );.    fts5P
17610 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  utU16(&pPage->bu
17620 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62  f.p[2], pPage->b
17630 75 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65 66  uf.n);.    nPref
17640 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ix = 0;.    if( 
17650 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29  pPage->pgno!=1 )
17660 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
17670 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
17680 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74  m on a leaf that
17690 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74   is not the left
176a0 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20  most leaf in.   
176b0 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e     ** the segmen
176c0 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69  t b-tree. In thi
176d0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63  s case it is nec
176e0 65 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20  essary to add a 
176f0 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a  term to.      **
17700 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
17710 61 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61  archy that is (a
17720 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  ) larger than th
17730 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a  e largest term .
17740 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
17750 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
17760 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20  segment and (b) 
17770 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20  smaller than or 
17780 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a  equal to.      *
17790 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20  * this term. In 
177a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70  other words, a p
177b0 72 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f  refix of (pTerm/
177c0 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f  nTerm) that is o
177d0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  ne.      ** byte
177e0 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65   longer than the
177f0 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20   longest prefix 
17800 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68  (pTerm/nTerm) sh
17810 61 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20  ares with the.  
17820 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
17830 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  term. .      **.
17840 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79        ** Usually
17850 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  , the previous t
17860 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65  erm is available
17870 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e   in pPage->term.
17880 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20   The exception. 
17890 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68       ** is if th
178a0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
178b0 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20  term written in 
178c0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d  an incremental-m
178d0 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20  erge step..     
178e0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
178f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
17900 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  rm is not availa
17910 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69  ble, so just wri
17920 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  te a.      ** co
17930 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65  py of (pTerm/nTe
17940 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72  rm) into the par
17950 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69  ent node. This i
17960 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20  s slightly.     
17970 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c   ** inefficient,
17980 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65   but still corre
17990 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ct.  */.      in
179a0 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20  t n = nTerm;.   
179b0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65     if( pPage->te
179c0 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  rm.n ){.        
179d0 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66  n = 1 + fts5Pref
179e0 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65  ixCompress(pPage
179f0 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d  ->term.n, pPage-
17a00 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20  >term.p, nTerm, 
17a10 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  pTerm);.      }.
17a20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42        fts5WriteB
17a30 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69  treeTerm(p, pWri
17a40 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a  ter, n, pTerm);.
17a50 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70        pPage = &p
17a60 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
17a70 30 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0];.    }.  }els
17a80 65 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  e{.    nPrefix =
17a90 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
17aa0 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e  ess(pPage->term.
17ab0 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70  n, pPage->term.p
17ac0 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
17ad0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
17ae0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
17af0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
17b00 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a   nPrefix);.  }..
17b10 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
17b20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
17b30 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65  of new data, the
17b40 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20  n the term data 
17b50 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74  itself.  ** to t
17b60 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  he page. */.  ft
17b70 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
17b80 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
17b90 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
17ba0 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74  - nPrefix);.  ft
17bb0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
17bc0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
17bd0 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
17be0 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b  nPrefix, &pTerm[
17bf0 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a  nPrefix]);..  /*
17c00 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
17c10 50 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20  PageWriter.term 
17c20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35  field. */.  fts5
17c30 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
17c40 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
17c50 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
17c60 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
17c70 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a  TermInPage = 0;.
17c80 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
17c90 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
17ca0 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  0;.  pWriter->bF
17cb0 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
17cc0 73 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66  st = 1;..  /* If
17cd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
17ce0 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20  f page is full, 
17cf0 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b  flush it to disk
17d00 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  . */.  if( pPage
17d10 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e  ->buf.n>=p->pCon
17d20 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
17d30 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
17d40 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
17d50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  .  }.}../*.** Ap
17d60 70 65 6e 64 20 61 20 64 6f 63 69 64 20 61 6e 64  pend a docid and
17d70 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
17d80 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65  ize field to the
17d90 20 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e   writers output.
17da0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
17db0 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
17dc0 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64  Rowid(.  Fts5Ind
17dd0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
17de0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
17df0 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0a  ,.  i64 iRowid,.
17e00 20 20 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20 20    int nPos.){.  
17e10 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17e20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
17e30 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
17e40 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  e = &pWriter->aW
17e50 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 2f  riter[0];..    /
17e60 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 6f 20  * If this is to 
17e70 62 65 20 74 68 65 20 66 69 72 73 74 20 64 6f 63  be the first doc
17e80 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  id written to th
17e90 65 20 70 61 67 65 2c 20 73 65 74 20 74 68 65 20  e page, set the 
17ea0 0a 20 20 20 20 2a 2a 20 64 6f 63 69 64 2d 70 6f  .    ** docid-po
17eb0 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
17ec0 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61  e-header. Also a
17ed0 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f  ppend a value to
17ee0 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a   the dlidx.    *
17ef0 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73  * buffer, in cas
17f00 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  e a doclist-inde
17f10 78 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  x is required.  
17f20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74  */.    if( pWrit
17f30 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
17f40 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66  nPage ){.      f
17f50 74 73 35 50 75 74 55 31 36 28 70 50 61 67 65 2d  ts5PutU16(pPage-
17f60 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
17f70 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  uf.n);.      fts
17f80 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e  5WriteDlidxAppen
17f90 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52  d(p, pWriter, iR
17fa0 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  owid);.    }..  
17fb0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64    /* Write the d
17fc0 6f 63 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ocid. */.    if(
17fd0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
17fe0 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c  RowidInDoclist |
17ff0 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  | pWriter->bFirs
18000 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
18010 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
18020 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
18030 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
18040 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , iRowid);.    }
18050 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
18060 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f  rt( p->rc || iRo
18070 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72  wid>pWriter->iPr
18080 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  evRowid );.     
18090 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
180a0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
180b0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f  &pPage->buf, iRo
180c0 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69  wid - pWriter->i
180d0 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20  PrevRowid);.    
180e0 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69  }.    pWriter->i
180f0 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77  PrevRowid = iRow
18100 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  id;.    pWriter-
18110 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
18120 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70  clist = 0;.    p
18130 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
18140 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a  widInPage = 0;..
18150 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
18160 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
18170 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
18180 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 69 66 28 20  nPos);..    if( 
18190 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d  pPage->buf.n>=p-
181a0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
181b0 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  {.      fts5Writ
181c0 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57  eFlushLeaf(p, pW
181d0 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  riter);.    }.  
181e0 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69  }.}..#if 0.stati
181f0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
18200 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74  AppendPoslistInt
18210 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
18220 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
18230 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
18240 6e 74 20 69 56 61 6c 0a 29 7b 0a 20 20 69 66 28  nt iVal.){.  if(
18250 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18260 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  K ){.    Fts5Pag
18270 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
18280 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
18290 65 72 5b 30 5d 3b 0a 20 20 20 20 66 74 73 35 42  er[0];.    fts5B
182a0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
182b0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
182c0 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20  ->buf, iVal);.  
182d0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66    if( pPage->buf
182e0 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  .n>=p->pConfig->
182f0 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74  pgsz ){.      ft
18300 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
18310 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
18320 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
18330 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
18340 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
18350 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35  listData(.  Fts5
18360 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
18370 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
18380 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ter, .  const u8
18390 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20   *aData, .  int 
183a0 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50  nData.){.  Fts5P
183b0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
183c0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
183d0 69 74 65 72 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74  iter[0];.  const
183e0 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a   u8 *a = aData;.
183f0 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b    int n = nData;
18400 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d  .  .  assert( p-
18410 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30  >pConfig->pgsz>0
18420 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
18430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18440 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
18450 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d   n)>=p->pConfig-
18460 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 6e 74  >pgsz ){.    int
18470 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66   nReq = p->pConf
18480 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65  ig->pgsz - pPage
18490 2d 3e 62 75 66 2e 6e 3b 0a 20 20 20 20 69 6e 74  ->buf.n;.    int
184a0 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20   nCopy = 0;.    
184b0 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65  while( nCopy<nRe
184c0 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64  q ){.      i64 d
184d0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70  ummy;.      nCop
184e0 79 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  y += getVarint(&
184f0 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29  a[nCopy], (u64*)
18500 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20  &dummy);.    }. 
18510 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
18520 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
18530 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f  &pPage->buf, nCo
18540 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d  py, a);.    a +=
18550 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d   nCopy;.    n -=
18560 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35   nCopy;.    fts5
18570 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
18580 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
18590 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
185a0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
185b0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
185c0 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29  Page->buf, n, a)
185d0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
185e0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
185f0 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 46 74 73  pendZerobyte(Fts
18600 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
18610 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
18620 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72  r){.  fts5Buffer
18630 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
18640 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 61  >rc, &pWriter->a
18650 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 2c 20 30  Writer[0].buf, 0
18660 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  );.}../*.** Flus
18670 68 20 61 6e 79 20 64 61 74 61 20 63 61 63 68 65  h any data cache
18680 64 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20  d by the writer 
18690 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61  object to the da
186a0 74 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79  tabase. Free any
186b0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  .** allocations 
186c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
186d0 74 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73  the writer..*/.s
186e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
186f0 72 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74  riteFinish(.  Ft
18700 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
18710 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
18720 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
18730 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
18740 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 48 65 69 67  */.  int *pnHeig
18750 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
18760 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69       /* OUT: Hei
18770 67 68 74 20 6f 66 20 74 68 65 20 62 2d 74 72 65  ght of the b-tre
18780 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65  e */.  int *pnLe
18790 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
187a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
187b0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
187c0 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f  ges in b-tree */
187d0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
187e0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
187f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50  _OK ){.    Fts5P
18800 61 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66  ageWriter *pLeaf
18810 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
18820 69 74 65 72 5b 30 5d 3b 0a 20 20 20 20 69 66 28  iter[0];.    if(
18830 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3d 3d 31 20   pLeaf->pgno==1 
18840 26 26 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3d  && pLeaf->buf.n=
18850 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 4c  =0 ){.      *pnL
18860 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a  eaf = 0;.      *
18870 70 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20  pnHeight = 0;.  
18880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
18890 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e  f( pLeaf->buf.n>
188a0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  4 ){.        fts
188b0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
188c0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
188d0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 4c 65     }.      *pnLe
188e0 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f  af = pLeaf->pgno
188f0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  -1;.      if( pW
18900 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3d 3d  riter->nWriter==
18910 31 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45  1 && pWriter->nE
18920 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44  mpty>=FTS5_MIN_D
18930 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20  LIDX_SIZE ){.   
18940 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
18950 72 65 65 47 72 6f 77 28 70 2c 20 70 57 72 69 74  reeGrow(p, pWrit
18960 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
18970 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
18980 6e 57 72 69 74 65 72 3e 31 20 29 7b 0a 20 20 20  nWriter>1 ){.   
18990 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
189a0 72 65 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72  reeNEmpty(p, pWr
189b0 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iter);.      }. 
189c0 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
189d0 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65   pWriter->nWrite
189e0 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  r;..      for(i=
189f0 31 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57  1; i<pWriter->nW
18a00 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  riter; i++){.   
18a10 20 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69       Fts5PageWri
18a20 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69  ter *pPg = &pWri
18a30 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b  ter->aWriter[i];
18a40 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
18a50 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20  aWrite(p, .     
18a60 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d         FTS5_SEGM
18a70 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65  ENT_ROWID(pWrite
18a80 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72  r->iIdx, pWriter
18a90 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 50 67  ->iSegid, i, pPg
18aa0 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20 20 20 20 20  ->pgno), .      
18ab0 20 20 20 20 20 20 70 50 67 2d 3e 62 75 66 2e 70        pPg->buf.p
18ac0 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 0a 20 20 20  , pPg->buf.n.   
18ad0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
18ae0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
18af0 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
18b00 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nWriter; i++){. 
18b10 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
18b20 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65  r *pPg = &pWrite
18b30 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20  r->aWriter[i];. 
18b40 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
18b50 65 28 26 70 50 67 2d 3e 74 65 72 6d 29 3b 0a 20  e(&pPg->term);. 
18b60 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
18b70 65 28 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20 20  e(&pPg->buf);.  
18b80 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
18b90 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  (pWriter->aWrite
18ba0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  r);.  sqlite3Fts
18bb0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72  5BufferFree(&pWr
18bc0 69 74 65 72 2d 3e 63 64 6c 69 64 78 29 3b 0a 7d  iter->cdlidx);.}
18bd0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
18be0 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46  s5WriteInit(.  F
18bf0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
18c00 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
18c10 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69  Writer, .  int i
18c20 49 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64 0a  Idx, int iSegid.
18c30 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69  ){.  memset(pWri
18c40 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
18c50 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a  ts5SegWriter));.
18c60 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20    pWriter->iIdx 
18c70 3d 20 69 49 64 78 3b 0a 20 20 70 57 72 69 74 65  = iIdx;.  pWrite
18c80 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  r->iSegid = iSeg
18c90 69 64 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e  id;..  pWriter->
18ca0 61 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 50  aWriter = (Fts5P
18cb0 61 67 65 57 72 69 74 65 72 2a 29 66 74 73 35 49  ageWriter*)fts5I
18cc0 64 78 4d 61 6c 6c 6f 63 28 70 2c 73 69 7a 65 6f  dxMalloc(p,sizeo
18cd0 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72  f(Fts5PageWriter
18ce0 29 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65  ));.  if( pWrite
18cf0 72 2d 3e 61 57 72 69 74 65 72 3d 3d 30 20 29 20  r->aWriter==0 ) 
18d00 72 65 74 75 72 6e 3b 0a 20 20 70 57 72 69 74 65  return;.  pWrite
18d10 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20 31 3b 0a  r->nWriter = 1;.
18d20 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74    pWriter->aWrit
18d30 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 31 3b 0a  er[0].pgno = 1;.
18d40 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
18d50 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b  tTermInPage = 1;
18d60 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
18d70 66 74 73 35 57 72 69 74 65 49 6e 69 74 46 6f 72  fts5WriteInitFor
18d80 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e  Append(.  Fts5In
18d90 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
18da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
18db0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
18dc0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
18dd0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20  ter *pWriter,   
18de0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
18df0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f  to initialize */
18e00 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 65 67 6d     /* Index segm
18e30 65 6e 74 20 69 73 20 61 20 70 61 72 74 20 6f 66  ent is a part of
18e40 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
18e50 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
18e60 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
18e70 20 6f 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e   object to appen
18e80 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  d to */.){.  int
18e90 20 6e 42 79 74 65 20 3d 20 70 53 65 67 2d 3e 6e   nByte = pSeg->n
18ea0 48 65 69 67 68 74 20 2a 20 73 69 7a 65 6f 66 28  Height * sizeof(
18eb0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 29 3b  Fts5PageWriter);
18ec0 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65  .  memset(pWrite
18ed0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
18ee0 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
18ef0 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20  pWriter->iIdx = 
18f00 69 49 64 78 3b 0a 20 20 70 57 72 69 74 65 72 2d  iIdx;.  pWriter-
18f10 3e 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e  >iSegid = pSeg->
18f20 69 53 65 67 69 64 3b 0a 20 20 70 57 72 69 74 65  iSegid;.  pWrite
18f30 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74  r->aWriter = (Ft
18f40 73 35 50 61 67 65 57 72 69 74 65 72 2a 29 66 74  s5PageWriter*)ft
18f50 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e  s5IdxMalloc(p, n
18f60 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 2d  Byte);..  if( p-
18f70 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
18f80 7b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d  {.    int pgno =
18f90 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   1;.    int i;. 
18fa0 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69     pWriter->nWri
18fb0 74 65 72 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69  ter = pSeg->nHei
18fc0 67 68 74 3b 0a 20 20 20 20 70 57 72 69 74 65 72  ght;.    pWriter
18fd0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
18fe0 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  o = pSeg->pgnoLa
18ff0 73 74 2b 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d  st+1;.    for(i=
19000 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b  pSeg->nHeight-1;
19010 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
19020 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
19030 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
19040 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c  D(pWriter->iIdx,
19050 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
19060 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  , i, pgno);.    
19070 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
19080 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65 72   *pPg = &pWriter
19090 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20  ->aWriter[i];.  
190a0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
190b0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74 73 35  pgno;.      fts5
190c0 44 61 74 61 42 75 66 66 65 72 28 70 2c 20 26 70  DataBuffer(p, &p
190d0 50 67 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29  Pg->buf, iRowid)
190e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
190f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19100 20 20 20 20 20 20 20 20 46 74 73 35 4e 6f 64 65          Fts5Node
19110 49 74 65 72 20 73 73 3b 0a 20 20 20 20 20 20 20  Iter ss;.       
19120 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69   fts5NodeIterIni
19130 74 28 70 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50  t(pPg->buf.p, pP
19140 67 2d 3e 62 75 66 2e 6e 2c 20 26 73 73 29 3b 0a  g->buf.n, &ss);.
19150 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73          while( s
19160 73 2e 61 44 61 74 61 20 29 20 66 74 73 35 4e 6f  s.aData ) fts5No
19170 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72  deIterNext(&p->r
19180 63 2c 20 26 73 73 29 3b 0a 20 20 20 20 20 20 20  c, &ss);.       
19190 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
191a0 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 74 65 72  p->rc, &pPg->ter
191b0 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73 73  m, ss.term.n, ss
191c0 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20  .term.p);.      
191d0 20 20 70 67 6e 6f 20 3d 20 73 73 2e 69 43 68 69    pgno = ss.iChi
191e0 6c 64 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ld;.        fts5
191f0 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 73 73  NodeIterFree(&ss
19200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19210 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e  .    if( pSeg->n
19220 48 65 69 67 68 74 3d 3d 31 20 29 7b 0a 20 20 20  Height==1 ){.   
19230 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70     pWriter->nEmp
19240 74 79 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  ty = pSeg->pgnoL
19250 61 73 74 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  ast-1;.    }.   
19260 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
19270 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 67  SQLITE_OK || (pg
19280 6e 6f 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  no+pWriter->nEmp
19290 74 79 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  ty)==pSeg->pgnoL
192a0 61 73 74 20 29 3b 0a 20 20 20 20 70 57 72 69 74  ast );.    pWrit
192b0 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
192c0 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 61 73  Page = 1;.    as
192d0 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 61  sert( pWriter->a
192e0 57 72 69 74 65 72 5b 30 5d 2e 74 65 72 6d 2e 6e  Writer[0].term.n
192f0 3d 3d 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ==0 );.  }.}../*
19300 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
19310 65 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69  er was used to i
19320 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
19330 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
19340 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e  s of on an.** in
19350 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
19360 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
19370 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
19380 65 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d  ed if the increm
19390 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73  ental.** merge s
193a0 74 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64  tep has finished
193b0 20 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68   but the input h
193c0 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70  as not been comp
193d0 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64  letely exhausted
193e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
193f0 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
19400 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
19410 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
19420 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
19430 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i;.  Fts5Buffer 
19440 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
19450 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
19460 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f  s5Buffer));.  fo
19470 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
19480 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
19490 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
194a0 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
194b0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65  [i];.    if( pSe
194c0 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20  g->pSeg==0 ){.  
194d0 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
194e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
194f0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  eg->pLeaf==0 ){.
19500 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79        /* All key
19510 73 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75  s from this inpu
19520 74 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62  t segment have b
19530 65 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74  een transfered t
19540 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20  o the output..  
19550 20 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20      ** Set both 
19560 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61  the first and la
19570 73 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20  st page-numbers 
19580 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  to 0 to indicate
19590 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
195a0 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f  ** segment is no
195b0 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20  w empty. */.    
195c0 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67    pSeg->pSeg->pg
195d0 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20  noLast = 0;.    
195e0 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67    pSeg->pSeg->pg
195f0 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20  noFirst = 0;.   
19600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
19610 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69  t iOff = pSeg->i
19620 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20  TermLeafOffset; 
19630 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e      /* Offset on
19640 20 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66 20   new first leaf 
19650 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  page */.      i6
19660 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20  4 iLeafRowid;.  
19670 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44      Fts5Data *pD
19680 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  ata;.      int i
19690 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d  Id = pSeg->pSeg-
196a0 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75  >iSegid;.      u
196b0 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30  8 aHdr[4] = {0x0
196c0 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
196d0 78 30 34 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65  x04};..      iLe
196e0 61 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53  afRowid = FTS5_S
196f0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
19700 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20 30 2c  g->iIdx, iId, 0,
19710 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
19720 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61  Pgno);.      pDa
19730 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
19740 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29  d(p, iLeafRowid)
19750 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
19760 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  a ){.        fts
19770 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66  5BufferZero(&buf
19780 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
19790 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
197a0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69  &p->rc, &buf, si
197b0 7a 65 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72  zeof(aHdr), aHdr
197c0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
197d0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
197e0 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
197f0 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20  pSeg->term.n);. 
19800 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
19810 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
19820 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e  rc, &buf, pSeg->
19830 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65  term.n, pSeg->te
19840 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66  rm.p);.        f
19850 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
19860 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
19870 2c 20 70 44 61 74 61 2d 3e 6e 20 2d 20 69 4f 66  , pData->n - iOf
19880 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66  f, &pData->p[iOf
19890 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  f]);.        fts
198a0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
198b0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  ta);.        pSe
198c0 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  g->pSeg->pgnoFir
198d0 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d  st = pSeg->iTerm
198e0 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20  LeafPgno;.      
198f0 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
19900 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
19910 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64  _ROWID(pSeg->iId
19920 78 2c 20 69 49 64 2c 20 30 2c 20 31 29 2c 69 4c  x, iId, 0, 1),iL
19930 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
19940 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
19950 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20  (p, iLeafRowid, 
19960 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20  buf.p, buf.n);. 
19970 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
19980 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
19990 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(&buf);.}../*.*
199a0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
199b0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
199c0 65 76 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65  evel(.  Fts5Inde
199d0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
199e0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
199f0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
19a00 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20  /.  int iIdx,   
19a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
19a30 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73  work on */.  Fts
19a40 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
19a50 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
19a60 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65  IN/OUT: Stucture
19a70 20 6f 66 20 69 6e 64 65 78 20 69 49 64 78 20 2a   of index iIdx *
19a80 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20  /.  int iLvl,   
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
19ab0 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  read input from 
19ac0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20  */.  int *pnRem 
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70       /* Write up
19af0 20 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75   to this many ou
19b00 74 70 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29  tput leaves */.)
19b10 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
19b20 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
19b30 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74  Struct;.  Fts5St
19b40 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
19b50 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
19b60 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46  Level[iLvl];.  F
19b70 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
19b80 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74  l *pLvlOut;.  Ft
19b90 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
19ba0 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a  pIter = 0;    /*
19bb0 20 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61   Iterator to rea
19bc0 64 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a  d input data */.
19bd0 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52    int nRem = pnR
19be0 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b  em ? *pnRem : 0;
19bf0 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66    /* Output leaf
19c00 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77   pages left to w
19c10 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  rite */.  int nI
19c20 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nput;           
19c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19c40 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
19c50 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53  ments */.  Fts5S
19c60 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  egWriter writer;
19c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
19c80 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
19c90 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
19ca0 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
19cb0 20 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65   /* Output segme
19cc0 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  nt */.  Fts5Buff
19cd0 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62  er term;.  int b
19ce0 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65  RequireDoclistTe
19cf0 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44 6f  rm = 0;    /* Do
19d00 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72  clist terminator
19d10 20 28 30 78 30 30 29 20 72 65 71 75 69 72 65 64   (0x00) required
19d20 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73   */.  int bOldes
19d30 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
19d40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
19d50 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
19d60 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73  ent is the oldes
19d70 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
19d80 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
19d90 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  evel );.  assert
19da0 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d  ( pLvl->nMerge<=
19db0 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20  pLvl->nSeg );.. 
19dc0 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c   memset(&writer,
19dd0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
19de0 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65  egWriter));.  me
19df0 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
19e00 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
19e10 29 29 3b 0a 20 20 77 72 69 74 65 72 2e 69 49 64  ));.  writer.iId
19e20 78 20 3d 20 69 49 64 78 3b 0a 20 20 69 66 28 20  x = iIdx;.  if( 
19e30 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
19e40 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70      pLvlOut = &p
19e50 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
19e60 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65  Lvl+1];.    asse
19e70 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  rt( pLvlOut->nSe
19e80 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75  g>0 );.    nInpu
19e90 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
19ea0 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ;.    fts5WriteI
19eb0 6e 69 74 46 6f 72 41 70 70 65 6e 64 28 70 2c 20  nitForAppend(p, 
19ec0 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c 20 26  &writer, iIdx, &
19ed0 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
19ee0 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 29 3b  vlOut->nSeg-1]);
19ef0 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76  .    pSeg = &pLv
19f00 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
19f10 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20 7d  ut->nSeg-1];.  }
19f20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53  else{.    int iS
19f30 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63  egid = fts5Alloc
19f40 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72  ateSegid(p, pStr
19f50 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78  uct);..    /* Ex
19f60 74 65 6e 64 20 74 68 65 20 46 74 73 35 53 74 72  tend the Fts5Str
19f70 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73  ucture object as
19f80 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73   required to ens
19f90 75 72 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20  ure the output. 
19fa0 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78     ** segment ex
19fb0 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ists. */.    if(
19fc0 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e   iLvl==pStruct->
19fd0 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20  nLevel-1 ){.    
19fe0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41    fts5StructureA
19ff0 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ddLevel(&p->rc, 
1a000 70 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20  ppStruct);.     
1a010 20 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74   pStruct = *ppSt
1a020 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ruct;.    }.    
1a030 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
1a040 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
1a050 20 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31   pStruct, iLvl+1
1a060 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
1a070 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
1a080 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74  .    pLvl = &pSt
1a090 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1a0a0 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20  l];.    pLvlOut 
1a0b0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1a0c0 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20  el[iLvl+1];..   
1a0d0 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
1a0e0 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c  , &writer, iIdx,
1a0f0 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f   iSegid);..    /
1a100 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65  * Add the new se
1a110 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  gment to the out
1a120 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
1a130 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74   pSeg = &pLvlOut
1a140 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
1a150 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f  nSeg];.    pLvlO
1a160 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20  ut->nSeg++;.    
1a170 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
1a180 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69  = 1;.    pSeg->i
1a190 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
1a1a0 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
1a1b0 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a  gment++;..    /*
1a1c0 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   Read input from
1a1d0 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
1a1e0 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
1a1f0 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d   */.    nInput =
1a200 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d   pLvl->nSeg;.  }
1a210 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c  .  bOldest = (pL
1a220 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26  vlOut->nSeg==1 &
1a230 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  & pStruct->nLeve
1a240 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 23 69 66  l==iLvl+2);..#if
1a250 20 30 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75   0.fprintf(stdou
1a260 74 2c 20 22 6d 65 72 67 69 6e 67 20 25 64 20 73  t, "merging %d s
1a270 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 6c 65 76  egments from lev
1a280 65 6c 20 25 64 21 22 2c 20 6e 49 6e 70 75 74 2c  el %d!", nInput,
1a290 20 69 4c 76 6c 29 3b 0a 66 66 6c 75 73 68 28 73   iLvl);.fflush(s
1a2a0 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  tdout);.#endif..
1a2b0 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d    assert( iLvl>=
1a2c0 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d  0 );.  for(fts5M
1a2d0 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
1a2e0 53 74 72 75 63 74 2c 20 69 49 64 78 2c 20 30 2c  Struct, iIdx, 0,
1a2f0 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20   0, 0, 0, iLvl, 
1a300 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b  nInput, &pIter);
1a310 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
1a320 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
1a330 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
1a340 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
1a350 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20   pIter, 0, 0).  
1a360 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
1a370 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
1a380 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
1a390 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1a3a0 20 5d 3b 0a 20 20 20 20 46 74 73 35 43 68 75 6e   ];.    Fts5Chun
1a3b0 6b 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20  kIter sPos;     
1a3c0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1a3d0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1a3e0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
1a3f0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20  /.    int nPos; 
1a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a410 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d      /* position-
1a420 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
1a430 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74  value */.    int
1a440 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73   nTerm;.    cons
1a450 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20  t u8 *pTerm;..  
1a460 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b    /* Check for k
1a470 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e  ey annihilation.
1a480 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67   */.    if( pSeg
1a490 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f  ->nPos==0 && (bO
1a4a0 6c 64 65 73 74 20 7c 7c 20 70 53 65 67 2d 3e 62  ldest || pSeg->b
1a4b0 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Del==0) ) contin
1a4c0 75 65 3b 0a 0a 20 20 20 20 66 74 73 35 43 68 75  ue;..    fts5Chu
1a4d0 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53  nkIterInit(p, pS
1a4e0 65 67 2c 20 26 73 50 6f 73 29 3b 0a 0a 20 20 20  eg, &sPos);..   
1a4f0 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c   pTerm = fts5Mul
1a500 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
1a510 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  , &nTerm);.    i
1a520 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e  f( nTerm!=term.n
1a530 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d   || memcmp(pTerm
1a540 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29  , term.p, nTerm)
1a550 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 6e   ){.      if( pn
1a560 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e 4c  Rem && writer.nL
1a570 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20  eafWritten>nRem 
1a580 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43  ){.        fts5C
1a590 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28  hunkIterRelease(
1a5a0 26 73 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  &sPos);.        
1a5b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1a5c0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
1a5d0 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70   a new term. App
1a5e0 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  end a term to th
1a5f0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1a600 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  . */.      if( b
1a610 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65  RequireDoclistTe
1a620 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  rm ){.        ft
1a630 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72  s5WriteAppendZer
1a640 6f 62 79 74 65 28 70 2c 20 26 77 72 69 74 65 72  obyte(p, &writer
1a650 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1a660 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
1a670 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c  Term(p, &writer,
1a680 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
1a690 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1a6a0 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72  Set(&p->rc, &ter
1a6b0 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
1a6c0 3b 0a 20 20 20 20 20 20 62 52 65 71 75 69 72 65  ;.      bRequire
1a6d0 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 31 3b  DoclistTerm = 1;
1a6e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
1a6f0 70 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20  ppend the rowid 
1a700 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f  to the output */
1a710 0a 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53  .    /* WRITEPOS
1a720 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20  LISTSIZE */.    
1a730 6e 50 6f 73 20 3d 20 70 53 65 67 2d 3e 6e 50 6f  nPos = pSeg->nPo
1a740 73 2a 32 20 2b 20 70 53 65 67 2d 3e 62 44 65 6c  s*2 + pSeg->bDel
1a750 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41  ;.    fts5WriteA
1a760 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77  ppendRowid(p, &w
1a770 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69  riter, fts5Multi
1a780 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
1a790 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 66 6f  , nPos);..    fo
1a7a0 72 28 2f 2a 20 6e 6f 6f 70 20 2a 2f 3b 20 21 66  r(/* noop */; !f
1a7b0 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28  ts5ChunkIterEof(
1a7c0 70 2c 20 26 73 50 6f 73 29 3b 20 66 74 73 35 43  p, &sPos); fts5C
1a7d0 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20  hunkIterNext(p, 
1a7e0 26 73 50 6f 73 29 29 7b 0a 20 20 20 20 20 20 66  &sPos)){.      f
1a7f0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
1a800 73 6c 69 73 74 44 61 74 61 28 70 2c 20 26 77 72  slistData(p, &wr
1a810 69 74 65 72 2c 20 73 50 6f 73 2e 70 2c 20 73 50  iter, sPos.p, sP
1a820 6f 73 2e 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  os.n);.    }..  
1a830 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52    fts5ChunkIterR
1a840 65 6c 65 61 73 65 28 26 73 50 6f 73 29 3b 0a 20  elease(&sPos);. 
1a850 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74   }..  /* Flush t
1a860 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  he last leaf pag
1a870 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74  e to disk. Set t
1a880 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1a890 74 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a  t b-tree height.
1a8a0 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65    ** and last le
1a8b0 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  af page number a
1a8c0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
1a8d0 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65    */.  fts5Write
1a8e0 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65  Finish(p, &write
1a8f0 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65 69 67 68  r, &pSeg->nHeigh
1a900 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  t, &pSeg->pgnoLa
1a910 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35  st);..  if( fts5
1a920 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
1a930 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e  pIter) ){.    in
1a940 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  t i;..    /* Rem
1a950 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e  ove the redundan
1a960 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  t segments from 
1a970 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
1a980 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1a990 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b   i<nInput; i++){
1a9a0 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
1a9b0 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20  emoveSegment(p, 
1a9c0 69 49 64 78 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  iIdx, pLvl->aSeg
1a9d0 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  [i].iSegid);.   
1a9e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76   }..    /* Remov
1a9f0 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
1aa00 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
1aa10 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f  e input level */
1aa20 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e  .    if( pLvl->n
1aa30 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20  Seg!=nInput ){. 
1aa40 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d       int nMove =
1aa50 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e   (pLvl->nSeg - n
1aa60 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28  Input) * sizeof(
1aa70 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1aa80 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ment);.      mem
1aa90 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c  move(pLvl->aSeg,
1aaa0 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e   &pLvl->aSeg[nIn
1aab0 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20  put], nMove);.  
1aac0 20 20 7d 0a 20 20 20 20 70 53 74 72 75 63 74 2d    }.    pStruct-
1aad0 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e  >nSegment -= nIn
1aae0 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e  put;.    pLvl->n
1aaf0 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20  Seg -= nInput;. 
1ab00 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20     pLvl->nMerge 
1ab10 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53 65  = 0;.    if( pSe
1ab20 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29  g->pgnoLast==0 )
1ab30 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d  {.      pLvlOut-
1ab40 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70  >nSeg--;.      p
1ab50 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
1ab60 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  --;.    }.  }els
1ab70 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
1ab80 53 65 67 2d 3e 6e 48 65 69 67 68 74 3e 30 20 26  Seg->nHeight>0 &
1ab90 26 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  & pSeg->pgnoLast
1aba0 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72  >0 );.    fts5Tr
1abb0 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49  imSegments(p, pI
1abc0 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  ter);.    pLvl->
1abd0 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b  nMerge = nInput;
1abe0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74  .  }..  fts5Mult
1abf0 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 49 74  iIterFree(p, pIt
1ac00 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  er);.  fts5Buffe
1ac10 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
1ac20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52  if( pnRem ) *pnR
1ac30 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65  em -= writer.nLe
1ac40 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a  afWritten;.}../*
1ac50 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50 67  .** Do up to nPg
1ac60 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d 65   pages of autome
1ac70 72 67 65 20 77 6f 72 6b 20 6f 6e 20 69 6e 64 65  rge work on inde
1ac80 78 20 69 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69  x iIdx..*/.stati
1ac90 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1aca0 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  Merge(.  Fts5Ind
1acb0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1acc0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1acd0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1ace0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
1ad10 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74   work on */.  Ft
1ad20 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1ad30 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
1ad40 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1ad50 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1ad60 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67  dex */.  int nPg
1ad70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1ad90 73 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s of work to do 
1ada0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d  */.){.  int nRem
1adb0 20 3d 20 6e 50 67 3b 0a 20 20 46 74 73 35 53 74   = nPg;.  Fts5St
1adc0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
1add0 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
1ade0 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26  while( nRem>0 &&
1adf0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1ae00 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76  K ){.    int iLv
1ae10 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1ae20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61       /* To itera
1ae30 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
1ae40 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 65  s */.    int iBe
1ae50 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20  stLvl = 0;      
1ae60 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66       /* Level of
1ae70 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20  fering the most 
1ae80 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
1ae90 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20  /.    int nBest 
1aea0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1aeb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
1aec0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e  nput segments on
1aed0 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a   best level */..
1aee0 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74      /* Set iBest
1aef0 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c  Lvl to the level
1af00 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73   to read input s
1af10 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f  egments from. */
1af20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1af30 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29  ruct->nLevel>0 )
1af40 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ;.    for(iLvl=0
1af50 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
1af60 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
1af70 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
1af80 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
1af90 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1afa0 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
1afb0 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
1afc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1afd0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65  pLvl->nMerge>nBe
1afe0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
1aff0 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
1b000 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74  .          nBest
1b010 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b   = pLvl->nMerge;
1b020 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b030 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b040 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  }.      if( pLvl
1b050 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a  ->nSeg>nBest ){.
1b060 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20          nBest = 
1b070 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20  pLvl->nSeg;.    
1b080 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69      iBestLvl = i
1b090 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Lvl;.      }.   
1b0a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42   }..    /* If nB
1b0b0 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20  est is still 0, 
1b0c0 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d  then the index m
1b0d0 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f  ust be empty. */
1b0e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1b0f0 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c 76  EBUG.    for(iLv
1b100 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26  l=0; nBest==0 &&
1b110 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1b120 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1b130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1b140 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1b150 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20  vl].nSeg==0 );. 
1b160 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1b170 20 69 66 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43   if( nBest<p->pC
1b180 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67  onfig->nAutomerg
1b190 65 20 0a 20 20 20 20 20 20 20 20 26 26 20 70 53  e .        && pS
1b1a0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42  truct->aLevel[iB
1b1b0 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d  estLvl].nMerge==
1b1c0 30 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  0 .      ){.    
1b1d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1b1e0 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1b1f0 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78 2c 20  eLevel(p, iIdx, 
1b200 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c  &pStruct, iBestL
1b210 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
1b220 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1b230 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d  E_OK && pStruct-
1b240 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c  >aLevel[iBestLvl
1b250 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ].nMerge==0 ){. 
1b260 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
1b270 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65  rePromote(p, iBe
1b280 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74  stLvl+1, pStruct
1b290 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
1b2a0 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
1b2b0 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74  ct;.}../*.** A t
1b2c0 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65  otal of nLeaf le
1b2d0 61 66 20 70 61 67 65 73 20 6f 66 20 64 61 74 61  af pages of data
1b2e0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66   has just been f
1b2f0 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65  lushed to a leve
1b300 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20  l-0.** segments 
1b310 69 6e 20 69 6e 64 65 78 20 69 49 64 78 20 77 69  in index iIdx wi
1b320 74 68 20 73 74 72 75 63 74 75 72 65 20 70 53 74  th structure pSt
1b330 72 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ruct. This funct
1b340 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 0a  ion updates the.
1b350 2a 2a 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  ** write-counter
1b360 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64   accordingly and
1b370 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20  , if necessary, 
1b380 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65  performs increme
1b390 6e 74 61 6c 20 6d 65 72 67 65 0a 2a 2a 20 77 6f  ntal merge.** wo
1b3a0 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  rk..**.** If an 
1b3b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
1b3c0 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e  t the Fts5Index.
1b3d0 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  rc error code. I
1b3e0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
1b3f0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
1b400 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
1b410 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1b420 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1b430 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65  s5IndexAutomerge
1b440 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1b450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b460 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1b470 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1b480 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4a0 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f 72 6b  /* Index to work
1b4b0 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72   on */.  Fts5Str
1b4c0 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1b4d0 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
1b4e0 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
1b4f0 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
1b500 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20  /.  int nLeaf   
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b530 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a   output leaves j
1b540 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29  ust written */.)
1b550 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1b560 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70  QLITE_OK && p->p
1b570 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72  Config->nAutomer
1b580 67 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  ge>0 ){.    Fts5
1b590 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1b5a0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1b5b0 20 20 20 20 69 36 34 20 6e 57 72 69 74 65 3b 20      i64 nWrite; 
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
1b5e0 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e  ue of write-coun
1b5f0 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
1b600 57 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Work;           
1b610 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b620 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74  er of work-quant
1b630 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a  a to perform */.
1b640 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20      int nRem;   
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
1b670 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74  eaf pages left t
1b680 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20  o write */..    
1b690 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72  /* Update the wr
1b6a0 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69  ite-counter. Whi
1b6b0 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74  le doing so, set
1b6c0 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e   nWork. */.    n
1b6d0 57 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d  Write = pStruct-
1b6e0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
1b6f0 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28 28 6e 57      nWork = ((nW
1b700 72 69 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20  rite + nLeaf) / 
1b710 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20  p->nWorkUnit) - 
1b720 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f  (nWrite / p->nWo
1b730 72 6b 55 6e 69 74 29 3b 0a 20 20 20 20 70 53 74  rkUnit);.    pSt
1b740 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
1b750 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20  ter += nLeaf;.  
1b760 20 20 6e 52 65 6d 20 3d 20 70 2d 3e 6e 57 6f 72    nRem = p->nWor
1b770 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20  kUnit * nWork * 
1b780 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
1b790 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d  ..    fts5IndexM
1b7a0 65 72 67 65 28 70 2c 20 69 49 64 78 2c 20 70 70  erge(p, iIdx, pp
1b7b0 53 74 72 75 63 74 2c 20 6e 52 65 6d 29 3b 0a 20  Struct, nRem);. 
1b7c0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1b7d0 64 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69  d fts5IndexCrisi
1b7e0 73 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  smerge(.  Fts5In
1b7f0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1b800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1b810 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1b820 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
1b830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b840 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1b850 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46  o work on */.  F
1b860 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1b870 70 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f  pStruct        /
1b880 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
1b890 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
1b8a0 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ndex */.){.  con
1b8b0 73 74 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d  st int nCrisis =
1b8c0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72   p->pConfig->nCr
1b8d0 69 73 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73  isisMerge;.  Fts
1b8e0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1b8f0 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
1b900 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b  .  int iLvl = 0;
1b910 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1b920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
1b930 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e  pStruct->nLevel>
1b940 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
1b950 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1b960 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
1b970 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43  l[iLvl].nSeg>=nC
1b980 72 69 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73  risis ){.    fts
1b990 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
1b9a0 28 70 2c 20 69 49 64 78 2c 20 26 70 53 74 72 75  (p, iIdx, &pStru
1b9b0 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20  ct, iLvl, 0);.  
1b9c0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
1b9d0 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31  romote(p, iLvl+1
1b9e0 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  , pStruct);.    
1b9f0 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  iLvl++;.  }.  *p
1ba00 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
1ba10 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  t;.}..static int
1ba20 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
1ba30 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1ba40 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
1ba50 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  ;.  p->rc = SQLI
1ba60 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20  TE_OK;.  return 
1ba70 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73  rc;.}..typedef s
1ba80 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
1ba90 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b  tx Fts5FlushCtx;
1baa0 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73  .struct Fts5Flus
1bab0 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64  hCtx {.  Fts5Ind
1bac0 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35  ex *pIdx;.  Fts5
1bad0 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
1bae0 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66  ; .};../*.** Buf
1baf0 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61  fer aBuf[] conta
1bb00 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61  ins a list of va
1bb10 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c  rints, all small
1bb20 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a   enough to fit.*
1bb30 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  * in a 32-bit in
1bb40 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68  teger. Return th
1bb50 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61  e size of the la
1bb60 72 67 65 73 74 20 70 72 65 66 69 78 20 6f 66 20  rgest prefix of 
1bb70 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d  this .** list nM
1bb80 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73  ax bytes or less
1bb90 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
1bba0 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c  tic int fts5Posl
1bbb0 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20  istPrefix(const 
1bbc0 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d  u8 *aBuf, int nM
1bbd0 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a  ax){.  int ret;.
1bbe0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72    u32 dummy;.  r
1bbf0 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
1bc00 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79  nt32(aBuf, dummy
1bc10 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
1bc20 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73  .    int i = fts
1bc30 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42  5GetVarint32(&aB
1bc40 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b  uf[ret], dummy);
1bc50 0a 20 20 20 20 69 66 28 20 28 72 65 74 20 2b 20  .    if( (ret + 
1bc60 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61  i) > nMax ) brea
1bc70 6b 3b 0a 20 20 20 20 72 65 74 20 2b 3d 20 69 3b  k;.    ret += i;
1bc80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
1bc90 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74  t;.}..#define ft
1bca0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1bcb0 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c  ndBlob(pBuf, pBl
1bcc0 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 5c 0a 20  ob, nBlob) { \. 
1bcd0 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
1bce0 53 70 61 63 65 3e 3d 28 70 42 75 66 2d 3e 6e 2b  Space>=(pBuf->n+
1bcf0 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20  nBlob) );       
1bd00 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79        \.  memcpy
1bd10 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
1bd20 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  n], pBlob, nBlob
1bd30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  );             \
1bd40 0a 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e 42  .  pBuf->n += nB
1bd50 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd70 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a          \.}../*.
1bd80 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e  ** Flush the con
1bd90 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f  tents of in-memo
1bda0 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69 48  ry hash table iH
1bdb0 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76  ash to a new lev
1bdc0 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  el-0 .** segment
1bdd0 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75   on disk. Also u
1bde0 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65 73  pdate the corres
1bdf0 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72  ponding structur
1be00 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  e record..**.** 
1be10 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1be20 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
1be30 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
1be40 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
1be50 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
1be60 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1be70 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1be80 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1be90 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65  oid fts5FlushOne
1bea0 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a  Hash(Fts5Index *
1beb0 70 2c 20 69 6e 74 20 69 48 61 73 68 2c 20 69 6e  p, int iHash, in
1bec0 74 20 2a 70 6e 4c 65 61 66 29 7b 0a 20 20 46 74  t *pnLeaf){.  Ft
1bed0 73 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20  s5Hash *pHash = 
1bee0 70 2d 3e 61 70 48 61 73 68 5b 69 48 61 73 68 5d  p->apHash[iHash]
1bef0 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
1bf00 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e  e *pStruct;.  in
1bf10 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20  t iSegid;.  int 
1bf20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20  pgnoLast = 0;   
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf40 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   Last leaf page 
1bf50 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e  number in segmen
1bf60 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  t */..  /* Obtai
1bf70 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
1bf80 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
1bf90 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74  ture and allocat
1bfa0 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
1bfb0 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  id.  ** for the 
1bfc0 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d  new level-0 segm
1bfd0 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75  ent.  */.  pStru
1bfe0 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
1bff0 72 65 52 65 61 64 28 70 2c 20 69 48 61 73 68 29  reRead(p, iHash)
1c000 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74 73  ;.  iSegid = fts
1c010 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70  5AllocateSegid(p
1c020 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69  , pStruct);..  i
1c030 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20  f( iSegid ){.   
1c040 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
1c050 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
1c060 73 7a 3b 0a 0a 20 20 20 20 46 74 73 35 53 74 72  sz;..    Fts5Str
1c070 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1c080 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65  Seg;   /* New se
1c090 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74  gment within pSt
1c0a0 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ruct */.    int 
1c0b0 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 20  nHeight;        
1c0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69            /* Hei
1c0d0 67 68 74 20 6f 66 20 6e 65 77 20 73 65 67 6d 65  ght of new segme
1c0e0 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  nt b-tree */.   
1c0f0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
1c100 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
1c110 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63  * Buffer in whic
1c120 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65  h to assemble le
1c130 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 63  af page */.    c
1c140 6f 6e 73 74 20 75 38 20 2a 7a 50 72 65 76 20 3d  onst u8 *zPrev =
1c150 20 30 3b 0a 0a 20 20 20 20 46 74 73 35 53 65 67   0;..    Fts5Seg
1c160 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20  Writer writer;. 
1c170 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
1c180 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 48 61  (p, &writer, iHa
1c190 73 68 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20  sh, iSegid);..  
1c1a0 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74    /* Pre-allocat
1c1b0 65 20 74 68 65 20 62 75 66 66 65 72 20 75 73 65  e the buffer use
1c1c0 64 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65  d to assemble le
1c1d0 61 66 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  af pages to the 
1c1e0 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 70 61  target.    ** pa
1c1f0 67 65 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  ge size.  */.   
1c200 20 61 73 73 65 72 74 28 20 70 67 73 7a 3e 30 20   assert( pgsz>0 
1c210 29 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77  );.    pBuf = &w
1c220 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d  riter.aWriter[0]
1c230 2e 62 75 66 3b 0a 20 20 20 20 66 74 73 35 42 75  .buf;.    fts5Bu
1c240 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c  fferGrow(&p->rc,
1c250 20 70 42 75 66 2c 20 70 67 73 7a 20 2b 20 32 30   pBuf, pgsz + 20
1c260 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e  );..    /* Begin
1c270 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
1c280 68 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74  h hash table ent
1c290 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ries. */.    if(
1c2a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1c2b0 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  K ){.      memse
1c2c0 74 28 70 42 75 66 2d 3e 70 2c 20 30 2c 20 34 29  t(pBuf->p, 0, 4)
1c2d0 3b 0a 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20  ;.      pBuf->n 
1c2e0 3d 20 34 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  = 4;.      p->rc
1c2f0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
1c300 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68  shScanInit(pHash
1c310 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  , 0, 0);.    }..
1c320 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
1c330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
1c340 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  ==sqlite3Fts5Has
1c350 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29 20  hScanEof(pHash) 
1c360 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1c370 68 61 72 20 2a 7a 54 65 72 6d 3b 0a 20 20 20 20  har *zTerm;.    
1c380 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20    int nTerm;.   
1c390 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f     const u8 *pDo
1c3a0 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  clist;.      int
1c3b0 20 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20   nDoclist;.     
1c3c0 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20   int nSuffix;   
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3e0 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66  Size of term suf
1c3f0 66 69 78 20 2a 2f 0a 0a 20 20 20 20 20 20 73 71  fix */..      sq
1c400 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
1c410 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a  nEntry(pHash, &z
1c420 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c  Term, &pDoclist,
1c430 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20   &nDoclist);.   
1c440 20 20 20 6e 54 65 72 6d 20 3d 20 73 74 72 6c 65     nTerm = strle
1c450 6e 28 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20  n(zTerm);..     
1c460 20 2f 2a 20 44 65 63 69 64 65 20 69 66 20 74 68   /* Decide if th
1c470 65 20 74 65 72 6d 20 77 69 6c 6c 20 66 69 74 20  e term will fit 
1c480 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
1c490 65 61 66 2e 20 49 66 20 69 74 20 77 69 6c 6c 20  eaf. If it will 
1c4a0 6e 6f 74 2c 20 0a 20 20 20 20 20 20 2a 2a 20 66  not, .      ** f
1c4b0 6c 75 73 68 20 74 68 65 20 6c 65 61 66 20 74 6f  lush the leaf to
1c4c0 20 64 69 73 6b 20 68 65 72 65 2e 20 20 2a 2f 0a   disk here.  */.
1c4d0 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
1c4e0 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 20  >n + nTerm + 2) 
1c4f0 3e 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  > pgsz ){.      
1c500 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1c510 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72 29  Leaf(p, &writer)
1c520 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 3d  ;.        pBuf =
1c530 20 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72   &writer.aWriter
1c540 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20 20  [0].buf;.       
1c550 20 69 66 28 20 28 6e 54 65 72 6d 20 2b 20 33 32   if( (nTerm + 32
1c560 29 20 3e 20 70 42 75 66 2d 3e 6e 53 70 61 63 65  ) > pBuf->nSpace
1c570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
1c580 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1c590 3e 72 63 2c 20 70 42 75 66 2c 20 6e 54 65 72 6d  >rc, pBuf, nTerm
1c5a0 20 2b 20 33 32 20 2d 20 70 42 75 66 2d 3e 6e 29   + 32 - pBuf->n)
1c5b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1c5c0 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  p->rc ) break;. 
1c5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c5e0 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
1c5f0 20 74 68 65 20 74 65 72 6d 20 74 6f 20 74 68 65   the term to the
1c600 20 6c 65 61 66 2e 20 41 6e 64 20 70 75 73 68 20   leaf. And push 
1c610 69 74 20 75 70 20 69 6e 74 6f 20 74 68 65 20 62  it up into the b
1c620 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
1c630 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 77 72 69  */.      if( wri
1c640 74 65 72 2e 62 46 69 72 73 74 54 65 72 6d 49 6e  ter.bFirstTermIn
1c650 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
1c660 20 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 66 74     int nPre = ft
1c670 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
1c680 28 6e 54 65 72 6d 2c 20 7a 50 72 65 76 2c 20 6e  (nTerm, zPrev, n
1c690 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a  Term, (const u8*
1c6a0 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20  )zTerm);.       
1c6b0 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
1c6c0 74 65 33 50 75 74 56 61 72 69 6e 74 28 26 70 42  te3PutVarint(&pB
1c6d0 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
1c6e0 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  nPre);.        n
1c6f0 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d  Suffix = nTerm -
1c700 20 6e 50 72 65 3b 0a 20 20 20 20 20 20 7d 65 6c   nPre;.      }el
1c710 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
1c720 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b  PutU16(&pBuf->p[
1c730 32 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 0a 20 20  2], pBuf->n);.  
1c740 20 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69        writer.bFi
1c750 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1c760 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  0;.        if( w
1c770 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d  riter.aWriter[0]
1c780 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20  .pgno!=1 ){.    
1c790 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20 3d        int nPre =
1c7a0 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
1c7b0 65 73 73 28 6e 54 65 72 6d 2c 20 7a 50 72 65 76  ess(nTerm, zPrev
1c7c0 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20  , nTerm, (const 
1c7d0 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
1c7e0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42        fts5WriteB
1c7f0 74 72 65 65 54 65 72 6d 28 70 2c 20 26 77 72 69  treeTerm(p, &wri
1c800 74 65 72 2c 20 6e 50 72 65 2b 31 2c 20 28 63 6f  ter, nPre+1, (co
1c810 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a  nst u8*)zTerm);.
1c820 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20 3d            pBuf =
1c830 20 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72   &writer.aWriter
1c840 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20 20  [0].buf;.       
1c850 20 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 3c     assert( nPre<
1c860 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20  nTerm );.       
1c870 20 7d 0a 20 20 20 20 20 20 20 20 6e 53 75 66 66   }.        nSuff
1c880 69 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20  ix = nTerm;.    
1c890 20 20 7d 0a 20 20 20 20 20 20 70 42 75 66 2d 3e    }.      pBuf->
1c8a0 6e 20 2b 3d 20 73 71 6c 69 74 65 33 50 75 74 56  n += sqlite3PutV
1c8b0 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
1c8c0 42 75 66 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78  Buf->n], nSuffix
1c8d0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
1c8e0 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1c8f0 62 28 70 42 75 66 2c 20 28 63 6f 6e 73 74 20 75  b(pBuf, (const u
1c900 38 2a 29 26 7a 54 65 72 6d 5b 6e 54 65 72 6d 2d  8*)&zTerm[nTerm-
1c910 6e 53 75 66 66 69 78 5d 2c 20 6e 53 75 66 66 69  nSuffix], nSuffi
1c920 78 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  x);..      if( p
1c930 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b 20  gsz>=(pBuf->n + 
1c940 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b  nDoclist + 1) ){
1c950 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1c960 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77  entire doclist w
1c970 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63  ill fit on the c
1c980 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a  urrent leaf. */.
1c990 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1c9a0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
1c9b0 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c  (pBuf, pDoclist,
1c9c0 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20   nDoclist);.    
1c9d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c9e0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b   i64 iRowid = 0;
1c9f0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65  .        i64 iDe
1ca00 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  lta = 0;.       
1ca10 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a   int iOff = 0;..
1ca20 20 20 20 20 20 20 20 20 77 72 69 74 65 72 2e 62          writer.b
1ca30 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1ca40 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f   = 0;..        /
1ca50 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63  * The entire doc
1ca60 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69  list will not fi
1ca70 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20  t on this leaf. 
1ca80 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20  The following . 
1ca90 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 69         ** loop i
1caa0 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
1cab0 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74 68 61  the poslists tha
1cac0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 75  t make up the cu
1cad0 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 2a  rrent .        *
1cae0 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20  * doclist.  */. 
1caf0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f         while( iO
1cb00 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ff<nDoclist ){. 
1cb10 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f           int nPo
1cb20 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  s;.          int
1cb30 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   nCopy;.        
1cb40 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
1cb50 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
1cb60 67 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c  getVarint(&pDocl
1cb70 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ist[iOff], (u64*
1cb80 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
1cb90 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 66 74 73       nCopy = fts
1cba0 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
1cbb0 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
1cbc0 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
1cbd0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70  ;.          nCop
1cbe0 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20  y += nPos;.     
1cbf0 20 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69       iRowid += i
1cc00 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20  Delta;.         
1cc10 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20   .          if( 
1cc20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77  writer.bFirstRow
1cc30 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
1cc40 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55          fts5PutU
1cc50 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20  16(&pBuf->p[0], 
1cc60 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66  pBuf->n);   /* f
1cc70 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20 70 61  irst docid on pa
1cc80 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ge */.          
1cc90 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c    pBuf->n += sql
1cca0 69 74 65 33 50 75 74 56 61 72 69 6e 74 28 26 70  ite3PutVarint(&p
1ccb0 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c  Buf->p[pBuf->n],
1ccc0 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
1ccd0 20 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69        writer.bFi
1cce0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
1ccf0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1cd00 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
1cd10 70 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c  pend(p, &writer,
1cd20 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
1cd30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cd40 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b         pBuf->n +
1cd50 3d 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69  = sqlite3PutVari
1cd60 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
1cd70 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20  ->n], iDelta);. 
1cd80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1cd90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75       assert( pBu
1cda0 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61  f->n<=pBuf->nSpa
1cdb0 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ce );..         
1cdc0 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
1cdd0 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20 29  nCopy) <= pgsz )
1cde0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1cdf0 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c   The entire posl
1ce00 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ist will fit on 
1ce10 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
1ce20 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20 20 20 20  . So copy.      
1ce30 20 20 20 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f        ** it in o
1ce40 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  ne go. */.      
1ce50 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ce60 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
1ce70 42 75 66 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69  Buf, &pDoclist[i
1ce80 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  Off], nCopy);.  
1ce90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1cea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ceb0 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74  e entire poslist
1cec0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
1ced0 20 74 68 69 73 20 6c 65 61 66 2e 20 53 6f 20 69   this leaf. So i
1cee0 74 20 6e 65 65 64 73 0a 20 20 20 20 20 20 20 20  t needs.        
1cef0 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f      ** to be bro
1cf00 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e  ken into section
1cf10 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c  s. The only qual
1cf20 69 66 69 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a  ification being.
1cf30 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1cf40 68 61 74 20 65 61 63 68 20 76 61 72 69 6e 74 20  hat each varint 
1cf50 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64 20 63  must be stored c
1cf60 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f  ontiguously.  */
1cf70 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
1cf80 73 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74 20  st u8 *pPoslist 
1cf90 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  = &pDoclist[iOff
1cfa0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ];.            i
1cfb0 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20  nt iPos = 0;.   
1cfc0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
1cfd0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1cfe0 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20     int nSpace = 
1cff0 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 3b 0a  pgsz - pBuf->n;.
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1d010 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t n = 0;.       
1d020 20 20 20 20 20 20 20 69 66 28 20 28 6e 43 6f 70         if( (nCop
1d030 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63  y - iPos)<=nSpac
1d040 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1d050 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d       n = nCopy -
1d060 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20   iPos;.         
1d070 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d080 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
1d090 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69  fts5PoslistPrefi
1d0a0 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73  x(&pPoslist[iPos
1d0b0 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 20 20  ], nSpace);.    
1d0c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d0d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d0e0 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ( n>0 );.       
1d0f0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1d100 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
1d110 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b  pBuf, &pPoslist[
1d120 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20  iPos], n);.     
1d130 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d           iPos +=
1d140 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
1d150 20 20 69 66 28 20 70 42 75 66 2d 3e 6e 3e 3d 70    if( pBuf->n>=p
1d160 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
1d170 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1d180 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72  FlushLeaf(p, &wr
1d190 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  iter);.         
1d1a0 20 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 77         pBuf = &w
1d1b0 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d  riter.aWriter[0]
1d1c0 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20  .buf;.          
1d1d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d1e0 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43      if( iPos>=nC
1d1f0 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  opy ) break;.   
1d200 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d220 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a   iOff += nCopy;.
1d230 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d240 7d 0a 0a 20 20 20 20 20 20 70 42 75 66 2d 3e 70  }..      pBuf->p
1d250 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c  [pBuf->n++] = '\
1d260 30 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0';.      assert
1d270 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d  ( pBuf->n<=pBuf-
1d280 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20  >nSpace );.     
1d290 20 7a 50 72 65 76 20 3d 20 28 63 6f 6e 73 74 20   zPrev = (const 
1d2a0 75 38 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20 20  u8*)zTerm;.     
1d2b0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1d2c0 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b  ScanNext(pHash);
1d2d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d2e0 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
1d2f0 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35  pHash);.    fts5
1d300 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
1d310 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67 68 74  writer, &nHeight
1d320 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20  , &pgnoLast);.. 
1d330 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
1d340 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 20   Fts5Structure. 
1d350 49 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  It is written ba
1d360 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ck to the databa
1d370 73 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  se by the.    **
1d380 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1d390 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65 6c  lease() call bel
1d3a0 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ow.  */.    if( 
1d3b0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d  pStruct->nLevel=
1d3c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
1d3d0 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
1d3e0 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72 75  l(&p->rc, &pStru
1d3f0 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ct);.    }.    f
1d400 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
1d410 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
1d420 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 30  pStruct, 0, 1, 0
1d430 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1d440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d450 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74       pSeg = &pSt
1d460 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e  ruct->aLevel[0].
1d470 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e 61  aSeg[ pStruct->a
1d480 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20  Level[0].nSeg++ 
1d490 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 69  ];.      pSeg->i
1d4a0 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
1d4b0 20 20 20 20 20 20 70 53 65 67 2d 3e 6e 48 65 69        pSeg->nHei
1d4c0 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b 0a 20  ght = nHeight;. 
1d4d0 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
1d4e0 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
1d4f0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1d500 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20   pgnoLast;.     
1d510 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
1d520 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
1d530 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1d540 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75  mote(p, 0, pStru
1d550 63 74 29 3b 0a 20 20 7d 0a 0a 0a 20 20 66 74 73  ct);.  }...  fts
1d560 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28  5IndexAutomerge(
1d570 70 2c 20 69 48 61 73 68 2c 20 26 70 53 74 72 75  p, iHash, &pStru
1d580 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  ct, pgnoLast);. 
1d590 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1d5a0 6d 65 72 67 65 28 70 2c 20 69 48 61 73 68 2c 20  merge(p, iHash, 
1d5b0 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73  &pStruct);.  fts
1d5c0 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
1d5d0 70 2c 20 69 48 61 73 68 2c 20 70 53 74 72 75 63  p, iHash, pStruc
1d5e0 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
1d5f0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
1d600 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  ct);.}../*.** Fl
1d610 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ush any data sto
1d620 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
1d630 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
1d640 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d660 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
1d670 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
1d680 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
1d690 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
1d6a0 67 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  g;.  int i;     
1d6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6c0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1d6d0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1d6e0 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74  indexes */.  int
1d6f0 20 6e 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20   nLeaf = 0;     
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d710 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
1d720 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f   written */..  /
1d730 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
1d740 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65  s already occure
1d750 64 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  d this call is a
1d760 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
1d770 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
1d780 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1d790 61 73 73 65 72 74 28 20 70 2d 3e 61 70 48 61 73  assert( p->apHas
1d7a0 68 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c 75 73 68  h );..  /* Flush
1d7b0 20 74 68 65 20 74 65 72 6d 73 20 61 6e 64 20 65   the terms and e
1d7c0 61 63 68 20 70 72 65 66 69 78 20 69 6e 64 65 78  ach prefix index
1d7d0 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 66 6f   to disk */.  fo
1d7e0 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69  r(i=0; i<=pConfi
1d7f0 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29  g->nPrefix; i++)
1d800 7b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f  {.    fts5FlushO
1d810 6e 65 48 61 73 68 28 70 2c 20 69 2c 20 26 6e 4c  neHash(p, i, &nL
1d820 65 61 66 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  eaf);.  }.  p->n
1d830 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b  PendingData = 0;
1d840 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
1d850 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  Fts5IndexOptimiz
1d860 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
1d870 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
1d880 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
1d890 66 69 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  fig;.  int i;.. 
1d8a0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1d8b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
1d8c0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
1d8d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
1d8e0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
1d8f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
1d900 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1d910 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
1d920 72 65 52 65 61 64 28 70 2c 20 69 29 3b 0a 20 20  reRead(p, i);.  
1d930 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1d940 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
1d950 6e 74 20 6e 53 65 67 20 3d 20 30 3b 0a 20 20 20  nt nSeg = 0;.   
1d960 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
1d970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
1d980 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d  truct->nSegment=
1d990 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f  =fts5StructureCo
1d9a0 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72  untSegments(pStr
1d9b0 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e 53  uct) );.      nS
1d9c0 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53  eg = pStruct->nS
1d9d0 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20 69 66  egment;.      if
1d9e0 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20 20 20  ( nSeg>1 ){.    
1d9f0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
1da00 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
1da10 74 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  ture);.        n
1da20 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74  Byte += (pStruct
1da30 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69  ->nLevel+1) * si
1da40 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1da50 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  reLevel);.      
1da60 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74    pNew = (Fts5St
1da70 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33  ructure*)sqlite3
1da80 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
1da90 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20  p->rc, nByte);. 
1daa0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1dab0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1dac0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1dad0 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20  Level *pLvl;.   
1dae0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
1daf0 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  Seg * sizeof(Fts
1db00 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1db10 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  t);.      pNew->
1db20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74  nLevel = pStruct
1db30 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20  ->nLevel+1;.    
1db40 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f    pNew->nWriteCo
1db50 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d  unter = pStruct-
1db60 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
1db70 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e        pLvl = &pN
1db80 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75  ew->aLevel[pStru
1db90 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20  ct->nLevel];.   
1dba0 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
1dbb0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
1dbc0 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
1dbd0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
1dbe0 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >rc, nByte);.   
1dbf0 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65     if( pLvl->aSe
1dc00 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  g ){.        int
1dc10 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
1dc20 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74       int iSegOut
1dc30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1dc40 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1dc50 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1dc60 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1dc70 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1dc80 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1dc90 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1dca0 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1dcb0 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b       pLvl->aSeg[
1dcc0 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75  iSegOut] = pStru
1dcd0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1dce0 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
1dcf0 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74           iSegOut
1dd00 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
1dd10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dd20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74    pNew->nSegment
1dd30 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20   = pLvl->nSeg = 
1dd40 6e 53 65 67 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nSeg;.      }els
1dd50 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1dd60 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
1dd70 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b         pNew = 0;
1dd80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1dd90 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
1dda0 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d        int iLvl =
1ddb0 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b   pNew->nLevel-1;
1ddc0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d  .      while( p-
1ddd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1dde0 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69  & pNew->aLevel[i
1ddf0 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20  Lvl].nSeg>0 ){. 
1de00 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20         int nRem 
1de10 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f  = FTS5_OPT_WORK_
1de20 55 4e 49 54 3b 0a 20 20 20 20 20 20 20 20 66 74  UNIT;.        ft
1de30 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
1de40 6c 28 70 2c 20 69 2c 20 26 70 4e 65 77 2c 20 69  l(p, i, &pNew, i
1de50 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
1de60 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35     }..      fts5
1de70 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
1de80 2c 20 69 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  , i, pNew);.    
1de90 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
1dea0 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
1deb0 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72    }..    fts5Str
1dec0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
1ded0 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 72  truct);.  }..  r
1dee0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
1def0 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e  eturn(p); .}..in
1df00 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
1df10 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65  exMerge(Fts5Inde
1df20 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65  x *p, int nMerge
1df30 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
1df40 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 0a 20 20  re *pStruct;..  
1df50 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
1df60 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 30  ructureRead(p, 0
1df70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 4d 65  );.  fts5IndexMe
1df80 72 67 65 28 70 2c 20 30 2c 20 26 70 53 74 72 75  rge(p, 0, &pStru
1df90 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20 20 66  ct, nMerge);.  f
1dfa0 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
1dfb0 65 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29  e(p, 0, pStruct)
1dfc0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
1dfd0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1dfe0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73  );..  return fts
1dff0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
1e000 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  .}.../*.** Itera
1e010 74 6f 72 20 70 4d 75 6c 74 69 20 63 75 72 72 65  tor pMulti curre
1e020 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
1e030 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f   valid entry (no
1e040 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20  t EOF). This.** 
1e050 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
1e060 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
1e070 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 6f 66 20  osition-list of 
1e080 74 68 65 20 65 6e 74 72 79 20 70 4d 75 6c 74 69  the entry pMulti
1e090 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70   .** currently p
1e0a0 6f 69 6e 74 73 20 74 6f 20 74 6f 20 62 75 66 66  oints to to buff
1e0b0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49  er pBuf..**.** I
1e0c0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1e0d0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1e0e0 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72   is left in p->r
1e0f0 63 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  c. It is assumed
1e100 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 68 61 73  .** no error has
1e110 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1e120 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
1e130 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
1e140 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1e150 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c  ts5MultiIterPosl
1e160 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
1e170 20 2a 70 2c 0a 20 20 46 74 73 35 4d 75 6c 74 69   *p,.  Fts5Multi
1e180 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c  SegIter *pMulti,
1e190 0a 20 20 69 6e 74 20 62 53 7a 2c 0a 20 20 46 74  .  int bSz,.  Ft
1e1a0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29  s5Buffer *pBuf.)
1e1b0 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1e1c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e1d0 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 69 74  Fts5ChunkIter it
1e1e0 65 72 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49  er;.    Fts5SegI
1e1f0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75  ter *pSeg = &pMu
1e200 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74  lti->aSeg[ pMult
1e210 69 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  i->aFirst[1].iFi
1e220 72 73 74 20 5d 3b 0a 20 20 20 20 61 73 73 65 72  rst ];.    asser
1e230 74 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  t( fts5MultiIter
1e240 45 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d  Eof(p, pMulti)==
1e250 30 20 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20  0 );.    static 
1e260 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20  int nCall = 0;. 
1e270 20 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a 20 20 20     nCall++;..   
1e280 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e   fts5ChunkIterIn
1e290 69 74 28 70 2c 20 70 53 65 67 2c 20 26 69 74 65  it(p, pSeg, &ite
1e2a0 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73  r);..    if( fts
1e2b0 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c  5ChunkIterEof(p,
1e2c0 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20   &iter)==0 ){.  
1e2d0 20 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20      if( bSz ){. 
1e2e0 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50         /* WRITEP
1e2f0 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20  OSLISTSIZE */.  
1e300 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1e310 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1e320 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e  >rc, pBuf, iter.
1e330 6e 52 65 6d 20 2a 20 32 29 3b 0a 20 20 20 20 20  nRem * 2);.     
1e340 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
1e350 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
1e360 28 70 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b  (p, &iter)==0 ){
1e370 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1e380 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1e390 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72  ->rc, pBuf, iter
1e3a0 2e 6e 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20 20  .n, iter.p);.   
1e3b0 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
1e3c0 65 72 4e 65 78 74 28 70 2c 20 26 69 74 65 72 29  erNext(p, &iter)
1e3d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e3e0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
1e3f0 72 52 65 6c 65 61 73 65 28 26 69 74 65 72 29 3b  rRelease(&iter);
1e400 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
1e410 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49  oid fts5DoclistI
1e420 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c  terNext(Fts5Docl
1e430 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b  istIter *pIter){
1e440 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 3c  .  if( pIter->i<
1e450 70 49 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20 20  pIter->n ){.    
1e460 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
1e470 69 66 28 20 70 49 74 65 72 2d 3e 69 20 29 7b 0a  if( pIter->i ){.
1e480 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
1e490 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
1e4a0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
1e4b0 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69  Iter->a[pIter->i
1e4c0 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
1e4d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
1e4e0 65 72 2d 3e 62 44 65 73 63 20 29 7b 0a 20 20 20  er->bDesc ){.   
1e4f0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77       pIter->iRow
1e500 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id -= iDelta;.  
1e510 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e520 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
1e530 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
1e540 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1e550 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d       pIter->i +=
1e560 20 67 65 74 56 61 72 69 6e 74 28 26 70 49 74 65   getVarint(&pIte
1e570 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20  r->a[pIter->i], 
1e580 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
1e590 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
1e5a0 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73   pIter->i += fts
1e5b0 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
1e5c0 0a 20 20 20 20 20 20 20 20 26 70 49 74 65 72 2d  .        &pIter-
1e5d0 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 26 70  >a[pIter->i], &p
1e5e0 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 2c 20  Iter->nPoslist, 
1e5f0 26 62 44 75 6d 6d 79 0a 20 20 20 20 29 3b 0a 20  &bDummy.    );. 
1e600 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69     pIter->aPosli
1e610 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 5b 70  st = &pIter->a[p
1e620 49 74 65 72 2d 3e 69 5d 3b 0a 20 20 20 20 70 49  Iter->i];.    pI
1e630 74 65 72 2d 3e 69 20 2b 3d 20 70 49 74 65 72 2d  ter->i += pIter-
1e640 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c  >nPoslist;.  }el
1e650 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  se{.    pIter->a
1e660 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d  Poslist = 0;.  }
1e670 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1e680 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
1e690 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65  nit(.  Fts5Buffe
1e6a0 72 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  r *pBuf, .  int 
1e6b0 62 44 65 73 63 2c 20 0a 20 20 46 74 73 35 44 6f  bDesc, .  Fts5Do
1e6c0 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72  clistIter *pIter
1e6d0 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  .){.  memset(pIt
1e6e0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
1e6f0 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
1e700 3e 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20  >a = pBuf->p;.  
1e710 70 49 74 65 72 2d 3e 6e 20 3d 20 70 42 75 66 2d  pIter->n = pBuf-
1e720 3e 6e 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 65  >n;.  pIter->bDe
1e730 73 63 20 3d 20 62 44 65 73 63 3b 0a 20 20 66 74  sc = bDesc;.  ft
1e740 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1e750 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  t(pIter);.}../*.
1e760 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c  ** Append a docl
1e770 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70 42  ist to buffer pB
1e780 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  uf..*/.static vo
1e790 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70 65  id fts5MergeAppe
1e7a0 6e 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20 2a  ndDocid(.  int *
1e7b0 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
1e7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
1e7d0 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65  /OUT: Error code
1e7e0 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c   */.  int bDesc,
1e7f0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1e800 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1e810 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
1e820 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36  write to */.  i6
1e830 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20  4 *piLastRowid, 
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e850 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75   IN/OUT: Previou
1e860 73 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20  s rowid written 
1e870 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36  (if any) */.  i6
1e880 34 20 69 52 6f 77 69 64 20 20 20 20 20 20 20 20  4 iRowid        
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8a0 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64   Rowid to append
1e8b0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 42 75   */.){.  if( pBu
1e8c0 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66  f->n==0 ){.    f
1e8d0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1e8e0 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c  arint(pRc, pBuf,
1e8f0 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73   iRowid);.  }els
1e900 65 20 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20  e if( bDesc ){. 
1e910 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1e920 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70  endVarint(pRc, p
1e930 42 75 66 2c 20 2a 70 69 4c 61 73 74 52 6f 77 69  Buf, *piLastRowi
1e940 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d  d - iRowid);.  }
1e950 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75  else{.    fts5Bu
1e960 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1e970 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77  (pRc, pBuf, iRow
1e980 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69  id - *piLastRowi
1e990 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61 73  d);.  }.  *piLas
1e9a0 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  tRowid = iRowid;
1e9b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72  .}../*.** Buffer
1e9c0 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74  s p1 and p2 cont
1e9d0 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68  ain doclists. Th
1e9e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67  is function merg
1e9f0 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a  es the content.*
1ea00 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63  * of the two doc
1ea10 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61  lists together a
1ea20 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70  nd sets buffer p
1ea30 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  1 to the result 
1ea40 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  before.** return
1ea50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
1ea60 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
1ea70 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1ea80 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49  left in p->rc. I
1ea90 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a  f an error has.*
1eaa0 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
1eab0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
1eac0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
1ead0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1eae0 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
1eaf0 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  s(.  Fts5Index *
1eb00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1eb10 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1eb20 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1eb30 20 69 6e 74 20 62 44 65 73 63 2c 0a 20 20 46 74   int bDesc,.  Ft
1eb40 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20  s5Buffer *p1,   
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb60 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d   First list to m
1eb70 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  erge */.  Fts5Bu
1eb80 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20  ffer *p2        
1eb90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
1eba0 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  ond list to merg
1ebb0 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32  e */.){.  if( p2
1ebc0 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ->n ){.    i64 i
1ebd0 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
1ebe0 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
1ebf0 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44  er i1;.    Fts5D
1ec00 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20  oclistIter i2;. 
1ec10 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75     Fts5Buffer ou
1ec20 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  t;.    Fts5Buffe
1ec30 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65  r tmp;.    memse
1ec40 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f  t(&out, 0, sizeo
1ec50 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d  f(out));.    mem
1ec60 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a  set(&tmp, 0, siz
1ec70 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20  eof(tmp));..    
1ec80 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
1ec90 6e 69 74 28 70 31 2c 20 62 44 65 73 63 2c 20 26  nit(p1, bDesc, &
1eca0 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  i1);.    fts5Doc
1ecb0 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c  listIterInit(p2,
1ecc0 20 62 44 65 73 63 2c 20 26 69 32 29 3b 0a 20 20   bDesc, &i2);.  
1ecd0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1ece0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 31  SQLITE_OK && (i1
1ecf0 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20  .aPoslist!=0 || 
1ed00 69 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30 29 20  i2.aPoslist!=0) 
1ed10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e  ){.      if( i2.
1ed20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28  aPoslist==0 || (
1ed30 69 31 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 0a  i1.aPoslist && .
1ed40 20 20 20 20 20 20 20 20 20 20 20 28 20 28 62 44             ( (bD
1ed50 65 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64  esc && i1.iRowid
1ed60 3e 69 32 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28  >i2.iRowid) || (
1ed70 21 62 44 65 73 63 20 26 26 20 69 31 2e 69 52 6f  !bDesc && i1.iRo
1ed80 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 29 20 29  wid<i2.iRowid) )
1ed90 0a 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20  .      )){.     
1eda0 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79     /* Copy entry
1edb0 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20   from i1 */.    
1edc0 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
1edd0 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c  endDocid(&p->rc,
1ede0 20 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69   bDesc, &out, &i
1edf0 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52  LastRowid, i1.iR
1ee00 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 2f  owid);.        /
1ee10 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
1ee20 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  ZE */.        ft
1ee30 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1ee40 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75  rint(&p->rc, &ou
1ee50 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2a  t, i1.nPoslist *
1ee60 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   2);.        fts
1ee70 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1ee80 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  b(&p->rc, &out, 
1ee90 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 31 2e  i1.nPoslist, i1.
1eea0 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  aPoslist);.     
1eeb0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
1eec0 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
1eed0 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20     }.      else 
1eee0 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d  if( i1.aPoslist=
1eef0 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21  =0 || i2.iRowid!
1ef00 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20  =i1.iRowid ){.  
1ef10 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e        /* Copy en
1ef20 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20  try from i2 */. 
1ef30 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
1ef40 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e  AppendDocid(&p->
1ef50 72 63 2c 20 62 44 65 73 63 2c 20 26 6f 75 74 2c  rc, bDesc, &out,
1ef60 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32   &iLastRowid, i2
1ef70 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
1ef80 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
1ef90 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20  TSIZE */.       
1efa0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1efb0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1efc0 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  &out, i2.nPoslis
1efd0 74 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20  t * 2);.        
1efe0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1eff0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75  Blob(&p->rc, &ou
1f000 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  t, i2.nPoslist, 
1f010 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20  i2.aPoslist);.  
1f020 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
1f030 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a  tIterNext(&i2);.
1f040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c        }.      el
1f050 73 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  se{.        Fts5
1f060 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72 31  PoslistReader r1
1f070 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  ;.        Fts5Po
1f080 73 6c 69 73 74 52 65 61 64 65 72 20 72 32 3b 0a  slistReader r2;.
1f090 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
1f0a0 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72  istWriter writer
1f0b0 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ;..        memse
1f0c0 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69  t(&writer, 0, si
1f0d0 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a  zeof(writer));..
1f0e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65          /* Merge
1f0f0 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f   the two positio
1f100 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20  n lists. */ .   
1f110 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
1f120 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63  pendDocid(&p->rc
1f130 2c 20 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26  , bDesc, &out, &
1f140 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69  iLastRowid, i2.i
1f150 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
1f160 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
1f170 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  tmp);.        sq
1f180 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
1f190 52 65 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69  ReaderInit(-1, i
1f1a0 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e  1.aPoslist, i1.n
1f1b0 50 6f 73 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20  Poslist, &r1);. 
1f1c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1f1d0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49  s5PoslistReaderI
1f1e0 6e 69 74 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c  nit(-1, i2.aPosl
1f1f0 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  ist, i2.nPoslist
1f200 2c 20 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20  , &r2);.        
1f210 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1f220 4c 49 54 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62  LITE_OK && (r1.b
1f230 45 6f 66 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f  Eof==0 || r2.bEo
1f240 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  f==0) ){.       
1f250 20 20 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20     i64 iNew;.   
1f260 20 20 20 20 20 20 20 69 66 28 20 72 32 2e 62 45         if( r2.bE
1f270 6f 66 20 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d  of || (r1.bEof==
1f280 30 20 26 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e  0 && r1.iPos<r2.
1f290 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20  iPos) ){.       
1f2a0 20 20 20 20 20 69 4e 65 77 20 3d 20 72 31 2e 69       iNew = r1.i
1f2b0 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pos;.           
1f2c0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1f2d0 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72  istReaderNext(&r
1f2e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  1);.          }e
1f2f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1f300 20 69 4e 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b   iNew = r2.iPos;
1f310 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1f320 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
1f330 65 61 64 65 72 4e 65 78 74 28 26 72 32 29 3b 0a  eaderNext(&r2);.
1f340 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f350 72 31 2e 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73  r1.iPos==r2.iPos
1f360 20 29 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f   ) sqlite3Fts5Po
1f370 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
1f380 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &r1);.          
1f390 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  }.          p->r
1f3a0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50  c = sqlite3Fts5P
1f3b0 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65  oslistWriterAppe
1f3c0 6e 64 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72  nd(&tmp, &writer
1f3d0 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , iNew);.       
1f3e0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
1f3f0 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
1f400 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
1f410 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1f420 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  t(&p->rc, &out, 
1f430 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20  tmp.n * 2);.    
1f440 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f450 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1f460 20 26 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d   &out, tmp.n, tm
1f470 70 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74  p.p);.        ft
1f480 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1f490 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20  t(&i1);.        
1f4a0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
1f4b0 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
1f4c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
1f4d0 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
1f4e0 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75  c, p1, out.n, ou
1f4f0 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75  t.p);.    fts5Bu
1f500 66 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a  fferFree(&tmp);.
1f510 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
1f520 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a  ee(&out);.  }.}.
1f530 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1f540 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35  5BufferSwap(Fts5
1f550 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35  Buffer *p1, Fts5
1f560 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46  Buffer *p2){.  F
1f570 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20  ts5Buffer tmp = 
1f580 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32  *p1;.  *p1 = *p2
1f590 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d  ;.  *p2 = tmp;.}
1f5a0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1f5b0 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65  s5SetupPrefixIte
1f5c0 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r(.  Fts5Index *
1f5d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1f5e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
1f5f0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1f600 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20  int bDesc,      
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44  /* True for "ORD
1f630 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
1f640 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  " */.  const u8 
1f650 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20  *pToken,        
1f660 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1f670 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66   containing pref
1f680 69 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20  ix to match */. 
1f690 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20   int nToken,    
1f6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
1f6c0 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74  er pToken in byt
1f6d0 65 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  es */.  Fts5Inde
1f6e0 78 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  xIter *pIter    
1f6f0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c          /* Popul
1f700 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ate this object 
1f710 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
1f720 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
1f730 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42    Fts5Buffer *aB
1f740 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  uf;.  const int 
1f750 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42  nBuf = 32;..  aB
1f760 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72  uf = (Fts5Buffer
1f770 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
1f780 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  p, sizeof(Fts5Bu
1f790 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70  ffer)*nBuf);.  p
1f7a0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1f7b0 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 30 29  uctureRead(p, 0)
1f7c0 3b 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26  ;..  if( aBuf &&
1f7d0 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
1f7e0 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
1f7f0 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69  *pDoclist;.    i
1f800 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c  nt i;.    i64 iL
1f810 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
1f820 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
1f830 65 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20  er *p1 = 0;     
1f840 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
1f850 20 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20   to gather data 
1f860 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20  from index */.  
1f870 20 20 46 74 73 35 42 75 66 66 65 72 20 64 6f 63    Fts5Buffer doc
1f880 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65  list;..    memse
1f890 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73  t(&doclist, 0, s
1f8a0 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b  izeof(doclist));
1f8b0 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c  .    for(fts5Mul
1f8c0 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
1f8d0 72 75 63 74 2c 20 30 2c 20 31 2c 20 31 2c 20 70  ruct, 0, 1, 1, p
1f8e0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d  Token, nToken, -
1f8f0 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20 20  1, 0, &p1);.    
1f900 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1f910 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a  rEof(p, p1)==0;.
1f920 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
1f930 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 31 2c  iIterNext(p, p1,
1f940 20 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20 20   0, 0).    ){.  
1f950 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
1f960 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
1f970 77 69 64 28 70 31 29 3b 0a 20 20 20 20 20 20 69  wid(p1);.      i
1f980 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt nTerm;.      
1f990 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
1f9a0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
1f9b0 65 72 6d 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b  erm(p1, &nTerm);
1f9c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1f9d0 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
1f9e0 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c  erm, MIN(nToken,
1f9f0 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20   nTerm))<=0 );. 
1fa00 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e       if( nTerm<n
1fa10 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  Token || memcmp(
1fa20 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e  pToken, pTerm, n
1fa30 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a  Token) ) break;.
1fa40 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69  .      if( docli
1fa50 73 74 2e 6e 3e 30 20 0a 20 20 20 20 20 20 20 26  st.n>0 .       &
1fa60 26 20 28 28 21 62 44 65 73 63 20 26 26 20 69 52  & ((!bDesc && iR
1fa70 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64  owid<=iLastRowid
1fa80 29 20 7c 7c 20 28 62 44 65 73 63 20 26 26 20 69  ) || (bDesc && i
1fa90 52 6f 77 69 64 3e 3d 69 4c 61 73 74 52 6f 77 69  Rowid>=iLastRowi
1faa0 64 29 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20  d)).      ){..  
1fab0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
1fac0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1fad0 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b  && doclist.n; i+
1fae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
1faf0 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a  sert( i<nBuf );.
1fb00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42            if( aB
1fb10 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  uf[i].n==0 ){.  
1fb20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1fb30 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73  fferSwap(&doclis
1fb40 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
1fb50 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1fb60 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73  fferZero(&doclis
1fb70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
1fb80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1fb90 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
1fba0 4c 69 73 74 73 28 70 2c 20 62 44 65 73 63 2c 20  Lists(p, bDesc, 
1fbb0 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
1fbc0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
1fbd0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1fbe0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
1fbf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1fc00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1fc10 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30 20  f( doclist.n==0 
1fc20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
1fc30 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1fc40 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69  t(&p->rc, &docli
1fc50 73 74 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  st, iRowid);.   
1fc60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 44 65     }else if( bDe
1fc70 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  sc ){.        ft
1fc80 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1fc90 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f  rint(&p->rc, &do
1fca0 63 6c 69 73 74 2c 20 69 4c 61 73 74 52 6f 77 69  clist, iLastRowi
1fcb0 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  d - iRowid);.   
1fcc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fcd0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fce0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1fcf0 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69   &doclist, iRowi
1fd00 64 20 2d 20 69 4c 61 73 74 52 6f 77 69 64 29 3b  d - iLastRowid);
1fd10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1fd20 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
1fd30 69 64 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  id;.      fts5Mu
1fd40 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70  ltiIterPoslist(p
1fd50 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69 73  , p1, 1, &doclis
1fd60 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  t);.    }..    f
1fd70 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20  or(i=0; i<nBuf; 
1fd80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
1fd90 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
1fda0 28 70 2c 20 62 44 65 73 63 2c 20 26 64 6f 63 6c  (p, bDesc, &docl
1fdb0 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
1fdc0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fdd0 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a  Free(&aBuf[i]);.
1fde0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75      }.    fts5Mu
1fdf0 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
1fe00 31 29 3b 0a 0a 20 20 20 20 70 44 6f 63 6c 69 73  1);..    pDoclis
1fe10 74 20 3d 20 28 46 74 73 35 44 6f 63 6c 69 73 74  t = (Fts5Doclist
1fe20 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c  Iter*)fts5IdxMal
1fe30 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
1fe40 73 35 44 6f 63 6c 69 73 74 49 74 65 72 29 29 3b  s5DoclistIter));
1fe50 0a 20 20 20 20 69 66 28 20 21 70 44 6f 63 6c 69  .    if( !pDocli
1fe60 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  st ){.      fts5
1fe70 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c  BufferFree(&docl
1fe80 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
1fe90 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 44  .      pIter->pD
1fea0 6f 63 6c 69 73 74 20 3d 20 70 44 6f 63 6c 69 73  oclist = pDoclis
1feb0 74 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6f 63  t;.      fts5Doc
1fec0 6c 69 73 74 49 74 65 72 49 6e 69 74 28 26 64 6f  listIterInit(&do
1fed0 63 6c 69 73 74 2c 20 62 44 65 73 63 2c 20 70 49  clist, bDesc, pI
1fee0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a  ter->pDoclist);.
1fef0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
1ff00 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1ff10 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71  e(pStruct);.  sq
1ff20 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29  lite3_free(aBuf)
1ff30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  ;.}.../*.** Indi
1ff40 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75  cate that all su
1ff50 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1ff60 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
1ff70 65 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69  exWrite() pertai
1ff80 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75  n.** to the docu
1ff90 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20  ment with rowid 
1ffa0 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73  iRowid..*/.int s
1ffb0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42  qlite3Fts5IndexB
1ffc0 65 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e  eginWrite(Fts5In
1ffd0 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
1ffe0 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  id){.  assert( p
1fff0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20000 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
20010 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 69 66  e hash tables if
20020 20 74 68 65 79 20 68 61 76 65 20 6e 6f 74 20 61   they have not a
20030 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
20040 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  cated */.  if( p
20050 2d 3e 61 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20  ->apHash==0 ){. 
20060 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
20070 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20080 3b 0a 20 20 20 20 69 6e 74 20 6e 48 61 73 68 20  ;.    int nHash 
20090 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50  = p->pConfig->nP
200a0 72 65 66 69 78 20 2b 20 31 3b 0a 20 20 20 20 46  refix + 1;.    F
200b0 74 73 35 48 61 73 68 20 2a 2a 61 70 4e 65 77 3b  ts5Hash **apNew;
200c0 0a 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 46  ..    apNew = (F
200d0 74 73 35 48 61 73 68 2a 2a 29 73 71 6c 69 74 65  ts5Hash**)sqlite
200e0 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
200f0 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  &rc, sizeof(Fts5
20100 48 61 73 68 2a 29 2a 6e 48 61 73 68 29 3b 0a 20  Hash*)*nHash);. 
20110 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
20120 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e  SQLITE_OK && i<n
20130 48 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Hash; i++){.    
20140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
20150 73 35 48 61 73 68 4e 65 77 28 26 61 70 4e 65 77  s5HashNew(&apNew
20160 5b 69 5d 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e  [i], &p->nPendin
20170 67 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  gData);.    }.  
20180 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20190 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
201a0 61 70 48 61 73 68 20 3d 20 61 70 4e 65 77 3b 0a  apHash = apNew;.
201b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
201c0 20 69 66 28 20 61 70 4e 65 77 20 29 7b 0a 20 20   if( apNew ){.  
201d0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
201e0 3c 6e 48 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20  <nHash; i++){.  
201f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
20200 74 73 35 48 61 73 68 46 72 65 65 28 61 70 4e 65  ts5HashFree(apNe
20210 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  w[i]);.        }
20220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20230 5f 66 72 65 65 28 61 70 4e 65 77 29 3b 0a 20 20  _free(apNew);.  
20240 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
20250 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
20260 0a 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 3d  ..  if( iRowid<=
20270 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 7c  p->iWriteRowid |
20280 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  | (p->nPendingDa
20290 74 61 20 3e 20 70 2d 3e 6e 4d 61 78 50 65 6e 64  ta > p->nMaxPend
202a0 69 6e 67 44 61 74 61 29 20 29 7b 0a 20 20 20 20  ingData) ){.    
202b0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
202c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
202d0 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70  fts5IndexFlush(p
202e0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 57 72 69  );.  }.  p->iWri
202f0 74 65 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  teRowid = iRowid
20300 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
20310 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
20320 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64  ../*.** Commit d
20330 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  ata to disk..*/.
20340 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
20350 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64  ndexSync(Fts5Ind
20360 65 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d  ex *p, int bComm
20370 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  it){.  assert( p
20380 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20390 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c  );.  fts5IndexFl
203a0 75 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43  ush(p);.  if( bC
203b0 6f 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73  ommit ) fts5Clos
203c0 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65  eReader(p);.  re
203d0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
203e0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
203f0 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61  * Discard any da
20400 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
20410 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
20420 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77  tables. Do not w
20430 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68  rite it.** to th
20440 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
20450 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65  tionally, assume
20460 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
20470 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61  ts of the %_data
20480 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61  .** table may ha
20490 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69  ve changed on di
204a0 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65  sk. So any in-me
204b0 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25  mory caches of %
204c0 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64  _data .** record
204d0 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69  s must be invali
204e0 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  dated..*/.int sq
204f0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f  lite3Fts5IndexRo
20500 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78  llback(Fts5Index
20510 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73   *p){.  fts5Clos
20520 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74  eReader(p);.  ft
20530 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61  s5IndexDiscardDa
20540 74 61 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  ta(p);.  assert(
20550 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
20560 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  K );.  return SQ
20570 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
20580 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62  * The %_data tab
20590 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  le is completely
205a0 20 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73   empty when this
205b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
205c0 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  led. This.** fun
205d0 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20  ction populates 
205e0 69 74 20 77 69 74 68 20 74 68 65 20 69 6e 69 74  it with the init
205f0 69 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62  ial structure ob
20600 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 69  jects for each i
20610 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ndex,.** and the
20620 20 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e   initial version
20630 20 6f 66 20 74 68 65 20 22 61 76 65 72 61 67 65   of the "average
20640 73 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72  s" record (a zer
20650 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f  o-byte blob)..*/
20660 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
20670 49 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35  IndexReinit(Fts5
20680 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74  Index *p){.  int
20690 20 69 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74   i;.  Fts5Struct
206a0 75 72 65 20 73 3b 0a 0a 20 20 6d 65 6d 73 65 74  ure s;..  memset
206b0 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
206c0 74 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a  ts5Structure));.
206d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
206e0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
206f0 2b 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74  +1; i++){.    ft
20700 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
20710 28 70 2c 20 69 2c 20 26 73 29 3b 0a 20 20 7d 0a  (p, i, &s);.  }.
20720 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
20730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
20740 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
20750 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65  5IndexSetAverage
20760 73 28 70 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  s(p, (const u8*)
20770 22 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72  "", 0);.  }..  r
20780 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
20790 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
207a0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74  ** Open a new Ft
207b0 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20  s5Index handle. 
207c0 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20 61  If the bCreate a
207d0 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
207e0 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69   create.** and i
207f0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e  nitialize the un
20800 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20  derlying %_data 
20810 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
20820 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
20830 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  *pp to point to 
20840 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  the new object a
20850 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
20860 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  _OK..** Otherwis
20870 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  e, set *pp to NU
20880 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  LL and return an
20890 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
208a0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
208b0 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
208c0 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
208d0 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62  Config, .  int b
208e0 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49  Create, .  Fts5I
208f0 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61  ndex **pp,.  cha
20900 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69  r **pzErr.){.  i
20910 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20920 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  K;.  Fts5Index *
20930 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
20940 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
20950 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70  ct */..  *pp = p
20960 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73   = (Fts5Index*)s
20970 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
20980 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29  zeof(Fts5Index))
20990 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  ;.  if( !p ) ret
209a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
209b0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ;..  memset(p, 0
209c0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  , sizeof(Fts5Ind
209d0 65 78 29 29 3b 0a 20 20 70 2d 3e 70 43 6f 6e 66  ex));.  p->pConf
209e0 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20  ig = pConfig;.  
209f0 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46  p->nWorkUnit = F
20a00 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20  TS5_WORK_UNIT;. 
20a10 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44   p->nMaxPendingD
20a20 61 74 61 20 3d 20 31 30 32 34 2a 31 30 32 34 3b  ata = 1024*1024;
20a30 0a 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d  .  p->zDataTbl =
20a40 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
20a50 28 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e  ("%s_data", pCon
20a60 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  fig->zName);.  i
20a70 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d  f( p->zDataTbl==
20a80 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
20a90 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
20aa0 6c 73 65 20 69 66 28 20 62 43 72 65 61 74 65 20  lse if( bCreate 
20ab0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
20ac0 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62  te3Fts5CreateTab
20ad0 6c 65 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e  le(.        pCon
20ae0 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
20af0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
20b00 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
20b10 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
20b20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
20b30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20b40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
20b50 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29  s5IndexReinit(p)
20b60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
20b70 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
20b80 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 21 3d 53  LITE_OK || rc!=S
20b90 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
20ba0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
20bb0 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73  te3Fts5IndexClos
20bc0 65 28 70 2c 20 30 29 3b 0a 20 20 20 20 2a 70 70  e(p, 0);.    *pp
20bd0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
20be0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20bf0 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f  Close a handle o
20c00 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  pened by an earl
20c10 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ier call to sqli
20c20 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e  te3Fts5IndexOpen
20c30 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
20c40 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
20c50 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
20c60 6e 74 20 62 44 65 73 74 72 6f 79 29 7b 0a 20 20  nt bDestroy){.  
20c70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20c80 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  OK;.  if( p ){. 
20c90 20 20 20 69 66 28 20 62 44 65 73 74 72 6f 79 20     if( bDestroy 
20ca0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
20cb0 6c 69 74 65 33 46 74 73 35 44 72 6f 70 54 61 62  lite3Fts5DropTab
20cc0 6c 65 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 22  le(p->pConfig, "
20cd0 64 61 74 61 22 29 3b 0a 20 20 20 20 7d 0a 20 20  data");.    }.  
20ce0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65    assert( p->pRe
20cf0 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73  ader==0 );.    s
20d00 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
20d10 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p->pWriter);.   
20d20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
20d30 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a  e(p->pDeleter);.
20d40 20 20 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73      if( p->apHas
20d50 68 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  h ){.      int i
20d60 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
20d70 20 69 3c 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e   i<=p->pConfig->
20d80 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20  nPrefix; i++){. 
20d90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
20da0 73 35 48 61 73 68 46 72 65 65 28 70 2d 3e 61 70  s5HashFree(p->ap
20db0 48 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Hash[i]);.      
20dc0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
20dd0 66 72 65 65 28 70 2d 3e 61 70 48 61 73 68 29 3b  free(p->apHash);
20de0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
20df0 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61  e3_free(p->zData
20e00 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Tbl);.    sqlite
20e10 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20  3_free(p);.  }. 
20e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20e30 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
20e40 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
20e50 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74  er containing ut
20e60 66 2d 38 20 74 65 78 74 20 74 68 61 74 20 69 73  f-8 text that is
20e70 20 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20   n bytes in .** 
20e80 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65  size. Return the
20e90 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
20ea0 20 69 6e 20 74 68 65 20 6e 43 68 61 72 20 63 68   in the nChar ch
20eb0 61 72 61 63 74 65 72 20 70 72 65 66 69 78 20 6f  aracter prefix o
20ec0 66 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c  f the.** buffer,
20ed0 20 6f 72 20 30 20 69 66 20 74 68 65 72 65 20 61   or 0 if there a
20ee0 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 43 68  re less than nCh
20ef0 61 72 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  ar characters in
20f00 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69   total..*/.stati
20f10 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43  c int fts5IndexC
20f20 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28  harlenToBytelen(
20f30 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 69  const char *p, i
20f40 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 6e 43  nt nByte, int nC
20f50 68 61 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  har){.  int n = 
20f60 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
20f70 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20  r(i=0; i<nChar; 
20f80 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e  i++){.    if( n>
20f90 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e 20  =nByte ) return 
20fa0 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74  0;      /* Input
20fb0 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
20fc0 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73  than nChar chars
20fd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73   */.    if( (uns
20fe0 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b  igned char)p[n++
20ff0 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20  ]>=0xc0 ){.     
21000 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20   while( (p[n] & 
21010 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e 2b  0xc0)==0x80 ) n+
21020 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
21030 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
21040 2a 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38  * pIn is a UTF-8
21050 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c   encoded string,
21060 20 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69   nIn bytes in si
21070 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ze. Return the n
21080 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63  umber of.** unic
21090 6f 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69  ode characters i
210a0 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f  n the string..*/
210b0 0a 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68  .int fts5IndexCh
210c0 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  arlen(const char
210d0 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b   *pIn, int nIn){
210e0 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 30  .  int nChar = 0
210f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20  ;            .  
21100 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69  int i = 0;.  whi
21110 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20  le( i<nIn ){.   
21120 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63   if( (unsigned c
21130 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78  har)pIn[i++]>=0x
21140 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  c0 ){.      whil
21150 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e  e( i<nIn && (pIn
21160 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38  [i] & 0xc0)==0x8
21170 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20  0 ) i++;.    }. 
21180 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a     nChar++;.  }.
21190 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a    return nChar;.
211a0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
211b0 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74  or remove data t
211c0 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e  o or from the in
211d0 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61  dex. Each time a
211e0 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a   document is .**
211f0 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d   added to or rem
21200 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  oved from the in
21210 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69  dex, this functi
21220 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65  on is called one
21230 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65   or more.** time
21240 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  s..**.** For an 
21250 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20  insert, it must 
21260 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
21270 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e  or each token in
21280 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e   the new documen
21290 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65  t..** If the ope
212a0 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65  ration is a dele
212b0 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  te, it must be c
212c0 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29  alled (at least)
212d0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a   once for each.*
212e0 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69  * unique token i
212f0 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77  n the document w
21300 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75  ith an iCol valu
21310 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  e less than zero
21320 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72  . The iPos.** ar
21330 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65  gument is ignore
21340 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a  d for a delete..
21350 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
21360 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20  s5IndexWrite(.  
21370 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21390 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74  /* Index to writ
213a0 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43  e to */.  int iC
213b0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
213c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
213d0 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72  umn token appear
213e0 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c  s in (-ve -> del
213f0 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ete) */.  int iP
21400 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  os,             
21410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
21420 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77  ition of token w
21430 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ithin column */.
21440 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
21450 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
21460 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64    /* Token to ad
21470 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f  d or remove to o
21480 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a  r from index */.
21490 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214b0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
214c0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
214d0 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74  indexes */.  int
214e0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21500 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
21510 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
21520 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
21530 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  g;..  assert( p-
21540 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
21550 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ;..  /* Add the 
21560 6e 65 77 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65  new token to the
21570 20 6d 61 69 6e 20 74 65 72 6d 73 20 68 61 73 68   main terms hash
21580 20 74 61 62 6c 65 2e 20 41 6e 64 20 74 6f 20 65   table. And to e
21590 61 63 68 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ach of the.  ** 
215a0 70 72 65 66 69 78 20 68 61 73 68 20 74 61 62 6c  prefix hash tabl
215b0 65 73 20 74 68 61 74 20 69 74 20 69 73 20 6c 61  es that it is la
215c0 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 2e 20  rge enough for. 
215d0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
215e0 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a  3Fts5HashWrite(.
215f0 20 20 20 20 20 20 70 2d 3e 61 70 48 61 73 68 5b        p->apHash[
21600 30 5d 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  0], p->iWriteRow
21610 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
21620 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20  pToken, nToken. 
21630 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
21640 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  <pConfig->nPrefi
21650 78 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  x && rc==SQLITE_
21660 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  OK; i++){.    in
21670 74 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e  t nByte = fts5In
21680 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
21690 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  len(pToken, nTok
216a0 65 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  en, pConfig->aPr
216b0 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 69 66  efix[i]);.    if
216c0 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
216d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
216e0 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 20 20  5HashWrite(.    
216f0 20 20 20 20 20 20 70 2d 3e 61 70 48 61 73 68 5b        p->apHash[
21700 69 2b 31 5d 2c 20 70 2d 3e 69 57 72 69 74 65 52  i+1], p->iWriteR
21710 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
21720 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42 79 74 65 0a  , pToken, nByte.
21730 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
21740 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
21750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
21760 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f   new iterator to
21770 20 69 74 65 72 61 74 65 20 74 68 6f 75 67 68 20   iterate though 
21780 61 6c 6c 20 64 6f 63 69 64 73 20 74 68 61 74 20  all docids that 
21790 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70  match the .** sp
217a0 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72  ecified token or
217b0 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a   token prefix..*
217c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
217d0 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46  5IndexQuery(.  F
217e0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21800 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71  * FTS index to q
21810 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  uery */.  const 
21820 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
21830 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b  t nToken, /* Tok
21840 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20 74  en (or prefix) t
21850 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
21860 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21880 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
21890 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c  INDEX_QUERY_X fl
218a0 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  ags */.  Fts5Ind
218b0 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20  exIter **ppIter 
218c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
218d0 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62   New iterator ob
218e0 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ject */.){.  Fts
218f0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
21900 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
21910 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
21920 70 52 65 74 3b 0a 20 20 69 6e 74 20 69 49 64 78  pRet;.  int iIdx
21930 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 66 6c 61   = 0;..  if( fla
21940 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
21950 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20  UERY_PREFIX ){. 
21960 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
21970 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54  TS5INDEX_QUERY_T
21980 45 53 54 5f 4e 4f 49 44 58 20 29 7b 0a 20 20 20  EST_NOIDX ){.   
21990 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e     iIdx = 1+pCon
219a0 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20  fig->nPrefix;.  
219b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
219c0 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49  nt nChar = fts5I
219d0 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b  ndexCharlen(pTok
219e0 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
219f0 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
21a00 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
21a10 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
21a20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e          if( pCon
21a30 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
21a40 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72  x-1]==nChar ) br
21a50 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
21a60 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d   }.  }..  pRet =
21a70 20 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a   (Fts5IndexIter*
21a80 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
21a90 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 73  ocZero(&p->rc, s
21aa0 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49  izeof(Fts5IndexI
21ab0 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70 52 65  ter));.  if( pRe
21ac0 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t ){.    memset(
21ad0 70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pRet, 0, sizeof(
21ae0 46 74 73 35 49 6e 64 65 78 49 74 65 72 29 29 3b  Fts5IndexIter));
21af0 0a 0a 20 20 20 20 70 52 65 74 2d 3e 70 49 6e 64  ..    pRet->pInd
21b00 65 78 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20  ex = p;.    if( 
21b10 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
21b20 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20  Prefix ){.      
21b30 70 52 65 74 2d 3e 70 53 74 72 75 63 74 20 3d 20  pRet->pStruct = 
21b40 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
21b50 64 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20  d(p, iIdx);.    
21b60 20 20 69 66 28 20 70 52 65 74 2d 3e 70 53 74 72    if( pRet->pStr
21b70 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66  uct ){.        f
21b80 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
21b90 70 2c 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74  p, pRet->pStruct
21ba0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  , .            i
21bb0 49 64 78 2c 20 31 2c 20 66 6c 61 67 73 2c 20 28  Idx, 1, flags, (
21bc0 63 6f 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e  const u8*)pToken
21bd0 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c  , nToken, -1, 0,
21be0 20 26 70 52 65 74 2d 3e 70 4d 75 6c 74 69 0a 20   &pRet->pMulti. 
21bf0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
21c00 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
21c10 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20 28     int bDesc = (
21c20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
21c30 58 5f 51 55 45 52 59 5f 44 45 53 43 29 21 3d 30  X_QUERY_DESC)!=0
21c40 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75  ;.      fts5Setu
21c50 70 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62  pPrefixIter(p, b
21c60 44 65 73 63 2c 20 28 63 6f 6e 73 74 20 75 38 2a  Desc, (const u8*
21c70 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c  )pToken, nToken,
21c80 20 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20   pRet);.    }.  
21c90 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  }..  if( p->rc )
21ca0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
21cb0 35 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74 29  5IterClose(pRet)
21cc0 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  ;.    pRet = 0;.
21cd0 20 20 7d 0a 20 20 2a 70 70 49 74 65 72 20 3d 20    }.  *ppIter = 
21ce0 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 66  pRet;.  return f
21cf0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
21d00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
21d10 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
21d20 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
21d30 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
21d40 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a  ent is at EOF..*
21d50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
21d60 35 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  5IterEof(Fts5Ind
21d70 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
21d80 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
21d90 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c  >pIndex->rc==SQL
21da0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
21db0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20  pIter->pDoclist 
21dc0 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
21dd0 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e  Iter->pDoclist->
21de0 61 50 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a 20 20  aPoslist==0; .  
21df0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
21e00 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  n fts5MultiIterE
21e10 6f 66 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  of(pIter->pIndex
21e20 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29  , pIter->pMulti)
21e30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
21e40 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
21e50 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20  matching rowid. 
21e60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
21e70 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35  ts5IterNext(Fts5
21e80 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
21e90 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
21ea0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
21eb0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
21ec0 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  f( pIter->pDocli
21ed0 73 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f  st ){.    fts5Do
21ee0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49  clistIterNext(pI
21ef0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a  ter->pDoclist);.
21f00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
21f10 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74  5BufferZero(&pIt
21f20 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
21f30 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
21f40 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ext(pIter->pInde
21f50 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  x, pIter->pMulti
21f60 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
21f70 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
21f80 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
21f90 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
21fa0 6f 76 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  ove the doclist-
21fb0 69 74 65 72 20 70 61 73 73 65 64 20 61 73 20 74  iter passed as t
21fc0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
21fd0 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a  t to the next .*
21fe0 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  * matching rowid
21ff0 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
22000 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e  or after iMatch.
22010 20 54 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   The definition 
22020 6f 66 20 22 61 74 20 0a 2a 2a 20 6f 72 20 61 66  of "at .** or af
22030 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20  ter" depends on 
22040 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65  whether this ite
22050 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 20 69  rator iterates i
22060 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 0a  n ascending or .
22070 2a 2a 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  ** descending ro
22080 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  wid order..*/.st
22090 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
220a0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f  clistIterNextFro
220b0 6d 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  m(Fts5DoclistIte
220c0 72 20 2a 70 2c 20 69 36 34 20 69 4d 61 74 63 68  r *p, i64 iMatch
220d0 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34  ){.  do{.    i64
220e0 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e 69 52 6f   iRowid = p->iRo
220f0 77 69 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  wid;.    if( p->
22100 62 44 65 73 63 3d 3d 30 20 26 26 20 69 52 6f 77  bDesc==0 && iRow
22110 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id>=iMatch ) bre
22120 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  ak;.    if( p->b
22130 44 65 73 63 21 3d 30 20 26 26 20 69 52 6f 77 69  Desc!=0 && iRowi
22140 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d<=iMatch ) brea
22150 6b 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  k;.    fts5Docli
22160 73 74 49 74 65 72 4e 65 78 74 28 70 29 3b 0a 20  stIterNext(p);. 
22170 20 7d 77 68 69 6c 65 28 20 70 2d 3e 61 50 6f 73   }while( p->aPos
22180 6c 69 73 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  list );.}../*.**
22190 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
221a0 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
221b0 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
221c0 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e  or after iMatch.
221d0 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69   The.** definiti
221e0 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74  on of "at or aft
221f0 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  er" depends on w
22200 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72  hether this iter
22210 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a  ator iterates.**
22220 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
22230 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
22240 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20  d order..*/.int 
22250 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
22260 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
22270 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 36  xIter *pIter, i6
22280 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 69 66 28  4 iMatch){.  if(
22290 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
222a0 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c   ){.    fts5Docl
222b0 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  istIterNextFrom(
222c0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2c  pIter->pDoclist,
222d0 20 69 4d 61 74 63 68 29 3b 0a 20 20 7d 65 6c 73   iMatch);.  }els
222e0 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  e{.    fts5Multi
222f0 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74  IterNextFrom(pIt
22300 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
22310 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61 74 63  r->pMulti, iMatc
22320 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
22330 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
22340 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b  (pIter->pIndex);
22350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22360 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
22370 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  id..*/.i64 sqlit
22380 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28  e3Fts5IterRowid(
22390 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
223a0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
223b0 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a  er->pDoclist ){.
223c0 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 72      return pIter
223d0 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 69 52 6f 77  ->pDoclist->iRow
223e0 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  id;.  }else{.   
223f0 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74   return fts5Mult
22400 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
22410 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d  ->pMulti);.  }.}
22420 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
22430 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
22440 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
22450 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
22460 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72  osition list for
22470 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
22480 65 6e 74 72 79 2e 20 4f 75 74 70 75 74 20 76 61  entry. Output va
22490 72 69 61 62 6c 65 20 2a 70 6e 20 69 73 20 73 65  riable *pn is se
224a0 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
224b0 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20   the buffer .** 
224c0 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65 20  in bytes before 
224d0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
224e0 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   The returned po
224f0 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73  sition list does
22500 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
22510 20 22 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65   "number of byte
22520 73 22 20 76 61 72 69 6e 74 0a 2a 2a 20 66 69 65  s" varint.** fie
22530 6c 64 20 74 68 61 74 20 73 74 61 72 74 73 20 74  ld that starts t
22540 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
22550 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   on disk..*/.int
22560 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
22570 50 6f 73 6c 69 73 74 28 46 74 73 35 49 6e 64 65  Poslist(Fts5Inde
22580 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 63 6f  xIter *pIter, co
22590 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 69 6e 74  nst u8 **pp, int
225a0 20 2a 70 6e 29 7b 0a 20 20 61 73 73 65 72 74 28   *pn){.  assert(
225b0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
225c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
225d0 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44  .  if( pIter->pD
225e0 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70  oclist ){.    *p
225f0 6e 20 3d 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  n = pIter->pDocl
22600 69 73 74 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20  ist->nPoslist;. 
22610 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e     *pp = pIter->
22620 70 44 6f 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69  pDoclist->aPosli
22630 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
22640 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20   Fts5Index *p = 
22650 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20  pIter->pIndex;. 
22660 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
22670 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  o(&pIter->poslis
22680 74 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  t);.    fts5Mult
22690 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20  iIterPoslist(p, 
226a0 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 30  pIter->pMulti, 0
226b0 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
226c0 74 29 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49  t);.    *pn = pI
226d0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a  ter->poslist.n;.
226e0 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d      *pp = pIter-
226f0 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a  >poslist.p;.  }.
22700 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
22710 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
22720 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
22730 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61  * Close an itera
22740 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e  tor opened by an
22750 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
22760 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22770 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69  xQuery()..*/.voi
22780 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  d sqlite3Fts5Ite
22790 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78  rClose(Fts5Index
227a0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
227b0 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
227c0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63   if( pIter->pDoc
227d0 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73 71  list ){.      sq
227e0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
227f0 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 29 3b 0a  ->pDoclist->a);.
22800 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
22810 65 65 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  ee(pIter->pDocli
22820 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
22830 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
22840 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70  terFree(pIter->p
22850 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d  Index, pIter->pM
22860 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 74 73  ulti);.      fts
22870 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
22880 65 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74  e(pIter->pStruct
22890 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
228a0 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
228b0 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  poslist);.    }.
228c0 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
228d0 64 65 72 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  der(pIter->pInde
228e0 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  x);.    sqlite3_
228f0 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
22900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  .}../*.** Read t
22910 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65  he "averages" re
22920 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 62 75  cord into the bu
22930 66 66 65 72 20 73 75 70 70 6c 69 65 64 20 61 73  ffer supplied as
22940 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   the second .** 
22950 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e  argument. Return
22960 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
22970 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
22980 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
22990 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72  e.** if an error
229a0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20   occurs..*/.int 
229b0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
229c0 47 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35  GetAverages(Fts5
229d0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75  Index *p, Fts5Bu
229e0 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 61  ffer *pBuf){.  a
229f0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
22a00 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
22a10 35 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65  5DataReadOrBuffe
22a20 72 28 70 2c 20 70 42 75 66 2c 20 46 54 53 35 5f  r(p, pBuf, FTS5_
22a30 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b  AVERAGES_ROWID);
22a40 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
22a50 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
22a60 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
22a70 68 65 20 63 75 72 72 65 6e 74 20 22 61 76 65 72  he current "aver
22a80 61 67 65 73 22 20 72 65 63 6f 72 64 20 77 69 74  ages" record wit
22a90 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
22aa0 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a  f the buffer .**
22ab0 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
22ac0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
22ad0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22ae0 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65 72  Fts5IndexSetAver
22af0 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ages(Fts5Index *
22b00 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  p, const u8 *pDa
22b10 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a  ta, int nData){.
22b20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
22b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
22b40 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
22b50 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52   FTS5_AVERAGES_R
22b60 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61  OWID, pData, nDa
22b70 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ta);.  return ft
22b80 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
22b90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22ba0 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
22bb0 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69  er of blocks thi
22bc0 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61  s module has rea
22bd0 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
22be0 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65  a.** table since
22bf0 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2e   it was created.
22c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
22c10 74 73 35 49 6e 64 65 78 52 65 61 64 73 28 46 74  ts5IndexReads(Ft
22c20 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72  s5Index *p){.  r
22c30 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a  eturn p->nRead;.
22c40 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
22c50 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76   32-bit cookie v
22c60 61 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 74  alue stored at t
22c70 68 65 20 73 74 61 72 74 20 6f 66 20 61 6c 6c 20  he start of all 
22c80 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 72 65  structure .** re
22c90 63 6f 72 64 73 20 74 6f 20 74 68 65 20 76 61 6c  cords to the val
22ca0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
22cb0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
22cc0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
22cd0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63  QLITE_OK if succ
22ce0 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
22cf0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
22d00 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
22d10 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccurs..*/.int sq
22d20 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
22d30 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65  tCookie(Fts5Inde
22d40 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b  x *p, int iNew){
22d50 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22d60 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 43 6f 6e  TE_OK;.  Fts5Con
22d70 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
22d80 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 75 38 20  ->pConfig;.  u8 
22d90 61 43 6f 6f 6b 69 65 5b 34 5d 3b 0a 20 20 69 6e  aCookie[4];.  in
22da0 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
22db0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
22dc0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73   );.  sqlite3Fts
22dd0 35 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20  5Put32(aCookie, 
22de0 69 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 3d 30  iNew);.  for(i=0
22df0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
22e00 26 26 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  && i<=pConfig->n
22e10 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20  Prefix; i++){.  
22e20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
22e30 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 20 20 69  pBlob = 0;.    i
22e40 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
22e50 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
22e60 28 69 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (i);.    rc = sq
22e70 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
22e80 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67  .        pConfig
22e90 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  ->db, pConfig->z
22ea0 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c  Db, p->zDataTbl,
22eb0 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64   "block", iRowid
22ec0 2c 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20 20 20  , 1, &pBlob.    
22ed0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
22ee0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22ef0 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77    sqlite3_blob_w
22f00 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f  rite(pBlob, aCoo
22f10 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  kie, 4, 0);.    
22f20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
22f30 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29  lob_close(pBlob)
22f40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
22f50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74  eturn rc;.}..int
22f60 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22f70 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35  xLoadConfig(Fts5
22f80 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
22f90 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
22fa0 75 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  uct;.  pStruct =
22fb0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
22fc0 61 64 28 70 2c 20 30 29 3b 0a 20 20 66 74 73 35  ad(p, 0);.  fts5
22fd0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
22fe0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  (pStruct);.  ret
22ff0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
23000 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a  urn(p);.}.../***
23010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23050 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
23060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
230a0 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20  *.** Below this 
230b0 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70  point is the imp
230c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
230d0 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
230e0 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61  ck .** functiona
230f0 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  lity..*/../*.** 
23100 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20  Return a simple 
23110 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62  checksum value b
23120 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75  ased on the argu
23130 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
23140 20 75 36 34 20 66 74 73 35 49 6e 64 65 78 45 6e   u64 fts5IndexEn
23150 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34 20  tryCksum(.  i64 
23160 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 69  iRowid, .  int i
23170 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73  Col, .  int iPos
23180 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
23190 2a 70 54 65 72 6d 2c 20 0a 20 20 69 6e 74 20 6e  *pTerm, .  int n
231a0 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Term.){.  int i;
231b0 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f  .  u64 ret = iRo
231c0 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  wid;.  ret += (r
231d0 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20  et<<3) + iCol;. 
231e0 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
231f0 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f 72 28 69   + iPos;.  for(i
23200 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b  =0; i<nTerm; i++
23210 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33  ) ret += (ret<<3
23220 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20  ) + pTerm[i];.  
23230 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 73  return ret;.}..s
23240 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
23250 74 72 65 65 49 74 65 72 49 6e 69 74 28 0a 20 20  treeIterInit(.  
23260 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
23270 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 46 74 73   int iIdx,.  Fts
23280 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
23290 74 20 2a 70 53 65 67 2c 20 0a 20 20 46 74 73 35  t *pSeg, .  Fts5
232a0 42 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72  BtreeIter *pIter
232b0 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  .){.  int nByte;
232c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6e 42 79 74  .  int i;.  nByt
232d0 65 20 3d 20 73 69 7a 65 6f 66 28 70 49 74 65 72  e = sizeof(pIter
232e0 2d 3e 61 4c 76 6c 5b 30 5d 29 20 2a 20 28 70 53  ->aLvl[0]) * (pS
232f0 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 29 3b 0a  eg->nHeight-1);.
23300 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
23310 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
23320 29 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  ));.  if( nByte 
23330 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 4c  ){.    pIter->aL
23340 76 6c 20 3d 20 28 46 74 73 35 42 74 72 65 65 49  vl = (Fts5BtreeI
23350 74 65 72 4c 65 76 65 6c 2a 29 66 74 73 35 49 64  terLevel*)fts5Id
23360 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65  xMalloc(p, nByte
23370 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
23380 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23390 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c  .    pIter->nLvl
233a0 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74   = pSeg->nHeight
233b0 2d 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  -1;.    pIter->i
233c0 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  Idx = iIdx;.    
233d0 70 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a 20 20  pIter->p = p;.  
233e0 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
233f0 70 53 65 67 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  pSeg;.  }.  for(
23400 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
23410 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72  TE_OK && i<pIter
23420 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nLvl; i++){.  
23430 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
23440 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
23450 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53  D(iIdx, pSeg->iS
23460 65 67 69 64 2c 20 69 2b 31 2c 20 31 29 3b 0a 20  egid, i+1, 1);. 
23470 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61     Fts5Data *pDa
23480 74 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61  ta;.    pIter->a
23490 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 20 3d 20 70  Lvl[i].pData = p
234a0 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
234b0 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a  ead(p, iRowid);.
234c0 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b      if( pData ){
234d0 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49  .      fts5NodeI
234e0 74 65 72 49 6e 69 74 28 70 44 61 74 61 2d 3e 70  terInit(pData->p
234f0 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26 70 49 74  , pData->n, &pIt
23500 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 73 29 3b 0a  er->aLvl[i].s);.
23510 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
23520 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 3d 3d 30 20   pIter->nLvl==0 
23530 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  || p->rc ){.    
23540 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b  pIter->bEof = 1;
23550 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
23560 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  f = pSeg->pgnoLa
23570 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
23580 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d   pIter->nEmpty =
23590 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
235a0 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 20 20 70 49  s.nEmpty;.    pI
235b0 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74  ter->iLeaf = pIt
235c0 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43  er->aLvl[0].s.iC
235d0 68 69 6c 64 3b 0a 20 20 20 20 70 49 74 65 72 2d  hild;.    pIter-
235e0 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
235f0 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64  >aLvl[0].s.bDlid
23600 78 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  x;.  }.}..static
23610 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49   void fts5BtreeI
23620 74 65 72 4e 65 78 74 28 46 74 73 35 42 74 72 65  terNext(Fts5Btre
23630 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  eIter *pIter){. 
23640 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20   Fts5Index *p = 
23650 70 49 74 65 72 2d 3e 70 3b 0a 20 20 69 6e 74 20  pIter->p;.  int 
23660 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  i;..  assert( pI
23670 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20  ter->bEof==0 && 
23680 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
23690 2e 61 44 61 74 61 20 29 3b 0a 20 20 66 6f 72 28  .aData );.  for(
236a0 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
236b0 76 6c 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  vl && p->rc==SQL
236c0 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
236d0 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c    Fts5BtreeIterL
236e0 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49  evel *pLvl = &pI
236f0 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20  ter->aLvl[i];.  
23700 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65    fts5NodeIterNe
23710 78 74 28 26 70 2d 3e 72 63 2c 20 26 70 4c 76 6c  xt(&p->rc, &pLvl
23720 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ->s);.    if( pL
23730 76 6c 2d 3e 73 2e 61 44 61 74 61 20 29 7b 0a 20  vl->s.aData ){. 
23740 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
23750 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
23760 72 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c 2d 3e 73  r->term, pLvl->s
23770 2e 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c 2d 3e 73  .term.n, pLvl->s
23780 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20  .term.p);.      
23790 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  break;.    }else
237a0 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65  {.      fts5Node
237b0 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c 2d 3e  IterFree(&pLvl->
237c0 73 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61  s);.      fts5Da
237d0 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e  taRelease(pLvl->
237e0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 70 4c  pData);.      pL
237f0 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20  vl->pData = 0;. 
23800 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
23810 3d 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 7c 7c  ==pIter->nLvl ||
23820 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70 49   p->rc ){.    pI
23830 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  ter->bEof = 1;. 
23840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
23850 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e  iSegid = pIter->
23860 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
23870 20 20 66 6f 72 28 69 2d 2d 3b 20 69 3e 3d 30 3b    for(i--; i>=0;
23880 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 46 74 73   i--){.      Fts
23890 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20  5BtreeIterLevel 
238a0 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
238b0 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69  aLvl[i];.      i
238c0 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
238d0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
238e0 49 74 65 72 2d 3e 69 49 64 78 2c 69 53 65 67 69  Iter->iIdx,iSegi
238f0 64 2c 69 2b 31 2c 70 4c 76 6c 5b 31 5d 2e 73 2e  d,i+1,pLvl[1].s.
23900 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 70  iChild);.      p
23910 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
23920 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f  5DataRead(p, iRo
23930 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
23940 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20  pLvl->pData ){. 
23950 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49         fts5NodeI
23960 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d 3e 70 44  terInit(pLvl->pD
23970 61 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e 70 44  ata->p, pLvl->pD
23980 61 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d 3e 73  ata->n, &pLvl->s
23990 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
239a0 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 6e  .  }..  pIter->n
239b0 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61  Empty = pIter->a
239c0 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b  Lvl[0].s.nEmpty;
239d0 0a 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78  .  pIter->bDlidx
239e0 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30   = pIter->aLvl[0
239f0 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 70 49  ].s.bDlidx;.  pI
23a00 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74  ter->iLeaf = pIt
23a10 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43  er->aLvl[0].s.iC
23a20 68 69 6c 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  hild;.}..static 
23a30 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74  void fts5BtreeIt
23a40 65 72 46 72 65 65 28 46 74 73 35 42 74 72 65 65  erFree(Fts5Btree
23a50 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
23a60 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
23a70 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
23a80 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42   i++){.    Fts5B
23a90 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70  treeIterLevel *p
23aa0 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
23ab0 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e  vl[i];.    fts5N
23ac0 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76  odeIterFree(&pLv
23ad0 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70  l->s);.    if( p
23ae0 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20  Lvl->pData ){.  
23af0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
23b00 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
23b10 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
23b20 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ata = 0;.    }. 
23b30 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
23b40 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a  e(pIter->aLvl);.
23b50 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
23b60 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
23b70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
23b80 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79  nction is purely
23b90 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
23ba0 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
23bb0 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
23bc0 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
23bd0 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
23be0 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
23bf0 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
23c00 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74  ** Instead, it t
23c10 65 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61  ests that the sa
23c20 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72  me set of pgno/r
23c30 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  owid combination
23c40 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65  s are .** visite
23c50 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  d regardless of 
23c60 77 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c  whether the docl
23c70 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69  ist-index identi
23c80 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
23c90 72 73 0a 2a 2a 20 69 49 64 78 2f 69 53 65 67 69  rs.** iIdx/iSegi
23ca0 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61  d/iLeaf is itera
23cb0 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20  ted in forwards 
23cc0 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  or reverse order
23cd0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
23ce0 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
23cf0 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
23d00 65 72 54 65 73 74 52 65 76 65 72 73 65 28 0a 20  erTestReverse(. 
23d10 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
23d20 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
23d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d40 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6c 6f    /* Index to lo
23d50 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
23d60 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
23d70 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
23d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
23d90 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64  gment id to load
23da0 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
23db0 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
23dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
23dd0 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
23de0 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
23df0 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  /.){.  Fts5Dlidx
23e00 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
23e10 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d 31 20 3d  ;.  i64 cksum1 =
23e20 20 31 33 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d   13;.  i64 cksum
23e30 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70  2 = 13;..  for(p
23e40 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
23e50 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 49  terInit(p, 0, iI
23e60 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61  dx, iSegid, iLea
23e70 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  f);.      fts5Dl
23e80 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
23e90 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
23ea0 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
23eb0 74 28 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  t(pDlidx).  ){. 
23ec0 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
23ed0 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 69 4c 65  x->iLeafPgno>iLe
23ee0 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31  af );.    cksum1
23ef0 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 28 20 28   = (cksum1 ^ ( (
23f00 69 36 34 29 28 70 44 6c 69 64 78 2d 3e 69 4c 65  i64)(pDlidx->iLe
23f10 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32 20 29 29  afPgno) << 32 ))
23f20 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 3d 20 28  ;.    cksum1 = (
23f30 63 6b 73 75 6d 31 20 5e 20 70 44 6c 69 64 78 2d  cksum1 ^ pDlidx-
23f40 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  >iRowid);.  }.  
23f50 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
23f60 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c  e(pDlidx);.  pDl
23f70 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  idx = 0;..  for(
23f80 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
23f90 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69  IterInit(p, 1, i
23fa0 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65  Idx, iSegid, iLe
23fb0 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  af);.      fts5D
23fc0 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
23fd0 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
23fe0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
23ff0 65 76 28 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a  ev(pDlidx).  ){.
24000 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
24010 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 69 4c  dx->iLeafPgno>iL
24020 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d  eaf );.    cksum
24030 32 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20 28 20  2 = (cksum2 ^ ( 
24040 28 69 36 34 29 28 70 44 6c 69 64 78 2d 3e 69 4c  (i64)(pDlidx->iL
24050 65 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32 20 29  eafPgno) << 32 )
24060 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 3d 20  );.    cksum2 = 
24070 28 63 6b 73 75 6d 32 20 5e 20 70 44 6c 69 64 78  (cksum2 ^ pDlidx
24080 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  ->iRowid);.  }. 
24090 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
240a0 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
240b0 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28  lidx = 0;..  if(
240c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
240d0 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73  K && cksum1!=cks
240e0 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  um2 ) p->rc = FT
240f0 53 35 5f 43 4f 52 52 55 50 54 3b 20 0a 7d 0a 23  S5_CORRUPT; .}.#
24100 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
24110 73 35 44 6c 69 64 78 49 74 65 72 54 65 73 74 52  s5DlidxIterTestR
24120 65 76 65 72 73 65 28 77 2c 78 2c 79 2c 7a 29 0a  everse(w,x,y,z).
24130 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 76  #endif..static v
24140 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
24150 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
24160 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nt(.  Fts5Index 
24170 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
24180 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
24190 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
241a0 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20    /* Index that 
241d0 70 53 65 67 20 69 73 20 61 20 70 61 72 74 20 6f  pSeg is a part o
241e0 66 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  f */.  Fts5Struc
241f0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
24200 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g      /* Segmen
24210 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72  t to check inter
24220 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  nal consistency 
24230 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 42 74 72 65  */.){.  Fts5Btre
24240 65 49 74 65 72 20 69 74 65 72 3b 20 20 20 20 20  eIter iter;     
24250 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
24260 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
24270 67 68 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  gh b-tree hierar
24280 63 68 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70 53  chy */..  if( pS
24290 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30  eg->pgnoFirst==0
242a0 20 26 26 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61   && pSeg->pgnoLa
242b0 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
242c0 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68  .  /* Iterate th
242d0 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65  rough the b-tree
242e0 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a   hierarchy.  */.
242f0 20 20 66 6f 72 28 66 74 73 35 42 74 72 65 65 49    for(fts5BtreeI
24300 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78 2c  terInit(p, iIdx,
24310 20 70 53 65 67 2c 20 26 69 74 65 72 29 3b 0a 20   pSeg, &iter);. 
24320 20 20 20 20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49       p->rc==SQLI
24330 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 62 45  TE_OK && iter.bE
24340 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  of==0;.      fts
24350 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28 26  5BtreeIterNext(&
24360 69 74 65 72 29 0a 20 20 29 7b 0a 20 20 20 20 69  iter).  ){.    i
24370 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20  64 iRow;        
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24390 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c  Rowid for this l
243a0 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  eaf */.    Fts5D
243b0 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
243c0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
243d0 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
243e0 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20  /.    int iOff; 
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24400 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
24410 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c   first term on l
24420 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  eaf */.    int i
24430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24440 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
24450 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
24460 75 67 68 20 65 6d 70 74 79 20 6c 65 61 76 65 73  ugh empty leaves
24470 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   */..    /* If t
24480 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74  he leaf in quest
24490 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
244a0 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f  been trimmed fro
244b0 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a  m the segment, .
244c0 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68      ** ignore th
244d0 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e  is b-tree entry.
244e0 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64   Otherwise, load
244f0 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e   it into memory.
24500 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72   */.    if( iter
24510 2e 69 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e  .iLeaf<pSeg->pgn
24520 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e 75  oFirst ) continu
24530 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46 54  e;.    iRow = FT
24540 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
24550 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65  (iIdx, pSeg->iSe
24560 67 69 64 2c 20 30 2c 20 69 74 65 72 2e 69 4c 65  gid, 0, iter.iLe
24570 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d  af);.    pLeaf =
24580 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
24590 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20   iRow);.    if( 
245a0 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
245b0 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
245c0 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f  that the leaf co
245d0 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
245e0 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68  one term, and th
245f0 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20  at it is equal. 
24600 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67     ** to or larg
24610 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69  er than the spli
24620 74 2d 6b 65 79 20 69 6e 20 69 74 65 72 2e 74 65  t-key in iter.te
24630 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 4f 66 66  rm.  */.    iOff
24640 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
24650 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20  Leaf->p[2]);.   
24660 20 69 66 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a   if( iOff==0 ){.
24670 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
24680 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
24690 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
246a0 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
246b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
246c0 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66   of term on leaf
246d0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
246e0 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20     int res;     
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24700 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  * Comparison of 
24710 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b  term and split-k
24720 65 79 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66  ey */.      iOff
24730 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
24740 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
24750 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  ff], nTerm);.   
24760 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
24770 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
24780 20 69 74 65 72 2e 74 65 72 6d 2e 70 2c 20 4d 49   iter.term.p, MI
24790 4e 28 6e 54 65 72 6d 2c 20 69 74 65 72 2e 74 65  N(nTerm, iter.te
247a0 72 6d 2e 6e 29 29 3b 0a 20 20 20 20 20 20 69 66  rm.n));.      if
247b0 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
247c0 20 6e 54 65 72 6d 20 2d 20 69 74 65 72 2e 74 65   nTerm - iter.te
247d0 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  rm.n;.      if( 
247e0 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
247f0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
24800 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
24810 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
24820 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
24830 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
24840 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
24850 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
24860 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
24870 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
24880 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
24890 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73  .    ** (a) exis
248a0 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
248b0 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20  n no terms. */. 
248c0 20 20 20 66 6f 72 28 69 3d 31 3b 20 70 2d 3e 72     for(i=1; p->r
248d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
248e0 69 3c 3d 69 74 65 72 2e 6e 45 6d 70 74 79 3b 20  i<=iter.nEmpty; 
248f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4c 65 61  i++){.      pLea
24900 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
24910 28 70 2c 20 69 52 6f 77 2b 69 29 3b 0a 20 20 20  (p, iRow+i);.   
24920 20 20 20 69 66 28 20 70 4c 65 61 66 20 26 26 20     if( pLeaf && 
24930 30 21 3d 66 74 73 35 47 65 74 55 31 36 28 26 70  0!=fts5GetU16(&p
24940 4c 65 61 66 2d 3e 70 5b 32 5d 29 20 29 7b 0a 20  Leaf->p[2]) ){. 
24950 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
24960 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
24970 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44     }.      fts5D
24980 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
24990 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
249a0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
249b0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63 68  oclist-index, ch
249c0 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b  eck that it look
249d0 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  s right. */.    
249e0 69 66 28 20 69 74 65 72 2e 62 44 6c 69 64 78 20  if( iter.bDlidx 
249f0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69  ){.      Fts5Dli
24a00 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
24a10 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72   0;  /* For iter
24a20 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f  ating through do
24a30 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  clist index */. 
24a40 20 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65       int iPrevLe
24a50 61 66 20 3d 20 69 74 65 72 2e 69 4c 65 61 66 3b  af = iter.iLeaf;
24a60 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 69  .      int iSegi
24a70 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64  d = pSeg->iSegid
24a80 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b  ;.      int iPg;
24a90 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79 3b  .      i64 iKey;
24aa0 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c 69  ..      for(pDli
24ab0 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
24ac0 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
24ad0 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c   iSegid, iter.iL
24ae0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
24af0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
24b00 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
24b10 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c            fts5Dl
24b20 69 64 78 49 74 65 72 4e 65 78 74 28 70 44 6c 69  idxIterNext(pDli
24b30 64 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20  dx).      ){..  
24b40 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61        /* Check a
24b50 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61  ny rowid-less pa
24b60 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62  ges that occur b
24b70 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e  efore the curren
24b80 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20  t leaf. */.     
24b90 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76     for(iPg=iPrev
24ba0 4c 65 61 66 2b 31 3b 20 69 50 67 3c 70 44 6c 69  Leaf+1; iPg<pDli
24bb0 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 20 69  dx->iLeafPgno; i
24bc0 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pg++){.         
24bd0 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
24be0 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c  MENT_ROWID(iIdx,
24bf0 20 69 53 65 67 69 64 2c 20 30 2c 20 69 50 67 29   iSegid, 0, iPg)
24c00 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61  ;.          pLea
24c10 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
24c20 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20  (p, iKey);.     
24c30 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
24c40 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
24c50 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  ( fts5GetU16(&pL
24c60 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20  eaf->p[0])!=0 ) 
24c70 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
24c80 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
24c90 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
24ca0 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
24cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24cc0 20 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61          iPrevLea
24cd0 66 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61  f = pDlidx->iLea
24ce0 66 50 67 6e 6f 3b 0a 0a 20 20 20 20 20 20 20 20  fPgno;..        
24cf0 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
24d00 65 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69  e leaf page indi
24d10 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
24d20 72 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  rator really doe
24d30 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  s.        ** con
24d40 74 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73  tain the rowid s
24d50 75 67 67 65 73 74 65 64 20 62 79 20 74 68 65 20  uggested by the 
24d60 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  same. */.       
24d70 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
24d80 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c  MENT_ROWID(iIdx,
24d90 20 69 53 65 67 69 64 2c 20 30 2c 20 70 44 6c 69   iSegid, 0, pDli
24da0 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a  dx->iLeafPgno);.
24db0 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
24dc0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
24dd0 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  iKey);.        i
24de0 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
24df0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
24e00 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
24e10 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
24e20 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
24e30 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [0]);.          
24e40 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  getVarint(&pLeaf
24e50 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20  ->p[iRowidOff], 
24e60 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
24e70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
24e80 6f 77 69 64 21 3d 70 44 6c 69 64 78 2d 3e 69 52  owid!=pDlidx->iR
24e90 6f 77 69 64 20 29 20 70 2d 3e 72 63 20 3d 20 46  owid ) p->rc = F
24ea0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
24eb0 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
24ec0 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
24ed0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
24ee0 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 50 67  }..      for(iPg
24ef0 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50  =iPrevLeaf+1; iP
24f00 67 3c 3d 28 69 74 65 72 2e 69 4c 65 61 66 20 2b  g<=(iter.iLeaf +
24f10 20 69 74 65 72 2e 6e 45 6d 70 74 79 29 3b 20 69   iter.nEmpty); i
24f20 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Pg++){.        i
24f30 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Key = FTS5_SEGME
24f40 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69  NT_ROWID(iIdx, i
24f50 53 65 67 69 64 2c 20 30 2c 20 69 50 67 29 3b 0a  Segid, 0, iPg);.
24f60 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
24f70 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
24f80 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  iKey);.        i
24f90 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
24fa0 20 20 20 20 20 20 69 66 28 20 66 74 73 35 47 65        if( fts5Ge
24fb0 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30  tU16(&pLeaf->p[0
24fc0 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  ])!=0 ) p->rc = 
24fd0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
24fe0 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
24ff0 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
25000 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25010 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  }..      fts5Dli
25020 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
25030 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  x);.      fts5Dl
25040 69 64 78 49 74 65 72 54 65 73 74 52 65 76 65 72  idxIterTestRever
25050 73 65 28 70 2c 20 69 49 64 78 2c 20 69 53 65 67  se(p, iIdx, iSeg
25060 69 64 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b  id, iter.iLeaf);
25070 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
25080 20 45 69 74 68 65 72 20 69 74 65 72 2e 69 4c 65   Either iter.iLe
25090 61 66 20 6d 75 73 74 20 62 65 20 74 68 65 20 72  af must be the r
250a0 69 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61  ightmost leaf-pa
250b0 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  ge in the segmen
250c0 74 2c 20 6f 72 20 0a 20 20 2a 2a 20 65 6c 73 65  t, or .  ** else
250d0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 68 61 73   the segment has
250e0 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79   been completely
250f0 20 65 6d 70 74 69 65 64 20 62 79 20 61 6e 20 6f   emptied by an o
25100 6e 67 6f 69 6e 67 20 6d 65 72 67 65 0a 20 20 2a  ngoing merge.  *
25110 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a  * operation. */.
25120 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
25130 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69 74  ITE_OK .   && it
25140 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e  er.iLeaf!=pSeg->
25150 70 67 6e 6f 4c 61 73 74 20 0a 20 20 20 26 26 20  pgnoLast .   && 
25160 28 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  (pSeg->pgnoFirst
25170 20 7c 7c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61   || pSeg->pgnoLa
25180 73 74 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  st) .  ){.    p-
25190 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
251a0 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42  PT;.  }..  fts5B
251b0 74 72 65 65 49 74 65 72 46 72 65 65 28 26 69 74  treeIterFree(&it
251c0 65 72 29 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  er);.}...static 
251d0 69 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b 73  int fts5QueryCks
251e0 75 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  um(.  Fts5Index 
251f0 2a 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  *p,.  const char
25200 20 2a 7a 2c 0a 20 20 69 6e 74 20 6e 2c 0a 20 20   *z,.  int n,.  
25210 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 75 36 34  int flags,.  u64
25220 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 75 36   *pCksum.){.  u6
25230 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75  4 cksum = *pCksu
25240 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  m;.  Fts5IndexIt
25250 65 72 20 2a 70 49 64 78 49 74 65 72 20 3d 20 30  er *pIdxIter = 0
25260 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
25270 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
25280 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67  ry(p, z, n, flag
25290 73 2c 20 26 70 49 64 78 49 74 65 72 29 3b 0a 0a  s, &pIdxIter);..
252a0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
252b0 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
252c0 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
252d0 70 49 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20  pIdxIter) ){.   
252e0 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 3b   const u8 *pPos;
252f0 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20  .    int nPos;. 
25300 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73     i64 rowid = s
25310 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 52 6f  qlite3Fts5IterRo
25320 77 69 64 28 70 49 64 78 49 74 65 72 29 3b 0a 20  wid(pIdxIter);. 
25330 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
25340 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28 70  ts5IterPoslist(p
25350 49 64 78 49 74 65 72 2c 20 26 70 50 6f 73 2c 20  IdxIter, &pPos, 
25360 26 6e 50 6f 73 29 3b 0a 20 20 20 20 69 66 28 20  &nPos);.    if( 
25370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25380 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69  .      Fts5Posli
25390 73 74 52 65 61 64 65 72 20 73 52 65 61 64 65 72  stReader sReader
253a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c 69  ;.      for(sqli
253b0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
253c0 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 70 50 6f  aderInit(-1, pPo
253d0 73 2c 20 6e 50 6f 73 2c 20 26 73 52 65 61 64 65  s, nPos, &sReade
253e0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 52  r);.          sR
253f0 65 61 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20  eader.bEof==0;. 
25400 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25410 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
25420 72 4e 65 78 74 28 26 73 52 65 61 64 65 72 29 0a  rNext(&sReader).
25430 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25440 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35   int iCol = FTS5
25450 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61  _POS2COLUMN(sRea
25460 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20  der.iPos);.     
25470 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 46 54     int iOff = FT
25480 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 73 52  S5_POS2OFFSET(sR
25490 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20  eader.iPos);.   
254a0 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 66 74       cksum ^= ft
254b0 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
254c0 6d 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  m(rowid, iCol, i
254d0 4f 66 66 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  Off, z, n);.    
254e0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
254f0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
25500 78 74 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20  xt(pIdxIter);.  
25510 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
25520 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70  3Fts5IterClose(p
25530 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43  IdxIter);..  *pC
25540 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20  ksum = cksum;.  
25550 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
25560 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c  .** Run internal
25570 20 63 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72   checks to ensur
25580 65 20 74 68 61 74 20 74 68 65 20 46 54 53 20 69  e that the FTS i
25590 6e 64 65 78 20 28 61 29 20 69 73 20 69 6e 74 65  ndex (a) is inte
255a0 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69  rnally .** consi
255b0 73 74 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f  stent and (b) co
255c0 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66  ntains entries f
255d0 6f 72 20 77 68 69 63 68 20 74 68 65 20 58 4f 52  or which the XOR
255e0 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   of the checksum
255f0 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74  s.** as calculat
25600 65 64 20 62 79 20 66 74 73 35 49 6e 64 65 78 45  ed by fts5IndexE
25610 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20 63  ntryCksum() is c
25620 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ksum..**.** Retu
25630 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
25640 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  T if any of the 
25650 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20  internal checks 
25660 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a  fail, or if the.
25670 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  ** checksum does
25680 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74 75   not match. Retu
25690 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
256a0 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73 20  all checks pass 
256b0 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72  without.** error
256c0 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  , or some other 
256d0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
256e0 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72 72  e if another err
256f0 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a  or (e.g. OOM).**
25700 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20   occurs..*/.int 
25710 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
25720 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46  IntegrityCheck(F
25730 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36 34  ts5Index *p, u64
25740 20 63 6b 73 75 6d 29 7b 0a 20 20 46 74 73 35 43   cksum){.  Fts5C
25750 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
25760 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69   p->pConfig;.  i
25770 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20  nt iIdx;        
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25790 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
257a0 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65  e through indexe
257b0 73 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d  s */.  u64 cksum
257c0 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
257d0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
257e0 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74  um based on cont
257f0 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20  ents of indexes 
25800 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 33 20  */.  u64 cksum3 
25810 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
25820 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
25830 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e   based on conten
25840 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f  ts of indexes */
25850 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
25860 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  rm = {0,0,0};   
25870 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
25880 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72  d to hold most r
25890 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  ecent term */.  
258a0 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69  Fts5Buffer posli
258b0 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  st = {0,0,0};   
258c0 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
258d0 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74  o hold a poslist
258e0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
258f0 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61  that the interna
25900 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20  l nodes of each 
25910 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68  segment match th
25920 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 66 6f  e leaves */.  fo
25930 72 28 69 49 64 78 3d 30 3b 20 70 2d 3e 72 63 3d  r(iIdx=0; p->rc=
25940 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 49  =SQLITE_OK && iI
25950 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
25960 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
25970 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
25980 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35   *pStruct = fts5
25990 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c  StructureRead(p,
259a0 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   iIdx);.    if( 
259b0 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20  pStruct ){.     
259c0 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
259d0 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  .      for(iLvl=
259e0 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
259f0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
25a00 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53  {.        for(iS
25a10 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
25a20 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
25a30 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
25a40 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74            Fts5St
25a50 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
25a60 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d  pSeg = &pStruct-
25a70 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
25a80 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
25a90 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74      fts5IndexInt
25aa0 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
25ab0 6e 74 28 70 2c 20 69 49 64 78 2c 20 70 53 65 67  nt(p, iIdx, pSeg
25ac0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25ad0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
25ae0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
25af0 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
25b00 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6b 73 75  }..  /* The cksu
25b10 6d 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  m argument passe
25b20 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
25b30 6f 6e 20 69 73 20 61 20 63 68 65 63 6b 73 75 6d  on is a checksum
25b40 20 63 61 6c 63 75 6c 61 74 65 64 0a 20 20 2a 2a   calculated.  **
25b50 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c 20 65 78   based on all ex
25b60 70 65 63 74 65 64 20 65 6e 74 72 69 65 73 20 69  pected entries i
25b70 6e 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  n the FTS index 
25b80 28 69 6e 63 6c 75 64 69 6e 67 20 70 72 65 66 69  (including prefi
25b90 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20 65 6e 74  x index.  ** ent
25ba0 72 69 65 73 29 2e 20 54 68 69 73 20 62 6c 6f 63  ries). This bloc
25bb0 6b 20 63 68 65 63 6b 73 20 74 68 61 74 20 61 20  k checks that a 
25bc0 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61  checksum calcula
25bd0 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ted based on the
25be0 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 63 6f 6e  .  ** actual con
25bf0 74 65 6e 74 73 20 6f 66 20 46 54 53 20 69 6e 64  tents of FTS ind
25c00 65 78 20 69 73 20 69 64 65 6e 74 69 63 61 6c 2e  ex is identical.
25c10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77 6f 20 76  .  **.  ** Two v
25c20 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73  ersions of the s
25c30 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 61 72 65  ame checksum are
25c40 20 63 61 6c 63 75 6c 61 74 65 64 2e 20 54 68 65   calculated. The
25c50 20 66 69 72 73 74 20 28 73 74 61 63 6b 0a 20 20   first (stack.  
25c60 2a 2a 20 76 61 72 69 61 62 6c 65 20 63 6b 73 75  ** variable cksu
25c70 6d 32 29 20 62 61 73 65 64 20 6f 6e 20 65 6e 74  m2) based on ent
25c80 72 69 65 73 20 65 78 74 72 61 63 74 65 64 20 66  ries extracted f
25c90 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d 74 65 78  rom the full-tex
25ca0 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20 77 68 69  t index.  ** whi
25cb0 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69 6e 65 61  le doing a linea
25cc0 72 20 73 63 61 6e 20 6f 66 20 65 61 63 68 20 69  r scan of each i
25cd0 6e 64 69 76 69 64 75 61 6c 20 69 6e 64 65 78 20  ndividual index 
25ce0 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20  in turn. .  **. 
25cf0 20 2a 2a 20 41 73 20 65 61 63 68 20 74 65 72 6d   ** As each term
25d00 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65 20   visited by the 
25d10 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c 20 61 20  linear scans, a 
25d20 73 65 70 61 72 61 74 65 20 71 75 65 72 79 20 66  separate query f
25d30 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  or the.  ** same
25d40 20 74 65 72 6d 20 69 73 20 70 65 72 66 6f 72 6d   term is perform
25d50 65 64 2e 20 63 6b 73 75 6d 33 20 69 73 20 63 61  ed. cksum3 is ca
25d60 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f  lculated based o
25d70 6e 20 74 68 65 20 65 6e 74 72 69 65 73 0a 20 20  n the entries.  
25d80 2a 2a 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ** extracted by 
25d90 74 68 65 73 65 20 71 75 65 72 69 65 73 2e 0a 20  these queries.. 
25da0 20 2a 2f 0a 20 20 66 6f 72 28 69 49 64 78 3d 30   */.  for(iIdx=0
25db0 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ; iIdx<=pConfig-
25dc0 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b  >nPrefix; iIdx++
25dd0 29 7b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74 69  ){.    Fts5Multi
25de0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 3b 0a  SegIter *pIter;.
25df0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
25e00 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73  e *pStruct = fts
25e10 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
25e20 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 66 6f 72  , iIdx);.    for
25e30 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
25e40 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 69 49  w(p, pStruct, iI
25e50 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  dx, 0, 0, 0, 0, 
25e60 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a  -1, 0, &pIter);.
25e70 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
25e80 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
25e90 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66  r)==0;.        f
25ea0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
25eb0 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
25ec0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
25ed0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
25ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
25ef0 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74  e of term in byt
25f00 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  es */.      i64 
25f10 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20 20  iPos = 0;       
25f20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
25f30 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70 6f  ion read from po
25f40 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69  slist */.      i
25f50 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20  nt iOff = 0;    
25f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
25f70 66 73 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c  fset within posl
25f80 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ist */.      i64
25f90 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
25fa0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
25fb0 65 72 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  er);.      char 
25fc0 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35  *z = (char*)fts5
25fd0 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
25fe0 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 20  ter, &n);..     
25ff0 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a   poslist.n = 0;.
26000 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
26010 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 49  terPoslist(p, pI
26020 74 65 72 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74  ter, 0, &poslist
26030 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
26040 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 50 6f  0==sqlite3Fts5Po
26050 73 6c 69 73 74 4e 65 78 74 36 34 28 70 6f 73 6c  slistNext64(posl
26060 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73 74 2e 6e  ist.p, poslist.n
26070 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f 73 29 20  , &iOff, &iPos) 
26080 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
26090 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43  Col = FTS5_POS2C
260a0 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20  OLUMN(iPos);.   
260b0 20 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66       int iTokOff
260c0 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
260d0 45 54 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  ET(iPos);.      
260e0 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66 74 73 35    cksum2 ^= fts5
260f0 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
26100 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54  iRowid, iCol, iT
26110 6f 6b 4f 66 66 2c 20 7a 2c 20 6e 29 3b 0a 20 20  okOff, z, n);.  
26120 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
26130 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 65 77  If this is a new
26140 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f 72   term, query for
26150 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73 75   it. Update cksu
26160 6d 33 20 77 69 74 68 20 74 68 65 20 72 65 73 75  m3 with the resu
26170 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  lts. */.      if
26180 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
26190 4f 4b 20 26 26 20 28 74 65 72 6d 2e 6e 21 3d 6e  OK && (term.n!=n
261a0 20 7c 7c 20 6d 65 6d 63 6d 70 28 74 65 72 6d 2e   || memcmp(term.
261b0 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20  p, z, n)) ){.   
261c0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
261d0 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d       int flags =
261e0 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20   (iIdx==0 ? 0 : 
261f0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
26200 50 52 45 46 49 58 29 3b 0a 20 20 20 20 20 20 20  PREFIX);.       
26210 20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20   u64 ck1 = 0;.  
26220 20 20 20 20 20 20 75 36 34 20 63 6b 32 20 3d 20        u64 ck2 = 
26230 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  0;..        /* C
26240 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65  heck that the re
26250 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 66  sults returned f
26260 6f 72 20 41 53 43 20 61 6e 64 20 44 45 53 43 20  or ASC and DESC 
26270 71 75 65 72 69 65 73 20 61 72 65 0a 20 20 20 20  queries are.    
26280 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e      ** the same.
26290 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68   If not, call th
262a0 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  is corruption.  
262b0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
262c0 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
262d0 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 26  , z, n, flags, &
262e0 63 6b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ck1);.        if
262f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
26310 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
26320 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 7c  (p, z, n, flags|
26330 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
26340 44 45 53 43 2c 20 26 63 6b 32 29 3b 0a 20 20 20  DESC, &ck2);.   
26350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
26360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26370 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72   && ck1!=ck2 ) r
26380 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
26390 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;..        /* If
263a0 20 74 68 69 73 20 69 73 20 61 20 70 72 65 66 69   this is a prefi
263b0 78 20 71 75 65 72 79 2c 20 63 68 65 63 6b 20 74  x query, check t
263c0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
263d0 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 0a  returned if the.
263e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69          ** the i
263f0 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64  ndex is disabled
26400 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49   are the same. I
26410 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44  n both ASC and D
26420 45 53 43 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ESC order. */.  
26430 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30        if( iIdx>0
26440 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
26450 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
26460 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
26470 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53  5INDEX_QUERY_TES
26480 54 5f 4e 4f 49 44 58 3b 0a 20 20 20 20 20 20 20  T_NOIDX;.       
26490 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20     ck2 = 0;.    
264a0 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
264b0 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 7a 2c 20  ueryCksum(p, z, 
264c0 6e 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  n, f, &ck2);.   
264d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
264e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
264f0 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
26500 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
26510 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
26520 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
26530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26540 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
26550 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
26560 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54  RY_TEST_NOIDX|FT
26570 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
26580 53 43 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b  SC;.          ck
26590 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  2 = 0;.         
265a0 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
265b0 6b 73 75 6d 28 70 2c 20 7a 2c 20 6e 2c 20 66 2c  ksum(p, z, n, f,
265c0 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20   &ck2);.        
265d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
265e0 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
265f0 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
26600 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  UPT;.        }..
26610 20 20 20 20 20 20 20 20 63 6b 73 75 6d 33 20 5e          cksum3 ^
26620 3d 20 63 6b 31 3b 0a 20 20 20 20 20 20 20 20 66  = ck1;.        f
26630 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63  ts5BufferSet(&rc
26640 2c 20 26 74 65 72 6d 2c 20 6e 2c 20 28 63 6f 6e  , &term, n, (con
26650 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 20 20 20  st u8*)z);.     
26660 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
26670 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26680 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
26690 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ee(p, pIter);.  
266a0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
266b0 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
266c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63  .  }.  if( p->rc
266d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
266e0 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70  ksum!=cksum2 ) p
266f0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
26700 55 50 54 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  UPT;.  if( p->rc
26710 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
26720 6b 73 75 6d 21 3d 63 6b 73 75 6d 33 20 29 20 70  ksum!=cksum3 ) p
26730 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
26740 55 50 54 3b 0a 0a 20 20 66 74 73 35 42 75 66 66  UPT;..  fts5Buff
26750 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
26760 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
26770 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74  &poslist);.  ret
26780 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
26790 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn(p);.}.../*.*
267a0 2a 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20  * Calculate and 
267b0 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
267c0 6d 20 74 68 61 74 20 69 73 20 74 68 65 20 58 4f  m that is the XO
267d0 52 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  R of the index e
267e0 6e 74 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75 6d  ntry.** checksum
267f0 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
26800 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 67 65  that would be ge
26810 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 74  nerated by the t
26820 6f 6b 65 6e 20 73 70 65 63 69 66 69 65 64 0a 2a  oken specified.*
26830 2a 20 62 79 20 74 68 65 20 66 69 6e 61 6c 20 35  * by the final 5
26840 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75   arguments..*/.u
26850 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  64 sqlite3Fts5In
26860 64 65 78 43 6b 73 75 6d 28 0a 20 20 46 74 73 35  dexCksum(.  Fts5
26870 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
26880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
26890 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
268a0 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  ect */.  i64 iRo
268b0 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
268c0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 75           /* Docu
268d0 6d 65 6e 74 20 74 65 72 6d 20 61 70 70 65 61 72  ment term appear
268e0 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  s in */.  int iC
268f0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
26900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
26910 75 6d 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73  umn term appears
26920 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f   in */.  int iPo
26930 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
26940 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
26950 74 69 6f 6e 20 74 65 72 6d 20 61 70 70 65 61 72  tion term appear
26960 73 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  s in */.  const 
26970 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74  char *pTerm, int
26980 20 6e 54 65 72 6d 20 20 20 20 2f 2a 20 54 65 72   nTerm    /* Ter
26990 6d 20 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a  m at iPos */.){.
269a0 20 20 75 36 34 20 72 65 74 20 3d 20 30 3b 20 20    u64 ret = 0;  
269b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
269d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  e */.  int iIdx;
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269f0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74         /* For it
26a00 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
26a10 69 6e 64 65 78 65 73 20 2a 2f 0a 0a 20 20 72 65  indexes */..  re
26a20 74 20 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74  t = fts5IndexEnt
26a30 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
26a40 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 65 72  iCol, iPos, pTer
26a50 6d 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 66 6f  m, nTerm);..  fo
26a60 72 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 70  r(iIdx=0; iIdx<p
26a70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
26a80 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 6e   iIdx++){.    in
26a90 74 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e  t nByte = fts5In
26aa0 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
26ab0 6c 65 6e 28 70 54 65 72 6d 2c 20 6e 54 65 72 6d  len(pTerm, nTerm
26ac0 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  , pConfig->aPref
26ad0 69 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20 69  ix[iIdx]);.    i
26ae0 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
26af0 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64    ret ^= fts5Ind
26b00 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
26b10 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
26b20 20 70 54 65 72 6d 2c 20 6e 42 79 74 65 29 3b 0a   pTerm, nByte);.
26b30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
26b40 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 2a 2a  urn ret;.}../***
26b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26b90 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
26ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26be0 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20  *.** Below this 
26bf0 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70  point is the imp
26c00 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
26c10 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
26c20 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74   scalar.** funct
26c30 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a  ion only..*/../*
26c40 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67  .** Decode a seg
26c50 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20  ment-data rowid 
26c60 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
26c70 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  table. This func
26c80 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f  tion is.** the o
26c90 70 70 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f  pposite of macro
26ca0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
26cb0 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  WID()..*/.static
26cc0 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
26cd0 52 6f 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f  Rowid(.  i64 iRo
26ce0 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
26cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
26d00 64 20 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61  d from %_data ta
26d10 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ble */.  int *pi
26d20 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
26d30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
26d40 20 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   Index */.  int 
26d50 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  *piSegid,       
26d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26d70 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a  UT: Segment id *
26d80 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68  /.  int *piHeigh
26d90 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
26da0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67      /* OUT: Heig
26db0 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50  ht */.  int *piP
26dc0 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20  gno             
26dd0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26de0 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  Page number */.)
26df0 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69  {.  *piPgno = (i
26e00 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
26e10 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
26e20 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29  TA_PAGE_B) - 1))
26e30 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
26e40 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b  TS5_DATA_PAGE_B;
26e50 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20  ..  *piHeight = 
26e60 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
26e70 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
26e80 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d  DATA_HEIGHT_B) -
26e90 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e   1));.  iRowid >
26ea0 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  >= FTS5_DATA_HEI
26eb0 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67  GHT_B;..  *piSeg
26ec0 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  id = (int)(iRowi
26ed0 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
26ee0 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20  FTS5_DATA_ID_B) 
26ef0 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  - 1));.  iRowid 
26f00 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 49 44  >>= FTS5_DATA_ID
26f10 5f 42 3b 0a 0a 20 20 2a 70 69 49 64 78 20 3d 20  _B;..  *piIdx = 
26f20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
26f30 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
26f40 44 41 54 41 5f 49 44 58 5f 42 29 20 2d 20 31 29  DATA_IDX_B) - 1)
26f50 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
26f60 64 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64  d fts5DebugRowid
26f70 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
26f80 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34  uffer *pBuf, i64
26f90 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 49   iKey){.  int iI
26fa0 64 78 2c 69 53 65 67 69 64 2c 69 48 65 69 67 68  dx,iSegid,iHeigh
26fb0 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f 77  t,iPgno;  /* Row
26fc0 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f  id compenents */
26fd0 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
26fe0 69 64 28 69 4b 65 79 2c 20 26 69 49 64 78 2c 20  id(iKey, &iIdx, 
26ff0 26 69 53 65 67 69 64 2c 20 26 69 48 65 69 67 68  &iSegid, &iHeigh
27000 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69  t, &iPgno);..  i
27010 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a  f( iSegid==0 ){.
27020 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54      if( iKey==FT
27030 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
27040 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D ){.      sqlit
27050 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
27060 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
27070 75 66 2c 20 22 28 61 76 65 72 61 67 65 73 29 20  uf, "(averages) 
27080 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
27090 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
270a0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
270b0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20  tf(pRc, pBuf, . 
270c0 20 20 20 20 20 20 20 20 20 22 7b 73 74 72 75 63           "{struc
270d0 74 75 72 65 20 69 64 78 3d 25 64 7d 22 2c 20 28  ture idx=%d}", (
270e0 69 6e 74 29 28 69 4b 65 79 2d 31 30 29 0a 20 20  int)(iKey-10).  
270f0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
27100 0a 20 20 65 6c 73 65 20 69 66 28 20 69 48 65 69  .  else if( iHei
27110 67 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e  ght==FTS5_SEGMEN
27120 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 29 7b 0a  T_MAX_HEIGHT ){.
27130 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
27140 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
27150 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28 64  f(pRc, pBuf, "(d
27160 6c 69 64 78 20 69 64 78 3d 25 64 20 73 65 67 69  lidx idx=%d segi
27170 64 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a  d=%d pgno=%d)",.
27180 20 20 20 20 20 20 20 20 69 49 64 78 2c 20 69 53          iIdx, iS
27190 65 67 69 64 2c 20 69 50 67 6e 6f 0a 20 20 20 20  egid, iPgno.    
271a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
271b0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
271c0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
271d0 63 2c 20 70 42 75 66 2c 20 22 28 69 64 78 3d 25  c, pBuf, "(idx=%
271e0 64 20 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20  d segid=%d h=%d 
271f0 70 67 6e 6f 3d 25 64 29 22 2c 0a 20 20 20 20 20  pgno=%d)",.     
27200 20 20 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c     iIdx, iSegid,
27210 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a   iHeight, iPgno.
27220 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74      );.  }.}..st
27230 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
27240 62 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20  bugStructure(.  
27250 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27270 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72  /* IN/OUT: error
27280 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42   code */.  Fts5B
27290 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46  uffer *pBuf,.  F
272a0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a  ts5Structure *p.
272b0 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69  ){.  int iLvl, i
272c0 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
272d0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20       /* Iterate 
272e0 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20  through levels, 
272f0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66  segments */..  f
27300 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
27310 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  p->nLevel; iLvl+
27320 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  +){.    Fts5Stru
27330 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
27340 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c   = &p->aLevel[iL
27350 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  vl];.    sqlite3
27360 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
27370 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
27380 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76  , .        " {lv
27390 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 22 2c  l=%d nMerge=%d",
273a0 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65   iLvl, pLvl->nMe
273b0 72 67 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 66  rge.    );.    f
273c0 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
273d0 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67  pLvl->nSeg; iSeg
273e0 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
273f0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
27400 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61  *pSeg = &pLvl->a
27410 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
27420 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
27430 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
27440 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20  Rc, pBuf, .     
27450 20 20 20 20 20 22 20 7b 69 64 3d 25 64 20 68 3d       " {id=%d h=
27460 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64  %d leaves=%d..%d
27470 7d 22 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  }", pSeg->iSegid
27480 2c 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c  , pSeg->nHeight,
27490 20 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 67   .          pSeg
274a0 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65  ->pgnoFirst, pSe
274b0 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20  g->pgnoLast.    
274c0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
274d0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
274e0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
274f0 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20  , pBuf, "}");.  
27500 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
27510 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
27520 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62  ts5_decode() deb
27530 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a  ugging aid..**.*
27540 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f  * Arguments pBlo
27550 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20  b/nBlob contain 
27560 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46 74 73  a serialized Fts
27570 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
27580 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t. This.** funct
27590 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75  ion appends a hu
275a0 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70  man-readable rep
275b0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
275c0 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a 2a  he same object.*
275d0 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  * to the buffer 
275e0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
275f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a  cond argument. .
27600 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
27610 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75  ts5DecodeStructu
27620 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  re(.  int *pRc, 
27630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27640 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
27650 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
27660 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
27670 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  f,.  const u8 *p
27680 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a  Blob, int nBlob.
27690 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
276a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
276b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
276c0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ode */.  Fts5Str
276d0 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b 20 20  ucture *p = 0;  
276e0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f           /* Deco
276f0 64 65 64 20 73 74 72 75 63 74 75 72 65 20 6f 62  ded structure ob
27700 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  ject */..  rc = 
27710 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
27720 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  ode(pBlob, nBlob
27730 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66 28 20  , 0, &p);.  if( 
27740 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27750 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a  .    *pRc = rc;.
27760 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
27770 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75  .  fts5DebugStru
27780 63 74 75 72 65 28 70 52 63 2c 20 70 42 75 66 2c  cture(pRc, pBuf,
27790 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   p);.  fts5Struc
277a0 74 75 72 65 52 65 6c 65 61 73 65 28 70 29 3b 0a  tureRelease(p);.
277b0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20  }../*.** Buffer 
277c0 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64  (a/n) is assumed
277d0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69   to contain a li
277e0 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64  st of serialized
277f0 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a   varints. Read.*
27800 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e  * each varint an
27810 64 20 61 70 70 65 6e 64 20 69 74 73 20 73 74 72  d append its str
27820 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
27830 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  on to buffer pBu
27840 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74  f. Return.** aft
27850 65 72 20 65 69 74 68 65 72 20 74 68 65 20 69 6e  er either the in
27860 70 75 74 20 62 75 66 66 65 72 20 69 73 20 65 78  put buffer is ex
27870 68 61 75 73 74 65 64 20 6f 72 20 61 20 30 20 76  hausted or a 0 v
27880 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a  alue is read..**
27890 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
278a0 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
278b0 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
278c0 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
278d0 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  buffer..*/.stati
278e0 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65  c int fts5Decode
278f0 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63  Poslist(int *pRc
27900 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
27910 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c  uf, const u8 *a,
27920 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69   int n){.  int i
27930 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  Off = 0;.  while
27940 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
27950 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f  int iVal;.    iO
27960 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
27970 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
27980 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  iVal);.    sqlit
27990 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
279a0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
279b0 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c 29  uf, " %d", iVal)
279c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
279d0 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Off;.}../*.** Th
279e0 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66 65  e start of buffe
279f0 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73  r (a/n) contains
27a00 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
27a10 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f 63  doclist. The doc
27a20 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d  list.** may or m
27a30 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77 69  ay not finish wi
27a40 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 2e  thin the buffer.
27a50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
27a60 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a  ppends a text.**
27a70 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
27a80 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20 74  of the part of t
27a90 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20  he doclist that 
27aa0 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62 75  is present to bu
27ab0 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a  ffer.** pBuf. .*
27ac0 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
27ad0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
27ae0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
27af0 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  d from the input
27b00 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74   buffer..*/.stat
27b10 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64  ic int fts5Decod
27b20 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70 52  eDoclist(int *pR
27b30 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
27b40 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  Buf, const u8 *a
27b50 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20  , int n){.  i64 
27b60 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74 20 69 4f  iDocid;.  int iO
27b70 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ff = 0;..  if( i
27b80 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 4f 66  Off<n ){.    iOf
27b90 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  f += sqlite3GetV
27ba0 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
27bb0 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a  (u64*)&iDocid);.
27bc0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
27bd0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
27be0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 72  f(pRc, pBuf, " r
27bf0 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63  owid=%lld", iDoc
27c00 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  id);.  }.  while
27c10 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
27c20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e  int nPos;.    in
27c30 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69 4f  t bDummy;.    iO
27c40 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73  ff += fts5GetPos
27c50 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66  listSize(&a[iOff
27c60 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d  ], &nPos, &bDumm
27c70 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  y);.    iOff += 
27c80 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
27c90 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b  t(pRc, pBuf, &a[
27ca0 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66  iOff], MIN(n-iOf
27cb0 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69  f, nPos));.    i
27cc0 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
27cd0 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
27ce0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
27cf0 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
27d00 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
27d10 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66  Delta);.      if
27d20 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65  ( iDelta==0 ) re
27d30 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20 20  turn iOff;.     
27d40 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74   iDocid += iDelt
27d50 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
27d60 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
27d70 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
27d80 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c  , " rowid=%lld",
27d90 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a   iDocid);.    }.
27da0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f    }..  return iO
27db0 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ff;.}../*.** The
27dc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
27dd0 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
27de0 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
27df0 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a  fts5_decode()..*
27e00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
27e10 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
27e20 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
27e30 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
27e40 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
27e50 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
27e60 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
27e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
27e90 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
27ea0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
27eb0 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
27ec0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
27ed0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27ee0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f00 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72    /* Rowid for r
27f10 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f  ecord being deco
27f20 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ded */.  int iId
27f30 78 2c 69 53 65 67 69 64 2c 69 48 65 69 67 68 74  x,iSegid,iHeight
27f40 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f 77 69  ,iPgno;  /* Rowi
27f50 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a  d components */.
27f60 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f    const u8 *aBlo
27f70 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  b; int n;       
27f80 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64    /* Record to d
27f90 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61  ecode */.  u8 *a
27fa0 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66   = 0;.  Fts5Buff
27fb0 65 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  er s;           
27fc0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64          /* Build
27fd0 20 75 70 20 74 65 78 74 20 74 6f 20 72 65 74 75   up text to retu
27fe0 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  rn here */.  int
27ff0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
28000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28010 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
28020 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b   int nSpace = 0;
28030 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72 67  ..  assert( nArg
28040 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==2 );.  memset(
28050 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  &s, 0, sizeof(Ft
28060 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52  s5Buffer));.  iR
28070 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76  owid = sqlite3_v
28080 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c  alue_int64(apVal
28090 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  [0]);.  n = sqli
280a0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
280b0 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c  apVal[1]);.  aBl
280c0 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
280d0 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d  ue_blob(apVal[1]
280e0 29 3b 0a 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e  );..  nSpace = n
280f0 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52   + FTS5_DATA_ZER
28100 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d  O_PADDING;.  a =
28110 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73   (u8*)sqlite3Fts
28120 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
28130 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
28140 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f  a==0 ) goto deco
28150 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79  de_out;.  memcpy
28160 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 20  (a, aBlob, n);. 
28170 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
28180 28 69 52 6f 77 69 64 2c 20 26 69 49 64 78 2c 20  (iRowid, &iIdx, 
28190 26 69 53 65 67 69 64 2c 20 26 69 48 65 69 67 68  &iSegid, &iHeigh
281a0 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 66  t, &iPgno);..  f
281b0 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26 72  ts5DebugRowid(&r
281c0 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b 0a  c, &s, iRowid);.
281d0 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d 46    if( iHeight==F
281e0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f  TS5_SEGMENT_MAX_
281f0 48 45 49 47 48 54 20 29 7b 0a 20 20 20 20 46 74  HEIGHT ){.    Ft
28200 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20  s5Data dlidx;.  
28210 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
28220 69 74 65 72 3b 0a 0a 20 20 20 20 64 6c 69 64 78  iter;..    dlidx
28230 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64  .p = a;.    dlid
28240 78 2e 6e 20 3d 20 6e 3b 0a 20 20 20 20 64 6c 69  x.n = n;.    dli
28250 64 78 2e 6e 52 65 66 20 3d 20 32 3b 0a 0a 20 20  dx.nRef = 2;..  
28260 20 20 6d 65 6d 73 65 74 28 26 69 74 65 72 2c 20    memset(&iter, 
28270 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
28280 69 64 78 49 74 65 72 29 29 3b 0a 20 20 20 20 69  idxIter));.    i
28290 74 65 72 2e 70 44 61 74 61 20 3d 20 26 64 6c 69  ter.pData = &dli
282a0 64 78 3b 0a 20 20 20 20 69 74 65 72 2e 69 4c 65  dx;.    iter.iLe
282b0 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a  afPgno = iPgno;.
282c0 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69  .    for(fts5Dli
282d0 64 78 49 74 65 72 46 69 72 73 74 28 26 69 74 65  dxIterFirst(&ite
282e0 72 29 3b 20 69 74 65 72 2e 62 45 6f 66 3d 3d 30  r); iter.bEof==0
282f0 3b 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  ; fts5DlidxIterN
28300 65 78 74 28 26 69 74 65 72 29 29 7b 0a 20 20 20  ext(&iter)){.   
28310 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
28320 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
28330 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20  (&rc, &s, .     
28340 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22       " %d(%lld)"
28350 2c 20 69 74 65 72 2e 69 4c 65 61 66 50 67 6e 6f  , iter.iLeafPgno
28360 2c 20 69 74 65 72 2e 69 52 6f 77 69 64 0a 20 20  , iter.iRowid.  
28370 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
28380 65 6c 73 65 20 69 66 28 20 69 53 65 67 69 64 3d  else if( iSegid=
28390 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52  =0 ){.    if( iR
283a0 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41  owid==FTS5_AVERA
283b0 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  GES_ROWID ){.   
283c0 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20     /* todo */.  
283d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
283e0 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75  ts5DecodeStructu
283f0 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e  re(&rc, &s, a, n
28400 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
28410 7b 0a 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  {..    Fts5Buffe
28420 72 20 74 65 72 6d 3b 0a 20 20 20 20 6d 65 6d 73  r term;.    mems
28430 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
28440 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
28450 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65 69 67  ;..    if( iHeig
28460 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ht==0 ){.      i
28470 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b  nt iTermOff = 0;
28480 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69  .      int iRowi
28490 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  dOff = 0;.      
284a0 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
284b0 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a  int nKeep = 0;..
284c0 20 20 20 20 20 20 69 66 28 20 6e 3e 3d 34 20 29        if( n>=4 )
284d0 7b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64  {.        iRowid
284e0 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
284f0 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  (&a[0]);.       
28500 20 69 54 65 72 6d 4f 66 66 20 3d 20 66 74 73 35   iTermOff = fts5
28510 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20  GetU16(&a[2]);. 
28520 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28530 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
28540 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26 73  ufferSet(&rc, &s
28550 2c 20 38 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  , 8, (const u8*)
28560 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20 20  "corrupt");.    
28570 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f      goto decode_
28580 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
28590 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
285a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  f ){.        iOf
285b0 66 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  f = iRowidOff;. 
285c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
285d0 54 65 72 6d 4f 66 66 20 29 7b 0a 20 20 20 20 20  TermOff ){.     
285e0 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f     iOff = iTermO
285f0 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ff;.      }else{
28600 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20  .        iOff = 
28610 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
28620 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
28630 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34  st(&rc, &s, &a[4
28640 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20  ], iOff-4);..   
28650 20 20 20 61 73 73 65 72 74 28 20 69 52 6f 77 69     assert( iRowi
28660 64 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d  dOff==0 || iOff=
28670 3d 69 52 6f 77 69 64 4f 66 66 20 29 3b 0a 20 20  =iRowidOff );.  
28680 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
28690 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  f ){.        iOf
286a0 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44  f += fts5DecodeD
286b0 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
286c0 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66  &a[iOff], n-iOff
286d0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
286e0 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 4f    assert( iTermO
286f0 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69  ff==0 || iOff==i
28700 54 65 72 6d 4f 66 66 20 29 3b 0a 20 20 20 20 20  TermOff );.     
28710 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
28720 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  {.        int nB
28730 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  yte;.        iOf
28740 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
28750 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
28760 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 74  Byte);.        t
28770 65 72 6d 2e 6e 3d 20 6e 4b 65 65 70 3b 0a 20 20  erm.n= nKeep;.  
28780 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
28790 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20  AppendBlob(&rc, 
287a0 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61  &term, nByte, &a
287b0 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20  [iOff]);.       
287c0 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a   iOff += nByte;.
287d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
287e0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
287f0 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
28800 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74      &rc, &s, " t
28810 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e  erm=%.*s", term.
28820 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  n, (const char*)
28830 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 20 20 29  term.p.        )
28840 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
28850 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  = fts5DecodeDocl
28860 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
28870 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a  iOff], n-iOff);.
28880 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
28890 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <n ){.          
288a0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
288b0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
288c0 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
288d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
288e0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
288f0 28 26 74 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c  (&term);.    }el
28900 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 4e 6f  se{.      Fts5No
28910 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20 20  deIter ss;.     
28920 20 66 6f 72 28 66 74 73 35 4e 6f 64 65 49 74 65   for(fts5NodeIte
28930 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 73 73 29  rInit(a, n, &ss)
28940 3b 20 73 73 2e 61 44 61 74 61 3b 20 66 74 73 35  ; ss.aData; fts5
28950 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 72 63  NodeIterNext(&rc
28960 2c 20 26 73 73 29 29 7b 0a 20 20 20 20 20 20 20  , &ss)){.       
28970 20 69 66 28 20 73 73 2e 74 65 72 6d 2e 6e 3d 3d   if( ss.term.n==
28980 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
28990 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
289a0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
289b0 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d 25 64 22  , &s, " left=%d"
289c0 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20  , ss.iChild);.  
289d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
289e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
289f0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
28a00 69 6e 74 66 28 26 72 63 2c 26 73 2c 20 22 20 5c  intf(&rc,&s, " \
28a10 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20 20 20 20  "%.*s\"", .     
28a20 20 20 20 20 20 20 20 20 20 73 73 2e 74 65 72 6d           ss.term
28a30 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 0a 20 20  .n, ss.term.p.  
28a40 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
28a50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
28a60 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b 0a 20 20   ss.nEmpty ){.  
28a70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
28a80 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
28a90 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22  rintf(&rc, &s, "
28aa0 20 65 6d 70 74 79 3d 25 64 25 73 22 2c 20 73 73   empty=%d%s", ss
28ab0 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20 20 20 20  .nEmpty,.       
28ac0 20 20 20 20 20 20 20 73 73 2e 62 44 6c 69 64 78         ss.bDlidx
28ad0 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20 20 20 20   ? "*" : "".    
28ae0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
28af0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
28b00 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65   fts5NodeIterFre
28b10 65 28 26 73 73 29 3b 0a 20 20 20 20 7d 0a 20 20  e(&ss);.    }.  
28b20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74  }.  . decode_out
28b30 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
28b40 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  (a);.  if( rc==S
28b50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28b60 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
28b70 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73 74  ext(pCtx, (const
28b80 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c   char*)s.p, s.n,
28b90 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
28ba0 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  T);.  }else{.   
28bb0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
28bc0 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c  error_code(pCtx,
28bd0 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35   rc);.  }.  fts5
28be0 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b 0a  BufferFree(&s);.
28bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  }../*.** The imp
28c00 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75  lementation of u
28c10 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
28c20 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  ar function fts5
28c30 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61  _rowid()..*/.sta
28c40 74 69 63 20 76 6f 69 64 20 66 74 73 35 52 6f 77  tic void fts5Row
28c50 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  idFunction(.  sq
28c60 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
28c70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
28c80 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
28c90 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
28ca0 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28cc0 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61  umber of args (a
28cd0 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71  lways 2) */.  sq
28ce0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
28cf0 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
28d00 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
28d10 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  nts */.){.  cons
28d20 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
28d30 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20  if( nArg==0 ){. 
28d40 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
28d50 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22 73  t_error(pCtx, "s
28d60 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72  hould be: fts5_r
28d70 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e  owid(subject, ..
28d80 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  ..)", -1);.  }el
28d90 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 28  se{.    zArg = (
28da0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
28db0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
28dc0 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pVal[0]);.    if
28dd0 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
28de0 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65 67 6d  icmp(zArg, "segm
28df0 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 69  ent") ){.      i
28e00 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
28e10 20 69 6e 74 20 69 64 78 2c 20 73 65 67 69 64 2c   int idx, segid,
28e20 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 3b 0a 20   height, pgno;. 
28e30 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 35       if( nArg!=5
28e40 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
28e50 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
28e60 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20  (pCtx, .        
28e70 20 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a 20      "should be: 
28e80 66 74 73 35 5f 72 6f 77 69 64 28 27 73 65 67 6d  fts5_rowid('segm
28e90 65 6e 74 27 2c 20 69 64 78 2c 20 73 65 67 69 64  ent', idx, segid
28ea0 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 29  , height, pgno))
28eb0 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b  ", -1.        );
28ec0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28ed0 20 20 20 20 20 20 69 64 78 20 3d 20 73 71 6c 69        idx = sqli
28ee0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
28ef0 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Val[1]);.       
28f00 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33   segid = sqlite3
28f10 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
28f20 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 68 65  [2]);.        he
28f30 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  ight = sqlite3_v
28f40 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 33  alue_int(apVal[3
28f50 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f  ]);.        pgno
28f60 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
28f70 5f 69 6e 74 28 61 70 56 61 6c 5b 34 5d 29 3b 0a  _int(apVal[4]);.
28f80 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
28f90 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
28fa0 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20  WID(idx, segid, 
28fb0 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 3b 0a 20  height, pgno);. 
28fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
28fd0 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
28fe0 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
28ff0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
29000 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69   0==sqlite3_stri
29010 63 6d 70 28 7a 41 72 67 2c 20 22 73 74 61 72 74  cmp(zArg, "start
29020 2d 6f 66 2d 69 6e 64 65 78 22 29 20 29 7b 0a 20  -of-index") ){. 
29030 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b       i64 iRowid;
29040 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 3b 0a  .      int idx;.
29050 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d        if( nArg!=
29060 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 ){.        sql
29070 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
29080 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
29090 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a       "should be:
290a0 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73 74 61   fts5_rowid('sta
290b0 72 74 2d 6f 66 2d 69 6e 64 65 78 27 2c 20 69 64  rt-of-index', id
290c0 78 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20  x)", -1.        
290d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
290e0 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 73 71          idx = sq
290f0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
29100 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20  apVal[1]);.     
29110 20 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35     iRowid = FTS5
29120 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
29130 64 78 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20  dx, 1, 0, 0);.  
29140 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
29150 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78 2c  sult_int64(pCtx,
29160 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
29170 7d 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20  }.    }else {.  
29180 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
29190 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
291a0 20 20 20 20 20 20 20 20 22 66 69 72 73 74 20 61          "first a
291b0 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69 64  rg to fts5_rowid
291c0 28 29 20 6d 75 73 74 20 62 65 20 27 73 65 67 6d  () must be 'segm
291d0 65 6e 74 27 20 22 0a 20 20 20 20 20 20 20 20 22  ent' ".        "
291e0 6f 72 20 27 73 74 61 72 74 2d 6f 66 2d 69 6e 64  or 'start-of-ind
291f0 65 78 27 22 0a 20 20 20 20 20 20 20 20 2c 20 2d  ex'".        , -
29200 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  1.      );.    }
29210 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
29220 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  is is called as 
29230 70 61 72 74 20 6f 66 20 72 65 67 69 73 74 65 72  part of register
29240 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64  ing the FTS5 mod
29250 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61 73  ule with databas
29260 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
29270 64 62 2e 20 49 74 20 72 65 67 69 73 74 65 72 73  db. It registers
29280 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65   several user-de
29290 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
292a0 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a  ctions useful.**
292b0 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a   with FTS5..**.*
292c0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
292d0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
292e0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
292f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65  ror occurs, some
29300 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65   other.** SQLite
29310 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29320 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
29330 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
29340 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c  ts5IndexInit(sql
29350 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
29360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
29370 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
29380 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64       db, "fts5_d
29390 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54  ecode", 2, SQLIT
293a0 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44  E_UTF8, 0, fts5D
293b0 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30  ecodeFunction, 0
293c0 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  , 0.  );.  if( r
293d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
293e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
293f0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
29400 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66  (.        db, "f
29410 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20  ts5_rowid", -1, 
29420 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
29430 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f  fts5RowidFunctio
29440 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  n, 0, 0.    );. 
29450 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29460 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
29470 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 20  ITE_ENABLE_FTS5 
29480 2a 2f 0a                                         */.