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

Artifact abf74b5e0d96b954911b6db3e13dce008c091303:


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 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
2640: 68 65 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  he doclist index
2650: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2660: 20 6c 65 61 66 20 70 61 67 65 20 70 67 6e 6f 20   leaf page pgno 
2670: 6f 66 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 73 65  of segment.** se
2680: 67 69 64 20 69 6e 20 69 6e 64 65 78 20 69 64 78  gid in index idx
2690: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  ..*/.#define FTS
26a0: 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f  5_DOCLIST_IDX_RO
26b0: 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20  WID(idx, segid, 
26c0: 70 67 6e 6f 29 20 5c 0a 20 20 20 20 20 20 20 20  pgno) \.        
26d0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
26e0: 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20 46  ID(idx, segid, F
26f0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f  TS5_SEGMENT_MAX_
2700: 48 45 49 47 48 54 2c 20 70 67 6e 6f 29 0a 0a 23  HEIGHT, pgno)..#
2710: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2720: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
2730: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
2740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2750: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2760: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2770: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2780: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2790: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
27a0: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
27b0: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
27c0: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
27d0: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
27e0: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
27f0: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
2800: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
2810: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
2820: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
2830: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
2840: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
2850: 44 49 4e 47 20 38 0a 0a 74 79 70 65 64 65 66 20  DING 8..typedef 
2860: 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65  struct Fts5Btree
2870: 49 74 65 72 20 46 74 73 35 42 74 72 65 65 49 74  Iter Fts5BtreeIt
2880: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2890: 63 74 20 46 74 73 35 42 74 72 65 65 49 74 65 72  ct Fts5BtreeIter
28a0: 4c 65 76 65 6c 20 46 74 73 35 42 74 72 65 65 49  Level Fts5BtreeI
28b0: 74 65 72 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  terLevel;.typede
28c0: 66 20 73 74 72 75 63 74 20 46 74 73 35 43 68 75  f struct Fts5Chu
28d0: 6e 6b 49 74 65 72 20 46 74 73 35 43 68 75 6e 6b  nkIter Fts5Chunk
28e0: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
28f0: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74  ruct Fts5Data Ft
2900: 73 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20  s5Data;.typedef 
2910: 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78  struct Fts5Dlidx
2920: 49 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74  Iter Fts5DlidxIt
2930: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2940: 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  ct Fts5MultiSegI
2950: 74 65 72 20 46 74 73 35 4d 75 6c 74 69 53 65 67  ter Fts5MultiSeg
2960: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
2970: 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65  ruct Fts5NodeIte
2980: 72 20 46 74 73 35 4e 6f 64 65 49 74 65 72 3b 0a  r Fts5NodeIter;.
2990: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
29a0: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74  ts5PageWriter Ft
29b0: 73 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79  s5PageWriter;.ty
29c0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
29d0: 35 50 6f 73 49 74 65 72 20 46 74 73 35 50 6f 73  5PosIter Fts5Pos
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 53 65 67 49 74 65 72  ruct Fts5SegIter
2a00: 20 46 74 73 35 53 65 67 49 74 65 72 3b 0a 74 79   Fts5SegIter;.ty
2a10: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2a20: 35 44 6f 63 6c 69 73 74 49 74 65 72 20 46 74 73  5DoclistIter Fts
2a30: 35 44 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74 79  5DoclistIter;.ty
2a40: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2a50: 35 53 65 67 57 72 69 74 65 72 20 46 74 73 35 53  5SegWriter Fts5S
2a60: 65 67 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65  egWriter;.typede
2a70: 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74 72  f struct Fts5Str
2a80: 75 63 74 75 72 65 20 46 74 73 35 53 74 72 75 63  ucture Fts5Struc
2a90: 74 75 72 65 3b 0a 74 79 70 65 64 65 66 20 73 74  ture;.typedef st
2aa0: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
2ab0: 72 65 4c 65 76 65 6c 20 46 74 73 35 53 74 72 75  reLevel Fts5Stru
2ac0: 63 74 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65  ctureLevel;.type
2ad0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2ae0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
2af0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2b00: 6d 65 6e 74 3b 0a 0a 73 74 72 75 63 74 20 46 74  ment;..struct Ft
2b10: 73 35 44 61 74 61 20 7b 0a 20 20 75 38 20 2a 70  s5Data {.  u8 *p
2b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b40: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
2b50: 63 6f 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f 72  containing recor
2b60: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2b90: 66 20 72 65 63 6f 72 64 20 69 6e 20 62 79 74 65  f record in byte
2ba0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 20 20 20 20 2f 2a 20 52 65 66 20 63 6f         /* Ref co
2bd0: 75 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  unt */.};../*.**
2be0: 20 4f 6e 65 20 6f 62 6a 65 63 74 20 70 65 72 20   One object per 
2bf0: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f  %_data table..*/
2c00: 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e 64 65  .struct Fts5Inde
2c10: 78 20 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  x {.  Fts5Config
2c20: 20 2a 70 43 6f 6e 66 69 67 3b 20 20 20 20 20 20   *pConfig;      
2c30: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
2c40: 20 74 61 62 6c 65 20 63 6f 6e 66 69 67 75 72 61   table configura
2c50: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
2c60: 7a 44 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20  zDataTbl;       
2c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2c80: 65 20 6f 66 20 25 5f 64 61 74 61 20 74 61 62 6c  e of %_data tabl
2c90: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b  e */.  int nWork
2ca0: 55 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Unit;           
2cb0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
2cc0: 61 67 65 73 20 69 6e 20 61 20 22 75 6e 69 74 22  ages in a "unit"
2cd0: 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f   of work */..  /
2ce0: 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 73  *.  ** Variables
2cf0: 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
2d00: 61 63 63 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20  accumulation of 
2d10: 74 6f 6b 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69  tokens and docli
2d20: 73 74 73 20 77 69 74 68 69 6e 20 74 68 65 0a 20  sts within the. 
2d30: 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61   ** in-memory ha
2d40: 73 68 20 74 61 62 6c 65 73 20 62 65 66 6f 72 65  sh tables before
2d50: 20 74 68 65 79 20 61 72 65 20 66 6c 75 73 68 65   they are flushe
2d60: 64 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  d to disk..  */.
2d70: 20 20 46 74 73 35 48 61 73 68 20 2a 2a 61 70 48    Fts5Hash **apH
2d80: 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
2d90: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 68 61    /* Array of ha
2da0: 73 68 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69  sh tables */.  i
2db0: 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  nt nMaxPendingDa
2dc0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ta;            /
2dd0: 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67 20 64 61  * Max pending da
2de0: 74 61 20 62 65 66 6f 72 65 20 66 6c 75 73 68 20  ta before flush 
2df0: 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74  to disk */.  int
2e00: 20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b 20 20   nPendingData;  
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e20: 43 75 72 72 65 6e 74 20 62 79 74 65 73 20 6f 66  Current bytes of
2e30: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f   pending data */
2e40: 0a 20 20 69 36 34 20 69 57 72 69 74 65 52 6f 77  .  i64 iWriteRow
2e50: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2e60: 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
2e70: 63 75 72 72 65 6e 74 20 64 6f 63 20 62 65 69 6e  current doc bein
2e80: 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20  g written */..  
2e90: 2f 2a 20 45 72 72 6f 72 20 73 74 61 74 65 2e 20  /* Error state. 
2ea0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2ed0: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
2ee0: 20 2f 2a 20 53 74 61 74 65 20 75 73 65 64 20 62   /* State used b
2ef0: 79 20 74 68 65 20 66 74 73 35 44 61 74 61 58 58  y the fts5DataXX
2f00: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a  X() functions. *
2f10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
2f20: 20 2a 70 52 65 61 64 65 72 3b 20 20 20 20 20 20   *pReader;      
2f30: 20 20 20 20 2f 2a 20 52 4f 20 69 6e 63 72 2d 62      /* RO incr-b
2f40: 6c 6f 62 20 6f 70 65 6e 20 6f 6e 20 25 5f 64 61  lob open on %_da
2f50: 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ta table */.  sq
2f60: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72 69  lite3_stmt *pWri
2f70: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ter;          /*
2f80: 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 64   "INSERT ... %_d
2f90: 61 74 61 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22  ata VALUES(?,?)"
2fa0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2fb0: 6d 74 20 2a 70 44 65 6c 65 74 65 72 3b 20 20 20  mt *pDeleter;   
2fc0: 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45 54 45        /* "DELETE
2fd0: 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 2e 2e 2e   FROM %_data ...
2fe0: 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f   id>=? AND id<=?
2ff0: 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  " */.  int nRead
3000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3010: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
3020: 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73  number of blocks
3030: 20 72 65 61 64 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   read */.};..str
3040: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
3050: 74 65 72 20 7b 0a 20 20 69 6e 74 20 62 44 65 73  ter {.  int bDes
3060: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3070: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3080: 66 6f 72 20 44 45 53 43 20 6f 72 64 65 72 2c 20  for DESC order, 
3090: 66 61 6c 73 65 20 66 6f 72 20 41 53 43 20 2a 2f  false for ASC */
30a0: 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74 20  .  u8 *a;.  int 
30b0: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  n;.  int i;..  /
30c0: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
30d0: 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20  es. aPoslist==0 
30e0: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20  at EOF */.  i64 
30f0: 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50  iRowid;.  u8 *aP
3100: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50  oslist;.  int nP
3110: 6f 73 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  oslist;.};../*.*
3120: 2a 20 45 61 63 68 20 69 74 65 72 61 74 6f 72 20  * Each iterator 
3130: 75 73 65 64 20 62 79 20 65 78 74 65 72 6e 61 6c  used by external
3140: 20 6d 6f 64 75 6c 65 73 20 69 73 20 61 6e 20 69   modules is an i
3150: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
3160: 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  type..*/.struct 
3170: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b 0a  Fts5IndexIter {.
3180: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e    Fts5Index *pIn
3190: 64 65 78 3b 0a 20 20 46 74 73 35 53 74 72 75 63  dex;.  Fts5Struc
31a0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
31b0: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
31c0: 72 20 2a 70 4d 75 6c 74 69 3b 0a 20 20 46 74 73  r *pMulti;.  Fts
31d0: 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 44  5DoclistIter *pD
31e0: 6f 63 6c 69 73 74 3b 0a 20 20 46 74 73 35 42 75  oclist;.  Fts5Bu
31f0: 66 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20  ffer poslist;   
3200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3210: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
3220: 75 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a  urrent poslist *
3230: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
3240: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3250: 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63 6f  "structure" reco
3260: 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  rd for each inde
3270: 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  x are represente
3280: 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46 74  d.** using an Ft
3290: 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63 6f  s5Structure reco
32a0: 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57 68  rd in memory. Wh
32b0: 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e 63  ich uses instanc
32c0: 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 74  es of the .** ot
32d0: 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75 72  her Fts5Structur
32e0: 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63 6f  eXXX types as co
32f0: 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72  mponents..*/.str
3300: 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72  uct Fts5Structur
3310: 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e 74  eSegment {.  int
3320: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3340: 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
3350: 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20  int nHeight;    
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3370: 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73 65 67  /* Height of seg
3380: 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20  ment b-tree */. 
3390: 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20   int pgnoFirst; 
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70   /* First leaf p
33c0: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
33d0: 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70  gment */.  int p
33e0: 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20  gnoLast;        
33f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
3400: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
3410: 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
3420: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
3430: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b  StructureLevel {
3440: 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20  .  int nMerge;  
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3460: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3470: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72  segments in incr
3480: 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20  -merge */.  int 
3490: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
34b0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
34c0: 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
34d0: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
34e0: 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67  ureSegment *aSeg
34f0: 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ;     /* Array o
3500: 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67  f segments. aSeg
3510: 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a  [0] is oldest. *
3520: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
3530: 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 75 36  Structure {.  u6
3540: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3560: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
3570: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
3580: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c   */.  int nLevel
3590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
35b0: 6f 66 20 6c 65 76 65 6c 73 20 69 6e 20 74 68 69  of levels in thi
35c0: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73  s index */.  Fts
35d0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
35e0: 61 4c 65 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20  aLevel[0];   /* 
35f0: 41 72 72 61 79 20 6f 66 20 6e 4c 65 76 65 6c 20  Array of nLevel 
3600: 6c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 2a 2f  level objects */
3610: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62  .};../*.** An ob
3620: 6a 65 63 74 20 6f 66 20 74 79 70 65 20 46 74 73  ject of type Fts
3630: 35 53 65 67 57 72 69 74 65 72 20 69 73 20 75 73  5SegWriter is us
3640: 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 73  ed to write to s
3650: 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75  egments..*/.stru
3660: 63 74 20 46 74 73 35 50 61 67 65 57 72 69 74 65  ct Fts5PageWrite
3670: 72 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20  r {.  int pgno; 
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3690: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
36a0: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
36b0: 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ge */.  Fts5Buff
36c0: 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  er buf;         
36d0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
36e0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67  r containing pag
36f0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73 35  e data */.  Fts5
3700: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
3710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3720: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3730: 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 6f   previous term o
3740: 6e 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74 72  n page */.};.str
3750: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
3760: 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78 3b 20  r {.  int iIdx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
3790: 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
37a0: 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20  int iSegid;     
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 2f 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69 74  /* Segid to writ
37d0: 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 57  e to */.  int nW
37e0: 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  riter;          
37f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3800: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3810: 6e 20 61 57 72 69 74 65 72 20 2a 2f 0a 20 20 46  n aWriter */.  F
3820: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 61  ts5PageWriter *a
3830: 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 2f  Writer;        /
3840: 2a 20 41 72 72 61 79 20 6f 66 20 50 61 67 65 57  * Array of PageW
3850: 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f  riter objects */
3860: 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69  .  i64 iPrevRowi
3870: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3880: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 64     /* Previous d
3890: 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  ocid written to 
38a0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
38b0: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
38c0: 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  InDoclist;      
38d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
38e0: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
38f0: 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   in doclist */. 
3900: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3910: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
3920: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3930: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3940: 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  in page */.  u8 
3950: 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
3960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3970: 54 72 75 65 20 69 66 20 6e 65 78 74 20 74 65 72  True if next ter
3980: 6d 20 77 69 6c 6c 20 62 65 20 66 69 72 73 74 20  m will be first 
3990: 69 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74  in leaf */.  int
39a0: 20 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 20 20   nLeafWritten;  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39c0: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
39d0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ages written */.
39e0: 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20    int nEmpty;   
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3a10: 6f 6e 74 69 67 75 6f 75 73 20 74 65 72 6d 2d 6c  ontiguous term-l
3a20: 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 46  ess nodes */.  F
3a30: 74 73 35 42 75 66 66 65 72 20 63 64 6c 69 64 78  ts5Buffer cdlidx
3a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a50: 2f 2a 20 44 6f 63 6c 69 73 74 20 69 6e 64 65 78  /* Doclist index
3a60: 20 2a 2f 0a 20 20 69 36 34 20 69 44 6c 69 64 78   */.  i64 iDlidx
3a70: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
3a80: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
3a90: 73 20 72 6f 77 69 64 20 61 70 70 65 6e 64 65 64  s rowid appended
3aa0: 20 74 6f 20 64 6c 69 64 78 20 2a 2f 0a 20 20 69   to dlidx */.  i
3ab0: 6e 74 20 62 44 6c 69 64 78 50 72 65 76 56 61 6c  nt bDlidxPrevVal
3ac0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  id;            /
3ad0: 2a 20 54 72 75 65 20 69 66 20 69 44 6c 69 64 78  * True if iDlidx
3ae0: 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f  Prev is valid */
3af0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
3b00: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
3b10: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67  through the merg
3b20: 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e  ed results of on
3b30: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
3b40: 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20  ts,.** visiting 
3b50: 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 20  each term/docid 
3b60: 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67  pair in the merg
3b70: 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e  ed data..**.** n
3b80: 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20  Seg is always a 
3b90: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65  power of two gre
3ba0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
3bb0: 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  al to the number
3bc0: 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20   of.** segments 
3bd0: 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74  that this object
3be0: 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61   is merging data
3bf0: 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20   from. Both the 
3c00: 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46  aSeg[] and.** aF
3c10: 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72  irst[] arrays ar
3c20: 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20  e sized at nSeg 
3c30: 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65  entries. The aSe
3c40: 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64  g[] array is pad
3c50: 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f  ded.** with zero
3c60: 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65  ed objects - the
3c70: 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61  se are handled a
3c80: 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69  s if they were i
3c90: 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a  terators opened.
3ca0: 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d  ** on empty segm
3cb0: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
3cc0: 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
3cd0: 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53  ring segments aS
3ce0: 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e  eg[N] and aSeg[N
3cf0: 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20  +1], where N is 
3d00: 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65  an.** even numbe
3d10: 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  r, is stored in 
3d20: 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f  aFirst[(nSeg+N)/
3d30: 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22  2]. The "result"
3d40: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70   of the .** comp
3d50: 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63  arison in this c
3d60: 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e  ontext is the in
3d70: 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61  dex of the itera
3d80: 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74  tor that current
3d90: 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ly.** points to 
3da0: 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d  the smaller term
3db0: 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
3dc0: 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74  on. Iterators at
3dd0: 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73   EOF are.** cons
3de0: 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65  idered to be gre
3df0: 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74  ater than all ot
3e00: 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  her iterators..*
3e10: 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63  *.** aFirst[1] c
3e20: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
3e30: 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74  x in aSeg[] of t
3e40: 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  he iterator that
3e50: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
3e60: 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f  e smallest key o
3e70: 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30  verall. aFirst[0
3e80: 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f  ] is unused. .*/
3e90: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
3ea0: 20 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73   Fts5CResult Fts
3eb0: 35 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74  5CResult;.struct
3ec0: 20 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20   Fts5CResult {. 
3ed0: 20 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20   u16 iFirst;    
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78   /* aSeg[] index
3f00: 20 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65   of firstest ite
3f10: 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54  rator */.  u8 bT
3f20: 65 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20  ermEq;          
3f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3f40: 75 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20  ue if the terms 
3f50: 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a  are equal */.};.
3f60: 0a 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c 74  .struct Fts5Mult
3f70: 69 53 65 67 49 74 65 72 20 7b 0a 20 20 69 6e 74  iSegIter {.  int
3f80: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
3fb0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
3fc0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
3fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3fe0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
3ff0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4000: 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74  .  int bSkipEmpt
4010: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
4020: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4030: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4040: 65 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  es */.  Fts5SegI
4050: 74 65 72 20 2a 61 53 65 67 3b 20 20 20 20 20 20  ter *aSeg;      
4060: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4070: 20 6f 66 20 73 65 67 6d 65 6e 74 20 69 74 65 72   of segment iter
4080: 61 74 6f 72 73 20 2a 2f 0a 20 20 46 74 73 35 43  ators */.  Fts5C
4090: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
40b0: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
40c0: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
40d0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
40e0: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
40f0: 74 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c 65  through a single
4100: 20 73 65 67 6d 65 6e 74 2c 20 76 69 73 69 74 69   segment, visiti
4110: 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 64 6f 63  ng each term/doc
4120: 69 64 0a 2a 2a 20 70 61 69 72 20 69 6e 20 74 68  id.** pair in th
4130: 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  e segment..**.**
4140: 20 70 53 65 67 3a 0a 2a 2a 20 20 20 54 68 65 20   pSeg:.**   The 
4150: 73 65 67 6d 65 6e 74 20 74 6f 20 69 74 65 72 61  segment to itera
4160: 74 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a  te through..**.*
4170: 2a 20 69 4c 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20  * iLeafPgno:.** 
4180: 20 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 70    Current leaf p
4190: 61 67 65 20 6e 75 6d 62 65 72 20 77 69 74 68 69  age number withi
41a0: 6e 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  n segment..**.**
41b0: 20 69 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a   iLeafOffset:.**
41c0: 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20 77     Byte offset w
41d0: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
41e0: 74 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 74  t leaf that is t
41f0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
4200: 20 74 68 65 20 0a 2a 2a 20 20 20 70 6f 73 69 74   the .**   posit
4210: 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 28 6f  ion list data (o
4220: 6e 65 20 62 79 74 65 20 70 61 73 73 65 64 20 74  ne byte passed t
4230: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
4240: 20 73 69 7a 65 20 66 69 65 6c 64 29 2e 0a 2a 2a   size field)..**
4250: 20 20 20 72 6f 77 69 64 20 66 69 65 6c 64 20 6f     rowid field o
4260: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  f the current en
4270: 74 72 79 2e 20 55 73 75 61 6c 6c 79 20 74 68 69  try. Usually thi
4280: 73 20 69 73 20 74 68 65 20 73 69 7a 65 20 66 69  s is the size fi
4290: 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  eld of the.**   
42a0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61  position list da
42b0: 74 61 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  ta. The exceptio
42c0: 6e 20 69 73 20 69 66 20 74 68 65 20 72 6f 77 69  n is if the rowi
42d0: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
42e0: 74 20 65 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73  t entry .**   is
42f0: 20 74 68 65 20 6c 61 73 74 20 74 68 69 6e 67 20   the last thing 
4300: 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  on the leaf page
4310: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a  ..**.** pLeaf:.*
4320: 2a 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61  *   Buffer conta
4330: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 6c 65  ining current le
4340: 61 66 20 70 61 67 65 20 64 61 74 61 2e 20 53 65  af page data. Se
4350: 74 20 74 6f 20 4e 55 4c 4c 20 61 74 20 45 4f 46  t to NULL at EOF
4360: 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72 6d 4c 65 61  ..**.** iTermLea
4370: 66 50 67 6e 6f 2c 20 69 54 65 72 6d 4c 65 61 66  fPgno, iTermLeaf
4380: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 4c 65 61  Offset:.**   Lea
4390: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 63 6f  f page number co
43a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73  ntaining the las
43b0: 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d  t term read from
43c0: 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 41 6e   the segment. An
43d0: 64 0a 2a 2a 20 20 20 74 68 65 20 6f 66 66 73 65  d.**   the offse
43e0: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
43f0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 65 72 6d  llowing the term
4400: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61   data..**.** fla
4410: 67 73 3a 0a 2a 2a 20 20 20 4d 61 73 6b 20 6f 66  gs:.**   Mask of
4420: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 58 58   FTS5_SEGITER_XX
4430: 58 20 76 61 6c 75 65 73 2e 20 49 6e 74 65 72 70  X values. Interp
4440: 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
4450: 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53  :.**.**   FTS5_S
4460: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a  EGITER_ONETERM:.
4470: 2a 2a 20 20 20 20 20 49 66 20 73 65 74 2c 20 73  **     If set, s
4480: 65 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  et the iterator 
4490: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20  to point to EOF 
44a0: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
44b0: 74 20 64 6f 63 6c 69 73 74 20 0a 2a 2a 20 20 20  t doclist .**   
44c0: 20 20 68 61 73 20 62 65 65 6e 20 65 78 68 61 75    has been exhau
44d0: 73 74 65 64 2e 20 44 6f 20 6e 6f 74 20 70 72 6f  sted. Do not pro
44e0: 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ceed to the next
44f0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67   term in the seg
4500: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54  ment..**.**   FT
4510: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4520: 53 45 3a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  SE:.**     This 
4530: 66 6c 61 67 20 69 73 20 6f 6e 6c 79 20 65 76 65  flag is only eve
4540: 72 20 73 65 74 20 69 66 20 46 54 53 35 5f 53 45  r set if FTS5_SE
4550: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 69 73  GITER_ONETERM is
4560: 20 61 6c 73 6f 20 73 65 74 2e 20 49 66 0a 2a 2a   also set. If.**
4570: 20 20 20 20 20 69 74 20 69 73 20 73 65 74 2c 20       it is set, 
4580: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
4590: 64 6f 63 69 64 73 20 69 6e 20 64 65 73 63 65 6e  docids in descen
45a0: 64 69 6e 67 20 6f 72 64 65 72 20 69 6e 73 74 65  ding order inste
45b0: 61 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ad of the.**    
45c0: 20 64 65 66 61 75 6c 74 20 61 73 63 65 6e 64 69   default ascendi
45d0: 6e 67 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  ng order..**.** 
45e0: 69 52 6f 77 69 64 4f 66 66 73 65 74 2f 6e 52 6f  iRowidOffset/nRo
45f0: 77 69 64 4f 66 66 73 65 74 2f 61 52 6f 77 69 64  widOffset/aRowid
4600: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 20 20 54  Offset:.**     T
4610: 68 65 73 65 20 61 72 65 20 75 73 65 64 20 69 66  hese are used if
4620: 20 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45   the FTS5_SEGITE
4630: 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69  R_REVERSE flag i
4640: 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  s set..**.**    
4650: 20 46 6f 72 20 65 61 63 68 20 72 6f 77 69 64 20   For each rowid 
4660: 6f 6e 20 74 68 65 20 70 61 67 65 20 63 6f 72 72  on the page corr
4670: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
4680: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2c 20 74   current term, t
4690: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 72 72 65 73  he.**     corres
46a0: 70 6f 6e 64 69 6e 67 20 61 52 6f 77 69 64 4f 66  ponding aRowidOf
46b0: 66 73 65 74 5b 5d 20 65 6e 74 72 79 20 69 73 20  fset[] entry is 
46c0: 73 65 74 20 74 6f 20 74 68 65 20 62 79 74 65 20  set to the byte 
46d0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a  offset of the.**
46e0: 20 20 20 20 20 73 74 61 72 74 20 6f 66 20 74 68       start of th
46f0: 65 20 22 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  e "position-list
4700: 2d 73 69 7a 65 22 20 66 69 65 6c 64 20 77 69 74  -size" field wit
4710: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  hin the page..*/
4720: 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67 49  .struct Fts5SegI
4730: 74 65 72 20 7b 0a 20 20 46 74 73 35 53 74 72 75  ter {.  Fts5Stru
4740: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
4750: 65 67 3b 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg;     /* Segme
4760: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
4770: 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 69  rough */.  int i
4780: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
47a0: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
47b0: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
47c0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
47f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
4800: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
4810: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
4820: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4830: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
4840: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4850: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4860: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4870: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4880: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4890: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
48a0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
48b0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
48c0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  leaf */..  /* Th
48d0: 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73 65  e page and offse
48e0: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65  t from which the
48f0: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77 61   current term wa
4900: 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66 73  s read. The offs
4910: 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  et .  ** is the 
4920: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66 69  offset of the fi
4930: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  rst rowid in the
4940: 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
4950: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  .  */.  int iTer
4960: 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  mLeafPgno;.  int
4970: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
4980: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
4990: 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75  owing are only u
49a0: 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f  sed if the FTS5_
49b0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
49c0: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a  flag is set. */.
49d0: 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73    int iRowidOffs
49e0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
49f0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e 74    /* Current ent
4a00: 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66 73  ry in aRowidOffs
4a10: 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  et[] */.  int nR
4a20: 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20  owidOffset;     
4a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
4a40: 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
4a50: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72  RowidOffset[] ar
4a60: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52  ray */.  int *aR
4a70: 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20  owidOffset;     
4a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
4a90: 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20 72  y of offset to r
4aa0: 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a 0a  owid fields */..
4ab0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
4ac0: 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20  *pDlidx;        
4ad0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
4ae0: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
4af0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62   */..  /* Variab
4b00: 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62 61  les populated ba
4b10: 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20 65  sed on current e
4b20: 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42  ntry. */.  Fts5B
4b30: 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
4b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4b50: 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  rrent term */.  
4b60: 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64  /* Current rowid
4b90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b 20   */.  int nPos; 
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4bc0: 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75 72 72  of bytes in curr
4bd0: 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ent position lis
4be0: 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 3b  t */.  int bDel;
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4c10: 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61  f the delete fla
4c20: 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a  g is set */.};..
4c30: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47  #define FTS5_SEG
4c40: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78 30  ITER_ONETERM 0x0
4c50: 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  1.#define FTS5_S
4c60: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 30  EGITER_REVERSE 0
4c70: 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  x02.../*.** Obje
4c80: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
4c90: 20 74 68 72 6f 75 67 68 20 70 61 67 69 6e 61 74   through paginat
4ca0: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 72 75  ed data..*/.stru
4cb0: 63 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72  ct Fts5ChunkIter
4cc0: 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70   {.  Fts5Data *p
4cd0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
4ce0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4cf0: 6c 65 61 66 20 64 61 74 61 2e 20 4e 55 4c 4c 20  leaf data. NULL 
4d00: 2d 3e 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 36 34  -> EOF. */.  i64
4d10: 20 69 4c 65 61 66 52 6f 77 69 64 3b 20 20 20 20   iLeafRowid;    
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d30: 41 62 73 6f 6c 75 74 65 20 72 6f 77 69 64 20 6f  Absolute rowid o
4d40: 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a  f current leaf *
4d50: 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20  /.  int nRem;   
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67      /* Remaining
4d80: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 74   bytes of data t
4d90: 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 2f 2a 20  o read */..  /* 
4da0: 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  Output parameter
4db0: 73 20 2a 2f 0a 20 20 75 38 20 2a 70 3b 20 20 20  s */.  u8 *p;   
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4de0: 72 20 74 6f 20 63 68 75 6e 6b 20 6f 66 20 64 61  r to chunk of da
4df0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ta */.  int n;  
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
4e20: 6f 66 20 62 75 66 66 65 72 20 70 20 69 6e 20 62  of buffer p in b
4e30: 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ytes */.};../*.*
4e40: 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65  * Object for ite
4e50: 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
4e60: 20 73 69 6e 67 6c 65 20 70 6f 73 69 74 69 6f 6e   single position
4e70: 20 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a   list on disk..*
4e80: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f 73  /.struct Fts5Pos
4e90: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 43 68 75  Iter {.  Fts5Chu
4ea0: 6e 6b 49 74 65 72 20 63 68 75 6e 6b 3b 20 20 20  nkIter chunk;   
4eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4ec0: 65 6e 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74  ent chunk of dat
4ed0: 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b  a */.  int iOff;
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
4f00: 20 77 69 74 68 69 6e 20 63 68 75 6e 6b 20 64 61   within chunk da
4f10: 74 61 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43 6f  ta */..  int iCo
4f20: 6c 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a 7d  l;.  int iPos;.}
4f30: 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  ;../*.** Object 
4f40: 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  for iterating th
4f50: 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e 74  rough the conent
4f60: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69 6e  s of a single in
4f70: 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 0a  ternal node in .
4f80: 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
4f90: 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65  ruct Fts5NodeIte
4fa0: 72 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e 61  r {.  /* Interna
4fb0: 6c 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61 67  l. Set and manag
4fc0: 65 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49 74  ed by fts5NodeIt
4fd0: 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  erXXX() function
4fe0: 73 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a 2a  s. Except, .  **
4ff0: 20 74 68 65 20 45 4f 46 20 74 65 73 74 20 66 6f   the EOF test fo
5000: 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  r the iterator i
5010: 73 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72 2e  s (Fts5NodeIter.
5020: 61 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a 20  aData==0).  */. 
5030: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
5040: 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20  ;.  int nData;. 
5050: 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f 2a   int iOff;..  /*
5060: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
5070: 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
5080: 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 45  r term;.  int nE
5090: 6d 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68 69  mpty;.  int iChi
50a0: 6c 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78  ld;.  int bDlidx
50b0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ;.};../*.** An i
50c0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
50d0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
50e0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
50f0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5100: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5110: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5120: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5130: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5140: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5150: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
5160: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
5170: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
5180: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
5190: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
51a0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
51b0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
51c0: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
51d0: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
51e0: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
51f0: 74 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61  ter {.  Fts5Data
5200: 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
5210: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
5220: 72 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 2c  r doclist index,
5230: 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
5240: 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
5250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
5260: 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 74  rrent offset int
5270: 6f 20 70 44 6c 69 64 78 20 2a 2f 0a 20 20 69 6e  o pDlidx */.  in
5280: 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20  t bEof;         
5290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
52a0: 74 20 45 4f 46 20 61 6c 72 65 61 64 79 20 2a 2f  t EOF already */
52b0: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 4f 66 66  .  int iFirstOff
52c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
52d0: 20 2f 2a 20 55 73 65 64 20 62 79 20 72 65 76 65   /* Used by reve
52e0: 72 73 65 20 69 74 65 72 61 74 6f 72 73 20 6f 6e  rse iterators on
52f0: 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70  ly */..  /* Outp
5300: 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a  ut variables */.
5310: 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b    int iLeafPgno;
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
5340: 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  f current leaf p
5350: 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  age */.  i64 iRo
5360: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
5370: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
5380: 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c  rowid on leaf iL
5390: 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 0a  eafPgno */.};...
53a0: 2f 2a 0a 2a 2a 20 41 6e 20 46 74 73 35 42 74 72  /*.** An Fts5Btr
53b0: 65 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73  eeIter object is
53c0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
53d0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 6e 74   through all ent
53e0: 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 62  ries in the.** b
53f0: 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
5400: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 73  belonging to a s
5410: 69 6e 67 6c 65 20 66 74 73 35 20 73 65 67 6d 65  ingle fts5 segme
5420: 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nt. In this case
5430: 20 74 68 65 0a 2a 2a 20 22 62 2d 74 72 65 65 20   the.** "b-tree 
5440: 68 69 65 72 61 72 63 68 79 22 20 69 73 20 61 6c  hierarchy" is al
5450: 6c 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 65  l b-tree nodes e
5460: 78 63 65 70 74 20 6c 65 61 76 65 73 2e 20 45 61  xcept leaves. Ea
5470: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  ch entry in the.
5480: 2a 2a 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  ** b-tree hierar
5490: 63 68 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  chy consists of 
54a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
54b0: 2a 0a 2a 2a 20 20 20 69 4c 65 61 66 3a 20 20 54  *.**   iLeaf:  T
54c0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
54d0: 66 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  f the leaf page 
54e0: 74 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  the entry points
54f0: 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72   to..**.**   ter
5500: 6d 3a 20 20 20 41 20 73 70 6c 69 74 2d 6b 65 79  m:   A split-key
5510: 20 74 68 61 74 20 61 6c 6c 20 74 65 72 6d 73 20   that all terms 
5520: 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 24 69 4c  on leaf page $iL
5530: 65 61 66 20 6d 75 73 74 20 62 65 20 67 72 65 61  eaf must be grea
5540: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
5550: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
5560: 6f 2e 20 54 68 65 20 22 74 65 72 6d 22 20 61 73  o. The "term" as
5570: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
5580: 65 20 66 69 72 73 74 20 62 2d 74 72 65 65 0a 2a  e first b-tree.*
5590: 2a 20 20 20 20 20 20 20 20 20 20 20 68 69 65 72  *           hier
55a0: 61 72 63 68 79 20 65 6e 74 72 79 20 28 74 68 65  archy entry (the
55b0: 20 6f 6e 65 20 74 68 61 74 20 70 6f 69 6e 74 73   one that points
55c0: 20 74 6f 20 6c 65 61 66 20 70 61 67 65 20 31 29   to leaf page 1)
55d0: 20 69 73 20 61 6c 77 61 79 73 20 0a 2a 2a 20 20   is always .**  
55e0: 20 20 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74           an empt
55f0: 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
5600: 20 20 6e 45 6d 70 74 79 3a 20 54 68 65 20 6e 75    nEmpty: The nu
5610: 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20 28 74  mber of empty (t
5620: 65 72 6d 6c 65 73 73 29 20 6c 65 61 66 20 70 61  ermless) leaf pa
5630: 67 65 73 20 74 68 61 74 20 69 6d 6d 65 64 69 61  ges that immedia
5640: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  tely.**         
5650: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65 61    following iLea
5660: 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  f..**.** The Fts
5670: 35 42 74 72 65 65 49 74 65 72 20 6f 62 6a 65 63  5BtreeIter objec
5680: 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  t is only used a
5690: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
56a0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63 6f  tegrity-check co
56b0: 64 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  de..*/.struct Ft
56c0: 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
56d0: 20 7b 0a 20 20 46 74 73 35 4e 6f 64 65 49 74 65   {.  Fts5NodeIte
56e0: 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  r s;            
56f0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
5700: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
5710: 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 44   node */.  Fts5D
5720: 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20  ata *pData;     
5730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5740: 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ta for the curre
5750: 6e 74 20 6e 6f 64 65 20 2a 2f 0a 7d 3b 0a 73 74  nt node */.};.st
5760: 72 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74  ruct Fts5BtreeIt
5770: 65 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  er {.  Fts5Index
5780: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
5790: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
57a0: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
57b0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
57c0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
57d0: 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
57e0: 72 6f 75 67 68 20 74 68 69 73 20 73 65 67 6d 65  rough this segme
57f0: 6e 74 27 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  nt's b-tree */. 
5800: 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20   int iIdx;      
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 2f 2a 20 49 6e 64 65 78 20 70 53 65 67 20 62   /* Index pSeg b
5830: 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 69  elongs to */.  i
5840: 6e 74 20 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt nLvl;        
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5860: 2a 20 53 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d  * Size of aLvl[]
5870: 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35   array */.  Fts5
5880: 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a  BtreeIterLevel *
5890: 61 4c 76 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c  aLvl;       /* L
58a0: 65 76 65 6c 20 66 6f 72 20 65 61 63 68 20 74 69  evel for each ti
58b0: 65 72 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a  er of b-tree */.
58c0: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
58d0: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35  iables */.  Fts5
58e0: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5900: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
5910: 20 69 6e 74 20 69 4c 65 61 66 3b 20 20 20 20 20   int iLeaf;     
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 2f 2a 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e   /* Leaf contain
5940: 69 6e 67 20 74 65 72 6d 73 20 3e 3d 20 63 75 72  ing terms >= cur
5950: 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  rent term */.  i
5960: 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20  nt nEmpty;      
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5980: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22 65 6d 70  * Number of "emp
5990: 74 79 22 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  ty" leaves follo
59a0: 77 69 6e 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20  wing iLeaf */.  
59b0: 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20  int bEof;       
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 61  /* Set to true a
59e0: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62  t EOF */.  int b
59f0: 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  Dlidx;          
5a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
5a10: 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ue if there exis
5a20: 74 73 20 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b  ts a dlidx */.};
5a30: 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  ...static void f
5a40: 74 73 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f  ts5PutU16(u8 *aO
5a50: 75 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20  ut, u16 iVal){. 
5a60: 20 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c   aOut[0] = (iVal
5a70: 3e 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20  >>8);.  aOut[1] 
5a80: 3d 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d  = (iVal&0xFF);.}
5a90: 0a 0a 73 74 61 74 69 63 20 75 31 36 20 66 74 73  ..static u16 fts
5aa0: 35 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38  5GetU16(const u8
5ab0: 20 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e   *aIn){.  return
5ac0: 20 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c   ((u16)aIn[0] <<
5ad0: 20 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a   8) + aIn[1];.}.
5ae0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
5af0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 71 6c   copy of the sql
5b00: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
5b10: 29 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  ) routine from t
5b20: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a  he SQLite core..
5b30: 2a 2a 20 45 78 63 65 70 74 2c 20 74 68 69 73 20  ** Except, this 
5b40: 76 65 72 73 69 6f 6e 20 64 6f 65 73 20 68 61 6e  version does han
5b50: 64 6c 65 20 74 68 65 20 73 69 6e 67 6c 65 20 62  dle the single b
5b60: 79 74 65 20 63 61 73 65 20 74 68 61 74 20 74 68  yte case that th
5b70: 65 20 63 6f 72 65 0a 2a 2a 20 76 65 72 73 69 6f  e core.** versio
5b80: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 62 65 69  n depends on bei
5b90: 6e 67 20 68 61 6e 64 6c 65 64 20 62 65 66 6f 72  ng handled befor
5ba0: 65 20 69 74 73 20 66 75 6e 63 74 69 6f 6e 20 69  e its function i
5bb0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74  s called..*/.int
5bc0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
5bd0: 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e  arint32(const un
5be0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20  signed char *p, 
5bf0: 75 33 32 20 2a 76 29 7b 0a 20 20 75 33 32 20 61  u32 *v){.  u32 a
5c00: 2c 62 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 31 2d  ,b;..  /* The 1-
5c10: 62 79 74 65 20 63 61 73 65 2e 20 4f 76 65 72 77  byte case. Overw
5c20: 68 65 6c 6d 69 6e 67 6c 79 20 74 68 65 20 6d 6f  helmingly the mo
5c30: 73 74 20 63 6f 6d 6d 6f 6e 2e 20 2a 2f 0a 20 20  st common. */.  
5c40: 61 20 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20  a = *p;.  /* a: 
5c50: 70 30 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f  p0 (unmasked) */
5c60: 0a 20 20 69 66 20 28 21 28 61 26 30 78 38 30 29  .  if (!(a&0x80)
5c70: 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c  ).  {.    /* Val
5c80: 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ues between 0 an
5c90: 64 20 31 32 37 20 2a 2f 0a 20 20 20 20 2a 76 20  d 127 */.    *v 
5ca0: 3d 20 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = a;.    return 
5cb0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  1;.  }..  /* The
5cc0: 20 32 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a   2-byte case */.
5cd0: 20 20 70 2b 2b 3b 0a 20 20 62 20 3d 20 2a 70 3b    p++;.  b = *p;
5ce0: 0a 20 20 2f 2a 20 62 3a 20 70 31 20 28 75 6e 6d  .  /* b: p1 (unm
5cf0: 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28  asked) */.  if (
5d00: 21 28 62 26 30 78 38 30 29 29 0a 20 20 7b 0a 20  !(b&0x80)).  {. 
5d10: 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74     /* Values bet
5d20: 77 65 65 6e 20 31 32 38 20 61 6e 64 20 31 36 33  ween 128 and 163
5d30: 38 33 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20 30  83 */.    a &= 0
5d40: 78 37 66 3b 0a 20 20 20 20 61 20 3d 20 61 3c 3c  x7f;.    a = a<<
5d50: 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20  7;.    *v = a | 
5d60: 62 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  b;.    return 2;
5d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 33  .  }..  /* The 3
5d80: 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20  -byte case */.  
5d90: 70 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34  p++;.  a = a<<14
5da0: 3b 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f  ;.  a |= *p;.  /
5db0: 2a 20 61 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32  * a: p0<<14 | p2
5dc0: 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20   (unmasked) */. 
5dd0: 20 69 66 20 28 21 28 61 26 30 78 38 30 29 29 0a   if (!(a&0x80)).
5de0: 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65    {.    /* Value
5df0: 73 20 62 65 74 77 65 65 6e 20 31 36 33 38 34 20  s between 16384 
5e00: 61 6e 64 20 32 30 39 37 31 35 31 20 2a 2f 0a 20  and 2097151 */. 
5e10: 20 20 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31     a &= (0x7f<<1
5e20: 34 29 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 62  4)|(0x7f);.    b
5e30: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 62 20   &= 0x7f;.    b 
5e40: 3d 20 62 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d  = b<<7;.    *v =
5e50: 20 61 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75   a | b;.    retu
5e60: 72 6e 20 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 3;.  }..  /* 
5e70: 41 20 33 32 2d 62 69 74 20 76 61 72 69 6e 74 20  A 32-bit varint 
5e80: 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
5e90: 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f   size informatio
5ea0: 6e 20 69 6e 20 62 74 72 65 65 73 2e 0a 20 20 2a  n in btrees..  *
5eb0: 2a 20 4f 62 6a 65 63 74 73 20 61 72 65 20 72 61  * Objects are ra
5ec0: 72 65 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  rely larger than
5ed0: 20 32 4d 69 42 20 6c 69 6d 69 74 20 6f 66 20 61   2MiB limit of a
5ee0: 20 33 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a   3-byte varint..
5ef0: 20 20 2a 2a 20 41 20 33 2d 62 79 74 65 20 76 61    ** A 3-byte va
5f00: 72 69 6e 74 20 69 73 20 73 75 66 66 69 63 69 65  rint is sufficie
5f10: 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  nt, for example,
5f20: 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
5f30: 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 61 20 31 30  ize.  ** of a 10
5f40: 34 38 35 36 39 2d 62 79 74 65 20 42 4c 4f 42 20  48569-byte BLOB 
5f50: 6f 72 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2a 0a  or string..  **.
5f60: 20 20 2a 2a 20 57 65 20 6f 6e 6c 79 20 75 6e 72    ** We only unr
5f70: 6f 6c 6c 20 74 68 65 20 66 69 72 73 74 20 31 2d  oll the first 1-
5f80: 2c 20 32 2d 2c 20 61 6e 64 20 33 2d 20 62 79 74  , 2-, and 3- byt
5f90: 65 20 63 61 73 65 73 2e 20 20 54 68 65 20 76 65  e cases.  The ve
5fa0: 72 79 0a 20 20 2a 2a 20 72 61 72 65 20 6c 61 72  ry.  ** rare lar
5fb0: 67 65 72 20 63 61 73 65 73 20 63 61 6e 20 62 65  ger cases can be
5fc0: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
5fd0: 73 6c 6f 77 65 72 20 36 34 2d 62 69 74 20 76 61  slower 64-bit va
5fe0: 72 69 6e 74 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  rint.  ** routin
5ff0: 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  e..  */.  {.    
6000: 75 36 34 20 76 36 34 3b 0a 20 20 20 20 75 38 20  u64 v64;.    u8 
6010: 6e 3b 0a 20 20 20 20 70 20 2d 3d 20 32 3b 0a 20  n;.    p -= 2;. 
6020: 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 47 65     n = sqlite3Ge
6030: 74 56 61 72 69 6e 74 28 70 2c 20 26 76 36 34 29  tVarint(p, &v64)
6040: 3b 0a 20 20 20 20 2a 76 20 3d 20 28 75 33 32 29  ;.    *v = (u32)
6050: 76 36 34 3b 0a 20 20 20 20 61 73 73 65 72 74 28  v64;.    assert(
6060: 20 6e 3e 33 20 26 26 20 6e 3c 3d 39 20 29 3b 0a   n>3 && n<=9 );.
6070: 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20      return n;.  
6080: 7d 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  }.}..int sqlite3
6090: 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e  Fts5GetVarintLen
60a0: 28 75 33 32 20 69 56 61 6c 29 7b 0a 20 20 69 66  (u32 iVal){.  if
60b0: 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 37 20 29  ( iVal<(1 << 7 )
60c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
60d0: 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 31 34  f( iVal<(1 << 14
60e0: 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
60f0: 69 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32  if( iVal<(1 << 2
6100: 31 29 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  1) ) return 3;. 
6110: 20 69 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20   if( iVal<(1 << 
6120: 32 38 29 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  28) ) return 4;.
6130: 20 20 72 65 74 75 72 6e 20 35 3b 0a 7d 0a 0a 2f    return 5;.}../
6140: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
6150: 64 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65  d return a buffe
6160: 72 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65  r at least nByte
6170: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
6180: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
6190: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
61a0: 65 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ered, return NUL
61b0: 4c 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72  L and set the er
61c0: 72 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74  ror code in.** t
61d0: 68 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  he Fts5Index han
61e0: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
61f0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
6200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6210: 20 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28   *fts5IdxMalloc(
6220: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
6230: 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64  t nByte){.  void
6240: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
6250: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
6260: 4f 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  OK ){.    pRet =
6270: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
6280: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
6290: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pRet==0 ){.     
62a0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
62b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
62c0: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
62d0: 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  Ret, 0, nByte);.
62e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
62f0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
6300: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  * Compare the co
6310: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c  ntents of the pL
6320: 65 66 74 20 62 75 66 66 65 72 20 77 69 74 68 20  eft buffer with 
6330: 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68  the pRight/nRigh
6340: 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65  t blob..**.** Re
6350: 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66  turn -ve if pLef
6360: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
6370: 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74  n pRight, 0 if t
6380: 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72  hey are equal or
6390: 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68  .** +ve if pRigh
63a0: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
63b0: 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65  n pLeft. In othe
63c0: 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  r words:.**.**  
63d0: 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20     res = *pLeft 
63e0: 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61  - *pRight.*/.sta
63f0: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
6400: 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20  erCompareBlob(. 
6410: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65   Fts5Buffer *pLe
6420: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
6430: 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69   /* Left hand si
6440: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
6450: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
6460: 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67  pRight, int nRig
6470: 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68  ht    /* Right h
6480: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
6490: 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  arison */.){.  i
64a0: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c  nt nCmp = MIN(pL
64b0: 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b  eft->n, nRight);
64c0: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
64d0: 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52  cmp(pLeft->p, pR
64e0: 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  ight, nCmp);.  r
64f0: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
6500: 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67  (pLeft->n - nRig
6510: 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 2f  ht) : res);.}../
6520: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
6530: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
6540: 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69   two buffers usi
6550: 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20  ng memcmp(). If 
6560: 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73  one buffer.** is
6570: 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
6580: 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f   other, it is co
6590: 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73  nsidered the les
65a0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ser..**.** Retur
65b0: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
65c0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
65d0: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
65e0: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
65f0: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
6600: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
6610: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
6620: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
6630: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
6640: 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63  pRight.*/.static
6650: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
6660: 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65  ompare(Fts5Buffe
6670: 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75  r *pLeft, Fts5Bu
6680: 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  ffer *pRight){. 
6690: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
66a0: 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74  pLeft->n, pRight
66b0: 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ->n);.  int res 
66c0: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e  = memcmp(pLeft->
66d0: 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43  p, pRight->p, nC
66e0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
66f0: 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e  es==0 ? (pLeft->
6700: 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a  n - pRight->n) :
6710: 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   res);.}.../*.**
6720: 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d   Close the read-
6730: 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65  only blob handle
6740: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
6750: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6760: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
6770: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
6780: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20   if( p->pReader 
6790: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
67a0: 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20 70  lob *pReader = p
67b0: 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 70  ->pReader;.    p
67c0: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
67d0: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
67e0: 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b 0a  close(pReader);.
67f0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
6800: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
6810: 52 65 61 64 4f 72 42 75 66 66 65 72 28 0a 20 20  ReadOrBuffer(.  
6820: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
6830: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
6840: 66 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64  f, .  i64 iRowid
6850: 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  .){.  Fts5Data *
6860: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
6870: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
6880: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
6890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
68a0: 20 30 0a 46 74 73 35 42 75 66 66 65 72 20 62 75   0.Fts5Buffer bu
68b0: 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 66 74 73  f = {0,0,0};.fts
68c0: 35 44 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c  5DebugRowid(&rc,
68d0: 20 26 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a   &buf, iRowid);.
68e0: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
68f0: 22 72 65 61 64 3a 20 25 73 5c 6e 22 2c 20 62 75  "read: %s\n", bu
6900: 66 2e 70 29 3b 0a 66 66 6c 75 73 68 28 73 74 64  f.p);.fflush(std
6910: 6f 75 74 29 3b 0a 73 71 6c 69 74 65 33 5f 66 72  out);.sqlite3_fr
6920: 65 65 28 62 75 66 2e 70 29 3b 0a 23 65 6e 64 69  ee(buf.p);.#endi
6930: 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65  f.    if( p->pRe
6940: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ader ){.      /*
6950: 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72   This call may r
6960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
6970: 52 54 20 69 66 20 74 68 65 72 65 20 68 61 73 20  RT if there has 
6980: 62 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  been a savepoint
6990: 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
69a0: 63 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ck since it was 
69b0: 6c 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68  last used. In th
69c0: 69 73 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c  is case a new bl
69d0: 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20  ob handle.      
69e0: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ** is required. 
69f0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
6a00: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
6a10: 65 6e 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 69  en(p->pReader, i
6a20: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
6a30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  ( rc==SQLITE_ABO
6a40: 52 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  RT ){.        ft
6a50: 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29  s5CloseReader(p)
6a60: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
6a70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6a80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
6a90: 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  If the blob hand
6aa0: 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  le is not yet op
6ab0: 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65 65  en, open and see
6ac0: 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  k it. Otherwise,
6ad0: 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   use.    ** the 
6ae0: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41 50  blob_reopen() AP
6af0: 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65 20  I to reseek the 
6b00: 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68 61  existing blob ha
6b10: 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ndle.  */.    if
6b20: 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
6b30: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e  ){.      Fts5Con
6b40: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
6b50: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20  ->pConfig;.     
6b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
6b70: 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d  ob_open(pConfig-
6b80: 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  >db, .          
6b90: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d  pConfig->zDb, p-
6ba0: 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63  >zDataTbl, "bloc
6bb0: 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26  k", iRowid, 0, &
6bc0: 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20  p->pReader.     
6bd0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
6be0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6bf0: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f   ){.      u8 *aO
6c00: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
6c10: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c        /* Read bl
6c20: 6f 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  ob data into thi
6c30: 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  s buffer */.    
6c40: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71    int nByte = sq
6c50: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
6c60: 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20  (p->pReader);.  
6c70: 20 20 20 20 69 66 28 20 70 42 75 66 20 29 7b 0a      if( pBuf ){.
6c80: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
6c90: 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20  erZero(pBuf);.  
6ca0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
6cb0: 47 72 6f 77 28 26 72 63 2c 20 70 42 75 66 2c 20  Grow(&rc, pBuf, 
6cc0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
6cd0: 61 4f 75 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a  aOut = pBuf->p;.
6ce0: 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
6cf0: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  = nByte;.      }
6d00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
6d10: 74 20 6e 53 70 61 63 65 20 3d 20 6e 42 79 74 65  t nSpace = nByte
6d20: 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52   + FTS5_DATA_ZER
6d30: 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20  O_PADDING;.     
6d40: 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 44     pRet = (Fts5D
6d50: 61 74 61 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ata*)sqlite3Fts5
6d60: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
6d70: 6e 53 70 61 63 65 2b 73 69 7a 65 6f 66 28 46 74  nSpace+sizeof(Ft
6d80: 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20  s5Data));.      
6d90: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
6da0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 20          pRet->n 
6db0: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  = nByte;.       
6dc0: 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e     aOut = pRet->
6dd0: 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31  p = (u8*)&pRet[1
6de0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  ];.          pRe
6df0: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
6e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
6e10: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6e20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6e30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6e40: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65  blob_read(p->pRe
6e50: 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74  ader, aOut, nByt
6e60: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
6e70: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
6e80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6e90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ea0: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
6eb0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
6ec0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20      }.    p->rc 
6ed0: 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = rc;.    p->nRe
6ee0: 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ad++;.  }..  ret
6ef0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
6f00: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72 65  ** Retrieve a re
6f10: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  cord from the %_
6f20: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
6f30: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6f40: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
6f50: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
6f60: 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20  ror left in the 
6f70: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62  .** Fts5Index ob
6f80: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
6f90: 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61  Fts5Data *fts5Da
6fa0: 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  taRead(Fts5Index
6fb0: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29   *p, i64 iRowid)
6fc0: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52  {.  Fts5Data *pR
6fd0: 65 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  et = fts5DataRea
6fe0: 64 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c 20  dOrBuffer(p, 0, 
6ff0: 69 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72  iRowid);.  asser
7000: 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70  t( (pRet==0)==(p
7010: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc!=SQLITE_OK)
7020: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65   );.  return pRe
7030: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  t;.}../*.** Read
7040: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
7050: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
7060: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
7070: 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a  supplied as the.
7080: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
7090: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
70a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
70b0: 20 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69   error is left i
70c0: 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  n the Fts5Index 
70d0: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a  object. If an.**
70e0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
70f0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
7100: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
7110: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
7120: 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  a .** no-op..*/.
7130: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7140: 44 61 74 61 42 75 66 66 65 72 28 46 74 73 35 49  DataBuffer(Fts5I
7150: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66  ndex *p, Fts5Buf
7160: 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69  fer *pBuf, i64 i
7170: 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64 29  Rowid){.  (void)
7180: 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
7190: 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69 52  ffer(p, pBuf, iR
71a0: 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  owid);.}../*.** 
71b0: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
71c0: 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f  nce to data reco
71d0: 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  rd returned by a
71e0: 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
71f0: 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61  o.** fts5DataRea
7200: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
7210: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65  oid fts5DataRele
7220: 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44  ase(Fts5Data *pD
7230: 61 74 61 29 7b 0a 20 20 69 66 28 20 70 44 61 74  ata){.  if( pDat
7240: 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  a ){.    assert(
7250: 20 70 44 61 74 61 2d 3e 6e 52 65 66 3e 30 20 29   pData->nRef>0 )
7260: 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 52 65  ;.    pData->nRe
7270: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 61  f--;.    if( pDa
7280: 74 61 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71  ta->nRef==0 ) sq
7290: 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
72a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
72b0: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
72c0: 66 65 72 65 6e 63 65 28 46 74 73 35 44 61 74 61  ference(Fts5Data
72d0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 70 44 61 74   *pData){.  pDat
72e0: 61 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a  a->nRef++;.}../*
72f0: 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45  .** INSERT OR RE
7300: 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20 69  PLACE a record i
7310: 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74  nto the %_data t
7320: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
7330: 76 6f 69 64 20 66 74 73 35 44 61 74 61 57 72 69  void fts5DataWri
7340: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
7350: 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e   i64 iRowid, con
7360: 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
7370: 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20  t nData){.  if( 
7380: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
7390: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
73a0: 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20  ( p->pWriter==0 
73b0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
73c0: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
73d0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
73e0: 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  fig;.    char *z
73f0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
7400: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
7410: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
7420: 27 2e 25 51 28 69 64 2c 20 62 6c 6f 63 6b 29 20  '.%Q(id, block) 
7430: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 70 43  VALUES(?,?)", pC
7440: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
7450: 44 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20  DataTbl.    );. 
7460: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
7470: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
7480: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
7490: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
74a0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
74b0: 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  _v2(pConfig->db,
74c0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70   zSql, -1, &p->p
74d0: 57 72 69 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Writer, 0);.    
74e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
74f0: 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
7500: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7510: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  K ){.      p->rc
7520: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
7530: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
7540: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
7550: 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c  nt64(p->pWriter,
7560: 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73   1, iRowid);.  s
7570: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
7580: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20  (p->pWriter, 2, 
7590: 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51  pData, nData, SQ
75a0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
75b0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
75c0: 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72  pWriter);.  p->r
75d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
75e0: 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d  t(p->pWriter);.}
75f0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
7600: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  the following SQ
7610: 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c  L:.**.**     DEL
7620: 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20  ETE FROM %_data 
7630: 57 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e  WHERE id BETWEEN
7640: 20 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c   $iFirst AND $iL
7650: 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ast.*/.static vo
7660: 69 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  id fts5DataDelet
7670: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
7680: 69 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20  i64 iFirst, i64 
7690: 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d  iLast){.  if( p-
76a0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
76b0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
76c0: 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29  p->pDeleter==0 )
76d0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
76e0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
76f0: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
7700: 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  ig;.    char *zS
7710: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
7720: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 44  intf(.        "D
7730: 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e  ELETE FROM '%q'.
7740: 25 51 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41  %Q WHERE id>=? A
7750: 4e 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66  ND id<=?", pConf
7760: 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74  ig->zDb, p->zDat
7770: 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  aTbl.    );.    
7780: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
7790: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
77a0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
77b0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
77c0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
77d0: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53  (pConfig->db, zS
77e0: 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c  ql, -1, &p->pDel
77f0: 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  eter, 0);.      
7800: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
7810: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
7820: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7830: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
7840: 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
7850: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
7860: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
7870: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
7880: 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71  1, iFirst);.  sq
7890: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
78a0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c  (p->pDeleter, 2,
78b0: 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74   iLast);.  sqlit
78c0: 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65  e3_step(p->pDele
78d0: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
78e0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
78f0: 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f  >pDeleter);.}../
7900: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 73  *.** Close the s
7910: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 68 61 6e 64  qlite3_blob hand
7920: 6c 65 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  le used to read 
7930: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
7940: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
7950: 2a 20 41 6e 64 20 64 69 73 63 61 72 64 20 61 6e  * And discard an
7960: 79 20 63 61 63 68 65 64 20 72 65 61 64 73 2e 20  y cached reads. 
7970: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
7980: 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 65   called at the e
7990: 6e 64 20 6f 66 0a 2a 2a 20 61 20 72 65 61 64 20  nd of.** a read 
79a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 77  transaction or w
79b0: 68 65 6e 20 61 6e 79 20 73 75 62 2d 74 72 61 6e  hen any sub-tran
79c0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
79d0: 64 20 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20 30  d back..*/.#if 0
79e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
79f0: 35 44 61 74 61 52 65 73 65 74 28 46 74 73 35 49  5DataReset(Fts5I
7a00: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20  ndex *p){.  if( 
7a10: 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20  p->pReader ){.  
7a20: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63    sqlite3_blob_c
7a30: 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64 65 72 29  lose(p->pReader)
7a40: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72  ;.    p->pReader
7a50: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
7a60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  if../*.** Remove
7a70: 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61 73 73   all records ass
7a80: 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 65 67  ociated with seg
7a90: 6d 65 6e 74 20 69 53 65 67 69 64 20 69 6e 20 69  ment iSegid in i
7aa0: 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2f 0a 73 74  ndex iIdx..*/.st
7ab0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
7ac0: 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
7ad0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
7ae0: 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65 67  t iIdx, int iSeg
7af0: 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73  id){.  i64 iFirs
7b00: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
7b10: 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65  _ROWID(iIdx, iSe
7b20: 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69 36  gid, 0, 0);.  i6
7b30: 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f 53  4 iLast = FTS5_S
7b40: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
7b50: 78 2c 20 69 53 65 67 69 64 2b 31 2c 20 30 2c 20  x, iSegid+1, 0, 
7b60: 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74 61  0)-1;.  fts5Data
7b70: 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73 74  Delete(p, iFirst
7b80: 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , iLast);.}../*.
7b90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
7ba0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73  erence to an Fts
7bb0: 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
7bc0: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  t returned by an
7bd0: 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c   earlier .** cal
7be0: 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75  l to fts5Structu
7bf0: 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35  reRead() or fts5
7c00: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7c10: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
7c20: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  d fts5StructureR
7c30: 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63  elease(Fts5Struc
7c40: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
7c50: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
7c60: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
7c70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75  for(i=0; i<pStru
7c80: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  ct->nLevel; i++)
7c90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7ca0: 66 72 65 65 28 70 53 74 72 75 63 74 2d 3e 61 4c  free(pStruct->aL
7cb0: 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a 20  evel[i].aSeg);. 
7cc0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7cd0: 5f 66 72 65 65 28 70 53 74 72 75 63 74 29 3b 0a  _free(pStruct);.
7ce0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
7cf0: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74  erialize and ret
7d00: 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  urn the structur
7d10: 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74  e record current
7d20: 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65 72  ly stored in ser
7d30: 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20  ialized.** form 
7d40: 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70 44  within buffer pD
7d50: 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a  ata/nData..**.**
7d60: 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75   The Fts5Structu
7d70: 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20  re.aLevel[] and 
7d80: 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75  each Fts5Structu
7d90: 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61  reLevel.aSeg[] a
7da0: 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72  rray.** are over
7db0: 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f 6e  -allocated by on
7dc0: 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c 6c  e slot. This all
7dd0: 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75 72  ows the structur
7de0: 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f  e contents.** to
7df0: 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20   be more easily 
7e00: 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  edited..**.** If
7e10: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7e20: 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20  , *ppOut is set 
7e30: 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53  to NULL and an S
7e40: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
7e50: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  .** returned. Ot
7e60: 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74 20  herwise, *ppOut 
7e70: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
7e80: 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
7e90: 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  t and.** SQLITE_
7ea0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
7eb0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
7ec0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 0a  tructureDecode(.
7ed0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74    const u8 *pDat
7ee0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
7ef0: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
7f00: 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  aining serialize
7f10: 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  d structure */. 
7f20: 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20   int nData,     
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
7f50: 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74 65  er pData in byte
7f60: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  s */.  int *piCo
7f70: 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20 20  okie,           
7f80: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
7f90: 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 76  uration cookie v
7fa0: 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53 74  alue */.  Fts5St
7fb0: 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74 20  ructure **ppOut 
7fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
7fd0: 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20 6f  : Deserialized o
7fe0: 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bject */.){.  in
7ff0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8000: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  ;.  int i = 0;. 
8010: 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74   int iLvl;.  int
8020: 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69   nLevel = 0;.  i
8030: 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b  nt nSegment = 0;
8040: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
8070: 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
8080: 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46 74   at pRet */.  Ft
8090: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65  s5Structure *pRe
80a0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
80b0: 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   Structure objec
80c0: 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  t to return */..
80d0: 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63 6f    /* Grab the co
80e0: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
80f0: 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20 2a  if( piCookie ) *
8100: 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74  piCookie = sqlit
8110: 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61 74  e3Fts5Get32(pDat
8120: 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20 20  a);.  i = 4;..  
8130: 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61  /* Read the tota
8140: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  l number of leve
8150: 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20  ls and segments 
8160: 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
8170: 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63  f the.  ** struc
8180: 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f  ture record.  */
8190: 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56  .  i += fts5GetV
81a0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
81b0: 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20  ], nLevel);.  i 
81c0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
81d0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53  32(&pData[i], nS
81e0: 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65  egment);.  nByte
81f0: 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f   = (.      sizeo
8200: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
8210: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
8220: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
8230: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
8240: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8250: 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e  ctureLevel) * (n
8260: 4c 65 76 65 6c 29 20 20 20 20 20 20 2f 2a 20 61  Level)      /* a
8270: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
8280: 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28  .  );.  pRet = (
8290: 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73  Fts5Structure*)s
82a0: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
82b0: 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29  Zero(&rc, nByte)
82c0: 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  ;..  if( pRet ){
82d0: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65  .    pRet->nLeve
82e0: 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20  l = nLevel;.    
82f0: 69 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  i += sqlite3GetV
8300: 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c  arint(&pData[i],
8310: 20 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f   &pRet->nWriteCo
8320: 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72  unter);..    for
8330: 28 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c  (iLvl=0; rc==SQL
8340: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e  ITE_OK && iLvl<n
8350: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
8360: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
8370: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
8380: 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69   &pRet->aLevel[i
8390: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Lvl];.      int 
83a0: 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69 6e  nTotal;.      in
83b0: 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20 69  t iSeg;..      i
83c0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
83d0: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
83e0: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20  Lvl->nMerge);.  
83f0: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8400: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8410: 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20  i], nTotal);.   
8420: 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61     assert( nTota
8430: 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  l>=pLvl->nMerge 
8440: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61  );.      pLvl->a
8450: 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
8460: 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
8470: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
8480: 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  ro(&rc, .       
8490: 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65     nTotal * size
84a0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
84b0: 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 29  Segment).      )
84c0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
84d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
84e0: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67        pLvl->nSeg
84f0: 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20   = nTotal;.     
8500: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
8510: 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65 67  Seg<nTotal; iSeg
8520: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
8530: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
8540: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
8550: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8560: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20  iSegid);.       
8570: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
8580: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
8590: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
85a0: 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20  eg].nHeight);.  
85b0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
85c0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
85d0: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
85e0: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
85f0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  st);.          i
8600: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
8610: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
8620: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8630: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20  pgnoLast);.     
8640: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8650: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  {.        fts5St
8660: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
8670: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
8680: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
8690: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
86a0: 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65  Out = pRet;.  re
86b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
86c0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
86d0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64   fts5StructureAd
86e0: 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c  dLevel(int *pRc,
86f0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8700: 2a 70 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66  *ppStruct){.  if
8710: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
8720: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
8730: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
8740: 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
8750: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53   int nLevel = pS
8760: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  truct->nLevel;. 
8770: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
8780: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
8790: 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b  Fts5Structure) +
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87b0: 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74    /* Main struct
87c0: 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ure */.        s
87d0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
87e0: 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65  ureLevel) * (nLe
87f0: 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65  vel+1)  /* aLeve
8800: 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  l[] array */.   
8810: 20 29 3b 0a 0a 20 20 20 20 70 53 74 72 75 63 74   );..    pStruct
8820: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
8830: 6f 63 28 70 53 74 72 75 63 74 2c 20 6e 42 79 74  oc(pStruct, nByt
8840: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  e);.    if( pStr
8850: 75 63 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  uct ){.      mem
8860: 73 65 74 28 26 70 53 74 72 75 63 74 2d 3e 61 4c  set(&pStruct->aL
8870: 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c  evel[nLevel], 0,
8880: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8890: 63 74 75 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  ctureLevel));.  
88a0: 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65      pStruct->nLe
88b0: 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70  vel++;.      *pp
88c0: 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
88d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
88e0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
88f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
8900: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e  }.}../*.** Exten
8910: 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20  d level iLvl so 
8920: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 72 6f  that there is ro
8930: 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  om for at least 
8940: 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73  nExtra more.** s
8950: 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  egments..*/.stat
8960: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
8970: 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
8980: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
8990: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
89a0: 70 53 74 72 75 63 74 2c 20 0a 20 20 69 6e 74 20  pStruct, .  int 
89b0: 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78  iLvl, .  int nEx
89c0: 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73  tra, .  int bIns
89d0: 65 72 74 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52  ert.){.  if( *pR
89e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
89f0: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
8a00: 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
8a10: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8a20: 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53  iLvl];.    Fts5S
8a30: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
8a40: 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *aNew;.    int n
8a50: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65  Byte;..    nByte
8a60: 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b   = (pLvl->nSeg +
8a70: 20 6e 45 78 74 72 61 29 20 2a 20 73 69 7a 65 6f   nExtra) * sizeo
8a80: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8a90: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65  egment);.    aNe
8aa0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
8ab0: 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20  loc(pLvl->aSeg, 
8ac0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
8ad0: 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  aNew ){.      if
8ae0: 28 20 62 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a  ( bInsert==0 ){.
8af0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
8b00: 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d  aNew[pLvl->nSeg]
8b10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
8b20: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8b30: 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  ) * nExtra);.   
8b40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b50: 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c    int nMove = pL
8b60: 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f  vl->nSeg * sizeo
8b70: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8b80: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  egment);.       
8b90: 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e   memmove(&aNew[n
8ba0: 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d  Extra], aNew, nM
8bb0: 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ove);.        me
8bc0: 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20 73 69  mset(aNew, 0, si
8bd0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
8be0: 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78  reSegment) * nEx
8bf0: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra);.      }.  
8c00: 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
8c10: 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65   aNew;.    }else
8c20: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
8c30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8c40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8c50: 52 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a  Read, deserializ
8c60: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
8c70: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
8c80: 64 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78  d for index iIdx
8c90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
8ca0: 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c  Structure.aLevel
8cb0: 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35  [] and each Fts5
8cc0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61  StructureLevel.a
8cd0: 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  Seg[] array.** a
8ce0: 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65  re over-allocate
8cf0: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66  d as described f
8d00: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  or function fts5
8d10: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
8d20: 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a  ) .** above..**.
8d30: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
8d40: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
8d50: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
8d60: 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69  rror code left i
8d70: 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64  n the.** Fts5Ind
8d80: 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e  ex handle. If an
8d90: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
8da0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
8db0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
8dc0: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  * is called, it 
8dd0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
8de0: 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74  tatic Fts5Struct
8df0: 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75  ure *fts5Structu
8e00: 72 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  reRead(Fts5Index
8e10: 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 29 7b 0a   *p, int iIdx){.
8e20: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
8e30: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
8e40: 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ig;.  Fts5Struct
8e50: 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20  ure *pRet = 0;  
8e60: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
8e70: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46  to return */.  F
8e80: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20  ts5Data *pData; 
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ea0: 2a 20 25 5f 64 61 74 61 20 65 6e 74 72 79 20 63  * %_data entry c
8eb0: 6f 6e 74 61 69 6e 69 6e 67 20 73 74 72 75 63 74  ontaining struct
8ec0: 75 72 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ure record */.  
8ed0: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ef0: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8f00: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 0a 20 20 61 73   cookie */..  as
8f10: 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43 6f 6e  sert( iIdx<=pCon
8f20: 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 3b 0a  fig->nPrefix );.
8f30: 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
8f40: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
8f50: 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69  TRUCTURE_ROWID(i
8f60: 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 70 44  Idx));.  if( !pD
8f70: 61 74 61 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ata ) return 0;.
8f80: 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74    p->rc = fts5St
8f90: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44  ructureDecode(pD
8fa0: 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e  ata->p, pData->n
8fb0: 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65  , &iCookie, &pRe
8fc0: 74 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  t);..  if( p->rc
8fd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
8fe0: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21  Config->iCookie!
8ff0: 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20  =iCookie ){.    
9000: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
9010: 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43  ts5ConfigLoad(pC
9020: 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b  onfig, iCookie);
9030: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
9040: 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
9050: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
9060: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
9070: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
9080: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52  se(pRet);.    pR
9090: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  et = 0;.  }.  re
90a0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
90b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
90c0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
90d0: 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78  egments in index
90e0: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
90f0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
9100: 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43  t fts5StructureC
9110: 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73  ountSegments(Fts
9120: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
9130: 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  uct){.  int nSeg
9140: 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ment = 0;       
9150: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
9160: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
9170: 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  nts */.  if( pSt
9180: 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
9190: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
91a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
91b0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
91c0: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
91d0: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
91e0: 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
91f0: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
9200: 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20      nSegment += 
9210: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9220: 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20  iLvl].nSeg;.    
9230: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9240: 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  nSegment;.}../*.
9250: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64  ** Serialize and
9260: 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75   store the "stru
9270: 63 74 75 72 65 22 20 72 65 63 6f 72 64 20 66 6f  cture" record fo
9280: 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2a  r index iIdx..**
9290: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
92a0: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
92b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74   error code in t
92c0: 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a  he Fts5Index obj
92d0: 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  ect. If an.** er
92e0: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
92f0: 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
9300: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
9310: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
9320: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
9330: 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20  Write(Fts5Index 
9340: 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74  *p, int iIdx, Ft
9350: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9360: 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  ruct){.  if( p->
9370: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9380: 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  .    int nSegmen
9390: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
93a0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
93b0: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
93c0: 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
93d0: 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
93e0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
93f0: 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72   serialize recor
9400: 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e  d into */.    in
9410: 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
9420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
9430: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
9440: 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
9450: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  .    int iCookie
9460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9470: 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c     /* Cookie val
9480: 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a  ue to store */..
9490: 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 3d 20 66      nSegment = f
94a0: 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
94b0: 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
94c0: 74 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  t);.    memset(&
94d0: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
94e0: 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
94f0: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
9500: 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72  current configur
9510: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
9520: 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d      iCookie = p-
9530: 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69  >pConfig->iCooki
9540: 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b  e;.    if( iCook
9550: 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d  ie<0 ) iCookie =
9560: 20 30 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66   0;.    fts5Buff
9570: 65 72 41 70 70 65 6e 64 33 32 28 26 70 2d 3e 72  erAppend32(&p->r
9580: 63 2c 20 26 62 75 66 2c 20 69 43 6f 6f 6b 69 65  c, &buf, iCookie
9590: 29 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66  );..    fts5Buff
95a0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
95b0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 74  p->rc, &buf, pSt
95c0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20  ruct->nLevel);. 
95d0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
95e0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
95f0: 2c 20 26 62 75 66 2c 20 6e 53 65 67 6d 65 6e 74  , &buf, nSegment
9600: 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
9610: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9620: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36 34  ->rc, &buf, (i64
9630: 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65  )pStruct->nWrite
9640: 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66  Counter);..    f
9650: 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
9660: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9670: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
9680: 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20  int iSeg;       
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
96a0: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
96b0: 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
96c0: 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53  s */.      Fts5S
96d0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
96e0: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
96f0: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
9700: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9710: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9720: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
9730: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74  Merge);.      ft
9740: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9750: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9760: 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a  f, pLvl->nSeg);.
9770: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
9780: 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c  vl->nMerge<=pLvl
9790: 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20  ->nSeg );..     
97a0: 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
97b0: 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
97c0: 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  eg++){.        f
97d0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
97e0: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
97f0: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
9800: 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  Seg].iSegid);.  
9810: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9820: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9830: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9840: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69  >aSeg[iSeg].nHei
9850: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ght);.        ft
9860: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9870: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9880: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9890: 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg].pgnoFirst);.
98a0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
98b0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
98c0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
98d0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
98e0: 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d  noLast);.      }
98f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
9900: 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
9910: 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
9920: 44 28 69 49 64 78 29 2c 20 62 75 66 2e 70 2c 20  D(iIdx), buf.p, 
9930: 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35  buf.n);.    fts5
9940: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
9950: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73  ;.  }.}..#if 0.s
9960: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
9970: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e  ebugStructure(in
9980: 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46  t*,Fts5Buffer*,F
9990: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a  ts5Structure*);.
99a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
99b0: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63  PrintStructure(c
99c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74  onst char *zCapt
99d0: 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75  ion, Fts5Structu
99e0: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
99f0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9a00: 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  OK;.  Fts5Buffer
9a10: 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
9a20: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  buf, 0, sizeof(b
9a30: 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75  uf));.  fts5Debu
9a40: 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  gStructure(&rc, 
9a50: 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a  &buf, pStruct);.
9a60: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
9a70: 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43  , "%s: %s\n", zC
9a80: 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a  aption, buf.p);.
9a90: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
9aa0: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
9ab0: 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73  ee(&buf);.}.#els
9ac0: 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50  e.# define fts5P
9ad0: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c  rintStructure(x,
9ae0: 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  y).#endif..stati
9af0: 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e  c int fts5Segmen
9b00: 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74  tSize(Fts5Struct
9b10: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
9b20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20  ){.  return 1 + 
9b30: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
9b40: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
9b50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9b60: 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65  n a copy of inde
9b70: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
9b80: 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f  uct. Except, pro
9b90: 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a  mote as many .**
9ba0: 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73   segments as pos
9bb0: 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69  sible to level i
9bc0: 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f  Promote. If an O
9bd0: 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  OM occurs, NULL 
9be0: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
9bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9c00: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9c10: 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e  moteTo(.  Fts5In
9c20: 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50  dex *p,.  int iP
9c30: 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a  romote,.  int sz
9c40: 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53  Promote,.  Fts5S
9c50: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
9c60: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69  t.){.  int il, i
9c70: 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  s;.  Fts5Structu
9c80: 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20  reLevel *pOut = 
9c90: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
9ca0: 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69  [iPromote];..  i
9cb0: 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d  f( pOut->nMerge=
9cc0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c  =0 ){.    for(il
9cd0: 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c  =iPromote+1; il<
9ce0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9cf0: 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74   il++){.      Ft
9d00: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9d10: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
9d20: 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20  t->aLevel[il];. 
9d30: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
9d40: 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a  Merge ) return;.
9d50: 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76        for(is=pLv
9d60: 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30  l->nSeg-1; is>=0
9d70: 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20  ; is--){.       
9d80: 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65   int sz = fts5Se
9d90: 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d  gmentSize(&pLvl-
9da0: 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20  >aSeg[is]);.    
9db0: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f      if( sz>szPro
9dc0: 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  mote ) return;. 
9dd0: 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
9de0: 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
9df0: 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
9e00: 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29   iPromote, 1, 1)
9e10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
9e20: 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
9e30: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
9e40: 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  t->aSeg, &pLvl->
9e50: 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66  aSeg[is], sizeof
9e60: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
9e70: 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20  gment));.       
9e80: 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20   pOut->nSeg++;. 
9e90: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
9ea0: 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
9eb0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9ec0: 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61  A new segment ha
9ed0: 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74  s just been writ
9ee0: 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76  ten to level iLv
9ef0: 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  l of index struc
9f00: 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e  ture.** pStruct.
9f10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
9f20: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79  etermines if any
9f30: 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64   segments should
9f40: 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20   be promoted.** 
9f50: 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67  as a result. Seg
9f60: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9f70: 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ed in two scenar
9f80: 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
9f90: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
9fa0: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73  ust written is s
9fb0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20  maller than one 
9fc0: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
9fd0: 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20  .**      within 
9fe0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70  the previous pop
9ff0: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74  ulated level, it
a000: 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20   is promoted to 
a010: 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20  the previous.** 
a020: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c       populated l
a030: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29  evel..**.**   b)
a040: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
a050: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
a060: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
a070: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
a080: 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65  n.**      the ne
a090: 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76  xt populated lev
a0a0: 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65  el, then that se
a0b0: 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f  gment, and any o
a0c0: 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  ther adjacent.**
a0d0: 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74        segments t
a0e0: 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61  hat are also sma
a0f0: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ller than the on
a100: 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  e just written, 
a110: 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f  are .**      pro
a120: 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  moted. .**.** If
a130: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
a140: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
a150: 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  ed, the structur
a160: 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61  e object is upda
a170: 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63  ted.** to reflec
a180: 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  t this..*/.stati
a190: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
a1a0: 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46  turePromote(.  F
a1b0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a1d0: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
a1e0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
a1f0: 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
a200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a210: 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75  dex level just u
a220: 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35  pdated */.  Fts5
a230: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
a240: 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ct          /* I
a250: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
a260: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
a270: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a280: 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20     int iTst;.   
a290: 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20   int iPromote = 
a2a0: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72  -1;.    int szPr
a2b0: 6f 6d 6f 74 65 3b 20 20 20 20 20 20 20 20 20 20  omote;          
a2c0: 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65        /* Promote
a2d0: 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73   anything this s
a2e0: 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a  ize or smaller *
a2f0: 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  /.    Fts5Struct
a300: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
a310: 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a  ;   /* Segment j
a320: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ust written */. 
a330: 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20     int szSeg;   
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d   /* Size of segm
a360: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
a370: 20 2a 2f 0a 0a 0a 20 20 20 20 70 53 65 67 20 3d   */...    pSeg =
a380: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
a390: 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74  l[iLvl].aSeg[pSt
a3a0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
a3b0: 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20  l].nSeg-1];.    
a3c0: 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65  szSeg = (1 + pSe
a3d0: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53  g->pgnoLast - pS
a3e0: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg->pgnoFirst);.
a3f0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
a400: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  r condition (a) 
a410: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d  */.    for(iTst=
a420: 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20  iLvl-1; iTst>=0 
a430: 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
a440: 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30  el[iTst].nSeg==0
a450: 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69  ; iTst--);.    i
a460: 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20  f( iTst>=0 ){.  
a470: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
a480: 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a   int szMax = 0;.
a490: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
a4a0: 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d  ureLevel *pTst =
a4b0: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
a4c0: 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 61  l[iTst];.      a
a4d0: 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65  ssert( pTst->nMe
a4e0: 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rge==0 );.      
a4f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d  for(i=0; i<pTst-
a500: 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
a510: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 54       int sz = pT
a520: 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f  st->aSeg[i].pgno
a530: 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61 53 65  Last - pTst->aSe
a540: 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b  g[i].pgnoFirst +
a550: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
a560: 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78  sz>szMax ) szMax
a570: 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20   = sz;.      }. 
a580: 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d       if( szMax>=
a590: 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20  szSeg ){.       
a5a0: 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61   /* Condition (a
a5b0: 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f  ) is true. Promo
a5c0: 74 65 20 74 68 65 20 6e 65 77 65 73 74 20 73 65  te the newest se
a5d0: 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a  gment on level .
a5e0: 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20          ** iLvl 
a5f0: 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e 20 20  to level iTst.  
a600: 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72 6f 6d  */.        iProm
a610: 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20 20 20  ote = iTst;.    
a620: 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20      szPromote = 
a630: 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20  szMax;.      }. 
a640: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a650: 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  condition (a) is
a660: 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d 65   not met, assume
a670: 20 28 62 29 20 69 73 20 74 72 75 65 2e 20 53 74   (b) is true. St
a680: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
a690: 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 6e  ().    ** is a n
a6a0: 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20 6e 6f  o-op if it is no
a6b0: 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  t.  */.    if( i
a6c0: 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20  Promote<0 ){.   
a6d0: 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c     iPromote = iL
a6e0: 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d  vl;.      szProm
a6f0: 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20  ote = szSeg;.   
a700: 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
a710: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c  turePromoteTo(p,
a720: 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f   iPromote, szPro
a730: 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a  mote, pStruct);.
a740: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66    }.}.../*.** If
a750: 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f 66 66   the pIter->iOff
a760: 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c   offset currentl
a770: 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  y points to an e
a780: 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e 67 20  ntry indicating 
a790: 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 74  one.** or more t
a7a0: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 2c 20  erm-less nodes, 
a7b0: 61 64 76 61 6e 63 65 20 70 61 73 74 20 69 74 20  advance past it 
a7c0: 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d 3e 6e  and set pIter->n
a7d0: 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68 65 20  Empty to.** the 
a7e0: 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20  number of empty 
a7f0: 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f 0a  child nodes..*/.
a800: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
a810: 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e 45  NodeIterGobbleNE
a820: 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49 74 65  mpty(Fts5NodeIte
a830: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
a840: 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 49 74   pIter->iOff<pIt
a850: 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30 3d 3d  er->nData && 0==
a860: 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49  (pIter->aData[pI
a870: 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78 66  ter->iOff] & 0xf
a880: 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  e) ){.    pIter-
a890: 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
a8a0: 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f  >aData[pIter->iO
a8b0: 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20 20 20  ff] & 0x01;.    
a8c0: 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20  pIter->iOff++;. 
a8d0: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
a8e0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
a8f0: 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  2(&pIter->aData[
a900: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 70 49  pIter->iOff], pI
a910: 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20  ter->nEmpty);.  
a920: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
a930: 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20  ->nEmpty = 0;.  
a940: 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20    pIter->bDlidx 
a950: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
a960: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
a970: 20 6e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   next entry with
a980: 69 6e 20 74 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a  in the node..*/.
a990: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
a9a0: 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 69 6e 74  NodeIterNext(int
a9b0: 20 2a 70 52 63 2c 20 46 74 73 35 4e 6f 64 65 49   *pRc, Fts5NodeI
a9c0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
a9d0: 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3e 3d  f( pIter->iOff>=
a9e0: 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 29 7b 0a  pIter->nData ){.
a9f0: 20 20 20 20 70 49 74 65 72 2d 3e 61 44 61 74 61      pIter->aData
aa00: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d   = 0;.    pIter-
aa10: 3e 69 43 68 69 6c 64 20 2b 3d 20 70 49 74 65 72  >iChild += pIter
aa20: 2d 3e 6e 45 6d 70 74 79 3b 0a 20 20 7d 65 6c 73  ->nEmpty;.  }els
aa30: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 50 72 65 2c  e{.    int nPre,
aa40: 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72   nNew;.    pIter
aa50: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
aa60: 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72  tVarint32(&pIter
aa70: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
aa80: 4f 66 66 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20  Off], nPre);.   
aa90: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20   pIter->iOff += 
aaa0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
aab0: 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49  &pIter->aData[pI
aac0: 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 4e 65 77  ter->iOff], nNew
aad0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 74 65  );.    pIter->te
aae0: 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d 32 3b 0a 20  rm.n = nPre-2;. 
aaf0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
ab00: 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 26 70 49  endBlob(pRc, &pI
ab10: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
ab20: 20 70 49 74 65 72 2d 3e 61 44 61 74 61 2b 70 49   pIter->aData+pI
ab30: 74 65 72 2d 3e 69 4f 66 66 29 3b 0a 20 20 20 20  ter->iOff);.    
ab40: 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 6e  pIter->iOff += n
ab50: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
ab60: 69 43 68 69 6c 64 20 2b 3d 20 28 31 20 2b 20 70  iChild += (1 + p
ab70: 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20  Iter->nEmpty);. 
ab80: 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47     fts5NodeIterG
ab90: 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65  obbleNEmpty(pIte
aba0: 72 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63  r);.    if( *pRc
abb0: 20 29 20 70 49 74 65 72 2d 3e 61 44 61 74 61 20   ) pIter->aData 
abc0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  = 0;.  }.}.../*.
abd0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
abe0: 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
abf0: 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61  t pIter to itera
ac00: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  te through the i
ac10: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73 65 67 6d 65  nternal.** segme
ac20: 6e 74 20 6e 6f 64 65 20 69 6e 20 70 44 61 74 61  nt node in pData
ac30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ac40: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69   fts5NodeIterIni
ac50: 74 28 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  t(const u8 *aDat
ac60: 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 46 74  a, int nData, Ft
ac70: 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65  s5NodeIter *pIte
ac80: 72 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  r){.  memset(pIt
ac90: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
aca0: 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
acb0: 3e 61 44 61 74 61 20 3d 20 61 44 61 74 61 3b 0a  >aData = aData;.
acc0: 20 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 3d    pIter->nData =
acd0: 20 6e 44 61 74 61 3b 0a 20 20 70 49 74 65 72 2d   nData;.  pIter-
ace0: 3e 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 56  >iOff = fts5GetV
acf0: 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c 20 70  arint32(aData, p
ad00: 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b 0a 20  Iter->iChild);. 
ad10: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62   fts5NodeIterGob
ad20: 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29  bleNEmpty(pIter)
ad30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
ad40: 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  any memory alloc
ad50: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
ad60: 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ator object..*/.
ad70: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ad80: 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46 74 73  NodeIterFree(Fts
ad90: 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72  5NodeIter *pIter
ada0: 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  ){.  fts5BufferF
adb0: 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  ree(&pIter->term
adc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
add0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
ade0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
adf0: 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f  ument has the fo
ae00: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73  llowing fields s
ae10: 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  et.** as follows
ae20: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
ae30: 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73 74  sets up the rest
ae40: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
ae50: 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70   so that it.** p
ae60: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
ae70: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
ae80: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
ae90: 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 20 70 6f  *.**   pData: po
aea0: 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
aeb0: 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a  -index record, .
aec0: 2a 2a 20 20 20 69 4c 65 61 66 50 67 6e 6f 3a 20  **   iLeafPgno: 
aed0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
aee0: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2d 69 6e   this doclist-in
aef0: 64 65 78 20 69 73 20 61 73 73 6f 63 69 61 74 65  dex is associate
af00: 64 20 77 69 74 68 2e 0a 2a 2a 0a 2a 2a 20 57 68  d with..**.** Wh
af10: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
af20: 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65 72   is called pIter
af30: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20 74  ->iLeafPgno is t
af40: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
af50: 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73  he.** doclist is
af60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
af70: 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75 72   (the one featur
af80: 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a  ing the term)..*
af90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
afa0: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
afb0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
afc0: 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 61 74  Iter){.  Fts5Dat
afd0: 61 20 2a 70 44 61 74 61 20 3d 20 70 49 74 65 72  a *pData = pIter
afe0: 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  ->pData;.  int i
aff0: 3b 0a 20 20 69 6e 74 20 62 50 72 65 73 65 6e 74  ;.  int bPresent
b000: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
b010: 65 72 2d 3e 70 44 61 74 61 20 29 3b 0a 20 20 61  er->pData );.  a
b020: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c  ssert( pIter->iL
b030: 65 61 66 50 67 6e 6f 3e 30 20 29 3b 0a 0a 20 20  eafPgno>0 );..  
b040: 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  /* Read the firs
b050: 74 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 41  t rowid value. A
b060: 6e 64 20 74 68 65 20 22 70 72 65 73 65 6e 74 22  nd the "present"
b070: 20 66 6c 61 67 20 74 68 61 74 20 66 6f 6c 6c 6f   flag that follo
b080: 77 73 20 69 74 2e 20 2a 2f 0a 20 20 70 49 74 65  ws it. */.  pIte
b090: 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61  r->iOff += getVa
b0a0: 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 30  rint(&pData->p[0
b0b0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
b0c0: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 62 50 72 65  >iRowid);.  bPre
b0d0: 73 65 6e 74 20 3d 20 70 44 61 74 61 2d 3e 70 5b  sent = pData->p[
b0e0: 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 5d 3b 0a  pIter->iOff++];.
b0f0: 20 20 69 66 28 20 62 50 72 65 73 65 6e 74 20 29    if( bPresent )
b100: 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  {.    i = 0;.  }
b110: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  else{.    /* Cou
b120: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
b130: 20 6c 65 61 64 69 6e 67 20 30 78 30 30 20 62 79   leading 0x00 by
b140: 74 65 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  tes. */.    for(
b150: 69 3d 31 3b 20 70 49 74 65 72 2d 3e 69 4f 66 66  i=1; pIter->iOff
b160: 3c 70 44 61 74 61 2d 3e 6e 3b 20 69 2b 2b 29 7b  <pData->n; i++){
b170: 20 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74   .      if( pDat
b180: 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66  a->p[pIter->iOff
b190: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
b1a0: 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a   pIter->iOff++;.
b1b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
b1c0: 6c 65 73 73 20 77 65 20 61 72 65 20 61 6c 72 65  less we are alre
b1d0: 61 64 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ady at the end o
b1e0: 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  f the doclist-in
b1f0: 64 65 78 2c 20 6c 6f 61 64 20 74 68 65 20 66 69  dex, load the fi
b200: 72 73 74 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  rst.    ** rowid
b210: 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 20 20   value.  */.    
b220: 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c  if( pIter->iOff<
b230: 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20  pData->n ){.    
b240: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
b250: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
b260: 20 67 65 74 56 61 72 69 6e 74 28 26 70 44 61 74   getVarint(&pDat
b270: 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66  a->p[pIter->iOff
b280: 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b  ], (u64*)&iVal);
b290: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52  .      pIter->iR
b2a0: 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
b2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b2c0: 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Iter->bEof = 1;.
b2d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
b2e0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20  r->iLeafPgno += 
b2f0: 28 69 2b 31 29 3b 0a 0a 20 20 70 49 74 65 72 2d  (i+1);..  pIter-
b300: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 49 74  >iFirstOff = pIt
b310: 65 72 2d 3e 69 4f 66 66 3b 0a 20 20 72 65 74 75  er->iOff;.  retu
b320: 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a  rn pIter->bEof;.
b330: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
b340: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
b350: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
b360: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
b370: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b380: 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 44  dxIterNext(Fts5D
b390: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b3a0: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  {.  Fts5Data *pD
b3b0: 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61  ata = pIter->pDa
b3c0: 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ta;.  int iOff;.
b3d0: 0a 20 20 66 6f 72 28 69 4f 66 66 3d 70 49 74 65  .  for(iOff=pIte
b3e0: 72 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  r->iOff; iOff<pD
b3f0: 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b  ata->n; iOff++){
b400: 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
b410: 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b  p[iOff] ) break;
b420: 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66   .  }..  if( iOf
b430: 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20  f<pData->n ){.  
b440: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
b450: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
b460: 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 49 74 65   += (iOff - pIte
b470: 72 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20  r->iOff) + 1;.  
b480: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
b490: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
b4a0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
b4b0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
b4c0: 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
b4d0: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20    pIter->iOff = 
b4e0: 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iOff;.  }else{. 
b4f0: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
b500: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
b510: 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d  n pIter->bEof;.}
b520: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
b530: 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74  5DlidxIterEof(Ft
b540: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
b550: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  ){.  return pIte
b570: 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74  r->bEof;.}..stat
b580: 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64  ic void fts5Dlid
b590: 78 49 74 65 72 4c 61 73 74 28 46 74 73 35 44 6c  xIterLast(Fts5Dl
b5a0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
b5b0: 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78  .  if( fts5Dlidx
b5c0: 49 74 65 72 46 69 72 73 74 28 70 49 74 65 72 29  IterFirst(pIter)
b5d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  ==0 ){.    while
b5e0: 28 20 30 3d 3d 66 74 73 35 44 6c 69 64 78 49 74  ( 0==fts5DlidxIt
b5f0: 65 72 4e 65 78 74 28 70 49 74 65 72 29 20 29 3b  erNext(pIter) );
b600: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
b610: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 0;.  }.}..sta
b620: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
b630: 78 49 74 65 72 50 72 65 76 28 46 74 73 35 44 6c  xIterPrev(Fts5Dl
b640: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
b650: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49  .  int iOff = pI
b660: 74 65 72 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73  ter->iOff;..  as
b670: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f  sert( pIter->bEo
b680: 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f  f==0 );.  if( iO
b690: 66 66 3c 3d 70 49 74 65 72 2d 3e 69 46 69 72 73  ff<=pIter->iFirs
b6a0: 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 49 74 65  tOff ){.    pIte
b6b0: 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d  r->bEof = 1;.  }
b6c0: 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20  else{.    u8 *a 
b6d0: 3d 20 70 49 74 65 72 2d 3e 70 44 61 74 61 2d 3e  = pIter->pData->
b6e0: 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  p;.    i64 iVal;
b6f0: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
b700: 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ..    /* Current
b710: 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74  ly iOff points t
b720: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
b730: 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68   of a varint. Th
b740: 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  is block .    **
b750: 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66   decrements iOff
b760: 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
b770: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
b780: 74 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  te of the previo
b790: 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e  us .    ** varin
b7a0: 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e  t. Taking care n
b7b0: 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d  ot to read any m
b7c0: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
b7d0: 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a  that occur.    *
b7e0: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66  * before the buf
b7f0: 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  fer in memory.  
b800: 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  */.    iLimit = 
b810: 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39  (iOff>9 ? iOff-9
b820: 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69   : 0);.    for(i
b830: 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d  Off--; iOff>iLim
b840: 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20  it; iOff--){.   
b850: 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31     if( (a[iOff-1
b860: 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62  ] & 0x80)==0 ) b
b870: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
b880: 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f   getVarint(&a[iO
b890: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
b8a0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
b8b0: 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20  owid -= iVal;.  
b8c0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
b8d0: 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b  no--;..    /* Sk
b8e0: 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73  ip backwards pas
b8f0: 73 65 64 20 61 6e 79 20 30 78 30 30 20 62 79 74  sed any 0x00 byt
b900: 65 73 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  es. */.    while
b910: 28 20 69 4f 66 66 3e 70 49 74 65 72 2d 3e 69 46  ( iOff>pIter->iF
b920: 69 72 73 74 4f 66 66 20 0a 20 20 20 20 20 20 20  irstOff .       
b930: 20 26 26 20 61 5b 69 4f 66 66 2d 31 5d 3d 3d 30   && a[iOff-1]==0
b940: 78 30 30 20 26 26 20 28 61 5b 69 4f 66 66 2d 32  x00 && (a[iOff-2
b950: 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 0a 20 20  ] & 0x80)==0 .  
b960: 20 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 2d    ){.      iOff-
b970: 2d 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  -;.      pIter->
b980: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
b990: 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f   }.    pIter->iO
b9a0: 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a  ff = iOff;.  }..
b9b0: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
b9c0: 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bEof;.}..static 
b9d0: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
b9e0: 65 72 49 6e 69 74 46 72 6f 6d 44 61 74 61 28 0a  erInitFromData(.
b9f0: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e    /* Fts5 Backen
ba20: 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
ba30: 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  hin */.  int bRe
ba40: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
ba50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
ba60: 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53   for ORDER BY AS
ba70: 43 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  C */.  int iLeaf
ba80: 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
ba90: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
baa0: 61 67 65 20 6e 75 6d 62 65 72 20 64 6c 69 64 78  age number dlidx
bab0: 20 69 73 20 66 6f 72 20 2a 2f 0a 20 20 46 74 73   is for */.  Fts
bac0: 35 44 61 74 61 20 2a 70 44 6c 69 64 78 2c 20 20  5Data *pDlidx,  
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bae0: 4c 65 61 66 20 69 6e 64 65 78 20 64 61 74 61 20  Leaf index data 
baf0: 2a 2f 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  */.  Fts5DlidxIt
bb00: 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20  er **ppIter     
bb10: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 70       /* OUT: Pop
bb20: 75 6c 61 74 65 64 20 69 74 65 72 61 74 6f 72 20  ulated iterator 
bb30: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  */.){.  Fts5Dlid
bb40: 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 2a  xIter *pIter = *
bb50: 70 70 49 74 65 72 3b 0a 0a 20 20 69 66 28 20 70  ppIter;..  if( p
bb60: 49 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  Iter==0 ){.    *
bb70: 70 70 49 74 65 72 20 3d 20 70 49 74 65 72 20 3d  ppIter = pIter =
bb80: 20 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a   (Fts5DlidxIter*
bb90: 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
bba0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
bbb0: 64 78 49 74 65 72 29 29 3b 0a 20 20 20 20 69 66  dxIter));.    if
bbc0: 28 20 70 49 74 65 72 3d 3d 30 20 29 7b 20 0a 20  ( pIter==0 ){ . 
bbd0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
bbe0: 65 61 73 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  ease(pDlidx);.  
bbf0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
bc00: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  }.  }else{.    m
bc10: 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
bc20: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
bc30: 49 74 65 72 29 29 3b 0a 20 20 7d 0a 0a 20 20 70  Iter));.  }..  p
bc40: 49 74 65 72 2d 3e 70 44 61 74 61 20 3d 20 70 44  Iter->pData = pD
bc50: 6c 69 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69  lidx;.  pIter->i
bc60: 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66  LeafPgno = iLeaf
bc70: 50 67 6e 6f 3b 0a 20 20 69 66 28 20 62 52 65 76  Pgno;.  if( bRev
bc80: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44  ==0 ){.    fts5D
bc90: 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49  lidxIterFirst(pI
bca0: 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ter);.  }else{. 
bcb0: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
bcc0: 4c 61 73 74 28 70 49 74 65 72 29 3b 0a 20 20 7d  Last(pIter);.  }
bcd0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
bce0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
bcf0: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
bd00: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
bd10: 20 20 20 20 20 2f 2a 20 46 74 73 35 20 42 61 63       /* Fts5 Bac
bd20: 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
bd30: 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  within */.  int 
bd40: 62 52 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  bRev,           
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
bd60: 72 75 65 20 66 6f 72 20 4f 52 44 45 52 20 42 59  rue for ORDER BY
bd70: 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74 20 69 49   ASC */.  int iI
bd80: 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64 2c 20  dx, int iSegid, 
bd90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
bda0: 6d 65 6e 74 20 69 53 65 67 69 64 20 77 69 74 68  ment iSegid with
bdb0: 69 6e 20 69 6e 64 65 78 20 69 49 64 78 20 2a 2f  in index iIdx */
bdc0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
bdd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bde0: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
bdf0: 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20 64  number to load d
be00: 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 20 20 46 74  lidx for */.  Ft
be10: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 2a 70 70  s5DlidxIter **pp
be20: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Iter          /*
be30: 20 4f 55 54 3a 20 50 6f 70 75 6c 61 74 65 64 20   OUT: Populated 
be40: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  iterator */.){. 
be50: 20 46 74 73 35 44 61 74 61 20 2a 70 44 6c 69 64   Fts5Data *pDlid
be60: 78 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 66 74  x;.  pDlidx = ft
be70: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
be80: 53 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52  S5_DOCLIST_IDX_R
be90: 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69  OWID(iIdx, iSegi
bea0: 64 2c 20 69 4c 65 61 66 50 67 6e 6f 29 29 3b 0a  d, iLeafPgno));.
beb0: 20 20 69 66 28 20 70 44 6c 69 64 78 3d 3d 30 20    if( pDlidx==0 
bec0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 74 73 35  ) return;.  fts5
bed0: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 46 72 6f  DlidxIterInitFro
bee0: 6d 44 61 74 61 28 70 2c 20 62 52 65 76 2c 20 69  mData(p, bRev, i
bef0: 4c 65 61 66 50 67 6e 6f 2c 20 70 44 6c 69 64 78  LeafPgno, pDlidx
bf00: 2c 20 70 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  , ppIter);.}../*
bf10: 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c 69  .** Free a docli
bf20: 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74 6f  st-index iterato
bf30: 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74  r object allocat
bf40: 65 64 20 62 79 20 66 74 73 35 44 6c 69 64 78 49  ed by fts5DlidxI
bf50: 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  terInit()..*/.st
bf60: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
bf70: 69 64 78 49 74 65 72 46 72 65 65 28 46 74 73 35  idxIterFree(Fts5
bf80: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
bf90: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
bfa0: 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  {.    fts5DataRe
bfb0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 44 61  lease(pIter->pDa
bfc0: 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
bfd0: 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
bfe0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
bff0: 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28   fts5LeafHeader(
c000: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 2c  Fts5Data *pLeaf,
c010: 20 69 6e 74 20 2a 70 69 52 6f 77 69 64 2c 20 69   int *piRowid, i
c020: 6e 74 20 2a 70 69 54 65 72 6d 29 7b 0a 20 20 2a  nt *piTerm){.  *
c030: 70 69 52 6f 77 69 64 20 3d 20 28 69 6e 74 29 66  piRowid = (int)f
c040: 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
c050: 2d 3e 70 5b 30 5d 29 3b 0a 20 20 2a 70 69 54 65  ->p[0]);.  *piTe
c060: 72 6d 20 3d 20 28 69 6e 74 29 66 74 73 35 47 65  rm = (int)fts5Ge
c070: 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
c080: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  ]);.}../*.** Loa
c090: 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20  d the next leaf 
c0a0: 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65  page into the se
c0b0: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a  gment iterator..
c0c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
c0d0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
c0e0: 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
c0f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c100: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
c110: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
c120: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
c130: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
c140: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
c150: 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74   advance to next
c160: 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74   page */.){.  Ft
c170: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
c180: 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72  nt *pSeg = pIter
c190: 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35 44 61  ->pSeg;.  fts5Da
c1a0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
c1b0: 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
c1c0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20  ->iLeafPgno++;. 
c1d0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
c1e0: 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e  fPgno<=pSeg->pgn
c1f0: 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74  oLast ){.    pIt
c200: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35  er->pLeaf = fts5
c210: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
c220: 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e       FTS5_SEGMEN
c230: 54 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69  T_ROWID(pIter->i
c240: 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  Idx, pSeg->iSegi
c250: 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65  d, 0, pIter->iLe
c260: 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20  afPgno).    );. 
c270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
c280: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
c290: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  }.}../*.** Argum
c2a0: 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20  ent p points to 
c2b0: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
c2c0: 69 6e 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20  ing a varint to 
c2d0: 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  be interpreted a
c2e0: 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20  s a.** position 
c2f0: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e  list size field.
c300: 20 52 65 61 64 20 74 68 65 20 76 61 72 69 6e 74   Read the varint
c310: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
c320: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a  number of bytes.
c330: 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20  ** read. Before 
c340: 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a  returning, set *
c350: 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62  pnSz to the numb
c360: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
c370: 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c  he position.** l
c380: 69 73 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20  ist, and *pbDel 
c390: 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 64  to true if the d
c3a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
c3b0: 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  t, or false othe
c3c0: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
c3d0: 20 69 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c   int fts5GetPosl
c3e0: 69 73 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38  istSize(const u8
c3f0: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20   *p, int *pnSz, 
c400: 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69  int *pbDel){.  i
c410: 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20  nt nSz;.  int n 
c420: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
c430: 32 28 70 2c 20 6e 53 7a 29 3b 0a 20 20 2a 70 6e  2(p, nSz);.  *pn
c440: 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70  Sz = nSz/2;.  *p
c450: 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30  bDel = nSz & 0x0
c460: 30 30 31 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  001;.  return n;
c470: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65  .}../*.** Fts5Se
c480: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
c490: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
c4a0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
c4b0: 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73  byte of a.** pos
c4c0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
c4d0: 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20  field. Read the 
c4e0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69 65  value of the fie
c4f0: 6c 64 20 61 6e 64 20 73 74 6f 72 65 20 69 74 0a  ld and store it.
c500: 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
c510: 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a  ing variables:.*
c520: 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  *.**   Fts5SegIt
c530: 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73  er.nPos.**   Fts
c540: 35 53 65 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a  5SegIter.bDel.**
c550: 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73 35 53 65  .** Leave Fts5Se
c560: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
c570: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
c580: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c590: 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  the .** position
c5a0: 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 28 69   list content (i
c5b0: 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69  f any)..*/.stati
c5c0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c5d0: 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74 73 35 49  erLoadNPos(Fts5I
c5e0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
c5f0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
c600: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c610: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
c620: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
c630: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
c640: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
c650: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 66 66   */.    if( iOff
c660: 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  >=pIter->pLeaf->
c670: 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  n ){.      asser
c680: 74 28 20 30 20 29 3b 0a 20 20 20 20 20 20 66 74  t( 0 );.      ft
c690: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
c6a0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
c6b0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
c6c0: 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
c6d0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
c6e0: 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
c6f0: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
c700: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
c710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 66       }.      iOf
c720: 66 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  f = 4;.    }.   
c730: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
c740: 50 6f 73 6c 69 73 74 53 69 7a 65 28 70 49 74 65  PoslistSize(pIte
c750: 72 2d 3e 70 4c 65 61 66 2d 3e 70 2b 69 4f 66 66  r->pLeaf->p+iOff
c760: 2c 20 26 70 49 74 65 72 2d 3e 6e 50 6f 73 2c 26  , &pIter->nPos,&
c770: 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20  pIter->bDel);.  
c780: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
c790: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d  fset = iOff;.  }
c7a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65  .}../*.** Fts5Se
c7b0: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
c7c0: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
c7d0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
c7e0: 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  byte of the .** 
c7f0: 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c 64 20  "nSuffix" field 
c800: 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e 63 74  of a term. Funct
c810: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 6e 4b  ion parameter nK
c820: 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  eep contains the
c830: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
c840: 20 22 6e 50 72 65 66 69 78 22 20 66 69 65 6c 64   "nPrefix" field
c850: 20 28 69 66 20 74 68 65 72 65 20 77 61 73 20 6f   (if there was o
c860: 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73 73 65  ne - it is passe
c870: 64 20 30 20 69 66 20 74 68 69 73 20 69 73 0a 2a  d 0 if this is.*
c880: 2a 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  * the first term
c890: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 29   in the segment)
c8a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
c8b0: 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a  ction populates:
c8c0: 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67  .**.**   Fts5Seg
c8d0: 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46  Iter.term.**   F
c8e0: 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64  ts5SegIter.rowid
c8f0: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
c900: 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35  r.nPos.**   Fts5
c910: 53 65 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a  SegIter.bDel.**.
c920: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  ** accordingly a
c930: 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73 35 53  nd leaves (Fts5S
c940: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c950: 65 74 29 20 73 65 74 20 74 6f 20 74 68 65 20 63  et) set to the c
c960: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65  ontent of.** the
c970: 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e 20   first position 
c980: 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69  list. The positi
c990: 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e  on list belongin
c9a0: 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a  g to document .*
c9b0: 2a 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  * (Fts5SegIter.i
c9c0: 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  Rowid)..*/.stati
c9d0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c9e0: 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49  erLoadTerm(Fts5I
c9f0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
ca00: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
ca10: 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61   nKeep){.  u8 *a
ca20: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
ca30: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
ca40: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
ca50: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
ca60: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
ca70: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
ca80: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
ca90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
cac0: 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20  f new data */.. 
cad0: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
cae0: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
caf0: 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49 74 65  ], nNew);.  pIte
cb00: 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65  r->term.n = nKee
cb10: 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  p;.  fts5BufferA
cb20: 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
cb30: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
cb40: 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  nNew, &a[iOff]);
cb50: 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  .  iOff += nNew;
cb60: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
cb70: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
cb80: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
cb90: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
cba0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69  ->iLeafPgno;.  i
cbb0: 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  f( iOff>=pIter->
cbc0: 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20  pLeaf->n ){.    
cbd0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
cbe0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
cbf0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
cc00: 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
cc10: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
cc20: 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46  E_OK ) p->rc = F
cc30: 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
cc40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
cc50: 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20  .    iOff = 4;. 
cc60: 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c     a = pIter->pL
cc70: 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f  eaf->p;.  }.  iO
cc80: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74  ff += sqlite3Get
cc90: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
cca0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
ccb0: 52 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d  Rowid);.  pIter-
ccc0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
ccd0: 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  Off;.}../*.** In
cce0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65  itialize the ite
ccf0: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74  rator object pIt
cd00: 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  er to iterate th
cd10: 72 6f 75 67 68 20 74 68 65 20 65 6e 74 72 69 65  rough the entrie
cd20: 73 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20  s in.** segment 
cd30: 70 53 65 67 20 77 69 74 68 69 6e 20 69 6e 64 65  pSeg within inde
cd40: 78 20 69 49 64 78 2e 20 54 68 65 20 69 74 65 72  x iIdx. The iter
cd50: 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  ator is left poi
cd60: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a  nting to the .**
cd70: 20 66 69 72 73 74 20 65 6e 74 72 79 20 77 68 65   first entry whe
cd80: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
cd90: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  returns..**.** I
cda0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
cdb0: 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
cdc0: 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
cdd0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
cde0: 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
cdf0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
ce00: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
ce10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ce20: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
ce30: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
ce40: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
ce50: 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
ce60: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
ce70: 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61     /* Config.aHa
cea0: 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46 54  sh[] index of FT
ceb0: 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73  S index */.  Fts
cec0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
ced0: 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20  t *pSeg,     /* 
cee0: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73  Description of s
cef0: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
cf00: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
cf10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
cf20: 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
cf30: 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53  e */.){.  if( pS
cf40: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30  eg->pgnoFirst==0
cf50: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
cf60: 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73  happens if the s
cf70: 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20  egment is being 
cf80: 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74  used as an input
cf90: 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   to an increment
cfa0: 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20  al.    ** merge 
cfb0: 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73  and all data has
cfc0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74   already been "t
cfd0: 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e  rimmed". See fun
cfe0: 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73  ction.    ** fts
cff0: 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20  5TrimSegments() 
d000: 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20  for details. In 
d010: 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20  this case leave 
d020: 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70  the iterator emp
d030: 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63  ty..    ** The c
d040: 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74  aller will see t
d050: 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  he (pIter->pLeaf
d060: 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20  ==0) and assume 
d070: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a  the iterator is.
d080: 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c      ** at EOF al
d090: 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73  ready. */.    as
d0a0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65  sert( pIter->pLe
d0b0: 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  af==0 );.    ret
d0c0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
d0d0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
d0e0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
d0f0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
d100: 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70 49  *pIter));.    pI
d110: 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ter->pSeg = pSeg
d120: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 49 64  ;.    pIter->iId
d130: 78 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 70 49  x = iIdx;.    pI
d140: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
d150: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
d160: 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  -1;.    fts5SegI
d170: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
d180: 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Iter);.  }..  if
d190: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d1a0: 4f 4b 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 20  OK ){.    u8 *a 
d1b0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d1c0: 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  p;.    pIter->iL
d1d0: 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
d1e0: 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20  GetU16(&a[2]);. 
d1f0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
d200: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
d210: 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67   0);.    fts5Seg
d220: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
d230: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
d240: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d250: 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  on is only ever 
d260: 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61 74  called on iterat
d270: 6f 72 73 20 63 72 65 61 74 65 64 20 62 79 20 63  ors created by c
d280: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49  alls to.** Fts5I
d290: 6e 64 65 78 51 75 65 72 79 28 29 20 77 69 74 68  ndexQuery() with
d2a0: 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51   the FTS5INDEX_Q
d2b0: 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67 20 73  UERY_DESC flag s
d2c0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74  et..**.** The it
d2d0: 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61 6e 20  erator is in an 
d2e0: 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20 77 68  unusual state wh
d2f0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d300: 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68 65 0a   is called: the.
d310: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
d320: 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72 69 61  LeafOffset varia
d330: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
d340: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
d350: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
d360: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
d370: 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65  ze field for the
d380: 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20   first relevant 
d390: 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
d3a0: 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  e..** Fts5SegIte
d3b0: 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74 2c 20  r.rowid is set, 
d3c0: 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62 44 65  but nPos and bDe
d3d0: 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  l are not..**.**
d3e0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
d3f0: 64 76 61 6e 63 65 73 20 74 68 65 20 69 74 65 72  dvances the iter
d400: 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  ator so that it 
d410: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
d420: 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e 74 20  st .** relevant 
d430: 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
d440: 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  e and, if necess
d450: 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73  ary, initializes
d460: 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69 64 4f   the .** aRowidO
d470: 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77  ffset[] and iRow
d480: 69 64 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c  idOffset variabl
d490: 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  es. At this poin
d4a0: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a  t the iterator.*
d4b0: 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65 67 75  * is in its regu
d4c0: 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74 73 35  lar state - Fts5
d4d0: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
d4e0: 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  set points to th
d4f0: 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74 65 20  e first.** byte 
d500: 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
d510: 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61 73 73  list content ass
d520: 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 61 69  ociated with sai
d530: 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74  d rowid..*/.stat
d540: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d550: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
d560: 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ge(Fts5Index *p,
d570: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
d580: 74 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  ter){.  int n = 
d590: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b  pIter->pLeaf->n;
d5a0: 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72  .  int i = pIter
d5b0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
d5c0: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
d5d0: 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20  pLeaf->p;.  int 
d5e0: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30  iRowidOffset = 0
d5f0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  ;..  while( p->r
d600: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d610: 69 3c 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69  i<n ){.    i64 i
d620: 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 69  Delta = 0;.    i
d630: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74  nt nPos;.    int
d640: 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 69 20   bDummy;..    i 
d650: 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
d660: 74 53 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50  tSize(&a[i], &nP
d670: 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
d680: 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20    i += nPos;.   
d690: 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61   if( i>=n ) brea
d6a0: 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56  k;.    i += getV
d6b0: 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36  arint(&a[i], (u6
d6c0: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
d6d0: 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
d6e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 74 65   break;.    pIte
d6f0: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
d700: 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20 69 52  lta;..    if( iR
d710: 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65  owidOffset>=pIte
d720: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
d730: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
d740: 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69  w = pIter->nRowi
d750: 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20  dOffset + 8;.   
d760: 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28     int *aNew = (
d770: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  int*)sqlite3_rea
d780: 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77  lloc(pIter->aRow
d790: 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73  idOffset, nNew*s
d7a0: 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
d7b0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
d7c0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
d7d0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
d7e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d7f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
d800: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
d810: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
d820: 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73  Iter->nRowidOffs
d830: 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d  et = nNew;.    }
d840: 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f  ..    pIter->aRo
d850: 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64  widOffset[iRowid
d860: 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65  Offset++] = pIte
d870: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
d880: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d890: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a  Offset = i;.  }.
d8a0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
d8b0: 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66  ffset = iRowidOf
d8c0: 66 73 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49  fset;.  fts5SegI
d8d0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
d8e0: 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  Iter);.}../*.**.
d8f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
d900: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
d910: 65 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e 64  eNewPage(Fts5Ind
d920: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
d930: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
d940: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
d950: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
d960: 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61  R_REVERSE );.  a
d970: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
d980: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
d990: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20  ER_ONETERM );.. 
d9a0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
d9b0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
d9c0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
d9d0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   0;.  while( p->
d9e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d9f0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
da00: 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  o>pIter->iTermLe
da10: 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74  afPgno ){.    Ft
da20: 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20  s5Data *pNew;.  
da30: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
da40: 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d  no--;.    pNew =
da50: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
da60: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
da70: 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
da80: 49 74 65 72 2d 3e 69 49 64 78 2c 20 70 49 74 65  Iter->iIdx, pIte
da90: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  r->pSeg->iSegid,
daa0: 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   0, pIter->iLeaf
dab0: 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20  Pgno.    ));.   
dac0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
dad0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c     if( pIter->iL
dae0: 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
daf0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
db00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
db10: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
db20: 73 65 74 3c 70 4e 65 77 2d 3e 6e 20 29 7b 0a 20  set<pNew->n ){. 
db30: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
db40: 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20  pLeaf = pNew;.  
db50: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
db60: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74  LeafOffset = pIt
db70: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
db80: 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  set;.        }. 
db90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
dba0: 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
dbb0: 66 2c 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  f, dummy;.      
dbc0: 20 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72    fts5LeafHeader
dbd0: 28 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 4f 66  (pNew, &iRowidOf
dbe0: 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  f, &dummy);.    
dbf0: 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
dc00: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
dc10: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
dc20: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
dc30: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dc40: 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20   = iRowidOff;.  
dc50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dc60: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
dc70: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
dc80: 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65     u8 *a = &pIte
dc90: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65  r->pLeaf->p[pIte
dca0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  r->iLeafOffset];
dcb0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
dcc0: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 67  iLeafOffset += g
dcd0: 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34  etVarint(a, (u64
dce0: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
dcf0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
dd00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
dd10: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
dd20: 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
dd30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
dd40: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
dd50: 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53  eaf ){.    fts5S
dd60: 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
dd70: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
dd80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
dd90: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
dda0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
ddb0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
ddc0: 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  rgument currentl
ddd0: 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  y.** points to a
dde0: 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20   delete marker. 
ddf0: 41 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20  A delete marker 
de00: 69 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68  is an entry with
de10: 20 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73   a 0 byte.** pos
de20: 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73  ition-list..*/.s
de30: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
de40: 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 46  ltiIterIsEmpty(F
de50: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
de60: 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
de70: 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67  Iter){.  Fts5Seg
de80: 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
de90: 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
dea0: 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
deb0: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  t];.  return (p-
dec0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
ded0: 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26  & pSeg->pLeaf &&
dee0: 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b   pSeg->nPos==0);
def0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
df00: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
df10: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
df20: 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ry. .**.** If an
df30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
df40: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
df50: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
df60: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
df70: 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63   It .** is not c
df80: 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
df90: 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
dfa0: 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20  or reaches EOF. 
dfb0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
dfc0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
dfd0: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
dfe0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
dff0: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
e000: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e010: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
e020: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
e030: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e040: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
e050: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
e060: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
e070: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
e080: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
e090: 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
e0a0: 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20  *pbNewTerm      
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e0c0: 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20  UT: Set for new 
e0d0: 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  term */.){.  ass
e0e0: 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d  ert( pbNewTerm==
e0f0: 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d  0 || *pbNewTerm=
e100: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  =0 );.  if( p->r
e110: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e120: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66      if( pIter->f
e130: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
e140: 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 0a  TER_REVERSE ){..
e150: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
e160: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20  >iRowidOffset>0 
e170: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  ){.        u8 *a
e180: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
e190: 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  >p;.        int 
e1a0: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e  iOff;.        in
e1b0: 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  t nPos;.        
e1c0: 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
e1d0: 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
e1e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
e1f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e200: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e210: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d  ->iRowidOffset--
e220: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e230: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e240: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61   iOff = pIter->a
e250: 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65  RowidOffset[pIte
e260: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d  r->iRowidOffset]
e270: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
e280: 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
e290: 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c  stSize(&a[iOff],
e2a0: 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
e2b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
e2c0: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20   += nPos;.      
e2d0: 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 26 61      getVarint(&a
e2e0: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
e2f0: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
e300: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
e310: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  -= iDelta;.     
e320: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
e330: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
e340: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
e350: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e360: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
e370: 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20  verseNewPage(p, 
e380: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
e390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e3a0: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
e3b0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
e3c0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
e3d0: 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
e3e0: 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  erm = 0;.      i
e3f0: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20  nt nKeep = 0;.. 
e400: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
e410: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
e420: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
e430: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
e440: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
e450: 20 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d    u8 *a = pLeaf-
e460: 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  >p;.      int n 
e470: 3d 20 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20  = pLeaf->n;..   
e480: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
e490: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70  >iLeafOffset + p
e4a0: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 20  Iter->nPos;..   
e4b0: 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b     if( iOff<n ){
e4c0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
e4d0: 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e  next entry is on
e4e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
e4f0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 36 34  e */.        u64
e500: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20   iDelta;.       
e510: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
e520: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
e530: 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20  f], &iDelta);.  
e540: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
e550: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
e560: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 44 65  .        if( iDe
e570: 6c 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  lta==0 ){.      
e580: 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31      bNewTerm = 1
e590: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e5a0: 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  iOff>=n ){.     
e5b0: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
e5c0: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
e5d0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
e5e0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e5f0: 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 20 20  fset = 4;.      
e600: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 4f      }else if( iO
e610: 66 66 21 3d 66 74 73 35 47 65 74 55 31 36 28 26  ff!=fts5GetU16(&
e620: 61 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  a[2]) ){.       
e630: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e640: 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47  fOffset += fts5G
e650: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
e660: 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
e670: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e690: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
e6a0: 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
e6b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
e6c0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67   if( pIter->pSeg
e6d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
e6e0: 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
e6f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   0;.        cons
e700: 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 0a 20  t char *zTerm;. 
e710: 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74         int nList
e720: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d  ;.        if( 0=
e730: 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  =(pIter->flags &
e740: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
e750: 45 54 45 52 4d 29 20 29 7b 0a 20 20 20 20 20 20  ETERM) ){.      
e760: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
e770: 61 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 61  ashScanNext(p->a
e780: 70 48 61 73 68 5b 30 5d 29 3b 0a 20 20 20 20 20  pHash[0]);.     
e790: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
e7a0: 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d  HashScanEntry(p-
e7b0: 3e 61 70 48 61 73 68 5b 30 5d 2c 20 26 7a 54 65  >apHash[0], &zTe
e7c0: 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  rm, &pList, &nLi
e7d0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
e7e0: 20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74         if( pList
e7f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e800: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
e810: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
e820: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e830: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
e840: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e850: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e860: 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73  f->p = (u8*)pLis
e870: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  t;.          pIt
e880: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 3d 20 6e  er->pLeaf->n = n
e890: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  List;.          
e8a0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
e8b0: 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
e8c0: 74 65 72 2d 3e 74 65 72 6d 2c 20 73 74 72 6c 65  ter->term, strle
e8d0: 6e 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a  n(zTerm), (u8*)z
e8e0: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  Term);.         
e8f0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e900: 73 65 74 20 3d 20 67 65 74 56 61 72 69 6e 74 28  set = getVarint(
e910: 70 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49  pList, (u64*)&pI
e920: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
e930: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
e940: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  lse{.        iOf
e950: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f  f = 0;.        /
e960: 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20  * Next entry is 
e970: 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  not on the curre
e980: 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  nt page */.     
e990: 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d     while( iOff==
e9a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
e9b0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
e9c0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
e9d0: 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
e9e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20  pIter->pLeaf;.  
e9f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
ea00: 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  f==0 ) break;.  
ea10: 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
ea20: 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
ea30: 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20 29 7b  pLeaf->p[0])) ){
ea40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
ea50: 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  f += sqlite3GetV
ea60: 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b  arint(&pLeaf->p[
ea70: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
ea80: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
ea90: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
eaa0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
eab0: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Off;.          }
eac0: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20  .          else 
ead0: 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35  if( (iOff = fts5
eae0: 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
eaf0: 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20  [2])) ){.       
eb00: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
eb10: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 62 4e 65 77              bNew
eb30: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
eb40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
eb50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
eb60: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
eb70: 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61  terator is now a
eb80: 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65  t EOF. If so, re
eb90: 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20  turn early. */. 
eba0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
ebb0: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
ebc0: 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b   if( bNewTerm ){
ebd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
ebe0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
ebf0: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
ec00: 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  RM ){.          
ec10: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
ec20: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
ec30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
ec40: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
ec50: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
ec70: 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
ec80: 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29  p, pIter, nKeep)
ec90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
eca0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
ecb0: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
ecc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 62 4e           if( pbN
ecd0: 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54  ewTerm ) *pbNewT
ece0: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
ecf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
ed00: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74  se{.          ft
ed10: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
ed20: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
ed30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
ed40: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66     }.  }.}..#def
ed50: 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61  ine SWAPVAL(T, a
ed60: 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d  , b) { T tmp; tm
ed70: 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b  p=a; a=b; b=tmp;
ed80: 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74   }../*.** Iterat
ed90: 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  or pIter current
eda0: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
edb0: 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20   first rowid in 
edc0: 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a  a doclist. This.
edd0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  ** function sets
ede0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75 70   the iterator up
edf0: 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74 65   so that iterate
ee00: 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  s in reverse ord
ee10: 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68  er through.** th
ee20: 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74  e doclist..*/.st
ee30: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
ee40: 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74 73  gIterReverse(Fts
ee50: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
ee60: 49 64 78 2c 20 46 74 73 35 53 65 67 49 74 65 72  Idx, Fts5SegIter
ee70: 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
ee80: 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
ee90: 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  x = pIter->pDlid
eea0: 78 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  x;.  Fts5Data *p
eeb0: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Last = 0;.  int 
eec0: 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20  pgnoLast = 0;.. 
eed0: 20 69 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20   if( pDlidx ){. 
eee0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 6f 63     /* If the doc
eef0: 6c 69 73 74 2d 69 74 65 72 61 74 6f 72 20 69 73  list-iterator is
ef00: 20 61 6c 72 65 61 64 79 20 61 74 20 45 4f 46 2c   already at EOF,
ef10: 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
ef20: 74 20 64 6f 63 6c 69 73 74 0a 20 20 20 20 2a 2a  t doclist.    **
ef30: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 65 6e 74   contains no ent
ef40: 72 69 65 73 20 65 78 63 65 70 74 20 74 68 6f 73  ries except thos
ef50: 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e on the current
ef60: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66   page. */.    if
ef70: 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  ( fts5DlidxIterE
ef80: 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
ef90: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53   ){.      int iS
efa0: 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53  egid = pIter->pS
efb0: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
efc0: 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 44 6c    pgnoLast = pDl
efd0: 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  idx->iLeafPgno;.
efe0: 20 20 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74        pLast = ft
eff0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
f000: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
f010: 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30  (iIdx, iSegid, 0
f020: 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20  , pgnoLast));.  
f030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f040: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f050: 74 20 2d 3d 20 73 71 6c 69 74 65 33 46 74 73 35  t -= sqlite3Fts5
f060: 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 70 49 74  GetVarintLen(pIt
f070: 65 72 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74 65 72  er->nPos*2+pIter
f080: 2d 3e 62 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  ->bDel);.    }. 
f090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
f0a0: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0c0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
f0d0: 65 74 20 77 69 74 68 69 6e 20 70 4c 65 61 66 20  et within pLeaf 
f0e0: 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  */.    Fts5Data 
f0f0: 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  *pLeaf = pIter->
f100: 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f  pLeaf;         /
f110: 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
f120: 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ata */..    /* C
f130: 75 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65  urrently, Fts5Se
f140: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
f150: 74 20 28 61 6e 64 20 69 4f 66 66 29 20 70 6f 69  t (and iOff) poi
f160: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
f170: 20 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 66   .    ** byte of
f180: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63   position-list c
f190: 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63  ontent for the c
f1a0: 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61  urrent rowid. Ba
f1b0: 63 6b 20 69 74 20 75 70 0a 20 20 20 20 2a 2a 20  ck it up.    ** 
f1c0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
f1d0: 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
f1e0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  f the position-l
f1f0: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
f200: 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  */.    pIter->iL
f210: 65 61 66 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c  eafOffset -= sql
f220: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
f230: 74 4c 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73  tLen(pIter->nPos
f240: 2a 32 2b 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b  *2+pIter->bDel);
f250: 0a 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65  .    iOff = pIte
f260: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
f270: 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 66 66      assert( iOff
f280: 3e 3d 34 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  >=4 );..    /* S
f290: 65 61 72 63 68 20 66 6f 72 20 61 20 6e 65 77 20  earch for a new 
f2a0: 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20  term within the 
f2b0: 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 49 66  current leaf. If
f2c0: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
f2d0: 64 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  d,.    ** then t
f2e0: 68 69 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  his page contain
f2f0: 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  s the largest ro
f300: 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  wid for the curr
f310: 65 6e 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  ent term. */.   
f320: 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65   while( iOff<pLe
f330: 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69  af->n ){.      i
f340: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69  nt nPos;.      i
f350: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
f360: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20   int bDummy;..  
f370: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
f380: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
f390: 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20  ze field */.    
f3a0: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
f3b0: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 4c  tPoslistSize(&pL
f3c0: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e  eaf->p[iOff], &n
f3d0: 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
f3e0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f       iOff += nPo
f3f0: 73 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  s;.      if( iOf
f400: 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 20 62 72  f>=pLeaf->n ) br
f410: 65 61 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52  eak;..      /* R
f420: 6f 77 69 64 20 64 65 6c 74 61 2e 20 4f 72 2c 20  owid delta. Or, 
f430: 69 66 20 30 78 30 30 2c 20 74 68 65 20 65 6e 64  if 0x00, the end
f440: 20 6f 66 20 64 6f 63 6c 69 73 74 20 6d 61 72 6b   of doclist mark
f450: 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f  er. */.      nPo
f460: 73 20 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70  s = getVarint(&p
f470: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Leaf->p[iOff], (
f480: 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
f490: 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d       if( iDelta=
f4a0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
f4b0: 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a    iOff += nPos;.
f4c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
f4d0: 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   this condition 
f4e0: 69 73 20 74 72 75 65 20 74 68 65 6e 20 74 68 65  is true then the
f4f0: 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66   largest rowid f
f500: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  or the current. 
f510: 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e     ** term may n
f520: 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20  ot be stored on 
f530: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
f540: 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77  . So search forw
f550: 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65  ard to.    ** se
f560: 65 20 77 68 65 72 65 20 73 61 69 64 20 72 6f 77  e where said row
f570: 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a  id really is.  *
f580: 2f 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  /.    if( iOff>=
f590: 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20  pLeaf->n ){.    
f5a0: 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20    int pgno;.    
f5b0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
f5c0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
f5d0: 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20  Iter->pSeg;..   
f5e0: 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72     /* The last r
f5f0: 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
f600: 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ist may not be o
f610: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
f620: 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20  ge. Search.     
f630: 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66   ** forward to f
f640: 69 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ind the page con
f650: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74  taining the last
f660: 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20   rowid.  */.    
f670: 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72    for(pgno=pIter
f680: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21  ->iLeafPgno+1; !
f690: 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70  p->rc && pgno<=p
f6a0: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70  Seg->pgnoLast; p
f6b0: 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  gno++){.        
f6c0: 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f  i64 iAbs = FTS5_
f6d0: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
f6e0: 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  dx, pSeg->iSegid
f6f0: 2c 20 30 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  , 0, pgno);.    
f700: 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e      Fts5Data *pN
f710: 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ew = fts5DataRea
f720: 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20 20 20  d(p, iAbs);.    
f730: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
f740: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52            int iR
f750: 6f 77 69 64 2c 20 69 54 65 72 6d 3b 0a 20 20 20  owid, iTerm;.   
f760: 20 20 20 20 20 20 20 66 74 73 35 4c 65 61 66 48         fts5LeafH
f770: 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52 6f  eader(pNew, &iRo
f780: 77 69 64 2c 20 26 69 54 65 72 6d 29 3b 0a 20 20  wid, &iTerm);.  
f790: 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
f7a0: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
f7b0: 20 20 53 57 41 50 56 41 4c 28 46 74 73 35 44 61    SWAPVAL(Fts5Da
f7c0: 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74  ta*, pNew, pLast
f7d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
f7e0: 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a  gnoLast = pgno;.
f7f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
f800: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
f810: 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
f820: 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
f830: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f840: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
f850: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
f860: 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20  Last is NULL at 
f870: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
f880: 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   the last rowid 
f890: 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74  for this doclist
f8a0: 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68  .  ** lies on th
f8b0: 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
f8c0: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
f8d0: 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74  e iterator. In t
f8e0: 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 70  his case .  ** p
f8f0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f900: 74 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74  t is already set
f910: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
f920: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
f930: 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61  ize.  ** field a
f940: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
f950: 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
f960: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
f970: 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  age..  **.  ** O
f980: 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e  r, if pLast is n
f990: 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74  on-NULL, then it
f9a0: 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
f9b0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  t contains the l
f9c0: 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20  ast.  ** rowid. 
f9d0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f 6e  In this case con
f9e0: 66 69 67 75 72 65 20 74 68 65 20 69 74 65 72 61  figure the itera
f9f0: 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  tor so that it p
fa00: 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20 2a  oints to the.  *
fa10: 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  * first rowid on
fa20: 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f   this page..  */
fa30: 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a  .  if( pLast ){.
fa40: 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20      int dummy;. 
fa50: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
fa60: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
fa70: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
fa80: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
fa90: 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49   = pLast;.    pI
faa0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
fab0: 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 66   pgnoLast;.    f
fac0: 74 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4c  ts5LeafHeader(pL
fad0: 61 73 74 2c 20 26 69 4f 66 66 2c 20 26 64 75 6d  ast, &iOff, &dum
fae0: 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  my);.    iOff +=
faf0: 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73   getVarint(&pLas
fb00: 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t->p[iOff], (u64
fb10: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
fb20: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  );.    pIter->iL
fb30: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
fb40: 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  ;.  }..  fts5Seg
fb50: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
fb60: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d  age(p, pIter);.}
fb70: 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
fb80: 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
fb90: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
fba0: 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20  irst rowid of a 
fbb0: 64 6f 63 6c 69 73 74 20 77 69 74 68 69 6e 0a 2a  doclist within.*
fbc0: 2a 20 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68  * index iIdx. Th
fbd0: 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
fbe0: 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65  -index associate
fbf0: 64 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c  d with the final
fc00: 20 74 65 72 6d 20 6f 6e 0a 2a 2a 20 74 68 65 20   term on.** the 
fc10: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 49 66  current page. If
fc20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
fc30: 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65  m is the last te
fc40: 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  rm on the page, 
fc50: 0a 2a 2a 20 6c 6f 61 64 20 74 68 65 20 64 6f 63  .** load the doc
fc60: 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20  list-index from 
fc70: 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c  disk and initial
fc80: 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ize an iterator 
fc90: 61 74 20 0a 2a 2a 20 28 70 49 74 65 72 2d 3e 70  at .** (pIter->p
fca0: 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69  Dlidx)..*/.stati
fcb0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
fcc0: 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35  erLoadDlidx(Fts5
fcd0: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49  Index *p, int iI
fce0: 64 78 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  dx, Fts5SegIter 
fcf0: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
fd00: 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  Seg = pIter->pSe
fd10: 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74  g->iSegid;.  int
fd20: 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e   bRev = (pIter->
fd30: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
fd40: 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20  ITER_REVERSE);. 
fd50: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
fd60: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
fd70: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66   /* Current leaf
fd80: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65   data */..  asse
fd90: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
fda0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
fdb0: 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
fdc0: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
fdd0: 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43  dx==0 );..  /* C
fde0: 68 65 63 6b 20 69 66 20 74 68 65 20 63 75 72 72  heck if the curr
fdf0: 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73  ent doclist ends
fe00: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49   on this page. I
fe10: 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72  f it does, retur
fe20: 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74  n.  ** early wit
fe30: 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65  hout loading the
fe40: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28   doclist-index (
fe50: 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f  as it belongs to
fe60: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a   a different.  *
fe70: 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28  * term. */.  if(
fe80: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
fe90: 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c  fPgno==pIter->iL
fea0: 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 69  eafPgno ){.    i
feb0: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
fec0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70  >iLeafOffset + p
fed0: 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20  Iter->nPos;.    
fee0: 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61  while( iOff<pLea
fef0: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36  f->n ){.      i6
ff00: 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 20  4 iDelta;..     
ff10: 20 2f 2a 20 69 4f 66 66 20 69 73 20 63 75 72 72   /* iOff is curr
ff20: 65 6e 74 6c 79 20 74 68 65 20 6f 66 66 73 65 74  ently the offset
ff30: 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f 66   of the start of
ff40: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
ff50: 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66  ata */.      iOf
ff60: 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  f += getVarint(&
ff70: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
ff80: 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
ff90: 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61        if( iDelta
ffa0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
ffb0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70 4c       if( iOff<pL
ffc0: 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  eaf->n ){.      
ffd0: 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
ffe0: 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
fff0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
10000 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
10010 7a 65 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  ze(&pLeaf->p[iOf
10020 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  f], &nPos, &bDum
10030 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  my);.        iOf
10040 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20  f += nPos;.     
10050 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
10060 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
10070 74 28 70 2c 20 62 52 65 76 2c 20 69 49 64 78 2c  t(p, bRev, iIdx,
10080 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e 69 54   iSeg, pIter->iT
10090 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20 26 70 49  ermLeafPgno, &pI
100a0 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 7d 0a  ter->pDlidx);.}.
100b0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
100c0 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74  e the object pIt
100d0 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
100e0 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
100f0 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a  within segment.*
10100 2a 20 70 53 65 67 2c 20 69 6e 64 65 78 20 69 49  * pSeg, index iI
10110 64 78 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  dx. If there is 
10120 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20  no such term in 
10130 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69  the index, the i
10140 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 73 65  terator.** is se
10150 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  t to EOF..**.** 
10160 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10170 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
10180 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
10190 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
101a0 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
101b0 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
101c0 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
101d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
101e0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
101f0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
10200 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
10210 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74  erSeekInit(.  Ft
10220 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10240 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f   FTS5 backend */
10250 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61     /* Config.aHa
10280 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46 54  sh[] index of FT
10290 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  S index */.  con
102a0 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
102b0 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
102c0 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
102d0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
10300 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c  FTS5INDEX_XXX fl
10310 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ags */.  Fts5Str
10320 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
10330 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
10340 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
10350 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
10360 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
10370 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
10380 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
10390 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20  .){.  int iPg = 
103a0 31 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  1;.  int h;.  in
103b0 74 20 62 47 65 20 3d 20 28 28 66 6c 61 67 73 20  t bGe = ((flags 
103c0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
103d0 59 5f 50 52 45 46 49 58 29 20 26 26 20 69 49 64  Y_PREFIX) && iId
103e0 78 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 62 44 6c  x==0);.  int bDl
103f0 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  idx = 0;        
10400 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
10410 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
10420 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
10430 0a 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d  .  assert( bGe==
10440 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
10450 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
10460 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  SC)==0 );.  asse
10470 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65  rt( pTerm && nTe
10480 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  rm );.  memset(p
10490 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
104a0 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
104b0 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
104c0 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20    pIter->iIdx = 
104d0 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  iIdx;..  /* This
104e0 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74 61 63   block sets stac
104f0 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67 20 74  k variable iPg t
10500 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  o the leaf page 
10510 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 79 0a  number that may.
10520 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72    ** contain ter
10530 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
10540 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
10550 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  t in the segment
10560 2e 20 2a 2f 0a 20 20 66 6f 72 28 68 3d 70 53 65  . */.  for(h=pSe
10570 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20 68 3e  g->nHeight-1; h>
10580 30 3b 20 68 2d 2d 29 7b 0a 20 20 20 20 46 74 73  0; h--){.    Fts
10590 35 4e 6f 64 65 49 74 65 72 20 6e 6f 64 65 3b 20  5NodeIter node; 
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
105b0 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
105c0 72 6f 75 67 68 20 69 6e 74 65 72 6e 61 6c 20 6e  rough internal n
105d0 6f 64 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20  odes */.    i64 
105e0 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
105f0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
10600 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
10610 68 2c 20 69 50 67 29 3b 0a 20 20 20 20 46 74 73  h, iPg);.    Fts
10620 35 44 61 74 61 20 2a 70 4e 6f 64 65 20 3d 20 66  5Data *pNode = f
10630 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
10640 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  Rowid);.    if( 
10650 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b  pNode==0 ) break
10660 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49  ;..    fts5NodeI
10670 74 65 72 49 6e 69 74 28 70 4e 6f 64 65 2d 3e 70  terInit(pNode->p
10680 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26 6e 6f 64  , pNode->n, &nod
10690 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
106a0 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29  node.term.n==0 )
106b0 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20 6e 6f 64  ;..    iPg = nod
106c0 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 62 44  e.iChild;.    bD
106d0 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44 6c 69  lidx = node.bDli
106e0 64 78 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35  dx;.    for(fts5
106f0 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
10700 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20  >rc, &node);.   
10710 20 20 20 20 20 6e 6f 64 65 2e 61 44 61 74 61 20       node.aData 
10720 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  && fts5BufferCom
10730 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64 65 2e 74  pareBlob(&node.t
10740 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
10750 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20 20 20 66  m)<=0;.        f
10760 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
10770 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 0a 20  &p->rc, &node). 
10780 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 67 20     ){.      iPg 
10790 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20  = node.iChild;. 
107a0 20 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f       bDlidx = no
107b0 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20 7d  de.bDlidx;.    }
107c0 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
107d0 72 46 72 65 65 28 26 6e 6f 64 65 29 3b 0a 20 20  rFree(&node);.  
107e0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
107f0 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20  e(pNode);.  }.. 
10800 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70   if( iPg<pSeg->p
10810 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20  gnoFirst ){.    
10820 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  iPg = pSeg->pgno
10830 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64  First;.    bDlid
10840 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49  x = 0;.  }..  pI
10850 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
10860 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35   iPg - 1;.  fts5
10870 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
10880 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66  p, pIter);..  if
10890 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
108a0 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  {.    int res;. 
108b0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
108c0 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 55  ffset = fts5GetU
108d0 31 36 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66  16(&pIter->pLeaf
108e0 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 66 74 73  ->p[2]);.    fts
108f0 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
10900 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
10910 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
10920 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
10930 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
10940 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65   res = fts5Buffe
10950 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49  rCompareBlob(&pI
10960 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d  ter->term, pTerm
10970 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , nTerm);.      
10980 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62 72 65  if( res>=0 ) bre
10990 61 6b 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  ak;.      fts5Se
109a0 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  gIterNext(p, pIt
109b0 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 77 68 69  er, 0);.    }whi
109c0 6c 65 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  le( pIter->pLeaf
109d0 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
109e0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 69 66 28  E_OK );..    if(
109f0 20 62 47 65 3d 3d 30 20 26 26 20 72 65 73 20 29   bGe==0 && res )
10a00 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69  {.      /* Set i
10a10 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74  terator to point
10a20 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20 20 20 20   to EOF */.     
10a30 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
10a40 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
10a50 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
10a60 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  af = 0;.    }.  
10a70 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
10a80 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65  SQLITE_OK && bGe
10a90 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ==0 ){.    pIter
10aa0 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
10ab0 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b  SEGITER_ONETERM;
10ac0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
10ad0 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  pLeaf ){.      i
10ae0 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
10af0 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
10b00 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ){.        pIter
10b10 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
10b20 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b  SEGITER_REVERSE;
10b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10b40 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20  f( bDlidx ){.   
10b50 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
10b60 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 69 49 64  LoadDlidx(p, iId
10b70 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  x, pIter);.     
10b80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61   }.      if( fla
10b90 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
10ba0 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
10bb0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
10bc0 52 65 76 65 72 73 65 28 70 2c 20 69 49 64 78 2c  Reverse(p, iIdx,
10bd0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
10be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
10bf0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
10c00 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20  he object pIter 
10c10 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d  to point to term
10c20 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74   pTerm/nTerm wit
10c30 68 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65  hin the.** in-me
10c40 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20  mory hash table 
10c50 69 49 64 78 2e 20 49 66 20 74 68 65 72 65 20 69  iIdx. If there i
10c60 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
10c70 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 74 68 65  n the table, the
10c80 20 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73   .** iterator is
10c90 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a   set to EOF..**.
10ca0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
10cb0 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78  ccurs, Fts5Index
10cc0 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  .rc is set to an
10cd0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
10ce0 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20  or code. If .** 
10cf0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
10d00 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
10d10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
10d20 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
10d30 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10d40 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
10d50 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20  gIterHashInit(. 
10d60 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
10d90 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10db0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e        /* Config.
10dc0 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66  aHash[] index of
10dd0 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20   FTS index */.  
10de0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
10df0 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
10e00 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
10e10 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
10e20 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
10e30 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
10e40 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
10e50 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
10e60 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
10e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
10e80 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
10e90 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 48 61  e */.){.  Fts5Ha
10ea0 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 61  sh *pHash = p->a
10eb0 70 48 61 73 68 5b 69 49 64 78 5d 3b 0a 20 20 63  pHash[iIdx];.  c
10ec0 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
10ed0 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20   0;.  int nList 
10ee0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  = 0;.  const u8 
10ef0 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20  *z = 0;.  int n 
10f00 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
10f10 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65 72  pHash );.  asser
10f20 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
10f30 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 54  _OK );..  if( pT
10f40 65 72 6d 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3d  erm==0 || (iIdx=
10f50 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 46  =0 && (flags & F
10f60 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
10f70 52 45 46 49 58 29 29 20 29 7b 0a 20 20 20 20 70  REFIX)) ){.    p
10f80 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
10f90 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70  s5HashScanInit(p
10fa0 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
10fb0 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  r*)pTerm, nTerm)
10fc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
10fd0 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
10fe0 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
10ff0 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
11000 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
11010 20 28 7a 20 3f 20 73 74 72 6c 65 6e 28 28 63 6f   (z ? strlen((co
11020 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30  nst char*)z) : 0
11030 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11040 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
11050 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
11060 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  TERM;.    sqlite
11070 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28 70  3Fts5HashQuery(p
11080 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
11090 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  r*)pTerm, nTerm,
110a0 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
110b0 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b  ;.    z = pTerm;
110c0 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a  .    n = nTerm;.
110d0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74    }..  if( pList
110e0 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
110f0 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c   *pLeaf;.    sql
11100 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
11110 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
11120 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20  ->term, n, z);. 
11130 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49     pLeaf = fts5I
11140 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
11150 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20  of(Fts5Data));. 
11160 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20     if( pLeaf==0 
11170 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  ) return;.    pL
11180 65 61 66 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  eaf->nRef = 1;. 
11190 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75     pLeaf->p = (u
111a0 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c  8*)pList;.    pL
111b0 65 61 66 2d 3e 6e 20 3d 20 6e 4c 69 73 74 3b 0a  eaf->n = nList;.
111c0 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
111d0 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49   = pLeaf;.    pI
111e0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
111f0 20 3d 20 67 65 74 56 61 72 69 6e 74 28 70 4c 65   = getVarint(pLe
11200 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49  af->p, (u64*)&pI
11210 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 0a 20  ter->iRowid);.. 
11220 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
11230 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
11240 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ESC ){.      pIt
11250 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
11260 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
11270 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  E;.      fts5Seg
11280 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
11290 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
112a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
112b0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
112c0 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
112d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
112e0 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61  * Zero the itera
112f0 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
11300 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
11310 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11320 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
11330 28 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49  (Fts5SegIter *pI
11340 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66  ter){.  fts5Buff
11350 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74  erFree(&pIter->t
11360 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61  erm);.  fts5Data
11370 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
11380 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69  Leaf);.  fts5Dli
11390 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72  dxIterFree(pIter
113a0 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c  ->pDlidx);.  sql
113b0 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
113c0 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a  >aRowidOffset);.
113d0 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
113e0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
113f0 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64  gIter));.}..#ifd
11400 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
11410 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11420 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
11430 70 61 72 74 20 6f 66 20 74 68 65 20 62 69 67 20  part of the big 
11440 61 73 73 65 72 74 28 29 20 70 72 6f 63 65 64 75  assert() procedu
11450 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  re implemented b
11460 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d  y.** fts5AssertM
11470 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 29 2e  ultiIterSetup().
11480 20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61 74   It ensures that
11490 20 74 68 65 20 72 65 73 75 6c 74 20 63 75 72 72   the result curr
114a0 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20  ently stored.** 
114b0 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65 20  in *pRes is the 
114c0 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f  correct result o
114d0 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  f comparing the 
114e0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
114f0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  s of the.** two 
11500 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
11510 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
11520 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
11530 73 75 6c 74 28 0a 20 20 46 74 73 35 4d 75 6c 74  sult(.  Fts5Mult
11540 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
11550 20 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20   .  Fts5SegIter 
11560 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74  *p1,.  Fts5SegIt
11570 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52  er *p2,.  Fts5CR
11580 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20  esult *pRes.){. 
11590 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70   int i1 = p1 - p
115a0 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e  Iter->aSeg;.  in
115b0 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65  t i2 = p2 - pIte
115c0 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20  r->aSeg;..  if( 
115d0 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d  p1->pLeaf || p2-
115e0 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66  >pLeaf ){.    if
115f0 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
11600 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11610 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
11620 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
11630 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
11640 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11650 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
11660 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
11670 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20       int nMin = 
11680 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20  MIN(p1->term.n, 
11690 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  p2->term.n);.   
116a0 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d     int res = mem
116b0 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20  cmp(p1->term.p, 
116c0 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e  p2->term.p, nMin
116d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
116e0 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e  ==0 ) res = p1->
116f0 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72  term.n - p2->ter
11700 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m.n;..      if( 
11710 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
11720 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
11730 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20  bTermEq==1 );.  
11740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
11750 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52  ->iRowid!=p2->iR
11760 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
11770 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
11780 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
11790 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
117a0 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d   -1 : 1;.      }
117b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
117c0 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
117d0 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mEq==0 );.      
117e0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  }..      if( res
117f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  <0 ){.        as
11800 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
11810 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20  st==i1 );.      
11820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
11830 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
11840 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20  rst==i2 );.     
11850 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
11860 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11870 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
11880 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42  nless SQLITE_DEB
11890 55 47 20 69 73 20 64 65 66 69 6e 65 64 20 77 68  UG is defined wh
118a0 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  en this module.*
118b0 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49  * is compiled. I
118c0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
118d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73  s function is es
118e0 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73  sentially an ass
118f0 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
11900 65 6e 74 20 75 73 65 64 20 74 6f 20 76 65 72 69  ent used to veri
11910 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  fy that the cont
11920 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65  ents of the pIte
11930 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61  r->aFirst[] arra
11940 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74  y.** are correct
11950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11960 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
11970 49 74 65 72 53 65 74 75 70 28 46 74 73 35 49 6e  IterSetup(Fts5In
11980 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74  dex *p, Fts5Mult
11990 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  iSegIter *pIter)
119a0 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
119b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
119c0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
119d0 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
119e0 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  g; i+=2){.      
119f0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
11a00 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
11a10 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
11a20 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
11a30 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20  r->aSeg[i+1];.  
11a40 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
11a50 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
11a60 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e  aFirst[(pIter->n
11a70 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20  Seg + i) / 2];. 
11a80 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43       fts5AssertC
11a90 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
11aa0 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70  pIter, p1, p2, p
11ab0 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Res);.    }..   
11ac0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74   for(i=1; i<(pIt
11ad0 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69  er->nSeg / 2); i
11ae0 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  +=2){.      Fts5
11af0 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
11b00 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69  &pIter->aFirst[i
11b10 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
11b20 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65  Iter *p1 = &pIte
11b30 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
11b40 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72  aFirst[i*2].iFir
11b50 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  st ];.      Fts5
11b60 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70  SegIter *p2 = &p
11b70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
11b80 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d  r->aFirst[i*2+1]
11b90 2e 69 46 69 72 73 74 20 5d 3b 0a 0a 20 20 20 20  .iFirst ];..    
11ba0 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70    fts5AssertComp
11bb0 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74  arisonResult(pIt
11bc0 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73  er, p1, p2, pRes
11bd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
11be0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
11bf0 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
11c00 72 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64  rSetup(x,y).#end
11c10 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65  if../*.** Do the
11c20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65   comparison nece
11c30 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74  ssary to populat
11c40 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
11c50 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  iOut]..**.** If 
11c60 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
11c70 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ue is non-zero, 
11c80 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 69  then it is the i
11c90 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79  ndex of an entry
11ca0 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72  .** in the pIter
11cb0 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74  ->aSeg[] array t
11cc0 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61  hat is (a) not a
11cd0 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70  t EOF, and (b) p
11ce0 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
11cf0 6b 65 79 20 74 68 61 74 20 69 73 20 61 20 64 75  key that is a du
11d00 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
11d10 65 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72  er, higher prior
11d20 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  ity, .** segment
11d30 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65  -iterator in the
11d40 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72   pSeg->aSeg[] ar
11d50 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
11d60 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
11d70 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 4d 75  DoCompare(Fts5Mu
11d80 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
11d90 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20  r, int iOut){.  
11da0 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20 20  int i1;         
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74  /* Index of left
11dd0 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
11de0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20  r */.  int i2;  
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
11e10 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74  of right-hand Ft
11e20 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69  s5SegIter */.  i
11e30 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53  nt iRes;.  Fts5S
11e40 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20  egIter *p1;     
11e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
11e60 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ft-hand Fts5SegI
11e70 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ter */.  Fts5Seg
11e80 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20  Iter *p2;       
11e90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
11ea0 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
11eb0 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  er */.  Fts5CRes
11ec0 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74  ult *pRes = &pIt
11ed0 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d  er->aFirst[iOut]
11ee0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75  ;..  assert( iOu
11ef0 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26  t<pIter->nSeg &&
11f00 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73   iOut>0 );.  ass
11f10 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76  ert( pIter->bRev
11f20 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52  ==0 || pIter->bR
11f30 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ev==1 );..  if( 
11f40 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53  iOut>=(pIter->nS
11f50 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20  eg/2) ){.    i1 
11f60 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d  = (iOut - pIter-
11f70 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20  >nSeg/2) * 2;.  
11f80 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20    i2 = i1 + 1;. 
11f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d   }else{.    i1 =
11fa0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
11fb0 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20  Out*2].iFirst;. 
11fc0 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61     i2 = pIter->a
11fd0 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e  First[iOut*2+1].
11fe0 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31  iFirst;.  }.  p1
11ff0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
12000 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74  i1];.  p2 = &pIt
12010 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20  er->aSeg[i2];.. 
12020 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d   pRes->bTermEq =
12030 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c   0;.  if( p1->pL
12040 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  eaf==0 ){       
12050 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20      /* If p1 is 
12060 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52  at EOF */.    iR
12070 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65  es = i2;.  }else
12080 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d   if( p2->pLeaf==
12090 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70  0 ){     /* If p
120a0 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  2 is at EOF */. 
120b0 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20     iRes = i1;.  
120c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
120d0 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43  es = fts5BufferC
120e0 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d  ompare(&p1->term
120f0 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20  , &p2->term);.  
12100 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
12110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32        assert( i2
12120 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >i1 );.      ass
12130 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20  ert( i2!=0 );.  
12140 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45      pRes->bTermE
12150 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  q = 1;.      if(
12160 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d   p1->iRowid==p2-
12170 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
12180 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32     p1->bDel = p2
12190 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20 20  ->bDel;.        
121a0 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20  return i2;.     
121b0 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28   }.      res = (
121c0 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32  (p1->iRowid > p2
121d0 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
121e0 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b  ->bRev) ? -1 : +
121f0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
12200 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20  ert( res!=0 );. 
12210 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
12220 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b        iRes = i1;
12230 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12240 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20    iRes = i2;.   
12250 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e   }.  }..  pRes->
12260 69 46 69 72 73 74 20 3d 20 69 52 65 73 3b 0a 20  iFirst = iRes;. 
12270 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
12280 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67  .** Move the seg
12290 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20 69 74  -iter so that it
122a0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
122b0 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61  irst rowid on pa
122c0 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a  ge iLeafPgno..**
122d0 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
122e0 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e  if leaf iLeafPgn
122f0 6f 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  o contains no ro
12300 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  wid..*/.static v
12310 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47  oid fts5SegIterG
12320 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49  otoPage(.  Fts5I
12330 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
12340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
12350 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
12360 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
12370 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
12380 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
12390 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
123a0 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
123b0 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c  .){.  assert( iL
123c0 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
123d0 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 69 66  LeafPgno );.  if
123e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
123f0 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  OK ){.    pIter-
12400 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
12410 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74  afPgno-1;.    ft
12420 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
12430 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
12440 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
12450 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
12460 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69  er->iLeafPgno==i
12470 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 7d 0a  LeafPgno );.  }.
12480 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
12490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
124a0 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 75 38 20  nt iOff;.    u8 
124b0 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
124c0 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 6e 20  f->p;.    int n 
124d0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
124e0 6e 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20 66  n;..    iOff = f
124f0 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29  ts5GetU16(&a[0])
12500 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34  ;.    if( iOff<4
12510 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20   || iOff>=n ){. 
12520 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
12530 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
12540 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66  else{.      iOff
12550 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61   += getVarint(&a
12560 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
12570 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
12580 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
12590 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
125a0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
125b0 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
125c0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  er);.    }.  }.}
125d0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
125e0 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
125f0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
12600 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c  d argument until
12610 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a   it is at or .**
12620 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f   past rowid iFro
12630 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  m. Regardless of
12640 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46   the value of iF
12650 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f  rom, the iterato
12660 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61  r is.** always a
12670 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74  dvanced at least
12680 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   once..*/.static
12690 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
126a0 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73  rNextFrom(.  Fts
126b0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
126c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
126d0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
126e0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
126f0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
12700 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
12710 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
12720 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20  */.  i64 iMatch 
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20       /* Advance 
12750 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73  iterator at leas
12760 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b  t this far */.){
12770 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70  .  int bRev = (p
12780 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
12790 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
127a0 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78  SE);.  Fts5Dlidx
127b0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70  Iter *pDlidx = p
127c0 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20  Iter->pDlidx;.  
127d0 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20  int iLeafPgno = 
127e0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
127f0 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20  ;.  int bMove = 
12800 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  1;..  assert( pI
12810 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
12820 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
12830 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
12840 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a  Iter->pDlidx );.
12850 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
12860 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28  >pLeaf );..  if(
12870 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20   bRev==0 ){.    
12880 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
12890 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
128a0 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68 3e  x)==0 && iMatch>
128b0 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29  pDlidx->iRowid )
128c0 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e  {.      iLeafPgn
128d0 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61  o = pDlidx->iLea
128e0 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74 73  fPgno;.      fts
128f0 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
12900 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20  Dlidx);.    }.  
12910 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50    assert( iLeafP
12920 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno>=pIter->iLea
12930 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29  fPgno || p->rc )
12940 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ;.    if( iLeafP
12950 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
12960 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74  Pgno ){.      ft
12970 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
12980 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61  e(p, pIter, iLea
12990 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d  fPgno);.      bM
129a0 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
129b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
129c0 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72  rt( iMatch<pIter
129d0 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->iRowid );.    
129e0 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
129f0 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
12a00 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68 3c  x)==0 && iMatch<
12a10 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29  pDlidx->iRowid )
12a20 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
12a30 78 49 74 65 72 50 72 65 76 28 70 44 6c 69 64 78  xIterPrev(pDlidx
12a40 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65  );.    }.    iLe
12a50 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d  afPgno = pDlidx-
12a60 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 20  >iLeafPgno;..   
12a70 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69   assert( fts5Dli
12a80 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
12a90 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e  idx) || iLeafPgn
12aa0 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o<=pIter->iLeafP
12ab0 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  gno );..    if( 
12ac0 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d  iLeafPgno<pIter-
12ad0 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
12ae0 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
12af0 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f  Pgno = iLeafPgno
12b00 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  +1;.      fts5Se
12b10 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50  gIterReverseNewP
12b20 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
12b30 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a       bMove = 0;.
12b40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69      }.  }..  whi
12b50 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
12b60 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65 67   bMove ) fts5Seg
12b70 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
12b80 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
12b90 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
12ba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
12bb0 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72  bRev==0 && pIter
12bc0 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68  ->iRowid>=iMatch
12bd0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
12be0 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74  ( bRev!=0 && pIt
12bf0 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74  er->iRowid<=iMat
12c00 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
12c10 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d  bMove = 1;.  }.}
12c20 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  .../*.** Free th
12c30 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
12c40 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
12c50 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
12c60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12c70 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
12c80 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
12c90 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
12ca0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
12cb0 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
12cc0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
12cd0 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
12ce0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
12cf0 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49  SegIterClear(&pI
12d00 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20  ter->aSeg[i]);. 
12d10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12d20 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
12d30 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
12d40 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
12d50 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e  vanced(.  Fts5In
12d60 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
12d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
12d80 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
12d90 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
12da0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
12db0 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
12dc0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
12dd0 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20  update aFirst[] 
12de0 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69  array for */.  i
12df0 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20  nt iChanged,    
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12e10 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69  * Index of sub-i
12e20 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76  terator just adv
12e30 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  anced */.  int i
12e40 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20 20  Minset          
12e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
12e60 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61  nimum entry in a
12e70 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a  First[] to set *
12e80 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
12e90 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53  for(i=(pIter->nS
12ea0 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20  eg+iChanged)/2; 
12eb0 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d  i>=iMinset && p-
12ec0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
12ed0 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20  i=i/2){.    int 
12ee0 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45  iEq;.    if( (iE
12ef0 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
12f00 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72  rDoCompare(pIter
12f10 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 66  , i)) ){.      f
12f20 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
12f30 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  , &pIter->aSeg[i
12f40 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  Eq], 0);.      i
12f50 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b   = pIter->nSeg +
12f60 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iEq;.    }.  }.
12f70 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
12f80 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
12f90 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49  ceRowid(.  Fts5I
12fa0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
12fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
12fc0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
12fd0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
12fe0 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
12ff0 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
13000 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
13010 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
13020 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
13030 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20 20  int iChanged    
13040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13050 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
13060 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
13070 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  vanced */.){.  i
13080 6e 74 20 69 3b 0a 20 20 46 74 73 35 53 65 67 49  nt i;.  Fts5SegI
13090 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74  ter *pNew = &pIt
130a0 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65  er->aSeg[iChange
130b0 64 5d 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65  d];.  Fts5SegIte
130c0 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49 74  r *pOther = &pIt
130d0 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65  er->aSeg[iChange
130e0 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 0a 20 20  d ^ 0x0001];..  
130f0 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53  for(i=(pIter->nS
13100 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20  eg+iChanged)/2; 
13110 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13120 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 46 74  ; i=i/2){.    Ft
13130 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
13140 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
13150 5b 69 5d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  [i];..    assert
13160 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b  ( pNew->pLeaf );
13170 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65  .    assert( pRe
13180 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c  s->bTermEq==0 ||
13190 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20 29   pOther->pLeaf )
131a0 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  ;.    .    if( p
131b0 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a  Res->bTermEq ){.
131c0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
131d0 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e  iRowid==pOther->
131e0 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
131f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
13200 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74    }else if( (pOt
13210 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77  her->iRowid>pNew
13220 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
13230 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20  ->bRev ){.      
13240 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b    pNew = pOther;
13250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13260 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20     pRes->iFirst 
13270 3d 20 28 70 4e 65 77 20 2d 20 70 49 74 65 72 2d  = (pNew - pIter-
13280 3e 61 53 65 67 29 3b 0a 20 20 20 20 69 66 28 20  >aSeg);.    if( 
13290 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20  i==1 ) break;.. 
132a0 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74     pOther = &pIt
132b0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
132c0 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30  >aFirst[i ^ 0x00
132d0 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  01].iFirst ];.  
132e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  }..  return 0;.}
132f0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
13300 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65   iterator to the
13310 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a   next entry. .**
13320 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
13330 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
13340 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
13350 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
13360 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e  t is not .** con
13370 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72  sidered an error
13380 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
13390 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72   reaches EOF, or
133a0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
133b0 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65  y at .** EOF whe
133c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
133d0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
133e0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
133f0 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46  ltiIterNext(.  F
13400 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
13410 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
13420 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62   *pIter,.  int b
13430 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
13440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
13450 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  ue if argument i
13460 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f  From is valid */
13470 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20  .  i64 iFrom    
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13490 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74     /* Advance at
134a0 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61 73   least as far as
134b0 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66   this */.){.  if
134c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
134d0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55  OK ){.    int bU
134e0 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a  seFrom = bFrom;.
134f0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
13500 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74 65  nt iFirst = pIte
13510 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
13520 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  rst;.      int b
13530 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
13540 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13550 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
13560 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20  Seg[iFirst];.   
13570 20 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20     if( bUseFrom 
13580 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20  && pSeg->pDlidx 
13590 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
135a0 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  egIterNextFrom(p
135b0 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a  , pSeg, iFrom);.
135c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
135d0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
135e0 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
135f0 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  NewTerm);.      
13600 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  }..      if( pSe
13610 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62  g->pLeaf==0 || b
13620 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20  NewTerm .       
13630 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  || fts5MultiIter
13640 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c 20  AdvanceRowid(p, 
13650 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a 20  pIter, iFirst). 
13660 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
13670 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
13680 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20  anced(p, pIter, 
13690 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20  iFirst, 1);.    
136a0 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73    }.      fts5As
136b0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
136c0 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  up(p, pIter);.. 
136d0 20 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20       bUseFrom = 
136e0 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  0;.    }while( p
136f0 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79  Iter->bSkipEmpty
13700 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65   && fts5MultiIte
13710 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65  rIsEmpty(p, pIte
13720 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  r) );.  }.}../*.
13730 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
13740 77 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  w Fts5MultiSegIt
13750 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  er object..**.**
13760 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   The new object 
13770 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
13780 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
13790 64 61 74 61 20 69 6e 20 73 74 72 75 63 74 75 72  data in structur
137a0 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66  e pStruct..** If
137b0 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20   iLevel is -ve, 
137c0 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e  then all data in
137d0 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73   all segments is
137e0 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20   merged. Or, if 
137f0 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72  iLevel.** is zer
13800 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61  o or greater, da
13810 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  ta from the firs
13820 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65  t nSegment segme
13830 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65  nts on level iLe
13840 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64  vel.** is merged
13850 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ..**.** The iter
13860 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70  ator initially p
13870 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
13880 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e  st term/rowid en
13890 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69  try in the .** i
138a0 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f  terated data..*/
138b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
138c0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20  5MultiIterNew(. 
138d0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
13900 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
13910 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  in */.  Fts5Stru
13920 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20  cture *pStruct, 
13930 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63          /* Struc
13940 74 75 72 65 20 6f 66 20 73 70 65 63 69 66 69 63  ture of specific
13950 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
13960 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
13970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13980 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e  onfig.aHash[] in
13990 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78  dex of FTS index
139a0 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45   */.  int bSkipE
139b0 6d 70 74 79 2c 20 20 20 20 20 20 20 20 20 20 20  mpty,           
139c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
139d0 20 69 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d 6b   ignore delete-k
139e0 65 79 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  eys */.  int fla
139f0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
13a00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
13a10 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20  INDEX_QUERY_XXX 
13a20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
13a30 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
13a40 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
13a50 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
13a60 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
13a70 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a90 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
13aa0 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
13ab0 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
13ac0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
13ad0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13ae0 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
13af0 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
13b00 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  */.  Fts5MultiSe
13b10 67 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  gIter **ppOut   
13b20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
13b30 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
13b40 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
13b50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
13b60 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
13b70 20 6d 65 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74   merged */.  int
13b80 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
13b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13ba0 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20  Power of two >= 
13bb0 6e 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nSeg */.  int iI
13bc0 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ter = 0;        
13bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a            /* */.
13be0 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
13c10 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67  rate through seg
13c20 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53  ments */.  Fts5S
13c30 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
13c40 4c 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69  Lvl;.  Fts5Multi
13c50 53 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  SegIter *pNew;..
13c60 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
13c70 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
13c80 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
13c90 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
13ca0 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
13cb0 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
13cc0 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c  tor. */.  if( iL
13cd0 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 6e 53  evel<0 ){.    nS
13ce0 65 67 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  eg = fts5Structu
13cf0 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
13d00 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 6e 53  pStruct);.    nS
13d10 65 67 20 2b 3d 20 28 70 2d 3e 61 70 48 61 73 68  eg += (p->apHash
13d20 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 7d 65 6c   ? 1 : 0);.  }el
13d30 73 65 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 4d  se{.    nSeg = M
13d40 49 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  IN(pStruct->aLev
13d50 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c  el[iLevel].nSeg,
13d60 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d 0a   nSegment);.  }.
13d70 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e    for(nSlot=2; n
13d80 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74  Slot<nSeg; nSlot
13d90 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 2a 70 70  =nSlot*2);.  *pp
13da0 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
13db0 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20  5IdxMalloc(p, . 
13dc0 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
13dd0 4d 75 6c 74 69 53 65 67 49 74 65 72 29 20 2b 20  MultiSegIter) + 
13de0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
13df0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
13e00 28 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20  (Fts5SegIter) * 
13e10 6e 53 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a  nSlot +       /*
13e20 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f   pNew->aSeg[] */
13e30 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
13e40 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c  s5CResult) * nSl
13e50 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e  ot         /* pN
13e60 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a  ew->aFirst[] */.
13e70 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d    );.  if( pNew=
13e80 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
13e90 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f  New->nSeg = nSlo
13ea0 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67 20  t;.  pNew->aSeg 
13eb0 3d 20 28 46 74 73 35 53 65 67 49 74 65 72 2a 29  = (Fts5SegIter*)
13ec0 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77  &pNew[1];.  pNew
13ed0 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35  ->aFirst = (Fts5
13ee0 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e  CResult*)&pNew->
13ef0 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 70  aSeg[nSlot];.  p
13f00 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d  New->bRev = (0!=
13f10 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
13f20 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b  EX_QUERY_DESC));
13f30 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  .  pNew->bSkipEm
13f40 70 74 79 20 3d 20 62 53 6b 69 70 45 6d 70 74 79  pty = bSkipEmpty
13f50 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
13f60 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  ze each of the c
13f70 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74  omponent segment
13f80 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20   iterators. */. 
13f90 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
13fa0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
13fb0 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20  reLevel *pEnd = 
13fc0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
13fd0 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
13fe0 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 70  ];.    if( p->ap
13ff0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hash ){.      /*
14000 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69   Add a segment i
14010 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20  terator for the 
14020 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
14030 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62   of the hash tab
14040 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  le. */.      Fts
14050 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
14060 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
14070 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 66 74  ter++];.      ft
14080 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69  s5SegIterHashIni
14090 74 28 70 2c 20 69 49 64 78 2c 20 70 54 65 72 6d  t(p, iIdx, pTerm
140a0 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
140b0 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
140c0 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72    for(pLvl=&pStr
140d0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20  uct->aLevel[0]; 
140e0 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b  pLvl<pEnd; pLvl+
140f0 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  +){.      for(iS
14100 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b  eg=pLvl->nSeg-1;
14110 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d   iSeg>=0; iSeg--
14120 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
14130 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
14140 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61  *pSeg = &pLvl->a
14150 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
14160 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
14170 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
14180 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
14190 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
141a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
141b0 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
141c0 70 2c 20 69 49 64 78 2c 20 70 53 65 67 2c 20 70  p, iIdx, pSeg, p
141d0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
141e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
141f0 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
14200 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 70 54 65  nit(p, iIdx, pTe
14210 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73  rm, nTerm, flags
14220 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
14230 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14240 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
14250 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74  .    pLvl = &pSt
14260 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65  ruct->aLevel[iLe
14270 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69 53  vel];.    for(iS
14280 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e  eg=nSeg-1; iSeg>
14290 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20  =0; iSeg--){.   
142a0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49 6e     fts5SegIterIn
142b0 69 74 28 70 2c 20 69 49 64 78 2c 20 26 70 4c 76  it(p, iIdx, &pLv
142c0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26  l->aSeg[iSeg], &
142d0 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72  pNew->aSeg[iIter
142e0 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ++]);.    }.  }.
142f0 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72 3d    assert( iIter=
14300 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20 49  =nSeg );..  /* I
14310 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73 20  f the above was 
14320 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68  successful, each
14330 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61   component itera
14340 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20  tors now points 
14350 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  .  ** to the fir
14360 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20  st entry in its 
14370 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73  segment. In this
14380 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65   case initialize
14390 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73   the .  ** aFirs
143a0 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69  t[] array. Or, i
143b0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
143c0 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74 68  ccurred, free th
143d0 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20  e iterator.  ** 
143e0 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74  object and set t
143f0 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
14400 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a  le to NULL.  */.
14410 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f  ITE_OK ){.    fo
14430 72 28 69 49 74 65 72 3d 6e 53 6c 6f 74 2d 31 3b  r(iIter=nSlot-1;
14440 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d   iIter>0; iIter-
14450 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45  -){.      int iE
14460 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 45  q;.      if( (iE
14470 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  q = fts5MultiIte
14480 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c  rDoCompare(pNew,
14490 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20   iIter)) ){.    
144a0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
144b0 65 78 74 28 70 2c 20 26 70 4e 65 77 2d 3e 61 53  ext(p, &pNew->aS
144c0 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20  eg[iEq], 0);.   
144d0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
144e0 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e  erAdvanced(p, pN
144f0 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b  ew, iEq, iIter);
14500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14510 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c     fts5AssertMul
14520 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70  tiIterSetup(p, p
14530 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  New);..    if( p
14540 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
14550 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  && fts5MultiIter
14560 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29  IsEmpty(p, pNew)
14570 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75   ){.      fts5Mu
14580 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
14590 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  New, 0, 0);.    
145a0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
145b0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
145c0 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 2a  (p, pNew);.    *
145d0 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ppOut = 0;.  }.}
145e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
145f0 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61  rue if the itera
14600 74 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72  tor is at EOF or
14610 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   if an error has
14620 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46   occurred. .** F
14630 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
14640 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
14650 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46  s5MultiIterEof(F
14660 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
14670 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
14680 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
14690 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
146a0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
146b0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
146c0 2e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f  .pLeaf==0);.}../
146d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
146e0 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e 74  rowid of the ent
146f0 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ry that the iter
14700 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  ator currently p
14710 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20  oints.** to. If 
14720 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
14730 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e 20  nts to EOF when 
14740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
14750 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72   called the.** r
14760 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66  esults are undef
14770 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
14780 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74 65  i64 fts5MultiIte
14790 72 52 6f 77 69 64 28 46 74 73 35 4d 75 6c 74 69  rRowid(Fts5Multi
147a0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
147b0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
147c0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
147d0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
147e0 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74  ].pLeaf );.  ret
147f0 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  urn pIter->aSeg[
14800 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
14810 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69  ].iFirst ].iRowi
14820 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
14830 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
14840 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
14850 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20  at or following 
14860 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69  iMatch..*/.stati
14870 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
14880 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20  IterNextFrom(.  
14890 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
148a0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
148b0 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34  r *pIter, .  i64
148c0 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69   iMatch.){.  whi
148d0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34  le( 1 ){.    i64
148e0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73   iRowid;.    fts
148f0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
14900 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74  , pIter, 1, iMat
14910 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73  ch);.    if( fts
14920 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
14930 20 70 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b   pIter) ) break;
14940 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74  .    iRowid = ft
14950 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
14960 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28  (pIter);.    if(
14970 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20   pIter->bRev==0 
14980 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  && iRowid>=iMatc
14990 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
149a0 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d  f( pIter->bRev!=
149b0 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61  0 && iRowid<=iMa
149c0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  tch ) break;.  }
149d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
149e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
149f0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
14a00 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63  g the term assoc
14a10 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a  iated with the .
14a20 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  ** entry that th
14a30 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65  e iterator curre
14a40 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a  ntly points to..
14a50 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
14a60 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65  u8 *fts5MultiIte
14a70 72 54 65 72 6d 28 46 74 73 35 4d 75 6c 74 69 53  rTerm(Fts5MultiS
14a80 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
14a90 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53  nt *pn){.  Fts5S
14aa0 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74  egIter *p = &pIt
14ab0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
14ac0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
14ad0 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e  t ];.  *pn = p->
14ae0 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e  term.n;.  return
14af0 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f   p->term.p;.}../
14b00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
14b10 20 69 66 20 74 68 65 20 63 68 75 6e 6b 20 69 74   if the chunk it
14b20 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
14b30 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14b40 6d 65 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45 4f  ment is.** at EO
14b50 46 2e 20 4f 72 20 69 66 20 61 6e 20 65 72 72 6f  F. Or if an erro
14b60 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
14b70 63 75 72 72 65 64 2e 20 4f 74 68 65 72 77 69 73  curred. Otherwis
14b80 65 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e  e, return false.
14b90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
14ba0 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28  ts5ChunkIterEof(
14bb0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
14bc0 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74  s5ChunkIter *pIt
14bd0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
14be0 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 70  ->rc || pIter->p
14bf0 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Leaf==0);.}../*.
14c00 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
14c10 68 75 6e 6b 2d 69 74 65 72 61 74 6f 72 20 74 6f  hunk-iterator to
14c20 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 20   the next chunk 
14c30 6f 66 20 64 61 74 61 20 74 6f 20 72 65 61 64 2e  of data to read.
14c40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14c50 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65 78  fts5ChunkIterNex
14c60 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
14c70 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70  Fts5ChunkIter *p
14c80 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
14c90 20 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 3d 70 49   pIter->nRem>=pI
14ca0 74 65 72 2d 3e 6e 20 29 3b 0a 20 20 70 49 74 65  ter->n );.  pIte
14cb0 72 2d 3e 6e 52 65 6d 20 2d 3d 20 70 49 74 65 72  r->nRem -= pIter
14cc0 2d 3e 6e 3b 0a 20 20 66 74 73 35 44 61 74 61 52  ->n;.  fts5DataR
14cd0 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
14ce0 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
14cf0 4c 65 61 66 20 3d 20 30 3b 0a 20 20 70 49 74 65  Leaf = 0;.  pIte
14d00 72 2d 3e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  r->p = 0;.  if( 
14d10 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 30 20 29 7b  pIter->nRem>0 ){
14d20 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
14d30 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d  Leaf;.    pIter-
14d40 3e 69 4c 65 61 66 52 6f 77 69 64 2b 2b 3b 0a 20  >iLeafRowid++;. 
14d50 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72     pLeaf = pIter
14d60 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61  ->pLeaf = fts5Da
14d70 74 61 52 65 61 64 28 70 2c 20 70 49 74 65 72 2d  taRead(p, pIter-
14d80 3e 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20  >iLeafRowid);.  
14d90 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
14da0 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20       pIter->n = 
14db0 4d 49 4e 28 70 49 74 65 72 2d 3e 6e 52 65 6d 2c  MIN(pIter->nRem,
14dc0 20 70 4c 65 61 66 2d 3e 6e 2d 34 29 3b 0a 20 20   pLeaf->n-4);.  
14dd0 20 20 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70      pIter->p = p
14de0 4c 65 61 66 2d 3e 70 2b 34 3b 0a 20 20 20 20 7d  Leaf->p+4;.    }
14df0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
14e00 74 69 61 6c 69 7a 65 20 74 68 65 20 63 68 75 6e  tialize the chun
14e10 6b 20 69 74 65 72 61 74 6f 72 20 74 6f 20 72 65  k iterator to re
14e20 61 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  ad the position 
14e30 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20 77 68  list data for wh
14e40 69 63 68 20 0a 2a 2a 20 74 68 65 20 73 69 7a 65  ich .** the size
14e50 20 66 69 65 6c 64 20 69 73 20 61 74 20 6f 66 66   field is at off
14e60 73 65 74 20 69 4f 66 66 20 6f 66 20 6c 65 61 66  set iOff of leaf
14e70 20 70 4c 65 61 66 2e 20 0a 2a 2f 0a 73 74 61 74   pLeaf. .*/.stat
14e80 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e  ic void fts5Chun
14e90 6b 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  kIterInit(.  Fts
14ea0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ec0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
14ed0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
14ee0 49 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20  Iter *pSeg,     
14ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
14f00 65 6e 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20  ent iterator to 
14f10 72 65 61 64 20 70 6f 73 6c 69 73 74 20 66 72 6f  read poslist fro
14f20 6d 20 2a 2f 0a 20 20 46 74 73 35 43 68 75 6e 6b  m */.  Fts5Chunk
14f30 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
14f40 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
14f50 6c 69 7a 65 20 74 68 69 73 20 6f 62 6a 65 63 74  lize this object
14f60 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74   */.){.  Fts5Dat
14f70 61 20 2a 70 4c 65 61 66 20 3d 20 70 53 65 67 2d  a *pLeaf = pSeg-
14f80 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f  >pLeaf;.  int iO
14f90 66 66 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66  ff = pSeg->iLeaf
14fa0 4f 66 66 73 65 74 3b 0a 0a 20 20 6d 65 6d 73 65  Offset;..  memse
14fb0 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
14fc0 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 2f  of(*pIter));.  /
14fd0 2a 20 49 66 20 46 74 73 35 53 65 67 49 74 65 72  * If Fts5SegIter
14fe0 2e 70 53 65 67 20 69 73 20 4e 55 4c 4c 2c 20 74  .pSeg is NULL, t
14ff0 68 65 6e 20 74 68 69 73 20 69 74 65 72 61 74 6f  hen this iterato
15000 72 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  r iterates throu
15010 67 68 20 64 61 74 61 0a 20 20 2a 2a 20 63 75 72  gh data.  ** cur
15020 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
15030 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49   a hash table. I
15040 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
15050 65 20 69 73 20 6e 6f 20 6c 65 61 66 2d 72 6f 77  e is no leaf-row
15060 69 64 0a 20 20 2a 2a 20 74 6f 20 63 61 6c 63 75  id.  ** to calcu
15070 6c 61 74 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  late.  */.  if( 
15080 70 53 65 67 2d 3e 70 53 65 67 20 29 7b 0a 20 20  pSeg->pSeg ){.  
15090 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67    int iId = pSeg
150a0 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
150b0 20 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d 20      i64 rowid = 
150c0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
150d0 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c 20 69  ID(pSeg->iIdx, i
150e0 49 64 2c 20 30 2c 20 70 53 65 67 2d 3e 69 4c 65  Id, 0, pSeg->iLe
150f0 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 49 74  afPgno);.    pIt
15100 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 20 3d  er->iLeafRowid =
15110 20 72 6f 77 69 64 3b 0a 20 20 7d 0a 0a 20 20 66   rowid;.  }..  f
15120 74 73 35 44 61 74 61 52 65 66 65 72 65 6e 63 65  ts5DataReference
15130 28 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  (pLeaf);.  pIter
15140 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b  ->pLeaf = pLeaf;
15150 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20 3d  .  pIter->nRem =
15160 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 70   pSeg->nPos;.  p
15170 49 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 4c  Iter->n = MIN(pL
15180 65 61 66 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20 70  eaf->n - iOff, p
15190 49 74 65 72 2d 3e 6e 52 65 6d 29 3b 0a 20 20 70  Iter->nRem);.  p
151a0 49 74 65 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d  Iter->p = pLeaf-
151b0 3e 70 20 2b 20 69 4f 66 66 3b 0a 20 20 69 66 28  >p + iOff;.  if(
151c0 20 70 49 74 65 72 2d 3e 6e 3d 3d 30 20 29 7b 0a   pIter->n==0 ){.
151d0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
151e0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  rNext(p, pIter);
151f0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
15200 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65  oid fts5ChunkIte
15210 72 52 65 6c 65 61 73 65 28 46 74 73 35 43 68 75  rRelease(Fts5Chu
15220 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  nkIter *pIter){.
15230 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
15240 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
15250 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
15260 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
15270 61 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ad and return th
15280 65 20 6e 65 78 74 20 33 32 2d 62 69 74 20 76 61  e next 32-bit va
15290 72 69 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 6f  rint from the po
152a0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 74 65 72  sition-list iter
152b0 61 74 6f 72 20 0a 2a 2a 20 70 61 73 73 65 64 20  ator .** passed 
152c0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
152d0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
152e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
152f0 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  , zero is return
15300 65 64 20 61 6e 20 61 6e 20 65 72 72 6f 72 20 63  ed an an error c
15310 6f 64 65 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20  ode left in .** 
15320 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66  Fts5Index.rc. If
15330 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
15340 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
15350 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
15360 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20  n is.** called, 
15370 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
15380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
15390 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69  5PosIterReadVari
153a0 6e 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  nt(Fts5Index *p,
153b0 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49   Fts5PosIter *pI
153c0 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c  ter){.  int iVal
153d0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
153e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
153f0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69      if( pIter->i
15400 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 63 68 75 6e  Off>=pIter->chun
15410 6b 2e 6e 20 29 7b 0a 20 20 20 20 20 20 66 74 73  k.n ){.      fts
15420 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70  5ChunkIterNext(p
15430 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29  , &pIter->chunk)
15440 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  ;.      if( fts5
15450 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20  ChunkIterEof(p, 
15460 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 20 29  &pIter->chunk) )
15470 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
15480 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 30   pIter->iOff = 0
15490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  ;.    }.    pIte
154a0 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  r->iOff += fts5G
154b0 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
154c0 72 2d 3e 63 68 75 6e 6b 2e 70 5b 70 49 74 65 72  r->chunk.p[pIter
154d0 2d 3e 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a  ->iOff], iVal);.
154e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 56 61    }.  return iVa
154f0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  l;.}../*.** Adva
15500 6e 63 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  nce the position
15510 20 6c 69 73 74 20 69 74 65 72 61 74 6f 72 20 74   list iterator t
15520 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
15530 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15540 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74   fts5PosIterNext
15550 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
15560 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74 65  ts5PosIter *pIte
15570 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a  r){.  int iVal;.
15580 20 20 61 73 73 65 72 74 28 20 66 74 73 35 43 68    assert( fts5Ch
15590 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 70  unkIterEof(p, &p
155a0 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30 20  Iter->chunk)==0 
155b0 29 3b 0a 20 20 69 56 61 6c 20 3d 20 66 74 73 35  );.  iVal = fts5
155c0 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69 6e  PosIterReadVarin
155d0 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 69  t(p, pIter);.  i
155e0 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  f( fts5ChunkIter
155f0 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63  Eof(p, &pIter->c
15600 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hunk)==0 ){.    
15610 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20  if( iVal==1 ){. 
15620 20 20 20 20 20 70 49 74 65 72 2d 3e 69 43 6f 6c       pIter->iCol
15630 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52 65   = fts5PosIterRe
15640 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74 65  adVarint(p, pIte
15650 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  r);.      pIter-
15660 3e 69 50 6f 73 20 3d 20 66 74 73 35 50 6f 73 49  >iPos = fts5PosI
15670 74 65 72 52 65 61 64 56 61 72 69 6e 74 28 70 2c  terReadVarint(p,
15680 20 70 49 74 65 72 29 20 2d 20 32 3b 0a 20 20 20   pIter) - 2;.   
15690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
156a0 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28 69 56  ter->iPos += (iV
156b0 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 7d 0a 20  al - 2);.    }. 
156c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
156d0 69 61 6c 69 7a 65 20 74 68 65 20 46 74 73 35 50  ialize the Fts5P
156e0 6f 73 49 74 65 72 20 6f 62 6a 65 63 74 20 70 61  osIter object pa
156f0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 6e 61  ssed as the fina
15700 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  l argument to it
15710 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
15720 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
15730 73 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  st associated wi
15740 74 68 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  th the index ent
15750 72 79 20 74 68 61 74 20 69 74 65 72 61 74 6f 72  ry that iterator
15760 20 0a 2a 2a 20 70 4d 75 6c 74 69 20 63 75 72 72   .** pMulti curr
15770 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
15780 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15790 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69 74 28  fts5PosIterInit(
157a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
157d0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
157e0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
157f0 2a 70 4d 75 6c 74 69 2c 20 20 20 20 20 20 20 2f  *pMulti,       /
15800 2a 20 4d 75 6c 74 69 2d 73 65 67 20 69 74 65 72  * Multi-seg iter
15810 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73  ator to read pos
15820 2d 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  -list from */.  
15830 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74  Fts5PosIter *pIt
15840 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
15850 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
15860 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
15870 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
15880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
15890 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
158a0 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b  = &pMulti->aSeg[
158b0 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b   pMulti->aFirst[
158c0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
158d0 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
158e0 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
158f0 29 3b 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b  );.    fts5Chunk
15900 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67  IterInit(p, pSeg
15910 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29  , &pIter->chunk)
15920 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 43 68  ;.    if( fts5Ch
15930 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 70  unkIterEof(p, &p
15940 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30 20  Iter->chunk)==0 
15950 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 6f 73  ){.      fts5Pos
15960 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
15970 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
15980 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
15990 75 65 20 69 66 20 74 68 65 20 70 6f 73 69 74 69  ue if the positi
159a0 6f 6e 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  on iterator pass
159b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
159c0 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
159d0 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20 61 6e  at EOF. Or if an
159e0 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
159f0 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f 74 68  dy occurred. Oth
15a00 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 66  erwise, return f
15a10 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alse..*/.static 
15a20 69 6e 74 20 66 74 73 35 50 6f 73 49 74 65 72 45  int fts5PosIterE
15a30 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
15a40 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49   Fts5PosIter *pI
15a50 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ter){.  return (
15a60 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e  p->rc || pIter->
15a70 63 68 75 6e 6b 2e 70 4c 65 61 66 3d 3d 30 29 3b  chunk.pLeaf==0);
15a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
15a90 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74  te a new segment
15aa0 2d 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75  -id for the stru
15ab0 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a  cture pStruct..*
15ac0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
15ad0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
15ae0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
15af0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
15b00 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e   0 is .** return
15b10 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
15b20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
15b30 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
15b40 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
15b50 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
15b60 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 3b  truct){.  int i;
15b70 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
15b80 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
15b90 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
15ba0 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<100; i++){.   
15bb0 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 20   int iSegid;.   
15bc0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
15bd0 65 73 73 28 73 69 7a 65 6f 66 28 69 6e 74 29 2c  ess(sizeof(int),
15be0 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64 29   (void*)&iSegid)
15bf0 3b 0a 20 20 20 20 69 53 65 67 69 64 20 3d 20 69  ;.    iSegid = i
15c00 53 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20 46  Segid & ((1 << F
15c10 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31  TS5_DATA_ID_B)-1
15c20 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65 67 69  );.    if( iSegi
15c30 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  d ){.      int i
15c40 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20  Lvl, iSeg;.     
15c50 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
15c60 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
15c70 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
15c80 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
15c90 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
15ca0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
15cb0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
15cc0 20 20 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d      if( iSegid==
15cd0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
15ce0 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d  iLvl].aSeg[iSeg]
15cf0 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20  .iSegid ){.     
15d00 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20         iSegid = 
15d10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
15d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15d30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
15d40 53 65 67 69 64 20 29 20 72 65 74 75 72 6e 20 69  Segid ) return i
15d50 53 65 67 69 64 3b 0a 20 20 7d 0a 0a 20 20 70 2d  Segid;.  }..  p-
15d60 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
15d70 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  OR;.  return 0;.
15d80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
15d90 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e   all data curren
15da0 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74 68  tly cached in th
15db0 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a  e hash-tables..*
15dc0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
15dd0 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61  s5IndexDiscardDa
15de0 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ta(Fts5Index *p)
15df0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  {.  assert( p->a
15e00 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e  pHash || p->nPen
15e10 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20  dingData==0 );. 
15e20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 20 29   if( p->apHash )
15e30 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  {.    Fts5Config
15e40 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
15e50 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69 6e 74 20  Config;.    int 
15e60 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
15e70 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  i<=pConfig->nPre
15e80 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  fix; i++){.     
15e90 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 5b 69   if( p->apHash[i
15ea0 5d 20 29 20 73 71 6c 69 74 65 33 46 74 73 35 48  ] ) sqlite3Fts5H
15eb0 61 73 68 43 6c 65 61 72 28 70 2d 3e 61 70 48 61  ashClear(p->apHa
15ec0 73 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  sh[i]);.    }.  
15ed0 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
15ee0 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  a = 0;.  }.}../*
15ef0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
15f00 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69  ize of the prefi
15f10 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61  x, in bytes, tha
15f20 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f 70  t buffer (nNew/p
15f30 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20 77  New) shares.** w
15f40 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c 64  ith buffer (nOld
15f50 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  /pOld)..*/.stati
15f60 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78  c int fts5Prefix
15f70 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74 20  Compress(.  int 
15f80 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nOld, const u8 *
15f90 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77  pOld,.  int nNew
15fa0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77  , const u8 *pNew
15fb0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
15fc0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26  or(i=0; i<nNew &
15fd0 26 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  & i<nOld; i++){.
15fe0 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21      if( pOld[i]!
15ff0 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b  =pNew[i] ) break
16000 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
16010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  ;.}../*.** If an
16020 20 22 6e 45 6d 70 74 79 22 20 72 65 63 6f 72 64   "nEmpty" record
16030 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
16040 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 62   to the b-tree b
16050 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 0a 2a  efore the next.*
16060 2a 20 74 65 72 6d 2c 20 77 72 69 74 65 20 69 74  * term, write it
16070 20 6e 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   now..*/.static 
16080 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
16090 72 65 65 4e 45 6d 70 74 79 28 46 74 73 35 49 6e  reeNEmpty(Fts5In
160a0 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
160b0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
160c0 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
160d0 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 69 6e  nEmpty ){.    in
160e0 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20  t bFlag = 0;.   
160f0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
16100 2a 70 50 67 3b 0a 20 20 20 20 70 50 67 20 3d 20  *pPg;.    pPg = 
16110 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
16120 72 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 57  r[1];.    if( pW
16130 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46  riter->nEmpty>=F
16140 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
16150 5a 45 20 26 26 20 70 57 72 69 74 65 72 2d 3e 63  ZE && pWriter->c
16160 64 6c 69 64 78 2e 6e 20 29 7b 0a 20 20 20 20 20  dlidx.n ){.     
16170 20 69 36 34 20 69 4b 65 79 20 3d 20 46 54 53 35   i64 iKey = FTS5
16180 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57  _DOCLIST_IDX_ROW
16190 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 57  ID(.          pW
161a0 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
161b0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 0a 20  iter->iSegid, . 
161c0 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72           pWriter
161d0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
161e0 6f 20 2d 20 31 20 2d 20 70 57 72 69 74 65 72 2d  o - 1 - pWriter-
161f0 3e 6e 45 6d 70 74 79 0a 20 20 20 20 20 20 29 3b  >nEmpty.      );
16200 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16210 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2e 6e  Writer->cdlidx.n
16220 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  >0 );.      fts5
16230 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4b 65  DataWrite(p, iKe
16240 79 2c 20 70 57 72 69 74 65 72 2d 3e 63 64 6c 69  y, pWriter->cdli
16250 64 78 2e 70 2c 20 70 57 72 69 74 65 72 2d 3e 63  dx.p, pWriter->c
16260 64 6c 69 64 78 2e 6e 29 3b 0a 20 20 20 20 20 20  dlidx.n);.      
16270 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d  bFlag = 1;.    }
16280 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
16290 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
162a0 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 62  rc, &pPg->buf, b
162b0 46 6c 61 67 29 3b 0a 20 20 20 20 66 74 73 35 42  Flag);.    fts5B
162c0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
162d0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e  t(&p->rc, &pPg->
162e0 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e 6e 45  buf, pWriter->nE
162f0 6d 70 74 79 29 3b 0a 20 20 20 20 70 57 72 69 74  mpty);.    pWrit
16300 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a  er->nEmpty = 0;.
16310 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65    }..  /* Whethe
16320 72 20 6f 72 20 6e 6f 74 20 69 74 20 77 61 73 20  r or not it was 
16330 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2c  written to disk,
16340 20 7a 65 72 6f 20 74 68 65 20 64 6f 63 6c 69 73   zero the doclis
16350 74 20 69 6e 64 65 78 20 61 74 20 74 68 69 73 0a  t index at this.
16360 20 20 2a 2a 20 70 6f 69 6e 74 20 2a 2f 0a 20 20    ** point */.  
16370 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
16380 72 5a 65 72 6f 28 26 70 57 72 69 74 65 72 2d 3e  rZero(&pWriter->
16390 63 64 6c 69 64 78 29 3b 0a 20 20 70 57 72 69 74  cdlidx);.  pWrit
163a0 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61  er->bDlidxPrevVa
163b0 6c 69 64 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74  lid = 0;.}..stat
163c0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
163d0 65 42 74 72 65 65 47 72 6f 77 28 46 74 73 35 49  eBtreeGrow(Fts5I
163e0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
163f0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
16400 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
16410 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16420 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
16430 61 4e 65 77 3b 0a 20 20 20 20 46 74 73 35 50 61  aNew;.    Fts5Pa
16440 67 65 57 72 69 74 65 72 20 2a 70 4e 65 77 3b 0a  geWriter *pNew;.
16450 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 73      int nNew = s
16460 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72  izeof(Fts5PageWr
16470 69 74 65 72 29 20 2a 20 28 70 57 72 69 74 65 72  iter) * (pWriter
16480 2d 3e 6e 57 72 69 74 65 72 2b 31 29 3b 0a 0a 20  ->nWriter+1);.. 
16490 20 20 20 61 4e 65 77 20 3d 20 28 46 74 73 35 50     aNew = (Fts5P
164a0 61 67 65 57 72 69 74 65 72 2a 29 73 71 6c 69 74  ageWriter*)sqlit
164b0 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74  e3_realloc(pWrit
164c0 65 72 2d 3e 61 57 72 69 74 65 72 2c 20 6e 4e 65  er->aWriter, nNe
164d0 77 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  w);.    if( aNew
164e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
164f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
16500 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  M;.      return;
16510 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 65 77  .    }..    pNew
16520 20 3d 20 26 61 4e 65 77 5b 70 57 72 69 74 65 72   = &aNew[pWriter
16530 2d 3e 6e 57 72 69 74 65 72 5d 3b 0a 20 20 20 20  ->nWriter];.    
16540 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
16550 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57  sizeof(Fts5PageW
16560 72 69 74 65 72 29 29 3b 0a 20 20 20 20 70 4e 65  riter));.    pNe
16570 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  w->pgno = 1;.   
16580 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
16590 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
165a0 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29 3b 0a  &pNew->buf, 1);.
165b0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 57  .    pWriter->nW
165c0 72 69 74 65 72 2b 2b 3b 0a 20 20 20 20 70 57 72  riter++;.    pWr
165d0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20  iter->aWriter = 
165e0 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  aNew;.  }.}../*.
165f0 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
16600 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
16610 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74  leaf page except
16620 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20   the first that 
16630 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c  contains.** at l
16640 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41  east one term. A
16650 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70  rgument (nTerm/p
16660 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c  Term) is the spl
16670 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20  it-key - a term 
16680 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65  that.** is large
16690 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73  r than all terms
166a0 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c   written to earl
166b0 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20  ier leaves, and 
166c0 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73  equal to or.** s
166d0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
166e0 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  first term on th
166f0 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a  e new leaf..**.*
16700 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
16710 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
16720 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
16730 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20  ts5Index.rc. If 
16740 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20  an error.** has 
16750 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
16760 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
16770 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
16780 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
16790 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
167a0 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
167b0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167d0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
167e0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
167f0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16800 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
16810 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
16820 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
16830 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
16840 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65       /* First te
16850 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a  rm on new page *
16860 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65 69 67  /.){.  int iHeig
16870 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69 67 68  ht;.  for(iHeigh
16880 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68 74 2b  t=1; 1; iHeight+
16890 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65  +){.    Fts5Page
168a0 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b 0a 0a  Writer *pPage;..
168b0 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3e      if( iHeight>
168c0 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65  =pWriter->nWrite
168d0 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  r ){.      fts5W
168e0 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c  riteBtreeGrow(p,
168f0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
16900 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
16910 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
16920 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
16930 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67 68 74  >aWriter[iHeight
16940 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
16950 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c 20  eBtreeNEmpty(p, 
16960 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20 20 69  pWriter);..    i
16970 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
16980 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
16990 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  z ){.      /* pP
169a0 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69 74  age will be writ
169b0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ten to disk. The
169c0 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77 72   term will be wr
169d0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 20  itten into the. 
169e0 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6f       ** parent o
169f0 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20 20  f pPage.  */.   
16a00 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
16a10 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
16a20 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 57  ID(.          pW
16a30 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
16a40 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 48  iter->iSegid, iH
16a50 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70 67  eight, pPage->pg
16a60 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  no.      );.    
16a70 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
16a80 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
16a90 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
16aa0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  buf.n);.      ft
16ab0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
16ac0 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20  age->buf);.     
16ad0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
16ae0 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a 20  &pPage->term);. 
16af0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
16b00 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
16b10 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
16b20 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29   pPage[-1].pgno)
16b30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
16b40 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  gno++;.    }else
16b50 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65  {.      int nPre
16b60 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
16b70 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72  press(pPage->ter
16b80 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  m.n, pPage->term
16b90 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  .p, nTerm, pTerm
16ba0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
16bb0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
16bc0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
16bd0 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20 20  buf, nPre+2);.  
16be0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
16bf0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
16c00 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
16c10 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20 20  nTerm-nPre);.   
16c20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
16c30 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
16c40 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
16c50 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b 6e  rm-nPre, pTerm+n
16c60 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  Pre);.      fts5
16c70 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
16c80 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
16c90 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
16ca0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16cb0 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
16cc0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
16cd0 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73  reeNoTerm(.  Fts
16ce0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
16cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d00 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
16d10 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
16d20 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
16d30 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
16d40 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
16d50 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
16d60 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
16d70 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72 6f   ){.    /* No ro
16d80 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67  wids on this pag
16d90 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30 78 30  e. Append an 0x0
16da0 30 20 62 79 74 65 20 74 6f 20 74 68 65 20 63 75  0 byte to the cu
16db0 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64 6f  rrent .    ** do
16dc0 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20  clist-index */. 
16dd0 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
16de0 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 3d  bDlidxPrevValid=
16df0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  =0 ){.      i64 
16e00 69 52 6f 77 69 64 20 3d 20 70 57 72 69 74 65 72  iRowid = pWriter
16e10 2d 3e 69 50 72 65 76 52 6f 77 69 64 3b 0a 20 20  ->iPrevRowid;.  
16e20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
16e30 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
16e40 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  t(&p->rc, &pWrit
16e50 65 72 2d 3e 63 64 6c 69 64 78 2c 20 69 52 6f 77  er->cdlidx, iRow
16e60 69 64 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74  id);.      pWrit
16e70 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61  er->bDlidxPrevVa
16e80 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  lid = 1;.      p
16e90 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78 50 72  Writer->iDlidxPr
16ea0 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  ev = iRowid;.   
16eb0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
16ec0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
16ed0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57  rint(&p->rc, &pW
16ee0 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c 20 30  riter->cdlidx, 0
16ef0 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72  );.  }.  pWriter
16f00 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 2f  ->nEmpty++;.}../
16f10 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77 69  *.** Rowid iRowi
16f20 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  d has just been 
16f30 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
16f40 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
16f50 65 2e 20 41 73 20 69 74 20 69 73 0a 2a 2a 20 74  e. As it is.** t
16f60 68 65 20 66 69 72 73 74 20 6f 6e 20 69 74 73 20  he first on its 
16f70 70 61 67 65 2c 20 61 70 70 65 6e 64 20 61 6e 20  page, append an 
16f80 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75 72  entry to the cur
16f90 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64  rent doclist-ind
16fa0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
16fb0 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  id fts5WriteDlid
16fc0 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49  xAppend(.  Fts5I
16fd0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
16fe0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
16ff0 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  er, .  i64 iRowi
17000 64 0a 29 7b 0a 20 20 69 36 34 20 69 56 61 6c 3b  d.){.  i64 iVal;
17010 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
17020 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 20  bDlidxPrevValid 
17030 29 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20 69 52  ){.    iVal = iR
17040 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e  owid - pWriter->
17050 69 44 6c 69 64 78 50 72 65 76 3b 0a 20 20 7d 65  iDlidxPrev;.  }e
17060 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
17070 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
17080 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
17090 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c  pWriter->cdlidx,
170a0 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 56   iRowid);.    iV
170b0 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  al = 1;.  }.  sq
170c0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
170d0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
170e0 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 63 64  rc, &pWriter->cd
170f0 6c 69 64 78 2c 20 69 56 61 6c 29 3b 0a 20 20 70  lidx, iVal);.  p
17100 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72  Writer->bDlidxPr
17110 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 70  evValid = 1;.  p
17120 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78 50 72  Writer->iDlidxPr
17130 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a  ev = iRowid;.}..
17140 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
17150 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46  WriteFlushLeaf(F
17160 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
17170 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
17180 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ter){.  static c
17190 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d  onst u8 zero[] =
171a0 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30   { 0x00, 0x00, 0
171b0 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46  x00, 0x00 };.  F
171c0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
171d0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
171e0 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 69  >aWriter[0];.  i
171f0 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 69 66  64 iRowid;..  if
17200 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
17210 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
17220 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61     /* No term wa
17230 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
17240 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  s page. */.    a
17250 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65  ssert( 0==fts5Ge
17260 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
17270 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66 74  .p[2]) );.    ft
17280 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
17290 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  rm(p, pWriter);.
172a0 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
172b0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
172c0 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a 20   to the db. */. 
172d0 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53   iRowid = FTS5_S
172e0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72  EGMENT_ROWID(pWr
172f0 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69  iter->iIdx, pWri
17300 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20  ter->iSegid, 0, 
17310 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
17320 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
17330 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e   iRowid, pPage->
17340 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75  buf.p, pPage->bu
17350 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  f.n);..  /* Init
17360 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20  ialize the next 
17370 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42  page. */.  fts5B
17380 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65  ufferZero(&pPage
17390 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75  ->buf);.  fts5Bu
173a0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
173b0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
173c0 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20  uf, 4, zero);.  
173d0 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a  pPage->pgno++;..
173e0 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68    /* Increase th
173f0 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e  e leaves written
17400 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57   counter */.  pW
17410 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74  riter->nLeafWrit
17420 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65  ten++;..  /* The
17430 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20   new leaf holds 
17440 6e 6f 20 74 65 72 6d 73 20 2a 2f 0a 20 20 70 57  no terms */.  pW
17450 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
17460 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a  mInPage = 1;.}..
17470 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 72  /*.** Append ter
17480 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f  m pTerm/nTerm to
17490 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65 69   the segment bei
174a0 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20 74 68  ng written by th
174b0 65 20 77 72 69 74 65 72 20 70 61 73 73 65 64 0a  e writer passed.
174c0 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ** as the second
174d0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
174e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
174f0 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
17500 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
17510 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
17520 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
17530 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
17540 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
17550 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
17560 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
17570 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73 35  pendTerm(.  Fts5
17580 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
17590 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
175a0 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d  ter,.  int nTerm
175b0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
175c0 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65  m .){.  int nPre
175d0 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  fix;            
175e0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
175f0 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70 72   of prefix compr
17600 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20  ession for term 
17610 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  */.  Fts5PageWri
17620 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
17630 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
17640 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ];..  assert( pP
17650 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  age==0 || pPage-
17660 3e 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61  >buf.n==0 || pPa
17670 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20  ge->buf.n>4 );. 
17680 20 69 66 28 20 70 50 61 67 65 20 26 26 20 70 50   if( pPage && pP
17690 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b  age->buf.n==0 ){
176a0 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  .    /* Zero the
176b0 20 66 69 72 73 74 20 74 65 72 6d 20 61 6e 64 20   first term and 
176c0 66 69 72 73 74 20 64 6f 63 69 64 20 66 69 65 6c  first docid fiel
176d0 64 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63  ds */.    static
176e0 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d   const u8 zero[]
176f0 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c   = { 0x00, 0x00,
17700 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20   0x00, 0x00 };. 
17710 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
17720 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
17730 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20  &pPage->buf, 4, 
17740 7a 65 72 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  zero);.    asser
17750 74 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  t( pWriter->bFir
17760 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a  stTermInPage );.
17770 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 20    }.  if( p->rc 
17780 29 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69  ) return;.  .  i
17790 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
177a0 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a  stTermInPage ){.
177b0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
177c0 65 20 22 66 69 72 73 74 20 74 65 72 6d 22 20 66  e "first term" f
177d0 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65  ield of the page
177e0 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
177f0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62  assert( pPage->b
17800 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20 70 50  uf.p[2]==0 && pP
17810 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d 3d 30  age->buf.p[3]==0
17820 20 29 3b 0a 20 20 20 20 66 74 73 35 50 75 74 55   );.    fts5PutU
17830 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70  16(&pPage->buf.p
17840 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  [2], pPage->buf.
17850 6e 29 3b 0a 20 20 20 20 6e 50 72 65 66 69 78 20  n);.    nPrefix 
17860 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 0;.    if( pPa
17870 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20  ge->pgno!=1 ){. 
17880 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
17890 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
178a0 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20 69 73  n a leaf that is
178b0 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73   not the leftmos
178c0 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20  t leaf in.      
178d0 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  ** the segment b
178e0 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63  -tree. In this c
178f0 61 73 65 20 69 74 20 69 73 20 6e 65 63 65 73 73  ase it is necess
17900 61 72 79 20 74 6f 20 61 64 64 20 61 20 74 65 72  ary to add a ter
17910 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  m to.      ** th
17920 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  e b-tree hierarc
17930 68 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6c  hy that is (a) l
17940 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  arger than the l
17950 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20  argest term .   
17960 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72     ** already wr
17970 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67  itten to the seg
17980 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61  ment and (b) sma
17990 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ller than or equ
179a0 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  al to.      ** t
179b0 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68  his term. In oth
179c0 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66  er words, a pref
179d0 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65  ix of (pTerm/nTe
179e0 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a  rm) that is one.
179f0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f        ** byte lo
17a00 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f  nger than the lo
17a10 6e 67 65 73 74 20 70 72 65 66 69 78 20 28 70 54  ngest prefix (pT
17a20 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65  erm/nTerm) share
17a30 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20  s with the.     
17a40 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72   ** previous ter
17a50 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  m. .      **.   
17a60 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74     ** Usually, t
17a70 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  he previous term
17a80 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
17a90 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68   pPage->term. Th
17aa0 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20  e exception.    
17ab0 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20    ** is if this 
17ac0 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
17ad0 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20  m written in an 
17ae0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67  incremental-merg
17af0 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a  e step..      **
17b00 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
17b10 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  e previous term 
17b20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
17b30 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20  , so just write 
17b40 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  a.      ** copy 
17b50 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  of (pTerm/nTerm)
17b60 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
17b70 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73   node. This is s
17b80 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a  lightly.      **
17b90 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75   inefficient, bu
17ba0 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e  t still correct.
17bb0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
17bc0 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20   = nTerm;.      
17bd0 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e  if( pPage->term.
17be0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d  n ){.        n =
17bf0 20 31 20 2b 20 66 74 73 35 50 72 65 66 69 78 43   1 + fts5PrefixC
17c00 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74  ompress(pPage->t
17c10 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65  erm.n, pPage->te
17c20 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65  rm.p, nTerm, pTe
17c30 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
17c40 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65     fts5WriteBtre
17c50 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72  eTerm(p, pWriter
17c60 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  , n, pTerm);.   
17c70 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69     pPage = &pWri
17c80 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b  ter->aWriter[0];
17c90 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
17ca0 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74      nPrefix = ft
17cb0 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
17cc0 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20  (pPage->term.n, 
17cd0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e  pPage->term.p, n
17ce0 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
17cf0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
17d00 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
17d10 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50   &pPage->buf, nP
17d20 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  refix);.  }..  /
17d30 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d  * Append the num
17d40 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
17d50 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74  new data, then t
17d60 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74 73  he term data its
17d70 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  elf.  ** to the 
17d80 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42  page. */.  fts5B
17d90 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
17da0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
17db0 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
17dc0 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42  Prefix);.  fts5B
17dd0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
17de0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
17df0 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
17e00 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72  efix, &pTerm[nPr
17e10 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70  efix]);..  /* Up
17e20 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61 67  date the Fts5Pag
17e30 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65  eWriter.term fie
17e40 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ld. */.  fts5Buf
17e50 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
17e60 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65  pPage->term, nTe
17e70 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57  rm, pTerm);.  pW
17e80 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
17e90 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  mInPage = 0;..  
17ea0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
17eb0 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
17ec0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
17ed0 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
17ee0 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  = 1;..  /* If th
17ef0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
17f00 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75  age is full, flu
17f10 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a  sh it to disk. *
17f20 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62  /.  if( pPage->b
17f30 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  uf.n>=p->pConfig
17f40 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66 74  ->pgsz ){.    ft
17f50 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
17f60 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
17f70 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
17f80 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31  tRowidInPage = 1
17f90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
17fa0 70 70 65 6e 64 20 61 20 64 6f 63 69 64 20 61 6e  ppend a docid an
17fb0 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  d position-list 
17fc0 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68  size field to th
17fd0 65 20 77 72 69 74 65 72 73 20 6f 75 74 70 75 74  e writers output
17fe0 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
17ff0 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
18000 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e  dRowid(.  Fts5In
18010 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
18020 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
18030 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  r,.  i64 iRowid,
18040 0a 20 20 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20  .  int nPos.){. 
18050 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
18060 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
18070 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
18080 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  ge = &pWriter->a
18090 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 20 20  Writer[0];..    
180a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 6f  /* If this is to
180b0 20 62 65 20 74 68 65 20 66 69 72 73 74 20 64 6f   be the first do
180c0 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74  cid written to t
180d0 68 65 20 70 61 67 65 2c 20 73 65 74 20 74 68 65  he page, set the
180e0 20 0a 20 20 20 20 2a 2a 20 64 6f 63 69 64 2d 70   .    ** docid-p
180f0 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61  ointer in the pa
18100 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20  ge-header. Also 
18110 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74  append a value t
18120 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20  o the dlidx.    
18130 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61  ** buffer, in ca
18140 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  se a doclist-ind
18150 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ex is required. 
18160 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69   */.    if( pWri
18170 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
18180 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  InPage ){.      
18190 66 74 73 35 50 75 74 55 31 36 28 70 50 61 67 65  fts5PutU16(pPage
181a0 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
181b0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  buf.n);.      ft
181c0 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
181d0 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69  nd(p, pWriter, i
181e0 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  Rowid);.    }.. 
181f0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
18200 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66  docid. */.    if
18210 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
18220 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
18230 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  || pWriter->bFir
18240 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b  stRowidInPage ){
18250 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
18260 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
18270 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
18280 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  f, iRowid);.    
18290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
182a0 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52  ert( p->rc || iR
182b0 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50  owid>pWriter->iP
182c0 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  revRowid );.    
182d0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
182e0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
182f0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52   &pPage->buf, iR
18300 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e  owid - pWriter->
18310 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20  iPrevRowid);.   
18320 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e   }.    pWriter->
18330 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f  iPrevRowid = iRo
18340 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72  wid;.    pWriter
18350 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
18360 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  oclist = 0;.    
18370 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
18380 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
18390 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
183a0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
183b0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
183c0 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 69 66 28   nPos);..    if(
183d0 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70   pPage->buf.n>=p
183e0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
183f0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
18400 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
18410 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Writer);.      p
18420 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
18430 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  widInPage = 1;. 
18440 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
18450 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
18460 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e  eAppendPoslistIn
18470 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
18480 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
18490 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
184a0 69 6e 74 20 69 56 61 6c 0a 29 7b 0a 20 20 69 66  int iVal.){.  if
184b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
184c0 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61  OK ){.    Fts5Pa
184d0 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
184e0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
184f0 74 65 72 5b 30 5d 3b 0a 20 20 20 20 66 74 73 35  ter[0];.    fts5
18500 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
18510 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
18520 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20  e->buf, iVal);. 
18530 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75     if( pPage->bu
18540 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  f.n>=p->pConfig-
18550 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66  >pgsz ){.      f
18560 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
18570 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
18580 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46       pWriter->bF
18590 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
185a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 1;.    }.  }.}
185b0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
185c0 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
185d0 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35  listData(.  Fts5
185e0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
185f0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
18600 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ter, .  const u8
18610 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20   *aData, .  int 
18620 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50  nData.){.  Fts5P
18630 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
18640 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
18650 69 74 65 72 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74  iter[0];.  const
18660 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a   u8 *a = aData;.
18670 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b    int n = nData;
18680 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d  .  .  assert( p-
18690 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30  >pConfig->pgsz>0
186a0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
186b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
186c0 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
186d0 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d   n)>=p->pConfig-
186e0 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 6e 74  >pgsz ){.    int
186f0 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66   nReq = p->pConf
18700 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65  ig->pgsz - pPage
18710 2d 3e 62 75 66 2e 6e 3b 0a 20 20 20 20 69 6e 74  ->buf.n;.    int
18720 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20   nCopy = 0;.    
18730 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65  while( nCopy<nRe
18740 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64  q ){.      i64 d
18750 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70  ummy;.      nCop
18760 79 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  y += getVarint(&
18770 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29  a[nCopy], (u64*)
18780 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20  &dummy);.    }. 
18790 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
187a0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
187b0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f  &pPage->buf, nCo
187c0 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d  py, a);.    a +=
187d0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d   nCopy;.    n -=
187e0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35   nCopy;.    fts5
187f0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
18800 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
18810 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
18820 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a  owidInPage = 1;.
18830 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
18840 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
18850 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
18860 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
18870 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  , a);.  }.}..sta
18880 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
18890 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65  teAppendZerobyte
188a0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
188b0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
188c0 72 69 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75  riter){.  fts5Bu
188d0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
188e0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
188f0 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75  r->aWriter[0].bu
18900 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
18910 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63  Flush any data c
18920 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69  ached by the wri
18930 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ter object to th
18940 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65  e database. Free
18950 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   any.** allocati
18960 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
18970 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a  ith the writer..
18980 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18990 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a  ts5WriteFinish(.
189a0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
189b0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
189c0 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
189d0 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
189e0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ect */.  int *pn
189f0 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
18a00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
18a10 20 48 65 69 67 68 74 20 6f 66 20 74 68 65 20 62   Height of the b
18a20 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  -tree */.  int *
18a30 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20  pnLeaf          
18a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
18a50 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  T: Number of lea
18a60 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65  f pages in b-tre
18a70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
18a80 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
18a90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
18aa0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
18ab0 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d  Leaf = &pWriter-
18ac0 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 20  >aWriter[0];.   
18ad0 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f   if( pLeaf->pgno
18ae0 3d 3d 31 20 26 26 20 70 4c 65 61 66 2d 3e 62 75  ==1 && pLeaf->bu
18af0 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
18b00 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  *pnLeaf = 0;.   
18b10 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 30     *pnHeight = 0
18b20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18b30 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75     if( pLeaf->bu
18b40 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 20  f.n>4 ){.       
18b50 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
18b60 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
18b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
18b80 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e  pnLeaf = pLeaf->
18b90 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 20 20 69 66  pgno-1;.      if
18ba0 28 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74  ( pWriter->nWrit
18bb0 65 72 3d 3d 31 20 26 26 20 70 57 72 69 74 65 72  er==1 && pWriter
18bc0 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d  ->nEmpty>=FTS5_M
18bd0 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b  IN_DLIDX_SIZE ){
18be0 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69  .        fts5Wri
18bf0 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c 20 70  teBtreeGrow(p, p
18c00 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Writer);.      }
18c10 0a 20 20 20 20 20 20 69 66 28 20 70 57 72 69 74  .      if( pWrit
18c20 65 72 2d 3e 6e 57 72 69 74 65 72 3e 31 20 29 7b  er->nWriter>1 ){
18c30 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69  .        fts5Wri
18c40 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c  teBtreeNEmpty(p,
18c50 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
18c60 20 7d 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67   }.      *pnHeig
18c70 68 74 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 57  ht = pWriter->nW
18c80 72 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 66 6f  riter;..      fo
18c90 72 28 69 3d 31 3b 20 69 3c 70 57 72 69 74 65 72  r(i=1; i<pWriter
18ca0 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b  ->nWriter; i++){
18cb0 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 61 67  .        Fts5Pag
18cc0 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26  eWriter *pPg = &
18cd0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
18ce0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73  [i];.        fts
18cf0 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
18d00 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
18d10 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
18d20 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
18d30 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
18d40 20 70 50 67 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20   pPg->pgno), .  
18d50 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 62            pPg->b
18d60 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e  uf.p, pPg->buf.n
18d70 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
18d80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
18d90 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74  for(i=0; i<pWrit
18da0 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b  er->nWriter; i++
18db0 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57  ){.    Fts5PageW
18dc0 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57  riter *pPg = &pW
18dd0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69  riter->aWriter[i
18de0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
18df0 50 67 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c  Pg || p->rc!=SQL
18e00 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66  ITE_OK );.    if
18e10 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 66  ( pPg ){.      f
18e20 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
18e30 50 67 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 20  Pg->term);.     
18e40 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
18e50 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20 20 20 20  &pPg->buf);.    
18e60 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
18e70 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 57  free(pWriter->aW
18e80 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  riter);.  sqlite
18e90 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
18ea0 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78  &pWriter->cdlidx
18eb0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
18ec0 64 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  d fts5WriteInit(
18ed0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
18ee0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
18ef0 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
18f00 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65  nt iIdx, int iSe
18f10 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28  gid.){.  memset(
18f20 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  pWriter, 0, size
18f30 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
18f40 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  ));.  pWriter->i
18f50 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57  Idx = iIdx;.  pW
18f60 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  riter->iSegid = 
18f70 69 53 65 67 69 64 3b 0a 0a 20 20 70 57 72 69 74  iSegid;..  pWrit
18f80 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 28 46  er->aWriter = (F
18f90 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29 66  ts5PageWriter*)f
18fa0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 73  ts5IdxMalloc(p,s
18fb0 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72  izeof(Fts5PageWr
18fc0 69 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70 57  iter));.  if( pW
18fd0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 3d 3d  riter->aWriter==
18fe0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 57  0 ) return;.  pW
18ff0 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d  riter->nWriter =
19000 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61   1;.  pWriter->a
19010 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d  Writer[0].pgno =
19020 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
19030 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
19040 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  = 1;.}..static v
19050 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69  oid fts5WriteIni
19060 74 46 6f 72 41 70 70 65 6e 64 28 0a 20 20 46 74  tForAppend(.  Ft
19070 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19090 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
190a0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
190b0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
190c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
190d0 74 65 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ter to initializ
190e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  e */.  int iIdx,
190f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19100 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19110 73 65 67 6d 65 6e 74 20 69 73 20 61 20 70 61 72  segment is a par
19120 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53 74  t of */.  Fts5St
19130 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
19140 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
19150 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f 20 61  ment object to a
19160 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  ppend to */.){. 
19170 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70 53 65   int nByte = pSe
19180 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73 69 7a  g->nHeight * siz
19190 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
191a0 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 57  er);.  memset(pW
191b0 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
191c0 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
191d0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64  ;.  pWriter->iId
191e0 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57 72 69  x = iIdx;.  pWri
191f0 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 70 53  ter->iSegid = pS
19200 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 70 57  eg->iSegid;.  pW
19210 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d  riter->aWriter =
19220 20 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72   (Fts5PageWriter
19230 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
19240 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 57 72  p, nByte);.  pWr
19250 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20  iter->nWriter = 
19260 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3b 0a 0a  pSeg->nHeight;..
19270 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
19290 74 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20  t pgno = 1;.    
192a0 69 6e 74 20 69 3b 0a 20 20 20 20 70 57 72 69 74  int i;.    pWrit
192b0 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70  er->aWriter[0].p
192c0 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
192d0 4c 61 73 74 2b 31 3b 0a 20 20 20 20 66 6f 72 28  Last+1;.    for(
192e0 69 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d  i=pSeg->nHeight-
192f0 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
19300 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
19310 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
19320 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64  WID(pWriter->iId
19330 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  x, pWriter->iSeg
19340 69 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a 20 20  id, i, pgno);.  
19350 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
19360 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74  er *pPg = &pWrit
19370 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a  er->aWriter[i];.
19380 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20        pPg->pgno 
19390 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74  = pgno;.      ft
193a0 73 35 44 61 74 61 42 75 66 66 65 72 28 70 2c 20  s5DataBuffer(p, 
193b0 26 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f 77 69  &pPg->buf, iRowi
193c0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  d);.      if( p-
193d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
193e0 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 4e 6f  {.        Fts5No
193f0 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20 20  deIter ss;.     
19400 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49     fts5NodeIterI
19410 6e 69 74 28 70 50 67 2d 3e 62 75 66 2e 70 2c 20  nit(pPg->buf.p, 
19420 70 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73 73 29  pPg->buf.n, &ss)
19430 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
19440 20 73 73 2e 61 44 61 74 61 20 29 20 66 74 73 35   ss.aData ) fts5
19450 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
19460 3e 72 63 2c 20 26 73 73 29 3b 0a 20 20 20 20 20  >rc, &ss);.     
19470 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
19480 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 74  (&p->rc, &pPg->t
19490 65 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c 20  erm, ss.term.n, 
194a0 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20  ss.term.p);.    
194b0 20 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e 69 43      pgno = ss.iC
194c0 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20 66 74  hild;.        ft
194d0 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26  s5NodeIterFree(&
194e0 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ss);.      }.   
194f0 20 7d 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d   }.    if( pSeg-
19500 3e 6e 48 65 69 67 68 74 3d 3d 31 20 29 7b 0a 20  >nHeight==1 ){. 
19510 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 45       pWriter->nE
19520 6d 70 74 79 20 3d 20 70 53 65 67 2d 3e 70 67 6e  mpty = pSeg->pgn
19530 6f 4c 61 73 74 2d 31 3b 0a 20 20 20 20 7d 0a 20  oLast-1;.    }. 
19540 20 20 20 61 73 73 65 72 74 28 20 28 70 67 6e 6f     assert( (pgno
19550 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79  +pWriter->nEmpty
19560 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  )==pSeg->pgnoLas
19570 74 20 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72  t );.    pWriter
19580 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
19590 67 65 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65  ge = 1;.    asse
195a0 72 74 28 20 70 57 72 69 74 65 72 2d 3e 61 57 72  rt( pWriter->aWr
195b0 69 74 65 72 5b 30 5d 2e 74 65 72 6d 2e 6e 3d 3d  iter[0].term.n==
195c0 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  0 );.  }.}../*.*
195d0 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
195e0 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65   was used to ite
195f0 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
19600 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
19610 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72  of on an.** incr
19620 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70  emental merge op
19630 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  eration. This fu
19640 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
19650 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   if the incremen
19660 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65  tal.** merge ste
19670 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62  p has finished b
19680 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  ut the input has
19690 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65   not been comple
196a0 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a  tely exhausted..
196b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
196c0 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
196d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
196e0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
196f0 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
19700 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
19710 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66  f;.  memset(&buf
19720 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
19730 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72 28  Buffer));.  for(
19740 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
19750 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  eg; i++){.    Ft
19760 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
19770 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
19780 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ];.    if( pSeg-
19790 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >pSeg==0 ){.    
197a0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
197b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 67    }else if( pSeg
197c0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
197d0 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20      /* All keys 
197e0 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20  from this input 
197f0 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62 65 65  segment have bee
19800 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f 20  n transfered to 
19810 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 20  the output..    
19820 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20 74 68    ** Set both th
19830 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74  e first and last
19840 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f   page-numbers to
19850 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74   0 to indicate t
19860 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
19870 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20   segment is now 
19880 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
19890 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
198a0 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Last = 0;.      
198b0 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
198c0 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  First = 0;.    }
198d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
198e0 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65  iOff = pSeg->iTe
198f0 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20  rmLeafOffset;   
19900 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e    /* Offset on n
19910 65 77 20 66 69 72 73 74 20 6c 65 61 66 20 70 61  ew first leaf pa
19920 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  ge */.      i64 
19930 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20  iLeafRowid;.    
19940 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
19950 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  a;.      int iId
19960 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69   = pSeg->pSeg->i
19970 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20  Segid;.      u8 
19980 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c  aHdr[4] = {0x00,
19990 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
199a0 34 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66  4};..      iLeaf
199b0 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
199c0 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
199d0 3e 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 70  >iIdx, iId, 0, p
199e0 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
199f0 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61  no);.      pData
19a00 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
19a10 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  p, iLeafRowid);.
19a20 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 20        if( pData 
19a30 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
19a40 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b  ufferZero(&buf);
19a50 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
19a60 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
19a70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65  ->rc, &buf, size
19a80 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b  of(aHdr), aHdr);
19a90 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
19aa0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19ab0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
19ac0 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  eg->term.n);.   
19ad0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
19ae0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
19af0 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
19b00 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d  rm.n, pSeg->term
19b10 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .p);.        fts
19b20 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
19b30 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
19b40 70 44 61 74 61 2d 3e 6e 20 2d 20 69 4f 66 66 2c  pData->n - iOff,
19b50 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d   &pData->p[iOff]
19b60 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
19b70 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
19b80 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d  );.        pSeg-
19b90 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
19ba0 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
19bb0 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20  afPgno;.        
19bc0 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
19bd0 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
19be0 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c  OWID(pSeg->iIdx,
19bf0 20 69 49 64 2c 20 30 2c 20 31 29 2c 69 4c 65 61   iId, 0, 1),iLea
19c00 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  fRowid);.       
19c10 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
19c20 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75  , iLeafRowid, bu
19c30 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
19c40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
19c50 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
19c60 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  &buf);.}../*.**.
19c70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
19c80 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
19c90 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  el(.  Fts5Index 
19ca0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19cb0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
19cc0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
19cd0 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f    /* Index to wo
19d00 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53  rk on */.  Fts5S
19d10 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
19d20 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
19d30 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
19d40 66 20 69 6e 64 65 78 20 69 49 64 78 20 2a 2f 0a  f index iIdx */.
19d50 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20    int iLvl,     
19d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d70 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65    /* Level to re
19d80 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f  ad input from */
19d90 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20  .  int *pnRem   
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74     /* Write up t
19dc0 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70  o this many outp
19dd0 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a  ut leaves */.){.
19de0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
19df0 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
19e00 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
19e10 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
19e20 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
19e30 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73  vel[iLvl];.  Fts
19e40 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
19e50 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35  *pLvlOut;.  Fts5
19e60 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
19e70 74 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ter = 0;    /* I
19e80 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20  terator to read 
19e90 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20  input data */.  
19ea0 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d  int nRem = pnRem
19eb0 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20   ? *pnRem : 0;  
19ec0 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70  /* Output leaf p
19ed0 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
19ee0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  te */.  int nInp
19ef0 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
19f00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19f10 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
19f20 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  nts */.  Fts5Seg
19f30 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20  Writer writer;  
19f40 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
19f50 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  er object */.  F
19f60 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
19f70 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
19f80 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  * Output segment
19f90 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
19fa0 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 52 65   term;.  int bRe
19fb0 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d  quireDoclistTerm
19fc0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44 6f 63 6c   = 0;    /* Docl
19fd0 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 28  ist terminator (
19fe0 30 78 30 30 29 20 72 65 71 75 69 72 65 64 20 2a  0x00) required *
19ff0 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b  /.  int bOldest;
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1a020 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1a030 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20  t is the oldest 
1a040 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
1a050 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1a060 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
1a070 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
1a080 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d  vl->nSeg );..  m
1a090 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1a0a0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
1a0b0 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Writer));.  mems
1a0c0 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
1a0d0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1a0e0 3b 0a 20 20 77 72 69 74 65 72 2e 69 49 64 78 20  ;.  writer.iIdx 
1a0f0 3d 20 69 49 64 78 3b 0a 20 20 69 66 28 20 70 4c  = iIdx;.  if( pL
1a100 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20  vl->nMerge ){.  
1a110 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74    pLvlOut = &pSt
1a120 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1a130 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l+1];.    assert
1a140 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e  ( pLvlOut->nSeg>
1a150 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20  0 );.    nInput 
1a160 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a  = pLvl->nMerge;.
1a170 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
1a180 74 46 6f 72 41 70 70 65 6e 64 28 70 2c 20 26 77  tForAppend(p, &w
1a190 72 69 74 65 72 2c 20 69 49 64 78 2c 20 26 70 4c  riter, iIdx, &pL
1a1a0 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
1a1b0 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 29 3b 0a 20  Out->nSeg-1]);. 
1a1c0 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
1a1d0 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
1a1e0 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20 7d 65 6c  ->nSeg-1];.  }el
1a1f0 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  se{.    int iSeg
1a200 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74  id = fts5Allocat
1a210 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63  eSegid(p, pStruc
1a220 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65  t);..    /* Exte
1a230 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63  nd the Fts5Struc
1a240 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72  ture object as r
1a250 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72  equired to ensur
1a260 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  e the output.   
1a270 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73   ** segment exis
1a280 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ts. */.    if( i
1a290 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c  Lvl==pStruct->nL
1a2a0 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  evel-1 ){.      
1a2b0 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
1a2c0 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70  Level(&p->rc, pp
1a2d0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
1a2e0 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1a2f0 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ct;.    }.    ft
1a300 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
1a310 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
1a320 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20  Struct, iLvl+1, 
1a330 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
1a340 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
1a350 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75     pLvl = &pStru
1a360 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1a370 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20  ;.    pLvlOut = 
1a380 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1a390 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66  [iLvl+1];..    f
1a3a0 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1a3b0 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c 20 69  &writer, iIdx, i
1a3c0 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  Segid);..    /* 
1a3d0 41 64 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d  Add the new segm
1a3e0 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ent to the outpu
1a3f0 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  t level */.    i
1a400 66 28 20 69 4c 76 6c 2b 31 3d 3d 70 53 74 72 75  f( iLvl+1==pStru
1a410 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 20 70 53 74  ct->nLevel ) pSt
1a420 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a  ruct->nLevel++;.
1a430 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c      pSeg = &pLvl
1a440 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75  Out->aSeg[pLvlOu
1a450 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c  t->nSeg];.    pL
1a460 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20  vlOut->nSeg++;. 
1a470 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
1a480 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67  st = 1;.    pSeg
1a490 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1a4a0 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  d;..    /* Read 
1a4b0 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73  input from all s
1a4c0 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  egments in the i
1a4d0 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  nput level */.  
1a4e0 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d    nInput = pLvl-
1a4f0 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c  >nSeg;.  }.  bOl
1a500 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d  dest = (pLvlOut-
1a510 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72  >nSeg==1 && pStr
1a520 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76  uct->nLevel==iLv
1a530 6c 2b 32 29 3b 0a 0a 23 69 66 20 30 0a 66 70 72  l+2);..#if 0.fpr
1a540 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 6d 65  intf(stdout, "me
1a550 72 67 69 6e 67 20 25 64 20 73 65 67 6d 65 6e 74  rging %d segment
1a560 73 20 66 72 6f 6d 20 6c 65 76 65 6c 20 25 64 21  s from level %d!
1a570 22 2c 20 6e 49 6e 70 75 74 2c 20 69 4c 76 6c 29  ", nInput, iLvl)
1a580 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ;.fflush(stdout)
1a590 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
1a5a0 72 74 28 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20  rt( iLvl>=0 );. 
1a5b0 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
1a5c0 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
1a5d0 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c  , iIdx, 0, 0, 0,
1a5e0 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74   0, iLvl, nInput
1a5f0 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
1a600 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1a610 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a  f(p, pIter)==0;.
1a620 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1a630 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
1a640 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20  , 0, 0).  ){.   
1a650 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1a660 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
1a670 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
1a680 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
1a690 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20    Fts5ChunkIter 
1a6a0 73 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20  sPos;           
1a6b0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
1a6c0 74 65 20 74 68 72 6f 75 67 68 20 70 6f 73 69 74  te through posit
1a6d0 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  ion list */.    
1a6e0 69 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20  int nPos;       
1a6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a700 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
1a710 69 7a 65 20 66 69 65 6c 64 20 76 61 6c 75 65 20  ize field value 
1a720 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  */.    int nTerm
1a730 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  ;.    const u8 *
1a740 70 54 65 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 43  pTerm;..    /* C
1a750 68 65 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e  heck for key ann
1a760 69 68 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ihilation. */.  
1a770 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 50 6f 73    if( pSeg->nPos
1a780 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20  ==0 && (bOldest 
1a790 7c 7c 20 70 53 65 67 2d 3e 62 44 65 6c 3d 3d 30  || pSeg->bDel==0
1a7a0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20  ) ) continue;.. 
1a7b0 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1a7c0 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26 73  Init(p, pSeg, &s
1a7d0 50 6f 73 29 3b 0a 0a 20 20 20 20 70 54 65 72 6d  Pos);..    pTerm
1a7e0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1a7f0 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65  Term(pIter, &nTe
1a800 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 6e 54 65  rm);.    if( nTe
1a810 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65  rm!=term.n || me
1a820 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72 6d  mcmp(pTerm, term
1a830 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20  .p, nTerm) ){.  
1a840 20 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26 26      if( pnRem &&
1a850 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72 69   writer.nLeafWri
1a860 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20  tten>nRem ){.   
1a870 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
1a880 65 72 52 65 6c 65 61 73 65 28 26 73 50 6f 73 29  erRelease(&sPos)
1a890 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1a8a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1a8b0 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65 77  /* This is a new
1a8c0 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61 20   term. Append a 
1a8d0 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74 70  term to the outp
1a8e0 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  ut segment. */. 
1a8f0 20 20 20 20 20 69 66 28 20 62 52 65 71 75 69 72       if( bRequir
1a900 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 29 7b 0a  eDoclistTerm ){.
1a910 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
1a920 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65 28  eAppendZerobyte(
1a930 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
1a940 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57     }.      fts5W
1a950 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70  riteAppendTerm(p
1a960 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d  , &writer, nTerm
1a970 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1a980 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
1a990 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65  ->rc, &term, nTe
1a9a0 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
1a9b0 20 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73    bRequireDoclis
1a9c0 74 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 7d  tTerm = 1;.    }
1a9d0 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
1a9e0 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65  the rowid to the
1a9f0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f   output */.    /
1aa00 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
1aa10 5a 45 20 2a 2f 0a 20 20 20 20 6e 50 6f 73 20 3d  ZE */.    nPos =
1aa20 20 70 53 65 67 2d 3e 6e 50 6f 73 2a 32 20 2b 20   pSeg->nPos*2 + 
1aa30 70 53 65 67 2d 3e 62 44 65 6c 3b 0a 20 20 20 20  pSeg->bDel;.    
1aa40 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
1aa50 6f 77 69 64 28 70 2c 20 26 77 72 69 74 65 72 2c  owid(p, &writer,
1aa60 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
1aa70 77 69 64 28 70 49 74 65 72 29 2c 20 6e 50 6f 73  wid(pIter), nPos
1aa80 29 3b 0a 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e  );..    for(/* n
1aa90 6f 6f 70 20 2a 2f 3b 20 21 66 74 73 35 43 68 75  oop */; !fts5Chu
1aaa0 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50  nkIterEof(p, &sP
1aab0 6f 73 29 3b 20 66 74 73 35 43 68 75 6e 6b 49 74  os); fts5ChunkIt
1aac0 65 72 4e 65 78 74 28 70 2c 20 26 73 50 6f 73 29  erNext(p, &sPos)
1aad0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
1aae0 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44  teAppendPoslistD
1aaf0 61 74 61 28 70 2c 20 26 77 72 69 74 65 72 2c 20  ata(p, &writer, 
1ab00 73 50 6f 73 2e 70 2c 20 73 50 6f 73 2e 6e 29 3b  sPos.p, sPos.n);
1ab10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
1ab20 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65  ChunkIterRelease
1ab30 28 26 73 50 6f 73 29 3b 0a 20 20 7d 0a 0a 20 20  (&sPos);.  }..  
1ab40 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73  /* Flush the las
1ab50 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64  t leaf page to d
1ab60 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74  isk. Set the out
1ab70 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  put segment b-tr
1ab80 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61  ee height.  ** a
1ab90 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  nd last leaf pag
1aba0 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20  e number at the 
1abb0 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20  same time.  */. 
1abc0 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
1abd0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53  (p, &writer, &pS
1abe0 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20 26 70 53  eg->nHeight, &pS
1abf0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  eg->pgnoLast);..
1ac00 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
1ac10 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1ac20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a   ){.    int i;..
1ac30 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
1ac40 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d  e redundant segm
1ac50 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f  ents from the %_
1ac60 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
1ac70 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e    for(i=0; i<nIn
1ac80 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  put; i++){.     
1ac90 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53   fts5DataRemoveS
1aca0 65 67 6d 65 6e 74 28 70 2c 20 69 49 64 78 2c 20  egment(p, iIdx, 
1acb0 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53  pLvl->aSeg[i].iS
1acc0 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  egid);.    }..  
1acd0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1ace0 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e  redundant segmen
1acf0 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ts from the inpu
1ad00 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  t level */.    i
1ad10 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e  f( pLvl->nSeg!=n
1ad20 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69  Input ){.      i
1ad30 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c  nt nMove = (pLvl
1ad40 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29  ->nSeg - nInput)
1ad50 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
1ad60 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
1ad70 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  .      memmove(p
1ad80 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c  Lvl->aSeg, &pLvl
1ad90 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20  ->aSeg[nInput], 
1ada0 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMove);.    }.  
1adb0 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20    pLvl->nSeg -= 
1adc0 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c  nInput;.    pLvl
1add0 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  ->nMerge = 0;.  
1ade0 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f    if( pSeg->pgno
1adf0 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
1ae00 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d   pLvlOut->nSeg--
1ae10 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1ae20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65  .    assert( pSe
1ae30 67 2d 3e 6e 48 65 69 67 68 74 3e 30 20 26 26 20  g->nHeight>0 && 
1ae40 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30  pSeg->pgnoLast>0
1ae50 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69 6d   );.    fts5Trim
1ae60 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74 65  Segments(p, pIte
1ae70 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d  r);.    pLvl->nM
1ae80 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20  erge = nInput;. 
1ae90 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49   }..  fts5MultiI
1aea0 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72  terFree(p, pIter
1aeb0 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
1aec0 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 69 66  ree(&term);.  if
1aed0 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52 65 6d  ( pnRem ) *pnRem
1aee0 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61 66   -= writer.nLeaf
1aef0 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  Written;.}../*.*
1af00 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65  * A total of nLe
1af10 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66  af leaf pages of
1af20 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20 62   data has just b
1af30 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 61  een flushed to a
1af40 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d   level-0.** segm
1af50 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 69 49  ents in index iI
1af60 64 78 20 77 69 74 68 20 73 74 72 75 63 74 75 72  dx with structur
1af70 65 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20  e pStruct. This 
1af80 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73  function updates
1af90 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 2d 63 6f   the.** write-co
1afa0 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67 6c  unter accordingl
1afb0 79 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  y and, if necess
1afc0 61 72 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e  ary, performs in
1afd0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 0a  cremental merge.
1afe0 2a 2a 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ** work..**.** I
1aff0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1b000 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  s, set the Fts5I
1b010 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
1b020 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  de. If an error 
1b030 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
1b040 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
1b050 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1b060 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1b070 69 64 20 66 74 73 35 49 6e 64 65 78 57 6f 72 6b  id fts5IndexWork
1b080 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1b090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b0a0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1b0b0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1b0c0 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0e0 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f 72 6b  /* Index to work
1b0f0 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72   on */.  Fts5Str
1b100 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1b110 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
1b120 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
1b130 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
1b140 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20  /.  int nLeaf   
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b160 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b170 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a   output leaves j
1b180 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29  ust written */.)
1b190 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1b1a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b1b0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1b1c0 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1b1d0 63 74 3b 0a 20 20 20 20 69 36 34 20 6e 57 72 69  ct;.    i64 nWri
1b1e0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1b1f0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
1b200 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d   value of write-
1b210 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
1b220 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20  nt nWork;       
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b240 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71  Number of work-q
1b250 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d  uanta to perform
1b260 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
1b270 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b280 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b290 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  of leaf pages le
1b2a0 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a  ft to write */..
1b2b0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1b2c0 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e  e write-counter.
1b2d0 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   While doing so,
1b2e0 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20   set nWork. */. 
1b2f0 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72     nWrite = pStr
1b300 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
1b310 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20  er;.    nWork = 
1b320 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66  ((nWrite + nLeaf
1b330 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  ) / p->nWorkUnit
1b340 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d  ) - (nWrite / p-
1b350 3e 6e 57 6f 72 6b 55 6e 69 74 29 3b 0a 20 20 20  >nWorkUnit);.   
1b360 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
1b370 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66  Counter += nLeaf
1b380 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 70 2d 3e  ;.    nRem = p->
1b390 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72  nWorkUnit * nWor
1b3a0 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  k * pStruct->nLe
1b3b0 76 65 6c 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  vel;..    while(
1b3c0 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
1b3d0 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b3f0 54 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  To iterate throu
1b400 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
1b410 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20     int iBestLvl 
1b420 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
1b430 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67  * Level offering
1b440 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20   the most input 
1b450 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
1b460 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b    int nBest = 0;
1b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b480 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
1b490 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73   segments on bes
1b4a0 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20  t level */..    
1b4b0 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76    /* Set iBestLv
1b4c0 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74  l to the level t
1b4d0 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73 65 67  o read input seg
1b4e0 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20  ments from. */. 
1b4f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74       assert( pSt
1b500 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29  ruct->nLevel>0 )
1b510 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c  ;.      for(iLvl
1b520 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
1b530 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
1b540 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
1b550 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
1b560 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
1b570 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
1b580 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
1b590 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20  nMerge ){.      
1b5a0 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
1b5b0 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20  erge>nBest ){.  
1b5c0 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74 4c            iBestL
1b5d0 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  vl = iLvl;.     
1b5e0 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
1b5f0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
1b600 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b610 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1b620 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1b630 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74  pLvl->nSeg>nBest
1b640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42   ){.          nB
1b650 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  est = pLvl->nSeg
1b660 3b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73  ;.          iBes
1b670 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
1b680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
1b690 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73        /* If nBes
1b6a0 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68  t is still 0, th
1b6b0 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73  en the index mus
1b6c0 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23  t be empty. */.#
1b6d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1b6e0 55 47 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76  UG.      for(iLv
1b6f0 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26  l=0; nBest==0 &&
1b700 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1b710 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1b720 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b730 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1b740 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b  iLvl].nSeg==0 );
1b750 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1b760 0a 20 20 20 20 20 20 69 66 28 20 6e 42 65 73 74  .      if( nBest
1b770 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75  <p->pConfig->nAu
1b780 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20 20 20  tomerge .       
1b790 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
1b7a0 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65  el[iBestLvl].nMe
1b7b0 72 67 65 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b  rge==0 .      ){
1b7c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1b7d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1b7e0 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
1b7f0 6c 28 70 2c 20 69 49 64 78 2c 20 26 70 53 74 72  l(p, iIdx, &pStr
1b800 75 63 74 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26  uct, iBestLvl, &
1b810 6e 52 65 6d 29 3b 0a 20 20 20 20 20 20 61 73 73  nRem);.      ass
1b820 65 72 74 28 20 6e 52 65 6d 3d 3d 30 20 7c 7c 20  ert( nRem==0 || 
1b830 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1b840 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
1b850 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1b860 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
1b870 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72  l[iBestLvl].nMer
1b880 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
1b890 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
1b8a0 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76  omote(p, iBestLv
1b8b0 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  l+1, pStruct);. 
1b8c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
1b8d0 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
1b8e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 7d 0a 0a  ;.    }..  }.}..
1b8f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1b900 49 6e 64 65 78 43 72 69 73 69 73 4d 65 72 67 65  IndexCrisisMerge
1b910 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1b920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b930 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1b940 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1b950 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
1b960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b970 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f 72 6b  /* Index to work
1b980 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72   on */.  Fts5Str
1b990 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1b9a0 74 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t        /* IN/O
1b9b0 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
1b9c0 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
1b9d0 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
1b9e0 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
1b9f0 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74  *ppStruct;.  int
1ba00 20 69 4c 76 6c 20 3d 20 30 3b 0a 20 20 77 68 69   iLvl = 0;.  whi
1ba10 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
1ba20 45 5f 4f 4b 20 0a 20 20 20 20 20 20 26 26 20 69  E_OK .      && i
1ba30 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
1ba40 76 65 6c 0a 20 20 20 20 20 20 26 26 20 70 53 74  vel.      && pSt
1ba50 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1ba60 6c 5d 2e 6e 53 65 67 3e 3d 70 2d 3e 70 43 6f 6e  l].nSeg>=p->pCon
1ba70 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67  fig->nCrisisMerg
1ba80 65 20 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35  e .  ){.    fts5
1ba90 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1baa0 70 2c 20 69 49 64 78 2c 20 26 70 53 74 72 75 63  p, iIdx, &pStruc
1bab0 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20  t, iLvl, 0);.   
1bac0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
1bad0 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c  omote(p, iLvl+1,
1bae0 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69   pStruct);.    i
1baf0 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Lvl++;.  }.  *pp
1bb00 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
1bb10 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1bb20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
1bb30 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
1bb40 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
1bb50 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
1bb60 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72  E_OK;.  return r
1bb70 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  c;.}..typedef st
1bb80 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74  ruct Fts5FlushCt
1bb90 78 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a  x Fts5FlushCtx;.
1bba0 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68  struct Fts5Flush
1bbb0 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65  Ctx {.  Fts5Inde
1bbc0 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53  x *pIdx;.  Fts5S
1bbd0 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  egWriter writer;
1bbe0 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66   .};../*.** Buff
1bbf0 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69  er aBuf[] contai
1bc00 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72  ns a list of var
1bc10 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20  ints, all small 
1bc20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a  enough to fit.**
1bc30 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74   in a 32-bit int
1bc40 65 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68 65  eger. Return the
1bc50 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72   size of the lar
1bc60 67 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74  gest prefix of t
1bc70 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61  his .** list nMa
1bc80 78 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 20  x bytes or less 
1bc90 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
1bca0 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c 69  ic int fts5Posli
1bcb0 73 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20 75  stPrefix(const u
1bcc0 38 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61  8 *aBuf, int nMa
1bcd0 78 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20  x){.  int ret;. 
1bce0 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65   u32 dummy;.  re
1bcf0 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  t = fts5GetVarin
1bd00 74 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79 29  t32(aBuf, dummy)
1bd10 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
1bd20 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35      int i = fts5
1bd30 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75  GetVarint32(&aBu
1bd40 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a  f[ret], dummy);.
1bd50 20 20 20 20 69 66 28 20 28 72 65 74 20 2b 20 69      if( (ret + i
1bd60 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61 6b  ) > nMax ) break
1bd70 3b 0a 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a  ;.    ret += i;.
1bd80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
1bd90 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  ;.}..#define fts
1bda0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1bdb0 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f  dBlob(pBuf, pBlo
1bdc0 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 5c 0a 20 20  b, nBlob) { \.  
1bdd0 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 53  assert( pBuf->nS
1bde0 70 61 63 65 3e 3d 28 70 42 75 66 2d 3e 6e 2b 6e  pace>=(pBuf->n+n
1bdf0 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20  Blob) );        
1be00 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28       \.  memcpy(
1be10 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
1be20 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29  ], pBlob, nBlob)
1be30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a  ;             \.
1be40 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e 42 6c    pBuf->n += nBl
1be50 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ob;             
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be70 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
1be80 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74  * Flush the cont
1be90 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  ents of in-memor
1bea0 79 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61  y hash table iHa
1beb0 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65  sh to a new leve
1bec0 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20  l-0 .** segment 
1bed0 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70  on disk. Also up
1bee0 64 61 74 65 20 74 68 65 20 63 6f 72 72 65 73 70  date the corresp
1bef0 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72 65  onding structure
1bf00 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49   record..**.** I
1bf10 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1bf20 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  s, set the Fts5I
1bf30 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
1bf40 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  de. If an error 
1bf50 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  has .** already 
1bf60 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
1bf70 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1bf80 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1bf90 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48  id fts5FlushOneH
1bfa0 61 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ash(Fts5Index *p
1bfb0 2c 20 69 6e 74 20 69 48 61 73 68 2c 20 69 6e 74  , int iHash, int
1bfc0 20 2a 70 6e 4c 65 61 66 29 7b 0a 20 20 46 74 73   *pnLeaf){.  Fts
1bfd0 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70  5Hash *pHash = p
1bfe0 2d 3e 61 70 48 61 73 68 5b 69 48 61 73 68 5d 3b  ->apHash[iHash];
1bff0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1c000 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74   *pStruct;.  int
1c010 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70   iSegid;.  int p
1c020 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20  gnoLast = 0;    
1c030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c040 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
1c050 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
1c060 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
1c070 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1c080 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
1c090 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ure and allocate
1c0a0 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69   a new segment-i
1c0b0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  d.  ** for the n
1c0c0 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65  ew level-0 segme
1c0d0 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63  nt.  */.  pStruc
1c0e0 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
1c0f0 65 52 65 61 64 28 70 2c 20 69 48 61 73 68 29 3b  eRead(p, iHash);
1c100 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74 73 35  .  iSegid = fts5
1c110 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c  AllocateSegid(p,
1c120 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69 66   pStruct);..  if
1c130 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20  ( iSegid ){.    
1c140 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
1c150 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1c160 7a 3b 0a 0a 20 20 20 20 46 74 73 35 53 74 72 75  z;..    Fts5Stru
1c170 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
1c180 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67  eg;   /* New seg
1c190 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72  ment within pStr
1c1a0 75 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  uct */.    int n
1c1b0 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  Height;         
1c1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67           /* Heig
1c1d0 68 74 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e  ht of new segmen
1c1e0 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  t b-tree */.    
1c1f0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1c200 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c210 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   Buffer in which
1c220 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61   to assemble lea
1c230 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 63 6f  f page */.    co
1c240 6e 73 74 20 75 38 20 2a 7a 50 72 65 76 20 3d 20  nst u8 *zPrev = 
1c250 30 3b 0a 0a 20 20 20 20 46 74 73 35 53 65 67 57  0;..    Fts5SegW
1c260 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20  riter writer;.  
1c270 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28    fts5WriteInit(
1c280 70 2c 20 26 77 72 69 74 65 72 2c 20 69 48 61 73  p, &writer, iHas
1c290 68 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  h, iSegid);..   
1c2a0 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65   /* Pre-allocate
1c2b0 20 74 68 65 20 62 75 66 66 65 72 20 75 73 65 64   the buffer used
1c2c0 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65 61   to assemble lea
1c2d0 66 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 74  f pages to the t
1c2e0 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 70 61 67  arget.    ** pag
1c2f0 65 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20 20  e size.  */.    
1c300 61 73 73 65 72 74 28 20 70 67 73 7a 3e 30 20 29  assert( pgsz>0 )
1c310 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77 72  ;.    pBuf = &wr
1c320 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e  iter.aWriter[0].
1c330 62 75 66 3b 0a 20 20 20 20 66 74 73 35 42 75 66  buf;.    fts5Buf
1c340 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
1c350 70 42 75 66 2c 20 70 67 73 7a 20 2b 20 32 30 29  pBuf, pgsz + 20)
1c360 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
1c370 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
1c380 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72   hash table entr
1c390 69 65 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ies. */.    if( 
1c3a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c3b0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
1c3c0 28 70 42 75 66 2d 3e 70 2c 20 30 2c 20 34 29 3b  (pBuf->p, 0, 4);
1c3d0 0a 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d  .      pBuf->n =
1c3e0 20 34 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   4;.      p->rc 
1c3f0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
1c400 68 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c  hScanInit(pHash,
1c410 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20   0, 0);.    }.. 
1c420 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1c430 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
1c440 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68  =sqlite3Fts5Hash
1c450 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29 20 29  ScanEof(pHash) )
1c460 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1c470 61 72 20 2a 7a 54 65 72 6d 3b 0a 20 20 20 20 20  ar *zTerm;.     
1c480 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20   int nTerm;.    
1c490 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63    const u8 *pDoc
1c4a0 6c 69 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  list;.      int 
1c4b0 6e 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  nDoclist;.      
1c4c0 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20 20 20  int nSuffix;    
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c4e0 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75 66 66  ize of term suff
1c4f0 69 78 20 2a 2f 0a 0a 20 20 20 20 20 20 73 71 6c  ix */..      sql
1c500 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
1c510 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a 54  Entry(pHash, &zT
1c520 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20  erm, &pDoclist, 
1c530 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  &nDoclist);.    
1c540 20 20 6e 54 65 72 6d 20 3d 20 73 74 72 6c 65 6e    nTerm = strlen
1c550 28 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20 20  (zTerm);..      
1c560 2f 2a 20 44 65 63 69 64 65 20 69 66 20 74 68 65  /* Decide if the
1c570 20 74 65 72 6d 20 77 69 6c 6c 20 66 69 74 20 6f   term will fit o
1c580 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  n the current le
1c590 61 66 2e 20 49 66 20 69 74 20 77 69 6c 6c 20 6e  af. If it will n
1c5a0 6f 74 2c 20 0a 20 20 20 20 20 20 2a 2a 20 66 6c  ot, .      ** fl
1c5b0 75 73 68 20 74 68 65 20 6c 65 61 66 20 74 6f 20  ush the leaf to 
1c5c0 64 69 73 6b 20 68 65 72 65 2e 20 20 2a 2f 0a 20  disk here.  */. 
1c5d0 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e       if( (pBuf->
1c5e0 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 20 3e  n + nTerm + 2) >
1c5f0 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20   pgsz ){.       
1c600 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1c610 65 61 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b  eaf(p, &writer);
1c620 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 3d 20  .        pBuf = 
1c630 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b  &writer.aWriter[
1c640 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20  0].buf;.        
1c650 69 66 28 20 28 6e 54 65 72 6d 20 2b 20 33 32 29  if( (nTerm + 32)
1c660 20 3e 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 20   > pBuf->nSpace 
1c670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
1c680 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1c690 72 63 2c 20 70 42 75 66 2c 20 6e 54 65 72 6d 20  rc, pBuf, nTerm 
1c6a0 2b 20 33 32 20 2d 20 70 42 75 66 2d 3e 6e 29 3b  + 32 - pBuf->n);
1c6b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1c6c0 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ->rc ) break;.  
1c6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c6e0 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
1c6f0 74 68 65 20 74 65 72 6d 20 74 6f 20 74 68 65 20  the term to the 
1c700 6c 65 61 66 2e 20 41 6e 64 20 70 75 73 68 20 69  leaf. And push i
1c710 74 20 75 70 20 69 6e 74 6f 20 74 68 65 20 62 2d  t up into the b-
1c720 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20 2a  tree hierarchy *
1c730 2f 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  /.      if( writ
1c740 65 72 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  er.bFirstTermInP
1c750 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
1c760 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 66 74 73    int nPre = fts
1c770 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
1c780 6e 54 65 72 6d 2c 20 7a 50 72 65 76 2c 20 6e 54  nTerm, zPrev, nT
1c790 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  erm, (const u8*)
1c7a0 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  zTerm);.        
1c7b0 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1c7c0 65 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  e3PutVarint(&pBu
1c7d0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e  f->p[pBuf->n], n
1c7e0 50 72 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 53  Pre);.        nS
1c7f0 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d 20  uffix = nTerm - 
1c800 6e 50 72 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nPre;.      }els
1c810 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 50  e{.        fts5P
1c820 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 32  utU16(&pBuf->p[2
1c830 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 0a 20 20 20  ], pBuf->n);.   
1c840 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72       writer.bFir
1c850 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30  stTermInPage = 0
1c860 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 72  ;.        if( wr
1c870 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e  iter.aWriter[0].
1c880 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20  pgno!=1 ){.     
1c890 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20 3d 20       int nPre = 
1c8a0 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
1c8b0 73 73 28 6e 54 65 72 6d 2c 20 7a 50 72 65 76 2c  ss(nTerm, zPrev,
1c8c0 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75   nTerm, (const u
1c8d0 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
1c8e0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
1c8f0 72 65 65 54 65 72 6d 28 70 2c 20 26 77 72 69 74  reeTerm(p, &writ
1c900 65 72 2c 20 6e 50 72 65 2b 31 2c 20 28 63 6f 6e  er, nPre+1, (con
1c910 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20  st u8*)zTerm);. 
1c920 20 20 20 20 20 20 20 20 20 70 42 75 66 20 3d 20           pBuf = 
1c930 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b  &writer.aWriter[
1c940 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20  0].buf;.        
1c950 20 20 61 73 73 65 72 74 28 20 6e 50 72 65 3c 6e    assert( nPre<n
1c960 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  Term );.        
1c970 7d 0a 20 20 20 20 20 20 20 20 6e 53 75 66 66 69  }.        nSuffi
1c980 78 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  x = nTerm;.     
1c990 20 7d 0a 20 20 20 20 20 20 70 42 75 66 2d 3e 6e   }.      pBuf->n
1c9a0 20 2b 3d 20 73 71 6c 69 74 65 33 50 75 74 56 61   += sqlite3PutVa
1c9b0 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  rint(&pBuf->p[pB
1c9c0 75 66 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78 29  uf->n], nSuffix)
1c9d0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
1c9e0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
1c9f0 28 70 42 75 66 2c 20 28 63 6f 6e 73 74 20 75 38  (pBuf, (const u8
1ca00 2a 29 26 7a 54 65 72 6d 5b 6e 54 65 72 6d 2d 6e  *)&zTerm[nTerm-n
1ca10 53 75 66 66 69 78 5d 2c 20 6e 53 75 66 66 69 78  Suffix], nSuffix
1ca20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 67  );..      if( pg
1ca30 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b 20 6e  sz>=(pBuf->n + n
1ca40 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a  Doclist + 1) ){.
1ca50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1ca60 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69  ntire doclist wi
1ca70 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75  ll fit on the cu
1ca80 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20  rrent leaf. */. 
1ca90 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1caa0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
1cab0 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20  pBuf, pDoclist, 
1cac0 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  nDoclist);.     
1cad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1cae0 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a  i64 iRowid = 0;.
1caf0 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c          i64 iDel
1cb00 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ta = 0;.        
1cb10 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20  int iOff = 0;.  
1cb20 20 20 20 20 20 20 69 6e 74 20 62 46 69 72 73 74        int bFirst
1cb30 44 6f 63 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20  Docid = 0;..    
1cb40 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
1cb50 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e  e doclist will n
1cb60 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c  ot fit on this l
1cb70 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  eaf. The followi
1cb80 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ng .        ** l
1cb90 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74 68 72  oop iterates thr
1cba0 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74  ough the poslist
1cbb0 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
1cbc0 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20  he current .    
1cbd0 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20      ** doclist. 
1cbe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
1cbf0 65 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74  e( iOff<nDoclist
1cc00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
1cc10 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  t nPos;.        
1cc20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20 20 20    int nCopy;.   
1cc30 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d         int bDumm
1cc40 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  y;.          iOf
1cc50 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  f += getVarint(&
1cc60 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
1cc70 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
1cc80 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
1cc90 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
1cca0 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69  Size(&pDoclist[i
1ccb0 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
1ccc0 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20  ummy);.         
1ccd0 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a   nCopy += nPos;.
1cce0 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64            iRowid
1ccf0 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
1cd00 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
1cd10 20 69 66 28 20 62 46 69 72 73 74 44 6f 63 69 64   if( bFirstDocid
1cd20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cd30 66 74 73 35 50 75 74 55 31 36 28 26 70 42 75 66  fts5PutU16(&pBuf
1cd40 2d 3e 70 5b 30 5d 2c 20 70 42 75 66 2d 3e 6e 29  ->p[0], pBuf->n)
1cd50 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 64 6f 63  ;   /* first doc
1cd60 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  id on page */.  
1cd70 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
1cd80 6e 20 2b 3d 20 73 71 6c 69 74 65 33 50 75 74 56  n += sqlite3PutV
1cd90 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
1cda0 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29  Buf->n], iRowid)
1cdb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 46  ;.            bF
1cdc0 69 72 73 74 44 6f 63 69 64 20 3d 20 30 3b 0a 20  irstDocid = 0;. 
1cdd0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57             fts5W
1cde0 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28  riteDlidxAppend(
1cdf0 70 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77  p, &writer, iRow
1ce00 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  id);.          }
1ce10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ce20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c    pBuf->n += sql
1ce30 69 74 65 33 50 75 74 56 61 72 69 6e 74 28 26 70  ite3PutVarint(&p
1ce40 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c  Buf->p[pBuf->n],
1ce50 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20   iDelta);.      
1ce60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1ce70 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c  assert( pBuf->n<
1ce80 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b  =pBuf->nSpace );
1ce90 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
1cea0 28 70 42 75 66 2d 3e 6e 20 2b 20 6e 43 6f 70 79  (pBuf->n + nCopy
1ceb0 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20  ) <= pgsz ){.   
1cec0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ced0 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77  entire poslist w
1cee0 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63  ill fit on the c
1cef0 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20  urrent leaf. So 
1cf00 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20 20  copy.           
1cf10 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f   ** it in one go
1cf20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1cf30 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
1cf40 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
1cf50 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
1cf60 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20   nCopy);.       
1cf70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cf80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
1cf90 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c  ire poslist will
1cfa0 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73   not fit on this
1cfb0 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65   leaf. So it nee
1cfc0 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ds.            *
1cfd0 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69  * to be broken i
1cfe0 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68  nto sections. Th
1cff0 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61  e only qualifica
1d000 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20  tion being.     
1d010 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65         ** that e
1d020 61 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20  ach varint must 
1d030 62 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67  be stored contig
1d040 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20  uously.  */.    
1d050 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38          const u8
1d060 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44   *pPoslist = &pD
1d070 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20  oclist[iOff];.  
1d080 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
1d090 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  os = 0;.        
1d0a0 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
1d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1d0c0 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20  t nSpace = pgsz 
1d0d0 2d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20  - pBuf->n;.     
1d0e0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
1d0f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1d100 20 20 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69    if( (nCopy - i
1d110 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a  Pos)<=nSpace ){.
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73  n = nCopy - iPos
1d140 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d150 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d160 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50         n = fts5P
1d170 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26 70 50  oslistPrefix(&pP
1d180 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53  oslist[iPos], nS
1d190 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  pace);.         
1d1a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1d1b0 3e 3d 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20  >=nSpace );.    
1d1c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d1d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d1e0 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ( n>0 );.       
1d1f0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1d200 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
1d210 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b  pBuf, &pPoslist[
1d220 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20  iPos], n);.     
1d230 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d           iPos +=
1d240 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
1d250 20 20 69 66 28 20 70 42 75 66 2d 3e 6e 3e 3d 70    if( pBuf->n>=p
1d260 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
1d270 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1d280 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72  FlushLeaf(p, &wr
1d290 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  iter);.         
1d2a0 20 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 77         pBuf = &w
1d2b0 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d  riter.aWriter[0]
1d2c0 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20  .buf;.          
1d2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d2e0 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43      if( iPos>=nC
1d2f0 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  opy ) break;.   
1d300 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d310 20 20 20 20 20 20 20 62 46 69 72 73 74 44 6f 63         bFirstDoc
1d320 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
1d330 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 4f    }.          iO
1d340 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  ff += nCopy;.   
1d350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
1d360 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42        pBuf->p[pB
1d370 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b  uf->n++] = '\0';
1d380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d390 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53  Buf->n<=pBuf->nS
1d3a0 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 7a 50  pace );.      zP
1d3b0 72 65 76 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a  rev = (const u8*
1d3c0 29 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 73 71  )zTerm;.      sq
1d3d0 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
1d3e0 6e 4e 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20  nNext(pHash);.  
1d3f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
1d400 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 48 61  ts5HashClear(pHa
1d410 73 68 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  sh);.    fts5Wri
1d420 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69  teFinish(p, &wri
1d430 74 65 72 2c 20 26 6e 48 65 69 67 68 74 2c 20 26  ter, &nHeight, &
1d440 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20  pgnoLast);..    
1d450 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
1d460 73 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20  s5Structure. It 
1d470 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
1d480 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d490 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74  by the.    ** ft
1d4a0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1d4b0 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e  se() call below.
1d4c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
1d4d0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20  ruct->nLevel==0 
1d4e0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
1d4f0 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
1d500 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29  p->rc, &pStruct)
1d510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
1d520 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
1d530 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
1d540 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  ruct, 0, 1, 0);.
1d550 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1d560 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d570 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
1d580 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65  t->aLevel[0].aSe
1d590 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  g[ pStruct->aLev
1d5a0 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a  el[0].nSeg++ ];.
1d5b0 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67        pSeg->iSeg
1d5c0 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
1d5d0 20 20 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74     pSeg->nHeight
1d5e0 20 3d 20 6e 48 65 69 67 68 74 3b 0a 20 20 20 20   = nHeight;.    
1d5f0 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
1d600 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65  t = 1;.      pSe
1d610 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67  g->pgnoLast = pg
1d620 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20  noLast;.    }.  
1d630 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
1d640 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74  romote(p, 0, pSt
1d650 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 0a 20 20 69  ruct);.  }...  i
1d660 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  f( p->pConfig->n
1d670 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 20 66 74  Automerge>0 ) ft
1d680 73 35 49 6e 64 65 78 57 6f 72 6b 28 70 2c 20 69  s5IndexWork(p, i
1d690 48 61 73 68 2c 20 26 70 53 74 72 75 63 74 2c 20  Hash, &pStruct, 
1d6a0 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73  pgnoLast);.  fts
1d6b0 35 49 6e 64 65 78 43 72 69 73 69 73 4d 65 72 67  5IndexCrisisMerg
1d6c0 65 28 70 2c 20 69 48 61 73 68 2c 20 26 70 53 74  e(p, iHash, &pSt
1d6d0 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72  ruct);.  fts5Str
1d6e0 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 69  uctureWrite(p, i
1d6f0 48 61 73 68 2c 20 70 53 74 72 75 63 74 29 3b 0a  Hash, pStruct);.
1d700 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
1d710 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
1d720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
1d730 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20  any data stored 
1d740 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
1d750 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20   hash tables to 
1d760 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1d770 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1d780 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35  5IndexFlush(Fts5
1d790 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
1d7a0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1d7b0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
1d7c0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
1d7f0 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
1d800 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  xes */.  int nLe
1d810 61 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  af = 0;         
1d820 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d830 65 72 20 6f 66 20 6c 65 61 76 65 73 20 77 72 69  er of leaves wri
1d840 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  tten */..  /* If
1d850 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
1d860 72 65 61 64 79 20 6f 63 63 75 72 65 64 20 74 68  ready occured th
1d870 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1d880 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  op. */.  if( p->
1d890 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1d8a0 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
1d8b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1d8c0 61 73 73 65 72 74 28 20 70 2d 3e 61 70 48 61 73  assert( p->apHas
1d8d0 68 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c 75 73 68  h );..  /* Flush
1d8e0 20 74 68 65 20 74 65 72 6d 73 20 61 6e 64 20 65   the terms and e
1d8f0 61 63 68 20 70 72 65 66 69 78 20 69 6e 64 65 78  ach prefix index
1d900 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 66 6f   to disk */.  fo
1d910 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69  r(i=0; i<=pConfi
1d920 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29  g->nPrefix; i++)
1d930 7b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f  {.    fts5FlushO
1d940 6e 65 48 61 73 68 28 70 2c 20 69 2c 20 26 6e 4c  neHash(p, i, &nL
1d950 65 61 66 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  eaf);.  }.  p->n
1d960 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b  PendingData = 0;
1d970 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
1d980 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  Fts5IndexOptimiz
1d990 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
1d9a0 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
1d9b0 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
1d9c0 66 69 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  fig;.  int i;.. 
1d9d0 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
1d9e0 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p);.  for(i=0; i
1d9f0 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
1da00 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  ix; i++){.    Ft
1da10 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1da20 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
1da30 74 75 72 65 52 65 61 64 28 70 2c 20 69 29 3b 0a  tureRead(p, i);.
1da40 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1da50 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  e *pNew = 0;.   
1da60 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 0a 20   int nSeg = 0;. 
1da70 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
1da80 7b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 66  {.      nSeg = f
1da90 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
1daa0 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
1dab0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53  t);.      if( nS
1dac0 65 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  eg>1 ){.        
1dad0 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
1dae0 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
1daf0 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65  );.        nByte
1db00 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c   += (pStruct->nL
1db10 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66  evel+1) * sizeof
1db20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
1db30 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  vel);.        pN
1db40 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  ew = (Fts5Struct
1db50 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ure*)sqlite3Fts5
1db60 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
1db70 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  c, nByte);.     
1db80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1db90 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 46   pNew ){.      F
1dba0 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
1dbb0 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 20 20 69  l *pLvl;.      i
1dbc0 6e 74 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20  nt nByte = nSeg 
1dbd0 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1dbe0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
1dbf0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76        pNew->nLev
1dc00 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c  el = pStruct->nL
1dc10 65 76 65 6c 2b 31 3b 0a 20 20 20 20 20 20 70 4e  evel+1;.      pN
1dc20 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ew->nWriteCounte
1dc30 72 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72  r = pStruct->nWr
1dc40 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20  iteCounter;.    
1dc50 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e    pLvl = &pNew->
1dc60 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e  aLevel[pStruct->
1dc70 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 70  nLevel];.      p
1dc80 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73  Lvl->aSeg = (Fts
1dc90 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1dca0 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
1dcb0 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
1dcc0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
1dcd0 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b  f( pLvl->aSeg ){
1dce0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 76  .        int iLv
1dcf0 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 20  l, iSeg;.       
1dd00 20 69 6e 74 20 69 53 65 67 4f 75 74 20 3d 20 30   int iSegOut = 0
1dd10 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 4c  ;.        for(iL
1dd20 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
1dd30 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1dd40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
1dd50 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
1dd60 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1dd70 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
1dd80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1dd90 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
1dda0 4f 75 74 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e  Out] = pStruct->
1ddb0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
1ddc0 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
1ddd0 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b 0a       iSegOut++;.
1dde0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ddf0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c      }.        pL
1de00 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b  vl->nSeg = nSeg;
1de10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1de20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1de30 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
1de40 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
1de50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
1de60 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
1de70 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e 65 77   int iLvl = pNew
1de80 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20 20 20  ->nLevel-1;.    
1de90 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1dea0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65  SQLITE_OK && pNe
1deb0 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  w->aLevel[iLvl].
1dec0 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSeg>0 ){.      
1ded0 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53    int nRem = FTS
1dee0 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b  5_OPT_WORK_UNIT;
1def0 0a 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64  .        fts5Ind
1df00 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
1df10 69 2c 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20  i, &pNew, iLvl, 
1df20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  &nRem);.      }.
1df30 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
1df40 74 75 72 65 57 72 69 74 65 28 70 2c 20 69 2c 20  tureWrite(p, i, 
1df50 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 66 74 73  pNew);.      fts
1df60 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1df70 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 0a  e(pNew);.    }..
1df80 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1df90 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1dfa0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1dfb0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
1dfc0 28 70 29 3b 20 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  (p); .}..../*.**
1dfd0 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65   Return a simple
1dfe0 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
1dff0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67  based on the arg
1e000 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  uments..*/.stati
1e010 63 20 75 36 34 20 66 74 73 35 49 6e 64 65 78 45  c u64 fts5IndexE
1e020 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34  ntryCksum(.  i64
1e030 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20   iRowid, .  int 
1e040 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f  iCol, .  int iPo
1e050 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
1e060 20 2a 70 54 65 72 6d 2c 20 0a 20 20 69 6e 74 20   *pTerm, .  int 
1e070 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69  nTerm.){.  int i
1e080 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52  ;.  u64 ret = iR
1e090 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28  owid;.  ret += (
1e0a0 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a  ret<<3) + iCol;.
1e0b0 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
1e0c0 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f 72 28  ) + iPos;.  for(
1e0d0 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
1e0e0 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  +) ret += (ret<<
1e0f0 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20  3) + pTerm[i];. 
1e100 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
1e110 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1e120 42 74 72 65 65 49 74 65 72 49 6e 69 74 28 0a 20  BtreeIterInit(. 
1e130 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1e140 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 46 74    int iIdx,.  Ft
1e150 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1e160 6e 74 20 2a 70 53 65 67 2c 20 0a 20 20 46 74 73  nt *pSeg, .  Fts
1e170 35 42 74 72 65 65 49 74 65 72 20 2a 70 49 74 65  5BtreeIter *pIte
1e180 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  r.){.  int nByte
1e190 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6e 42 79  ;.  int i;.  nBy
1e1a0 74 65 20 3d 20 73 69 7a 65 6f 66 28 70 49 74 65  te = sizeof(pIte
1e1b0 72 2d 3e 61 4c 76 6c 5b 30 5d 29 20 2a 20 28 70  r->aLvl[0]) * (p
1e1c0 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 29 3b  Seg->nHeight-1);
1e1d0 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
1e1e0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
1e1f0 72 29 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  r));.  if( nByte
1e200 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   ){.    pIter->a
1e210 4c 76 6c 20 3d 20 28 46 74 73 35 42 74 72 65 65  Lvl = (Fts5Btree
1e220 49 74 65 72 4c 65 76 65 6c 2a 29 66 74 73 35 49  IterLevel*)fts5I
1e230 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74  dxMalloc(p, nByt
1e240 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
1e250 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1e260 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76  {.    pIter->nLv
1e270 6c 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68  l = pSeg->nHeigh
1e280 74 2d 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  t-1;.    pIter->
1e290 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 20  iIdx = iIdx;.   
1e2a0 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a 20   pIter->p = p;. 
1e2b0 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d     pIter->pSeg =
1e2c0 20 70 53 65 67 3b 0a 20 20 7d 0a 20 20 66 6f 72   pSeg;.  }.  for
1e2d0 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
1e2e0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65  ITE_OK && i<pIte
1e2f0 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20  r->nLvl; i++){. 
1e300 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1e310 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1e320 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69  ID(iIdx, pSeg->i
1e330 53 65 67 69 64 2c 20 69 2b 31 2c 20 31 29 3b 0a  Segid, i+1, 1);.
1e340 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44      Fts5Data *pD
1e350 61 74 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ata;.    pIter->
1e360 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 20 3d 20  aLvl[i].pData = 
1e370 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
1e380 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b  Read(p, iRowid);
1e390 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29  .    if( pData )
1e3a0 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65  {.      fts5Node
1e3b0 49 74 65 72 49 6e 69 74 28 70 44 61 74 61 2d 3e  IterInit(pData->
1e3c0 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26 70 49  p, pData->n, &pI
1e3d0 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 73 29 3b  ter->aLvl[i].s);
1e3e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1e3f0 28 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 3d 3d 30  ( pIter->nLvl==0
1e400 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20   || p->rc ){.   
1e410 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
1e420 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
1e430 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  af = pSeg->pgnoL
1e440 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ast;.  }else{.  
1e450 20 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20    pIter->nEmpty 
1e460 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  = pIter->aLvl[0]
1e470 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 20 20 70  .s.nEmpty;.    p
1e480 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49  Iter->iLeaf = pI
1e490 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69  ter->aLvl[0].s.i
1e4a0 43 68 69 6c 64 3b 0a 20 20 20 20 70 49 74 65 72  Child;.    pIter
1e4b0 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72  ->bDlidx = pIter
1e4c0 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69  ->aLvl[0].s.bDli
1e4d0 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  dx;.  }.}..stati
1e4e0 63 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65  c void fts5Btree
1e4f0 49 74 65 72 4e 65 78 74 28 46 74 73 35 42 74 72  IterNext(Fts5Btr
1e500 65 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  eeIter *pIter){.
1e510 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d    Fts5Index *p =
1e520 20 70 49 74 65 72 2d 3e 70 3b 0a 20 20 69 6e 74   pIter->p;.  int
1e530 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
1e540 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 26 26  Iter->bEof==0 &&
1e550 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
1e560 73 2e 61 44 61 74 61 20 29 3b 0a 20 20 66 6f 72  s.aData );.  for
1e570 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
1e580 4c 76 6c 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  Lvl && p->rc==SQ
1e590 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
1e5a0 20 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72     Fts5BtreeIter
1e5b0 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1e5c0 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20  Iter->aLvl[i];. 
1e5d0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e     fts5NodeIterN
1e5e0 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 70 4c 76  ext(&p->rc, &pLv
1e5f0 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70  l->s);.    if( p
1e600 4c 76 6c 2d 3e 73 2e 61 44 61 74 61 20 29 7b 0a  Lvl->s.aData ){.
1e610 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1e620 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
1e630 65 72 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c 2d 3e  er->term, pLvl->
1e640 73 2e 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c 2d 3e  s.term.n, pLvl->
1e650 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20  s.term.p);.     
1e660 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
1e670 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64  e{.      fts5Nod
1e680 65 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c 2d  eIterFree(&pLvl-
1e690 3e 73 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  >s);.      fts5D
1e6a0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
1e6b0 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 70  >pData);.      p
1e6c0 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a  Lvl->pData = 0;.
1e6d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1e6e0 69 3d 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 7c  i==pIter->nLvl |
1e6f0 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70  | p->rc ){.    p
1e700 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Iter->bEof = 1;.
1e710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1e720 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d   iSegid = pIter-
1e730 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
1e740 20 20 20 66 6f 72 28 69 2d 2d 3b 20 69 3e 3d 30     for(i--; i>=0
1e750 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 46 74  ; i--){.      Ft
1e760 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
1e770 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
1e780 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  >aLvl[i];.      
1e790 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
1e7a0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
1e7b0 70 49 74 65 72 2d 3e 69 49 64 78 2c 69 53 65 67  pIter->iIdx,iSeg
1e7c0 69 64 2c 69 2b 31 2c 70 4c 76 6c 5b 31 5d 2e 73  id,i+1,pLvl[1].s
1e7d0 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  .iChild);.      
1e7e0 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
1e7f0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
1e800 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
1e810 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a   pLvl->pData ){.
1e820 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65          fts5Node
1e830 49 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d 3e 70  IterInit(pLvl->p
1e840 44 61 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e 70  Data->p, pLvl->p
1e850 44 61 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d 3e  Data->n, &pLvl->
1e860 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
1e870 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  }.  }..  pIter->
1e880 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e  nEmpty = pIter->
1e890 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79  aLvl[0].s.nEmpty
1e8a0 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64  ;.  pIter->bDlid
1e8b0 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  x = pIter->aLvl[
1e8c0 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 70  0].s.bDlidx;.  p
1e8d0 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49  Iter->iLeaf = pI
1e8e0 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69  ter->aLvl[0].s.i
1e8f0 43 68 69 6c 64 3b 0a 20 20 61 73 73 65 72 74 28  Child;.  assert(
1e900 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e910 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66  K || pIter->bEof
1e920 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   );.}..static vo
1e930 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65 72  id fts5BtreeIter
1e940 46 72 65 65 28 46 74 73 35 42 74 72 65 65 49 74  Free(Fts5BtreeIt
1e950 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
1e960 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1e970 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
1e980 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74 72  ++){.    Fts5Btr
1e990 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76  eeIterLevel *pLv
1e9a0 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
1e9b0 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64  [i];.    fts5Nod
1e9c0 65 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c 2d  eIterFree(&pLvl-
1e9d0 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76  >s);.    if( pLv
1e9e0 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20  l->pData ){.    
1e9f0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1ea00 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
1ea10 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
1ea20 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  a = 0;.    }.  }
1ea30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1ea40 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a 20 20  pIter->aLvl);.  
1ea50 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1ea60 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a  pIter->term);.}.
1ea70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1ea80 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61  tion is purely a
1ea90 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e  n internal test.
1eaa0 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   It does not con
1eab0 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46  tribute to .** F
1eac0 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  TS functionality
1ead0 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e  , or even the in
1eae0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69  tegrity-check, i
1eaf0 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
1eb00 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73   Instead, it tes
1eb10 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ts that the same
1eb20 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77   set of pgno/row
1eb30 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  id combinations 
1eb40 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20  are .** visited 
1eb50 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
1eb60 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73  ether the doclis
1eb70 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69  t-index identifi
1eb80 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73  ed by parameters
1eb90 0a 2a 2a 20 69 49 64 78 2f 69 53 65 67 69 64 2f  .** iIdx/iSegid/
1eba0 69 4c 65 61 66 20 69 73 20 69 74 65 72 61 74 65  iLeaf is iterate
1ebb0 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f 72  d in forwards or
1ebc0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e 0a   reverse order..
1ebd0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1ebe0 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  _DEBUG.static vo
1ebf0 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  id fts5DlidxIter
1ec00 54 65 73 74 52 65 76 65 72 73 65 28 0a 20 20 46  TestReverse(.  F
1ec10 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1ec20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec40 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6c 6f 61 64  /* Index to load
1ec50 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66   doclist-index f
1ec60 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  rom */.  int iSe
1ec70 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
1ec80 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
1ec90 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66  ent id to load f
1eca0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  rom */.  int iLe
1ecb0 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
1ecc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64           /* Load
1ecd0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66   doclist-index f
1ece0 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
1ecf0 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
1ed00 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a  er *pDlidx = 0;.
1ed10 20 20 69 36 34 20 63 6b 73 75 6d 31 20 3d 20 31    i64 cksum1 = 1
1ed20 33 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d 32 20  3;.  i64 cksum2 
1ed30 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 66 74 73  = 13;..  for(fts
1ed40 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
1ed50 2c 20 30 2c 20 69 49 64 78 2c 20 69 53 65 67 69  , 0, iIdx, iSegi
1ed60 64 2c 20 69 4c 65 61 66 2c 20 26 70 44 6c 69 64  d, iLeaf, &pDlid
1ed70 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  x);.      fts5Dl
1ed80 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
1ed90 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
1eda0 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
1edb0 74 28 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  t(pDlidx).  ){. 
1edc0 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
1edd0 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 69 4c 65  x->iLeafPgno>iLe
1ede0 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31  af );.    cksum1
1edf0 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 28 20 28   = (cksum1 ^ ( (
1ee00 69 36 34 29 28 70 44 6c 69 64 78 2d 3e 69 4c 65  i64)(pDlidx->iLe
1ee10 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32 20 29 29  afPgno) << 32 ))
1ee20 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 3d 20 28  ;.    cksum1 = (
1ee30 63 6b 73 75 6d 31 20 5e 20 70 44 6c 69 64 78 2d  cksum1 ^ pDlidx-
1ee40 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  >iRowid);.  }.  
1ee50 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
1ee60 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c  e(pDlidx);.  pDl
1ee70 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  idx = 0;..  for(
1ee80 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
1ee90 74 28 70 2c 20 31 2c 20 69 49 64 78 2c 20 69 53  t(p, 1, iIdx, iS
1eea0 65 67 69 64 2c 20 69 4c 65 61 66 2c 20 26 70 44  egid, iLeaf, &pD
1eeb0 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73  lidx);.      fts
1eec0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
1eed0 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20   pDlidx)==0;.   
1eee0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1eef0 50 72 65 76 28 70 44 6c 69 64 78 29 0a 20 20 29  Prev(pDlidx).  )
1ef00 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
1ef10 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e  lidx->iLeafPgno>
1ef20 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73  iLeaf );.    cks
1ef30 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20  um2 = (cksum2 ^ 
1ef40 28 20 28 69 36 34 29 28 70 44 6c 69 64 78 2d 3e  ( (i64)(pDlidx->
1ef50 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32  iLeafPgno) << 32
1ef60 20 29 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20   ));.    cksum2 
1ef70 3d 20 28 63 6b 73 75 6d 32 20 5e 20 70 44 6c 69  = (cksum2 ^ pDli
1ef80 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d  dx->iRowid);.  }
1ef90 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
1efa0 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
1efb0 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69  pDlidx = 0;..  i
1efc0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1efd0 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63  _OK && cksum1!=c
1efe0 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
1eff0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 20 0a 7d  FTS5_CORRUPT; .}
1f000 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1f010 66 74 73 35 44 6c 69 64 78 49 74 65 72 54 65 73  fts5DlidxIterTes
1f020 74 52 65 76 65 72 73 65 28 77 2c 78 2c 79 2c 7a  tReverse(w,x,y,z
1f030 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  ).#endif..static
1f040 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49   void fts5IndexI
1f050 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67  ntegrityCheckSeg
1f060 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65  ment(.  Fts5Inde
1f070 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
1f080 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
1f090 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
1f0a0 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20  /.  int iIdx,   
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61      /* Index tha
1f0d0 74 20 70 53 65 67 20 69 73 20 61 20 70 61 72 74  t pSeg is a part
1f0e0 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53 74 72   of */.  Fts5Str
1f0f0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1f100 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg      /* Segm
1f110 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74  ent to check int
1f120 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63  ernal consistenc
1f130 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 42 74  y */.){.  Fts5Bt
1f140 72 65 65 49 74 65 72 20 69 74 65 72 3b 20 20 20  reeIter iter;   
1f150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1f160 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
1f170 6f 75 67 68 20 62 2d 74 72 65 65 20 68 69 65 72  ough b-tree hier
1f180 61 72 63 68 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49  archy */..  /* I
1f190 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
1f1a0 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
1f1b0 63 68 79 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 66  chy.  */.  for(f
1f1c0 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69 74  ts5BtreeIterInit
1f1d0 28 70 2c 20 69 49 64 78 2c 20 70 53 65 67 2c 20  (p, iIdx, pSeg, 
1f1e0 26 69 74 65 72 29 3b 0a 20 20 20 20 20 20 69 74  &iter);.      it
1f1f0 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20  er.bEof==0;.    
1f200 20 20 66 74 73 35 42 74 72 65 65 49 74 65 72 4e    fts5BtreeIterN
1f210 65 78 74 28 26 69 74 65 72 29 0a 20 20 29 7b 0a  ext(&iter).  ){.
1f220 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20      i64 iRow;   
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f240 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
1f250 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20  his leaf */.    
1f260 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
1f270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f280 20 44 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c   Data for this l
1f290 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  eaf */.    int i
1f2a0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
1f2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1f2c0 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d  et of first term
1f2d0 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20   on leaf */.    
1f2e0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f300 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
1f310 20 74 68 72 6f 75 67 68 20 65 6d 70 74 79 20 6c   through empty l
1f320 65 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  eaves */..    /*
1f330 20 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20   If the leaf in 
1f340 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72  question has alr
1f350 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65  eady been trimme
1f360 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65  d from the segme
1f370 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f  nt, .    ** igno
1f380 72 65 20 74 68 69 73 20 62 2d 74 72 65 65 20 65  re this b-tree e
1f390 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  ntry. Otherwise,
1f3a0 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65   load it into me
1f3b0 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  mory. */.    if(
1f3c0 20 69 74 65 72 2e 69 4c 65 61 66 3c 70 53 65 67   iter.iLeaf<pSeg
1f3d0 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63 6f  ->pgnoFirst ) co
1f3e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77  ntinue;.    iRow
1f3f0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1f400 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67  ROWID(iIdx, pSeg
1f410 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 69 74 65  ->iSegid, 0, ite
1f420 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c  r.iLeaf);.    pL
1f430 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
1f440 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20  ad(p, iRow);.   
1f450 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
1f460 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43  break;..    /* C
1f470 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65  heck that the le
1f480 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  af contains at l
1f490 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61  east one term, a
1f4a0 6e 64 20 74 68 61 74 20 69 74 20 69 73 20 65 71  nd that it is eq
1f4b0 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72  ual.    ** to or
1f4c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1f4d0 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 69 74   split-key in it
1f4e0 65 72 2e 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20  er.term.  */.   
1f4f0 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55   iOff = fts5GetU
1f500 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29  16(&pLeaf->p[2])
1f510 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3d 3d  ;.    if( iOff==
1f520 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  0 ){.      p->rc
1f530 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
1f540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f550 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f570 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e   Size of term on
1f580 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73 20 2a   leaf in bytes *
1f590 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b  /.      int res;
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5b0 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
1f5c0 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20 73 70  n of term and sp
1f5d0 6c 69 74 2d 6b 65 79 20 2a 2f 0a 20 20 20 20 20  lit-key */.     
1f5e0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
1f5f0 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
1f600 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29  >p[iOff], nTerm)
1f610 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65  ;.      res = me
1f620 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69  mcmp(&pLeaf->p[i
1f630 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72 6d 2e  Off], iter.term.
1f640 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 69 74  p, MIN(nTerm, it
1f650 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20 20 20  er.term.n));.   
1f660 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
1f670 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 69 74  res = nTerm - it
1f680 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20  er.term.n;.     
1f690 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
1f6a0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
1f6b0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
1f6c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
1f6d0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
1f6e0 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eaf);.    if( p-
1f6f0 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
1f700 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74    /* Now check t
1f710 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d  hat the iter.nEm
1f720 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  pty leaves follo
1f730 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  wing the current
1f740 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29   leaf.    ** (a)
1f750 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63   exist and (b) c
1f760 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e  ontain no terms.
1f770 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   */.    for(i=1;
1f780 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1f790 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e 45 6d  K && i<=iter.nEm
1f7a0 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  pty; i++){.     
1f7b0 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1f7c0 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b 69 29  aRead(p, iRow+i)
1f7d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 61  ;.      if( pLea
1f7e0 66 20 26 26 20 30 21 3d 66 74 73 35 47 65 74 55  f && 0!=fts5GetU
1f7f0 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29  16(&pLeaf->p[2])
1f800 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
1f810 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
1f820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f830 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1f840 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  pLeaf);.    }.. 
1f850 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
1f860 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
1f870 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74  x, check that it
1f880 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f   looks right. */
1f890 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e 62 44  .    if( iter.bD
1f8a0 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74  lidx ){.      Ft
1f8b0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
1f8c0 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72  idx = 0;  /* For
1f8d0 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
1f8e0 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  gh doclist index
1f8f0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50   */.      int iP
1f900 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72 2e 69  revLeaf = iter.i
1f910 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
1f920 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69  iSegid = pSeg->i
1f930 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Segid;.      int
1f940 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36 34 20   iPg;.      i64 
1f950 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72  iKey;..      for
1f960 28 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  (fts5DlidxIterIn
1f970 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c 20 69  it(p, 0, iIdx, i
1f980 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c 65 61  Segid, iter.iLea
1f990 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20  f, &pDlidx);.   
1f9a0 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78         fts5Dlidx
1f9b0 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
1f9c0 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  x)==0;.         
1f9d0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
1f9e0 78 74 28 70 44 6c 69 64 78 29 0a 20 20 20 20 20  xt(pDlidx).     
1f9f0 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   ){..        /* 
1fa00 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d  Check any rowid-
1fa10 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74 20  less pages that 
1fa20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65  occur before the
1fa30 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a   current leaf. *
1fa40 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 50  /.        for(iP
1fa50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69  g=iPrevLeaf+1; i
1fa60 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66  Pg<pDlidx->iLeaf
1fa70 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  Pgno; iPg++){.  
1fa80 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
1fa90 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1faa0 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
1fab0 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  0, iPg);.       
1fac0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1fad0 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
1fae0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1faf0 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
1fb00 20 20 20 20 20 69 66 28 20 66 74 73 35 47 65 74       if( fts5Get
1fb10 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d  U16(&pLeaf->p[0]
1fb20 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  )!=0 ) p->rc = F
1fb30 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
1fb40 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
1fb50 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
1fb60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1fb70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1fb80 50 72 65 76 4c 65 61 66 20 3d 20 70 44 6c 69 64  PrevLeaf = pDlid
1fb90 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20  x->iLeafPgno;.. 
1fba0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
1fbb0 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61  that the leaf pa
1fbc0 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ge indicated by 
1fbd0 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
1fbe0 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20  lly does.       
1fbf0 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   ** contain the 
1fc00 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20  rowid suggested 
1fc10 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a  by the same. */.
1fc20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
1fc30 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1fc40 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
1fc50 30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66  0, pDlidx->iLeaf
1fc60 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Pgno);.        p
1fc70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
1fc80 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
1fc90 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
1fca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  ){.          i64
1fcb0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20   iRowid;.       
1fcc0 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
1fcd0 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
1fce0 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20  Leaf->p[0]);.   
1fcf0 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
1fd00 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69  (&pLeaf->p[iRowi
1fd10 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52  dOff], (u64*)&iR
1fd20 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
1fd30 20 69 66 28 20 69 52 6f 77 69 64 21 3d 70 44 6c   if( iRowid!=pDl
1fd40 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 20 70 2d  idx->iRowid ) p-
1fd50 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1fd60 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  PT;.          ft
1fd70 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
1fd80 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eaf);.        }.
1fd90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1fda0 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61  for(iPg=iPrevLea
1fdb0 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65 72 2e  f+1; iPg<=(iter.
1fdc0 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e 45 6d  iLeaf + iter.nEm
1fdd0 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  pty); iPg++){.  
1fde0 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
1fdf0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
1fe00 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c  iIdx, iSegid, 0,
1fe10 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70   iPg);.        p
1fe20 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
1fe30 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
1fe40 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
1fe50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1fe60 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
1fe70 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20 70  af->p[0])!=0 ) p
1fe80 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
1fe90 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66  UPT;.          f
1fea0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
1feb0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  Leaf);.        }
1fec0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1fed0 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
1fee0 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  e(pDlidx);.     
1fef0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 54 65   fts5DlidxIterTe
1ff00 73 74 52 65 76 65 72 73 65 28 70 2c 20 69 49 64  stReverse(p, iId
1ff10 78 2c 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e  x, iSegid, iter.
1ff20 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20  iLeaf);.    }.  
1ff30 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 69  }..  /* Either i
1ff40 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20 62  ter.iLeaf must b
1ff50 65 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  e the rightmost 
1ff60 6c 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65  leaf-page in the
1ff70 20 73 65 67 6d 65 6e 74 2c 20 6f 72 20 0a 20 20   segment, or .  
1ff80 2a 2a 20 65 6c 73 65 20 74 68 65 20 73 65 67 6d  ** else the segm
1ff90 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ent has been com
1ffa0 70 6c 65 74 65 6c 79 20 65 6d 70 74 69 65 64 20  pletely emptied 
1ffb0 62 79 20 61 6e 20 6f 6e 67 6f 69 6e 67 20 6d 65  by an ongoing me
1ffc0 72 67 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  rge.  ** operati
1ffd0 6f 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  on. */.  if( p->
1ffe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
1fff0 20 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21    && iter.iLeaf!
20000 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  =pSeg->pgnoLast 
20010 0a 20 20 20 26 26 20 28 70 53 65 67 2d 3e 70 67  .   && (pSeg->pg
20020 6e 6f 46 69 72 73 74 20 7c 7c 20 70 53 65 67 2d  noFirst || pSeg-
20030 3e 70 67 6e 6f 4c 61 73 74 29 20 0a 20 20 29 7b  >pgnoLast) .  ){
20040 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
20050 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a  5_CORRUPT;.  }..
20060 20 20 66 74 73 35 42 74 72 65 65 49 74 65 72 46    fts5BtreeIterF
20070 72 65 65 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f  ree(&iter);.}../
20080 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 4d  *.** Iterator pM
20090 75 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20 70  ulti currently p
200a0 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64  oints to a valid
200b0 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29   entry (not EOF)
200c0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
200d0 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 63 6f 70  on appends a cop
200e0 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  y of the positio
200f0 6e 2d 6c 69 73 74 20 6f 66 20 74 68 65 20 65 6e  n-list of the en
20100 74 72 79 20 70 4d 75 6c 74 69 20 0a 2a 2a 20 63  try pMulti .** c
20110 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
20120 74 6f 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  to to buffer pBu
20130 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  f..**.** If an e
20140 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
20150 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
20160 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 74 20  ft in p->rc. It 
20170 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f  is assumed.** no
20180 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
20190 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
201a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
201b0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
201c0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
201d0 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28 0a 20  tiIterPoslist(. 
201e0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
201f0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
20200 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 69 6e 74  r *pMulti,.  int
20210 20 62 53 7a 2c 0a 20 20 46 74 73 35 42 75 66 66   bSz,.  Fts5Buff
20220 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66  er *pBuf.){.  if
20230 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
20240 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43 68  OK ){.    Fts5Ch
20250 75 6e 6b 49 74 65 72 20 69 74 65 72 3b 0a 20 20  unkIter iter;.  
20260 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
20270 53 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61  Seg = &pMulti->a
20280 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69  Seg[ pMulti->aFi
20290 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
202a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
202b0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
202c0 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a 20   pMulti)==0 );. 
202d0 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
202e0 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26 69  Init(p, pSeg, &i
202f0 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 66 74  ter);.    if( ft
20300 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70  s5ChunkIterEof(p
20310 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20  , &iter)==0 ){. 
20320 20 20 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a       if( bSz ){.
20330 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45          /* WRITE
20340 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20  POSLISTSIZE */. 
20350 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
20360 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
20370 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72  ->rc, pBuf, iter
20380 2e 6e 52 65 6d 20 2a 20 32 29 3b 0a 20 20 20 20  .nRem * 2);.    
20390 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
203a0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f   fts5ChunkIterEo
203b0 66 28 70 2c 20 26 69 74 65 72 29 3d 3d 30 20 29  f(p, &iter)==0 )
203c0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
203d0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
203e0 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65  p->rc, pBuf, ite
203f0 72 2e 6e 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20  r.n, iter.p);.  
20400 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
20410 74 65 72 4e 65 78 74 28 70 2c 20 26 69 74 65 72  terNext(p, &iter
20420 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20430 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74  .    fts5ChunkIt
20440 65 72 52 65 6c 65 61 73 65 28 26 69 74 65 72 29  erRelease(&iter)
20450 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
20460 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74  void fts5Doclist
20470 49 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63  IterNext(Fts5Doc
20480 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 29  listIter *pIter)
20490 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  {.  if( pIter->i
204a0 3c 70 49 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20  <pIter->n ){.   
204b0 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
204c0 20 69 66 28 20 70 49 74 65 72 2d 3e 69 20 29 7b   if( pIter->i ){
204d0 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74  .      i64 iDelt
204e0 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  a;.      pIter->
204f0 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  i += getVarint(&
20500 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e  pIter->a[pIter->
20510 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  i], (u64*)&iDelt
20520 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  a);.      if( pI
20530 74 65 72 2d 3e 62 44 65 73 63 20 29 7b 0a 20 20  ter->bDesc ){.  
20540 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
20550 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20  wid -= iDelta;. 
20560 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20570 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
20580 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
20590 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
205a0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b        pIter->i +
205b0 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 49 74  = getVarint(&pIt
205c0 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c  er->a[pIter->i],
205d0 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
205e0 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Rowid);.    }.  
205f0 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 66 74    pIter->i += ft
20600 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
20610 28 0a 20 20 20 20 20 20 20 20 26 70 49 74 65 72  (.        &pIter
20620 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 26  ->a[pIter->i], &
20630 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 2c  pIter->nPoslist,
20640 20 26 62 44 75 6d 6d 79 0a 20 20 20 20 29 3b 0a   &bDummy.    );.
20650 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c      pIter->aPosl
20660 69 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 5b  ist = &pIter->a[
20670 70 49 74 65 72 2d 3e 69 5d 3b 0a 20 20 20 20 70  pIter->i];.    p
20680 49 74 65 72 2d 3e 69 20 2b 3d 20 70 49 74 65 72  Iter->i += pIter
20690 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65  ->nPoslist;.  }e
206a0 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
206b0 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20  aPoslist = 0;.  
206c0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
206d0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
206e0 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66 66  Init(.  Fts5Buff
206f0 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  er *pBuf, .  int
20700 20 62 44 65 73 63 2c 20 0a 20 20 46 74 73 35 44   bDesc, .  Fts5D
20710 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
20720 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49  r.){.  memset(pI
20730 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
20740 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
20750 2d 3e 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20  ->a = pBuf->p;. 
20760 20 70 49 74 65 72 2d 3e 6e 20 3d 20 70 42 75 66   pIter->n = pBuf
20770 2d 3e 6e 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44  ->n;.  pIter->bD
20780 65 73 63 20 3d 20 62 44 65 73 63 3b 0a 20 20 66  esc = bDesc;.  f
20790 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
207a0 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  xt(pIter);.}../*
207b0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63  .** Append a doc
207c0 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70  list to buffer p
207d0 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Buf..*/.static v
207e0 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70  oid fts5MergeApp
207f0 65 6e 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20  endDocid(.  int 
20800 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
20810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
20820 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64  N/OUT: Error cod
20830 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  e */.  int bDesc
20840 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
20850 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
20860 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
20870 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
20880 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c  64 *piLastRowid,
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
208a0 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f  * IN/OUT: Previo
208b0 75 73 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e  us rowid written
208c0 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69   (if any) */.  i
208d0 36 34 20 69 52 6f 77 69 64 20 20 20 20 20 20 20  64 iRowid       
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
208f0 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e  * Rowid to appen
20900 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 42  d */.){.  if( pB
20910 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  uf->n==0 ){.    
20920 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
20930 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66  Varint(pRc, pBuf
20940 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  , iRowid);.  }el
20950 73 65 20 69 66 28 20 62 44 65 73 63 20 29 7b 0a  se if( bDesc ){.
20960 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
20970 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20  pendVarint(pRc, 
20980 70 42 75 66 2c 20 2a 70 69 4c 61 73 74 52 6f 77  pBuf, *piLastRow
20990 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20  id - iRowid);.  
209a0 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42  }else{.    fts5B
209b0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
209c0 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f  t(pRc, pBuf, iRo
209d0 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77  wid - *piLastRow
209e0 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61  id);.  }.  *piLa
209f0 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
20a00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  ;.}../*.** Buffe
20a10 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e  rs p1 and p2 con
20a20 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54  tain doclists. T
20a30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72  his function mer
20a40 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ges the content.
20a50 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f  ** of the two do
20a60 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20  clists together 
20a70 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20  and sets buffer 
20a80 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  p1 to the result
20a90 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
20aa0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
20ab0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
20ac0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
20ad0 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20   left in p->rc. 
20ae0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a  If an error has.
20af0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
20b00 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
20b10 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
20b20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
20b30 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
20b40 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ts(.  Fts5Index 
20b50 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
20b60 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
20b70 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
20b80 20 20 69 6e 74 20 62 44 65 73 63 2c 0a 20 20 46    int bDesc,.  F
20b90 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20  ts5Buffer *p1,  
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20bb0 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20  * First list to 
20bc0 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42  merge */.  Fts5B
20bd0 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20  uffer *p2       
20be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
20bf0 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72  cond list to mer
20c00 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ge */.){.  if( p
20c10 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20  2->n ){.    i64 
20c20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
20c30 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
20c40 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35  ter i1;.    Fts5
20c50 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a  DoclistIter i2;.
20c60 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f      Fts5Buffer o
20c70 75 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  ut;.    Fts5Buff
20c80 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73  er tmp;.    mems
20c90 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65  et(&out, 0, size
20ca0 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65  of(out));.    me
20cb0 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69  mset(&tmp, 0, si
20cc0 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20  zeof(tmp));..   
20cd0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
20ce0 49 6e 69 74 28 70 31 2c 20 62 44 65 73 63 2c 20  Init(p1, bDesc, 
20cf0 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f  &i1);.    fts5Do
20d00 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32  clistIterInit(p2
20d10 2c 20 62 44 65 73 63 2c 20 26 69 32 29 3b 0a 20  , bDesc, &i2);. 
20d20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
20d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69  =SQLITE_OK && (i
20d40 31 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c  1.aPoslist!=0 ||
20d50 20 69 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30 29   i2.aPoslist!=0)
20d60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 32   ){.      if( i2
20d70 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20  .aPoslist==0 || 
20d80 28 69 31 2e 61 50 6f 73 6c 69 73 74 20 26 26 20  (i1.aPoslist && 
20d90 0a 20 20 20 20 20 20 20 20 20 20 20 28 20 28 62  .           ( (b
20da0 44 65 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69  Desc && i1.iRowi
20db0 64 3e 69 32 2e 69 52 6f 77 69 64 29 20 7c 7c 20  d>i2.iRowid) || 
20dc0 28 21 62 44 65 73 63 20 26 26 20 69 31 2e 69 52  (!bDesc && i1.iR
20dd0 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 29 20  owid<i2.iRowid) 
20de0 29 0a 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20  ).      )){.    
20df0 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72      /* Copy entr
20e00 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20  y from i1 */.   
20e10 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
20e20 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63  pendDocid(&p->rc
20e30 2c 20 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26  , bDesc, &out, &
20e40 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69  iLastRowid, i1.i
20e50 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
20e60 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
20e70 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  IZE */.        f
20e80 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
20e90 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f  arint(&p->rc, &o
20ea0 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20  ut, i1.nPoslist 
20eb0 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74  * 2);.        ft
20ec0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
20ed0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ob(&p->rc, &out,
20ee0 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 31   i1.nPoslist, i1
20ef0 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
20f00 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
20f10 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
20f20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
20f30 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74   if( i1.aPoslist
20f40 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64  ==0 || i2.iRowid
20f50 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20  !=i1.iRowid ){. 
20f60 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
20f70 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a  ntry from i2 */.
20f80 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
20f90 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d  eAppendDocid(&p-
20fa0 3e 72 63 2c 20 62 44 65 73 63 2c 20 26 6f 75 74  >rc, bDesc, &out
20fb0 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  , &iLastRowid, i
20fc0 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
20fd0 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49     /* WRITEPOSLI
20fe0 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20  STSIZE */.      
20ff0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
21000 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
21010 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69   &out, i2.nPosli
21020 73 74 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20  st * 2);.       
21030 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
21040 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f  dBlob(&p->rc, &o
21050 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c  ut, i2.nPoslist,
21060 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20   i2.aPoslist);. 
21070 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69         fts5Docli
21080 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b  stIterNext(&i2);
21090 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
210a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73  lse{.        Fts
210b0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72  5PoslistReader r
210c0 31 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  1;.        Fts5P
210d0 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72 32 3b  oslistReader r2;
210e0 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73  .        Fts5Pos
210f0 6c 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65  listWriter write
21100 72 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  r;..        mems
21110 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73  et(&writer, 0, s
21120 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a  izeof(writer));.
21130 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67  .        /* Merg
21140 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69  e the two positi
21150 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20  on lists. */ .  
21160 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
21170 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72  ppendDocid(&p->r
21180 63 2c 20 62 44 65 73 63 2c 20 26 6f 75 74 2c 20  c, bDesc, &out, 
21190 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e  &iLastRowid, i2.
211a0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
211b0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
211c0 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73  &tmp);.        s
211d0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
211e0 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31 2c 20  tReaderInit(-1, 
211f0 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e  i1.aPoslist, i1.
21200 6e 50 6f 73 6c 69 73 74 2c 20 26 72 31 29 3b 0a  nPoslist, &r1);.
21210 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
21220 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
21230 49 6e 69 74 28 2d 31 2c 20 69 32 2e 61 50 6f 73  Init(-1, i2.aPos
21240 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  list, i2.nPoslis
21250 74 2c 20 26 72 32 29 3b 0a 20 20 20 20 20 20 20  t, &r2);.       
21260 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
21270 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 72 31 2e  QLITE_OK && (r1.
21280 62 45 6f 66 3d 3d 30 20 7c 7c 20 72 32 2e 62 45  bEof==0 || r2.bE
21290 6f 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  of==0) ){.      
212a0 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a 20 20      i64 iNew;.  
212b0 20 20 20 20 20 20 20 20 69 66 28 20 72 32 2e 62          if( r2.b
212c0 45 6f 66 20 7c 7c 20 28 72 31 2e 62 45 6f 66 3d  Eof || (r1.bEof=
212d0 3d 30 20 26 26 20 72 31 2e 69 50 6f 73 3c 72 32  =0 && r1.iPos<r2
212e0 2e 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20  .iPos) ){.      
212f0 20 20 20 20 20 20 69 4e 65 77 20 3d 20 72 31 2e        iNew = r1.
21300 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20  iPos;.          
21310 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
21320 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26  listReaderNext(&
21330 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  r1);.          }
21340 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21350 20 20 69 4e 65 77 20 3d 20 72 32 2e 69 50 6f 73    iNew = r2.iPos
21360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21370 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
21380 52 65 61 64 65 72 4e 65 78 74 28 26 72 32 29 3b  ReaderNext(&r2);
21390 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
213a0 20 72 31 2e 69 50 6f 73 3d 3d 72 32 2e 69 50 6f   r1.iPos==r2.iPo
213b0 73 20 29 20 73 71 6c 69 74 65 33 46 74 73 35 50  s ) sqlite3Fts5P
213c0 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
213d0 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  (&r1);.         
213e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
213f0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
21400 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70 70  PoslistWriterApp
21410 65 6e 64 28 26 74 6d 70 2c 20 26 77 72 69 74 65  end(&tmp, &write
21420 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20 20 20  r, iNew);.      
21430 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
21440 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
21450 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
21460 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
21470 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  nt(&p->rc, &out,
21480 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20   tmp.n * 2);.   
21490 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
214a0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
214b0 2c 20 26 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74  , &out, tmp.n, t
214c0 6d 70 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66  mp.p);.        f
214d0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
214e0 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20  xt(&i1);.       
214f0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
21500 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20  Next(&i2);.     
21510 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74   }.    }..    ft
21520 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
21530 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f  rc, p1, out.n, o
21540 75 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42  ut.p);.    fts5B
21550 75 66 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b  ufferFree(&tmp);
21560 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
21570 72 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d  ree(&out);.  }.}
21580 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
21590 73 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73  s5BufferSwap(Fts
215a0 35 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73  5Buffer *p1, Fts
215b0 35 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20  5Buffer *p2){.  
215c0 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d  Fts5Buffer tmp =
215d0 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70   *p1;.  *p1 = *p
215e0 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a  2;.  *p2 = tmp;.
215f0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
21600 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
21610 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  er(.  Fts5Index 
21620 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
21630 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
21640 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
21650 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20   int bDesc,     
21660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21670 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52   /* True for "OR
21680 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
21690 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  C" */.  const u8
216a0 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20   *pToken,       
216b0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
216c0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  r containing pre
216d0 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  fix to match */.
216e0 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20    int nToken,   
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21700 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
21710 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79  fer pToken in by
21720 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  tes */.  Fts5Ind
21730 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  exIter *pIter   
21740 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75           /* Popu
21750 6c 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74  late this object
21760 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72   */.){.  Fts5Str
21770 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
21780 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61  .  Fts5Buffer *a
21790 42 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Buf;.  const int
217a0 20 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61   nBuf = 32;..  a
217b0 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65  Buf = (Fts5Buffe
217c0 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
217d0 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42  (p, sizeof(Fts5B
217e0 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20  uffer)*nBuf);.  
217f0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
21800 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 30  ructureRead(p, 0
21810 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26  );..  if( aBuf &
21820 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  & pStruct ){.   
21830 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
21840 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20   *pDoclist;.    
21850 69 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69  int i;.    i64 i
21860 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
21870 20 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49     Fts5MultiSegI
21880 74 65 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20  ter *p1 = 0;    
21890 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65   /* Iterator use
218a0 64 20 74 6f 20 67 61 74 68 65 72 20 64 61 74 61  d to gather data
218b0 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20   from index */. 
218c0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 64 6f     Fts5Buffer do
218d0 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73  clist;..    mems
218e0 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20  et(&doclist, 0, 
218f0 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29  sizeof(doclist))
21900 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75  ;.    for(fts5Mu
21910 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
21920 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 31 2c 20  truct, 0, 1, 1, 
21930 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20  pToken, nToken, 
21940 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20  -1, 0, &p1);.   
21950 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
21960 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b  erEof(p, p1)==0;
21970 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
21980 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 31  tiIterNext(p, p1
21990 2c 20 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20  , 0, 0).    ){. 
219a0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
219b0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
219c0 6f 77 69 64 28 70 31 29 3b 0a 20 20 20 20 20 20  owid(p1);.      
219d0 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  int nTerm;.     
219e0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
219f0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
21a00 54 65 72 6d 28 70 31 2c 20 26 6e 54 65 72 6d 29  Term(p1, &nTerm)
21a10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21a20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70  memcmp(pToken, p
21a30 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e  Term, MIN(nToken
21a40 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a  , nTerm))<=0 );.
21a50 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c        if( nTerm<
21a60 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70  nToken || memcmp
21a70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
21a80 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b  nToken) ) break;
21a90 0a 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c  ..      if( docl
21aa0 69 73 74 2e 6e 3e 30 20 0a 20 20 20 20 20 20 20  ist.n>0 .       
21ab0 26 26 20 28 28 21 62 44 65 73 63 20 26 26 20 69  && ((!bDesc && i
21ac0 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69  Rowid<=iLastRowi
21ad0 64 29 20 7c 7c 20 28 62 44 65 73 63 20 26 26 20  d) || (bDesc && 
21ae0 69 52 6f 77 69 64 3e 3d 69 4c 61 73 74 52 6f 77  iRowid>=iLastRow
21af0 69 64 29 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20  id)).      ){.. 
21b00 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
21b10 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
21b20 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69   && doclist.n; i
21b30 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
21b40 73 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b  ssert( i<nBuf );
21b50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
21b60 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20  Buf[i].n==0 ){. 
21b70 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
21b80 75 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69  ufferSwap(&docli
21b90 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
21ba0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
21bb0 75 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69  ufferZero(&docli
21bc0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  st);.          }
21bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21be0 20 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69    fts5MergePrefi
21bf0 78 4c 69 73 74 73 28 70 2c 20 62 44 65 73 63 2c  xLists(p, bDesc,
21c00 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66   &doclist, &aBuf
21c10 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
21c20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
21c30 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20  (&aBuf[i]);.    
21c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21c50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
21c60 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30  if( doclist.n==0
21c70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
21c80 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
21c90 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c  nt(&p->rc, &docl
21ca0 69 73 74 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  ist, iRowid);.  
21cb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62 44      }else if( bD
21cc0 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 66  esc ){.        f
21cd0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
21ce0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64  arint(&p->rc, &d
21cf0 6f 63 6c 69 73 74 2c 20 69 4c 61 73 74 52 6f 77  oclist, iLastRow
21d00 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20  id - iRowid);.  
21d10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21d20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
21d30 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
21d40 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77  , &doclist, iRow
21d50 69 64 20 2d 20 69 4c 61 73 74 52 6f 77 69 64 29  id - iLastRowid)
21d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21d70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f  iLastRowid = iRo
21d80 77 69 64 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  wid;.      fts5M
21d90 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
21da0 70 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69  p, p1, 1, &docli
21db0 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  st);.    }..    
21dc0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b  for(i=0; i<nBuf;
21dd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
21de0 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
21df0 73 28 70 2c 20 62 44 65 73 63 2c 20 26 64 6f 63  s(p, bDesc, &doc
21e00 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
21e10 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
21e20 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b  rFree(&aBuf[i]);
21e30 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
21e40 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
21e50 70 31 29 3b 0a 0a 20 20 20 20 70 44 6f 63 6c 69  p1);..    pDocli
21e60 73 74 20 3d 20 28 46 74 73 35 44 6f 63 6c 69 73  st = (Fts5Doclis
21e70 74 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61  tIter*)fts5IdxMa
21e80 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
21e90 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 29 29  ts5DoclistIter))
21ea0 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 63 6c  ;.    if( !pDocl
21eb0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ist ){.      fts
21ec0 35 42 75 66 66 65 72 46 72 65 65 28 26 64 6f 63  5BufferFree(&doc
21ed0 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  list);.    }else
21ee0 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  {.      pIter->p
21ef0 44 6f 63 6c 69 73 74 20 3d 20 70 44 6f 63 6c 69  Doclist = pDocli
21f00 73 74 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6f  st;.      fts5Do
21f10 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 26 64  clistIterInit(&d
21f20 6f 63 6c 69 73 74 2c 20 62 44 65 73 63 2c 20 70  oclist, bDesc, p
21f30 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b  Iter->pDoclist);
21f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74  .    }.  }..  ft
21f50 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
21f60 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73  se(pStruct);.  s
21f70 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75 66  qlite3_free(aBuf
21f80 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
21f90 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
21fa0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
21fb0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
21fc0 2c 0a 20 20 69 6e 74 20 6e 2c 0a 20 20 69 6e 74  ,.  int n,.  int
21fd0 20 66 6c 61 67 73 2c 0a 20 20 75 36 34 20 2a 70   flags,.  u64 *p
21fe0 43 6b 73 75 6d 0a 29 7b 0a 20 20 75 36 34 20 63  Cksum.){.  u64 c
21ff0 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a  ksum = *pCksum;.
22000 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
22010 2a 70 49 64 78 49 74 65 72 20 3d 20 30 3b 0a 20  *pIdxIter = 0;. 
22020 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
22030 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
22040 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20  p, z, n, flags, 
22050 26 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 77  &pIdxIter);..  w
22060 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
22070 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
22080 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 64  3Fts5IterEof(pId
22090 78 49 74 65 72 29 20 29 7b 0a 20 20 20 20 63 6f  xIter) ){.    co
220a0 6e 73 74 20 75 38 20 2a 70 50 6f 73 3b 0a 20 20  nst u8 *pPos;.  
220b0 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
220c0 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71 6c 69  i64 rowid = sqli
220d0 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64  te3Fts5IterRowid
220e0 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20 20  (pIdxIter);.    
220f0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
22100 49 74 65 72 50 6f 73 6c 69 73 74 28 70 49 64 78  IterPoslist(pIdx
22110 49 74 65 72 2c 20 26 70 50 6f 73 2c 20 26 6e 50  Iter, &pPos, &nP
22120 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  os);.    if( rc=
22130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22140 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52      Fts5PoslistR
22150 65 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a 20  eader sReader;. 
22160 20 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65 33       for(sqlite3
22170 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
22180 72 49 6e 69 74 28 2d 31 2c 20 70 50 6f 73 2c 20  rInit(-1, pPos, 
22190 6e 50 6f 73 2c 20 26 73 52 65 61 64 65 72 29 3b  nPos, &sReader);
221a0 0a 20 20 20 20 20 20 20 20 20 20 73 52 65 61 64  .          sRead
221b0 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20  er.bEof==0;.    
221c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
221d0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65  5PoslistReaderNe
221e0 78 74 28 26 73 52 65 61 64 65 72 29 0a 20 20 20  xt(&sReader).   
221f0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
22200 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f  t iCol = FTS5_PO
22210 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72  S2COLUMN(sReader
22220 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  .iPos);.        
22230 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53 35 5f  int iOff = FTS5_
22240 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65 61 64  POS2OFFSET(sRead
22250 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  er.iPos);.      
22260 20 20 63 6b 73 75 6d 20 5e 3d 20 66 74 73 35 49    cksum ^= fts5I
22270 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72  ndexEntryCksum(r
22280 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66  owid, iCol, iOff
22290 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
222a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
222b0 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28  te3Fts5IterNext(
222c0 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20 20 7d  pIdxIter);.    }
222d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74  .  }.  sqlite3Ft
222e0 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49 64 78  s5IterClose(pIdx
222f0 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75  Iter);..  *pCksu
22300 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74  m = cksum;.  ret
22310 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22320 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68   Run internal ch
22330 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ecks to ensure t
22340 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65  hat the FTS inde
22350 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61  x (a) is interna
22360 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65  lly .** consiste
22370 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  nt and (b) conta
22380 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
22390 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66  which the XOR of
223a0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a   the checksums.*
223b0 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20  * as calculated 
223c0 62 79 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  by fts5IndexEntr
223d0 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75  yCksum() is cksu
223e0 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  m..**.** Return 
223f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
22400 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74  f any of the int
22410 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69  ernal checks fai
22420 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  l, or if the.** 
22430 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f  checksum does no
22440 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20  t match. Return 
22450 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
22460 20 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74   checks pass wit
22470 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f  hout.** error, o
22480 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c  r some other SQL
22490 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
224a0 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  f another error 
224b0 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63  (e.g. OOM).** oc
224c0 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
224d0 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74  ite3Fts5IndexInt
224e0 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35  egrityCheck(Fts5
224f0 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b  Index *p, u64 ck
22500 73 75 6d 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  sum){.  Fts5Conf
22510 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
22520 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20  >pConfig;.  int 
22530 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
22540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
22550 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
22560 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a  hrough indexes *
22570 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  /.  u64 cksum2 =
22580 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
22590 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
225a0 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
225b0 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
225c0 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30    u64 cksum3 = 0
225d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
225e0 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61    /* Checksum ba
225f0 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20  sed on contents 
22600 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  of indexes */.  
22610 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 20  Fts5Buffer term 
22620 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20  = {0,0,0};      
22630 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
22640 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65  o hold most rece
22650 6e 74 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 2f 2a  nt term */..  /*
22660 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
22670 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f  internal nodes o
22680 66 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d  f each segment m
22690 61 74 63 68 20 74 68 65 20 6c 65 61 76 65 73 20  atch the leaves 
226a0 2a 2f 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b  */.  for(iIdx=0;
226b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
226c0 4b 20 26 26 20 69 49 64 78 3c 3d 70 43 6f 6e 66  K && iIdx<=pConf
226d0 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64  ig->nPrefix; iId
226e0 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74  x++){.    Fts5St
226f0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
22700 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
22710 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20  Read(p, iIdx);. 
22720 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
22730 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
22740 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 66 6f  , iSeg;.      fo
22750 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
22760 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
22770 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
22780 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
22790 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
227a0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
227b0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
227c0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
227d0 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
227e0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
227f0 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
22800 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 49  .          fts5I
22810 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
22820 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 69 49 64  ckSegment(p, iId
22830 78 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  x, pSeg);.      
22840 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22850 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
22860 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
22870 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ct);.  }..  /* T
22880 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e  he cksum argumen
22890 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
228a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63   function is a c
228b0 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74  hecksum calculat
228c0 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e  ed.  ** based on
228d0 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20 65 6e   all expected en
228e0 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 54 53  tries in the FTS
228f0 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64 69 6e   index (includin
22900 67 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 20  g prefix index. 
22910 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20 54 68   ** entries). Th
22920 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20  is block checks 
22930 74 68 61 74 20 61 20 63 68 65 63 6b 73 75 6d 20  that a checksum 
22940 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64  calculated based
22950 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   on the.  ** act
22960 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ual contents of 
22970 46 54 53 20 69 6e 64 65 78 20 69 73 20 69 64 65  FTS index is ide
22980 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  ntical..  **.  *
22990 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  * Two versions o
229a0 66 20 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b  f the same check
229b0 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c 61 74  sum are calculat
229c0 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 28 73  ed. The first (s
229d0 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62  tack.  ** variab
229e0 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73 65 64  le cksum2) based
229f0 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78 74 72   on entries extr
22a00 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  acted from the f
22a10 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20  ull-text index. 
22a20 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67 20   ** while doing 
22a30 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66  a linear scan of
22a40 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
22a50 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e 20   index in turn. 
22a60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61  .  **.  ** As ea
22a70 63 68 20 74 65 72 6d 20 76 69 73 69 74 65 64 20  ch term visited 
22a80 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20 73 63  by the linear sc
22a90 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74 65 20  ans, a separate 
22aa0 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20  query for the.  
22ab0 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69 73 20  ** same term is 
22ac0 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d  performed. cksum
22ad0 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20  3 is calculated 
22ae0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 6e 74  based on the ent
22af0 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72 61 63  ries.  ** extrac
22b00 74 65 64 20 62 79 20 74 68 65 73 65 20 71 75 65  ted by these que
22b10 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ries..  */.  for
22b20 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 3d 70  (iIdx=0; iIdx<=p
22b30 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
22b40 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74   iIdx++){.    Ft
22b50 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
22b60 70 49 74 65 72 3b 0a 20 20 20 20 46 74 73 35 53  pIter;.    Fts5S
22b70 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
22b80 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
22b90 65 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a  eRead(p, iIdx);.
22ba0 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74      for(fts5Mult
22bb0 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
22bc0 75 63 74 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c  uct, iIdx, 0, 0,
22bd0 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70   0, 0, -1, 0, &p
22be0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  Iter);.        f
22bf0 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
22c00 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20  p, pIter)==0;.  
22c10 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
22c20 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
22c30 2c 20 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20  , 0, 0).    ){. 
22c40 20 20 20 20 20 46 74 73 35 50 6f 73 49 74 65 72       Fts5PosIter
22c50 20 73 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20   sPos;          
22c60 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
22c70 61 74 65 20 74 68 72 6f 75 67 68 20 70 6f 73 69  ate through posi
22c80 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20  tion list */.   
22c90 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22cb0 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69  * Size of term i
22cc0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
22cd0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
22ce0 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
22cf0 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 63  (pIter);.      c
22d00 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29  har *z = (char*)
22d10 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
22d20 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20  m(pIter, &n);.. 
22d30 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 63       /* Update c
22d40 6b 73 75 6d 32 20 77 69 74 68 20 74 68 65 20 65  ksum2 with the e
22d50 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
22d60 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  d with the curre
22d70 6e 74 20 74 65 72 6d 0a 20 20 20 20 20 20 2a 2a  nt term.      **
22d80 20 61 6e 64 20 72 6f 77 69 64 2e 20 20 2a 2f 0a   and rowid.  */.
22d90 20 20 20 20 20 20 66 6f 72 28 66 74 73 35 50 6f        for(fts5Po
22da0 73 49 74 65 72 49 6e 69 74 28 70 2c 20 70 49 74  sIterInit(p, pIt
22db0 65 72 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20 20  er, &sPos);.    
22dc0 20 20 20 20 20 20 66 74 73 35 50 6f 73 49 74 65        fts5PosIte
22dd0 72 45 6f 66 28 70 2c 20 26 73 50 6f 73 29 3d 3d  rEof(p, &sPos)==
22de0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  0;.          fts
22df0 35 50 6f 73 49 74 65 72 4e 65 78 74 28 70 2c 20  5PosIterNext(p, 
22e00 26 73 50 6f 73 29 0a 20 20 20 20 20 20 29 7b 0a  &sPos).      ){.
22e10 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e          cksum2 ^
22e20 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  = fts5IndexEntry
22e30 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 73 50  Cksum(iRowid, sP
22e40 6f 73 2e 69 43 6f 6c 2c 20 73 50 6f 73 2e 69 50  os.iCol, sPos.iP
22e50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20  os, z, n);.     
22e60 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
22e70 74 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65  this is a new te
22e80 72 6d 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74  rm, query for it
22e90 2e 20 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20  . Update cksum3 
22ea0 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73  with the results
22eb0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
22ec0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22ed0 26 26 20 28 74 65 72 6d 2e 6e 21 3d 6e 20 7c 7c  && (term.n!=n ||
22ee0 20 6d 65 6d 63 6d 70 28 74 65 72 6d 2e 70 2c 20   memcmp(term.p, 
22ef0 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20 20 20  z, n)) ){.      
22f00 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
22f10 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 69    int flags = (i
22f20 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54 53  Idx==0 ? 0 : FTS
22f30 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
22f40 46 49 58 29 3b 0a 20 20 20 20 20 20 20 20 75 36  FIX);.        u6
22f50 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 20  4 ck1 = 0;.     
22f60 20 20 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a     u64 ck2 = 0;.
22f70 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
22f80 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  k that the resul
22f90 74 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  ts returned for 
22fa0 41 53 43 20 61 6e 64 20 44 45 53 43 20 71 75 65  ASC and DESC que
22fb0 72 69 65 73 20 61 72 65 0a 20 20 20 20 20 20 20  ries are.       
22fc0 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20 49 66   ** the same. If
22fd0 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73 20   not, call this 
22fe0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a  corruption.  */.
22ff0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
23000 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 7a  5QueryCksum(p, z
23010 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31  , n, flags, &ck1
23020 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
23030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23040 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66            rc = f
23050 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
23060 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 7c 46 54 53   z, n, flags|FTS
23070 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
23080 43 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20  C, &ck2);.      
23090 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
230a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
230b0 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
230c0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
230d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
230e0 69 73 20 69 73 20 61 20 70 72 65 66 69 78 20 71  is is a prefix q
230f0 75 65 72 79 2c 20 63 68 65 63 6b 20 74 68 61 74  uery, check that
23100 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74   the results ret
23110 75 72 6e 65 64 20 69 66 20 74 68 65 0a 20 20 20  urned if the.   
23120 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65       ** the inde
23130 78 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 72  x is disabled ar
23140 65 20 74 68 65 20 73 61 6d 65 2e 20 49 6e 20 62  e the same. In b
23150 6f 74 68 20 41 53 43 20 61 6e 64 20 44 45 53 43  oth ASC and DESC
23160 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
23170 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26     if( iIdx>0 &&
23180 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23190 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
231a0 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
231b0 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
231c0 4f 49 44 58 3b 0a 20 20 20 20 20 20 20 20 20 20  OIDX;.          
231d0 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ck2 = 0;.       
231e0 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
231f0 79 43 6b 73 75 6d 28 70 2c 20 7a 2c 20 6e 2c 20  yCksum(p, z, n, 
23200 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20  f, &ck2);.      
23210 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
23220 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
23230 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
23240 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  RRUPT;.        }
23250 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 49 64  .        if( iId
23260 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  x>0 && rc==SQLIT
23270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23280 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c    int f = flags|
23290 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
232a0 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49  TEST_NOIDX|FTS5I
232b0 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b  NDEX_QUERY_DESC;
232c0 0a 20 20 20 20 20 20 20 20 20 20 63 6b 32 20 3d  .          ck2 =
232d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
232e0 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
232f0 6d 28 70 2c 20 7a 2c 20 6e 2c 20 66 2c 20 26 63  m(p, z, n, f, &c
23300 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  k2);.          i
23310 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23320 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72   && ck1!=ck2 ) r
23330 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
23340 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
23350 20 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20 63       cksum3 ^= c
23360 6b 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  k1;.        fts5
23370 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26  BufferSet(&rc, &
23380 74 65 72 6d 2c 20 6e 2c 20 28 63 6f 6e 73 74 20  term, n, (const 
23390 75 38 2a 29 7a 29 3b 0a 20 20 20 20 20 20 20 20  u8*)z);.        
233a0 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
233b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
233c0 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
233d0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 66  p, pIter);.    f
233e0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
233f0 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
23400 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
23410 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
23420 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  m!=cksum2 ) p->r
23430 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
23440 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
23450 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
23460 6d 21 3d 63 6b 73 75 6d 33 20 29 20 70 2d 3e 72  m!=cksum3 ) p->r
23470 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
23480 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  ;..  fts5BufferF
23490 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 72 65  ree(&term);.  re
234a0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
234b0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn(p);.}.../*.
234c0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
234d0 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
234e0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
234f0 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29  Fts5IndexWrite()
23500 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74   pertain.** to t
23510 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
23520 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a   rowid iRowid..*
23530 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
23540 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65  5IndexBeginWrite
23550 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
23560 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73  64 iRowid){.  as
23570 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
23580 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20  ITE_OK );..  /* 
23590 41 6c 6c 6f 63 61 74 65 20 68 61 73 68 20 74 61  Allocate hash ta
235a0 62 6c 65 73 20 69 66 20 74 68 65 79 20 68 61 76  bles if they hav
235b0 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  e not already be
235c0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
235d0 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 3d    if( p->apHash=
235e0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
235f0 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
23600 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74  LITE_OK;.    int
23610 20 6e 48 61 73 68 20 3d 20 70 2d 3e 70 43 6f 6e   nHash = p->pCon
23620 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 2b 20 31  fig->nPrefix + 1
23630 3b 0a 20 20 20 20 46 74 73 35 48 61 73 68 20 2a  ;.    Fts5Hash *
23640 2a 61 70 4e 65 77 3b 0a 0a 20 20 20 20 61 70 4e  *apNew;..    apN
23650 65 77 20 3d 20 28 46 74 73 35 48 61 73 68 2a 2a  ew = (Fts5Hash**
23660 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
23670 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
23680 6f 66 28 46 74 73 35 48 61 73 68 2a 29 2a 6e 48  of(Fts5Hash*)*nH
23690 61 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ash);.    for(i=
236a0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
236b0 20 26 26 20 69 3c 6e 48 61 73 68 3b 20 69 2b 2b   && i<nHash; i++
236c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
236d0 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65 77  lite3Fts5HashNew
236e0 28 26 61 70 4e 65 77 5b 69 5d 2c 20 26 70 2d 3e  (&apNew[i], &p->
236f0 6e 50 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20  nPendingData);. 
23700 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
23710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23720 20 20 20 20 70 2d 3e 61 70 48 61 73 68 20 3d 20      p->apHash = 
23730 61 70 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65  apNew;.    }else
23740 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  {.      if( apNe
23750 77 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  w ){.        for
23760 28 69 3d 30 3b 20 69 3c 6e 48 61 73 68 3b 20 69  (i=0; i<nHash; i
23770 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
23780 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 46 72  qlite3Fts5HashFr
23790 65 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  ee(apNew[i]);.  
237a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
237b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 4e  sqlite3_free(apN
237c0 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
237d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
237e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69    }.  }..  if( i
237f0 52 6f 77 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65  Rowid<=p->iWrite
23800 52 6f 77 69 64 20 7c 7c 20 28 70 2d 3e 6e 50 65  Rowid || (p->nPe
23810 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e  ndingData > p->n
23820 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 29 20  MaxPendingData) 
23830 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
23840 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20  Flush(p);.  }.  
23850 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d  p->iWriteRowid =
23860 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72   iRowid;.  retur
23870 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
23880 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n(p);.}../*.** C
23890 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64 69  ommit data to di
238a0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
238b0 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28  e3Fts5IndexSync(
238c0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
238d0 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 61 73  t bCommit){.  as
238e0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
238f0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
23900 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20  IndexFlush(p);. 
23910 20 69 66 28 20 62 43 6f 6d 6d 69 74 20 29 20 66   if( bCommit ) f
23920 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
23930 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
23940 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
23950 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
23960 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
23970 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
23980 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44  y hash tables. D
23990 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a  o not write it.*
239a0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
239b0 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
239c0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
239d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
239e0 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65   %_data.** table
239f0 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
23a00 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e  d on disk. So an
23a10 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  y in-memory cach
23a20 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a  es of %_data .**
23a30 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65   records must be
23a40 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
23a50 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
23a60 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74  IndexRollback(Ft
23a70 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66  s5Index *p){.  f
23a80 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
23a90 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44 69  );.  fts5IndexDi
23aa0 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20 20  scardData(p);.  
23ab0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
23ac0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
23ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  }../*.** The %_d
23af0 61 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  ata table is com
23b00 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68  pletely empty wh
23b10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
23b20 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73   is called. This
23b30 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  .** function pop
23b40 75 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74  ulates it with t
23b50 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63  he initial struc
23b60 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72  ture objects for
23b70 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20   each index,.** 
23b80 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  and the initial 
23b90 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22  version of the "
23ba0 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
23bb0 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c   (a zero-byte bl
23bc0 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ob)..*/.int sqli
23bd0 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e  te3Fts5IndexRein
23be0 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  it(Fts5Index *p)
23bf0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73  {.  int i;.  Fts
23c00 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a 0a 20  5Structure s;.. 
23c10 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
23c20 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
23c30 75 72 65 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ure));.  for(i=0
23c40 3b 20 69 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  ; i<p->pConfig->
23c50 6e 50 72 65 66 69 78 2b 31 3b 20 69 2b 2b 29 7b  nPrefix+1; i++){
23c60 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
23c70 72 65 57 72 69 74 65 28 70 2c 20 69 2c 20 26 73  reWrite(p, i, &s
23c80 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
23c90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23ca0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
23cb0 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
23cc0 41 76 65 72 61 67 65 73 28 70 2c 20 28 63 6f 6e  Averages(p, (con
23cd0 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20  st u8*)"", 0);. 
23ce0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73   }..  return fts
23cf0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
23d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
23d10 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20 68   new Fts5Index h
23d20 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43  andle. If the bC
23d30 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69  reate argument i
23d40 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a  s true, create.*
23d50 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
23d60 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
23d70 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a  %_data table..**
23d80 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
23d90 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  l, set *pp to po
23da0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
23db0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
23dc0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
23dd0 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70  therwise, set *p
23de0 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65  p to NULL and re
23df0 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
23e00 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
23e10 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
23e20 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f  exOpen(.  Fts5Co
23e30 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a  nfig *pConfig, .
23e40 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a    int bCreate, .
23e50 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70    Fts5Index **pp
23e60 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
23e70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
23e80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35  QLITE_OK;.  Fts5
23e90 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23eb0 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  ew object */..  
23ec0 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49  *pp = p = (Fts5I
23ed0 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ndex*)sqlite3_ma
23ee0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 35  lloc(sizeof(Fts5
23ef0 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 21  Index));.  if( !
23f00 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  p ) return SQLIT
23f10 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 6d 65 6d 73  E_NOMEM;..  mems
23f20 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
23f30 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 70  Fts5Index));.  p
23f40 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e  ->pConfig = pCon
23f50 66 69 67 3b 0a 20 20 70 2d 3e 6e 57 6f 72 6b 55  fig;.  p->nWorkU
23f60 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f  nit = FTS5_WORK_
23f70 55 4e 49 54 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50  UNIT;.  p->nMaxP
23f80 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 31 30 32  endingData = 102
23f90 34 2a 31 30 32 34 3b 0a 20 20 70 2d 3e 7a 44 61  4*1024;.  p->zDa
23fa0 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 5f  taTbl = sqlite3_
23fb0 6d 70 72 69 6e 74 66 28 22 25 73 5f 64 61 74 61  mprintf("%s_data
23fc0 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  ", pConfig->zNam
23fd0 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 44 61  e);.  if( p->zDa
23fe0 74 61 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  taTbl==0 ){.    
23ff0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
24000 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62  M;.  }else if( b
24010 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 72 63  Create ){.    rc
24020 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72   = sqlite3Fts5Cr
24030 65 61 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20  eateTable(.     
24040 20 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74     pConfig, "dat
24050 61 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20  a", "id INTEGER 
24060 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f  PRIMARY KEY, blo
24070 63 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45  ck BLOB", 0, pzE
24080 72 72 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  rr.    );.    if
24090 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
240a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
240b0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
240c0 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20  init(p);.    }. 
240d0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d   }..  assert( p-
240e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
240f0 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
24100 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
24110 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e     sqlite3Fts5In
24120 64 65 78 43 6c 6f 73 65 28 70 2c 20 30 29 3b 0a  dexClose(p, 0);.
24130 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
24140 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24150 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68  ./*.** Close a h
24160 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20  andle opened by 
24170 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
24180 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  to sqlite3Fts5In
24190 64 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  dexOpen()..*/.in
241a0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
241b0 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65  exClose(Fts5Inde
241c0 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 73 74 72  x *p, int bDestr
241d0 6f 79 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oy){.  int rc = 
241e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
241f0 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 62 44   p ){.    if( bD
24200 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
24210 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
24220 44 72 6f 70 54 61 62 6c 65 28 70 2d 3e 70 43 6f  DropTable(p->pCo
24230 6e 66 69 67 2c 20 22 64 61 74 61 22 29 3b 0a 20  nfig, "data");. 
24240 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
24250 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29   p->pReader==0 )
24260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
24270 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65  nalize(p->pWrite
24280 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
24290 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c  finalize(p->pDel
242a0 65 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  eter);.    if( p
242b0 2d 3e 61 70 48 61 73 68 20 29 7b 0a 20 20 20 20  ->apHash ){.    
242c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
242d0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 70 43  or(i=0; i<=p->pC
242e0 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
242f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
24300 6c 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65  lite3Fts5HashFre
24310 65 28 70 2d 3e 61 70 48 61 73 68 5b 69 5d 29 3b  e(p->apHash[i]);
24320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
24330 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
24340 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20  pHash);.    }.  
24350 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24360 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20  ->zDataTbl);.   
24370 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
24380 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24390 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75  c;.}../*.** Argu
243a0 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f  ment p points to
243b0 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
243c0 6e 69 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20  ning utf-8 text 
243d0 74 68 61 74 20 69 73 20 6e 20 62 79 74 65 73 20  that is n bytes 
243e0 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74  in .** size. Ret
243f0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
24400 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e  f bytes in the n
24410 43 68 61 72 20 63 68 61 72 61 63 74 65 72 20 70  Char character p
24420 72 65 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20  refix of the.** 
24430 62 75 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20  buffer, or 0 if 
24440 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20 74  there are less t
24450 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63  han nChar charac
24460 74 65 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a  ters in total..*
24470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
24480 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42  5IndexCharlenToB
24490 79 74 65 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61  ytelen(const cha
244a0 72 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 2c  r *p, int nByte,
244b0 20 69 6e 74 20 6e 43 68 61 72 29 7b 0a 20 20 69   int nChar){.  i
244c0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt n = 0;.  int 
244d0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
244e0 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nChar; i++){.   
244f0 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20   if( n>=nByte ) 
24500 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f  return 0;      /
24510 2a 20 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73  * Input contains
24520 20 66 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61   fewer than nCha
24530 72 20 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69  r chars */.    i
24540 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  f( (unsigned cha
24550 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29  r)p[n++]>=0xc0 )
24560 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  {.      while( (
24570 70 5b 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78  p[n] & 0xc0)==0x
24580 38 30 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  80 ) n++;.    }.
24590 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
245a0 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20  }../*.** pIn is 
245b0 61 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  a UTF-8 encoded 
245c0 73 74 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65  string, nIn byte
245d0 73 20 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72  s in size. Retur
245e0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  n the number of.
245f0 2a 2a 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61  ** unicode chara
24600 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 74 72  cters in the str
24610 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 66 74 73 35  ing..*/.int fts5
24620 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e  IndexCharlen(con
24630 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e  st char *pIn, in
24640 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43  t nIn){.  int nC
24650 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  har = 0;        
24660 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30      .  int i = 0
24670 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e  ;.  while( i<nIn
24680 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73   ){.    if( (uns
24690 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69  igned char)pIn[i
246a0 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20  ++]>=0xc0 ){.   
246b0 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20     while( i<nIn 
246c0 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63  && (pIn[i] & 0xc
246d0 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a  0)==0x80 ) i++;.
246e0 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b      }.    nChar+
246f0 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
24700 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nChar;.}../*.** 
24710 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20 72 65  Calculate and re
24720 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
24730 74 68 61 74 20 69 73 20 74 68 65 20 58 4f 52 20  that is the XOR 
24740 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
24750 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 6f  ry.** checksum o
24760 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 74 68  f all entries th
24770 61 74 20 77 6f 75 6c 64 20 62 65 20 67 65 6e 65  at would be gene
24780 72 61 74 65 64 20 62 79 20 74 68 65 20 74 6f 6b  rated by the tok
24790 65 6e 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  en specified.** 
247a0 62 79 20 74 68 65 20 66 69 6e 61 6c 20 35 20 61  by the final 5 a
247b0 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34  rguments..*/.u64
247c0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
247d0 78 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 43 6f  xCksum(.  Fts5Co
247e0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20  nfig *pConfig,  
247f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
24800 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63  figuration objec
24810 74 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  t */.  i64 iRowi
24820 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
24830 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65         /* Docume
24840 6e 74 20 74 65 72 6d 20 61 70 70 65 61 72 73 20  nt term appears 
24850 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  in */.  int iCol
24860 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24870 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
24880 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69  n term appears i
24890 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c  n */.  int iPos,
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248b0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69         /* Positi
248c0 6f 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73 20  on term appears 
248d0 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  in */.  const ch
248e0 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  ar *pTerm, int n
248f0 54 65 72 6d 20 20 20 20 2f 2a 20 54 65 72 6d 20  Term    /* Term 
24900 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20  at iPos */.){.  
24910 75 36 34 20 72 65 74 20 3d 20 30 3b 20 20 20 20  u64 ret = 0;    
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
24940 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20  */.  int iIdx;  
24950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24960 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72       /* For iter
24970 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e  ating through in
24980 64 65 78 65 73 20 2a 2f 0a 0a 20 20 72 65 74 20  dexes */..  ret 
24990 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  = fts5IndexEntry
249a0 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43  Cksum(iRowid, iC
249b0 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 65 72 6d 2c  ol, iPos, pTerm,
249c0 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28   nTerm);..  for(
249d0 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 70 43 6f  iIdx=0; iIdx<pCo
249e0 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
249f0 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  Idx++){.    int 
24a00 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e 64 65  nByte = fts5Inde
24a10 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
24a20 6e 28 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  n(pTerm, nTerm, 
24a30 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
24a40 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66 28  [iIdx]);.    if(
24a50 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
24a60 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64 65 78  ret ^= fts5Index
24a70 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69  EntryCksum(iRowi
24a80 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70  d, iCol, iPos, p
24a90 54 65 72 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Term, nByte);.  
24aa0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
24ab0 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
24ac0 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65  Insert or remove
24ad0 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d   data to or from
24ae0 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68   the index. Each
24af0 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74   time a document
24b00 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f   is .** added to
24b10 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   or removed from
24b20 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73   the index, this
24b30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
24b40 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a  led one or more.
24b50 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  ** times..**.** 
24b60 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69  For an insert, i
24b70 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
24b80 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
24b90 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20  oken in the new 
24ba0 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20  document..** If 
24bb0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  the operation is
24bc0 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75   a delete, it mu
24bd0 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74  st be called (at
24be0 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72   least) once for
24bf0 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20   each.** unique 
24c00 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63  token in the doc
24c10 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43  ument with an iC
24c20 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68  ol value less th
24c30 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f  an zero. The iPo
24c40 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  s.** argument is
24c50 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64   ignored for a d
24c60 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  elete..*/.int sq
24c70 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72  lite3Fts5IndexWr
24c80 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ite(.  Fts5Index
24c90 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
24ca0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
24cb0 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
24cc0 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20   int iCol,      
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e   /* Column token
24cf0 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65   appears in (-ve
24d00 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20   -> delete) */. 
24d10 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20   int iPos,      
24d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d30 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20   /* Position of 
24d40 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c  token within col
24d50 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  umn */.  const c
24d60 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74  har *pToken, int
24d70 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65   nToken  /* Toke
24d80 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f  n to add or remo
24d90 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e  ve to or from in
24da0 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  dex */.){.  int 
24db0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
24dd0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
24de0 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a  hrough indexes *
24df0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
24e20 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
24e30 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
24e40 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73  >pConfig;..  ass
24e50 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
24e60 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41  TE_OK );..  /* A
24e70 64 64 20 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e  dd the new token
24e80 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72   to the main ter
24e90 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20 41  ms hash table. A
24ea0 6e 64 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68  nd to each of th
24eb0 65 0a 20 20 2a 2a 20 70 72 65 66 69 78 20 68 61  e.  ** prefix ha
24ec0 73 68 20 74 61 62 6c 65 73 20 74 68 61 74 20 69  sh tables that i
24ed0 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  t is large enoug
24ee0 68 20 66 6f 72 2e 20 2a 2f 0a 20 20 72 63 20 3d  h for. */.  rc =
24ef0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
24f00 57 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e  Write(.      p->
24f10 61 70 48 61 73 68 5b 30 5d 2c 20 70 2d 3e 69 57  apHash[0], p->iW
24f20 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  riteRowid, iCol,
24f30 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e   iPos, pToken, n
24f40 54 6f 6b 65 6e 0a 20 20 29 3b 0a 20 20 66 6f 72  Token.  );.  for
24f50 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
24f60 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d  >nPrefix && rc==
24f70 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
24f80 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
24f90 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
24fa0 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65  nToBytelen(pToke
24fb0 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66  n, nToken, pConf
24fc0 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 29 3b  ig->aPrefix[i]);
24fd0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
24fe0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
24ff0 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
25000 65 28 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e(.          p->
25010 61 70 48 61 73 68 5b 69 2b 31 5d 2c 20 70 2d 3e  apHash[i+1], p->
25020 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f  iWriteRowid, iCo
25030 6c 2c 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c  l, iPos, pToken,
25040 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b 0a   nByte.      );.
25050 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
25060 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
25070 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65 72   Open a new iter
25080 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65 20  ator to iterate 
25090 74 68 6f 75 67 68 20 61 6c 6c 20 64 6f 63 69 64  though all docid
250a0 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  s that match the
250b0 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74   .** specified t
250c0 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
250d0 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  efix..*/.int sql
250e0 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
250f0 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ry(.  Fts5Index 
25100 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
25110 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
25120 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  ex to query */. 
25130 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
25140 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  ken, int nToken,
25150 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72   /* Token (or pr
25160 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66  efix) to query f
25170 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  or */.  int flag
25180 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
25190 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
251a0 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  of FTS5INDEX_QUE
251b0 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  RY_X flags */.  
251c0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a  Fts5IndexIter **
251d0 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
251e0 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
251f0 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  ator object */.)
25200 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
25210 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
25220 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e 64 65  nfig;.  Fts5Inde
25230 78 49 74 65 72 20 2a 70 52 65 74 3b 0a 20 20 69  xIter *pRet;.  i
25240 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 0a 20 20  nt iIdx = 0;..  
25250 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
25260 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
25270 49 58 20 29 7b 0a 20 20 20 20 69 66 28 20 66 6c  IX ){.    if( fl
25280 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
25290 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
252a0 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
252b0 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65   1+pConfig->nPre
252c0 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fix;.    }else{.
252d0 20 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72 20        int nChar 
252e0 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c  = fts5IndexCharl
252f0 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  en(pToken, nToke
25300 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 49  n);.      for(iI
25310 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e  dx=1; iIdx<=pCon
25320 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49  fig->nPrefix; iI
25330 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  dx++){.        i
25340 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  f( pConfig->aPre
25350 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68  fix[iIdx-1]==nCh
25360 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ar ) break;.    
25370 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
25380 20 70 52 65 74 20 3d 20 28 46 74 73 35 49 6e 64   pRet = (Fts5Ind
25390 65 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 46  exIter*)sqlite3F
253a0 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70  ts5MallocZero(&p
253b0 2d 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73  ->rc, sizeof(Fts
253c0 35 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 20 20  5IndexIter));.  
253d0 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
253e0 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20  memset(pRet, 0, 
253f0 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78  sizeof(Fts5Index
25400 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 70 52 65  Iter));..    pRe
25410 74 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20  t->pIndex = p;. 
25420 20 20 20 69 66 28 20 69 49 64 78 3c 3d 70 43 6f     if( iIdx<=pCo
25430 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b  nfig->nPrefix ){
25440 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 70 53 74  .      pRet->pSt
25450 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
25460 74 75 72 65 52 65 61 64 28 70 2c 20 69 49 64 78  tureRead(p, iIdx
25470 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
25480 74 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a 20 20  t->pStruct ){.  
25490 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
254a0 74 65 72 4e 65 77 28 70 2c 20 70 52 65 74 2d 3e  terNew(p, pRet->
254b0 70 53 74 72 75 63 74 2c 20 0a 20 20 20 20 20 20  pStruct, .      
254c0 20 20 20 20 20 20 69 49 64 78 2c 20 31 2c 20 66        iIdx, 1, f
254d0 6c 61 67 73 2c 20 28 63 6f 6e 73 74 20 75 38 2a  lags, (const u8*
254e0 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c  )pToken, nToken,
254f0 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 2d 3e 70   -1, 0, &pRet->p
25500 4d 75 6c 74 69 0a 20 20 20 20 20 20 20 20 29 3b  Multi.        );
25510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
25520 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  se{.      int bD
25530 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46  esc = (flags & F
25540 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
25550 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 66  ESC)!=0;.      f
25560 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
25570 65 72 28 70 2c 20 62 44 65 73 63 2c 20 28 63 6f  er(p, bDesc, (co
25580 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20  nst u8*)pToken, 
25590 6e 54 6f 6b 65 6e 2c 20 70 52 65 74 29 3b 0a 20  nToken, pRet);. 
255a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
255b0 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  p->rc ){.    sql
255c0 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
255d0 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52 65  e(pRet);.    pRe
255e0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70  t = 0;.  }.  *pp
255f0 49 74 65 72 20 3d 20 70 52 65 74 3b 0a 20 20 72  Iter = pRet;.  r
25600 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
25610 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
25620 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
25630 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
25640 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
25650 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74  y argument is at
25660 20 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   EOF..*/.int sql
25670 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
25680 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
25690 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
256a0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
256b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
256c0 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44  .  if( pIter->pD
256d0 6f 63 6c 69 73 74 20 29 7b 20 0a 20 20 20 20 72  oclist ){ .    r
256e0 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f  eturn pIter->pDo
256f0 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3d  clist->aPoslist=
25700 3d 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  =0; .  }else{.  
25710 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c    return fts5Mul
25720 74 69 49 74 65 72 45 6f 66 28 70 49 74 65 72 2d  tiIterEof(pIter-
25730 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e  >pIndex, pIter->
25740 70 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pMulti);.  }.}..
25750 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
25760 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
25770 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  rowid. .*/.int s
25780 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
25790 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  xt(Fts5IndexIter
257a0 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
257b0 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
257c0 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
257d0 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d   );.  if( pIter-
257e0 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  >pDoclist ){.   
257f0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
25800 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 44 6f 63  Next(pIter->pDoc
25810 6c 69 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  list);.  }else{.
25820 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
25830 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
25840 73 74 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  st);.    fts5Mul
25850 74 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  tiIterNext(pIter
25860 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d  ->pIndex, pIter-
25870 3e 70 4d 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a  >pMulti, 0, 0);.
25880 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
25890 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
258a0 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
258b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64  /*.** Move the d
258c0 6f 63 6c 69 73 74 2d 69 74 65 72 20 70 61 73 73  oclist-iter pass
258d0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
258e0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
258f0 6e 65 78 74 20 0a 2a 2a 20 6d 61 74 63 68 69 6e  next .** matchin
25900 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63  g rowid that occ
25910 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20  urs at or after 
25920 69 4d 61 74 63 68 2e 20 54 68 65 20 64 65 66 69  iMatch. The defi
25930 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 0a 2a  nition of "at .*
25940 2a 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65  * or after" depe
25950 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74  nds on whether t
25960 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65  his iterator ite
25970 72 61 74 65 73 20 69 6e 20 61 73 63 65 6e 64 69  rates in ascendi
25980 6e 67 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  ng or .** descen
25990 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72  ding rowid order
259a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
259b0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
259c0 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 44 6f 63  NextFrom(Fts5Doc
259d0 6c 69 73 74 49 74 65 72 20 2a 70 2c 20 69 36 34  listIter *p, i64
259e0 20 69 4d 61 74 63 68 29 7b 0a 20 20 64 6f 7b 0a   iMatch){.  do{.
259f0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
25a00 20 70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20   p->iRowid;.    
25a10 69 66 28 20 70 2d 3e 62 44 65 73 63 3d 3d 30 20  if( p->bDesc==0 
25a20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  && iRowid>=iMatc
25a30 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
25a40 66 28 20 70 2d 3e 62 44 65 73 63 21 3d 30 20 26  f( p->bDesc!=0 &
25a50 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68  & iRowid<=iMatch
25a60 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 66 74   ) break;.    ft
25a70 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
25a80 74 28 70 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  t(p);.  }while( 
25a90 70 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 7d  p->aPoslist );.}
25aa0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
25ab0 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
25ac0 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63  g rowid that occ
25ad0 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20  urs at or after 
25ae0 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64  iMatch. The.** d
25af0 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74  efinition of "at
25b00 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e   or after" depen
25b10 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ds on whether th
25b20 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72  is iterator iter
25b30 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  ates.** in ascen
25b40 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69  ding or descendi
25b50 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a  ng rowid order..
25b60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
25b70 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46  s5IterNextFrom(F
25b80 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
25b90 74 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29  ter, i64 iMatch)
25ba0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  {.  if( pIter->p
25bb0 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 66  Doclist ){.    f
25bc0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
25bd0 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70 44  xtFrom(pIter->pD
25be0 6f 63 6c 69 73 74 2c 20 69 4d 61 74 63 68 29 3b  oclist, iMatch);
25bf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
25c00 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46  s5MultiIterNextF
25c10 72 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  rom(pIter->pInde
25c20 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  x, pIter->pMulti
25c30 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 7d 0a 20  , iMatch);.  }. 
25c40 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
25c50 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
25c60 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
25c70 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
25c80 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36  ent rowid..*/.i6
25c90 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  4 sqlite3Fts5Ite
25ca0 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78  rRowid(Fts5Index
25cb0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
25cc0 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
25cd0 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
25ce0 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  n pIter->pDoclis
25cf0 74 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 7d 65 6c  t->iRowid;.  }el
25d00 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66  se{.    return f
25d10 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
25d20 64 28 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29  d(pIter->pMulti)
25d30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
25d40 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
25d50 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
25d60 74 61 69 6e 69 6e 67 20 61 20 63 6f 70 79 20 6f  taining a copy o
25d70 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
25d80 69 73 74 20 66 6f 72 0a 2a 2a 20 74 68 65 20 63  ist for.** the c
25d90 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 4f 75  urrent entry. Ou
25da0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
25db0 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
25dc0 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
25dd0 65 72 20 0a 2a 2a 20 69 6e 20 62 79 74 65 73 20  er .** in bytes 
25de0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
25df0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
25e00 72 6e 65 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69  rned position li
25e10 73 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  st does not incl
25e20 75 64 65 20 74 68 65 20 22 6e 75 6d 62 65 72 20  ude the "number 
25e30 6f 66 20 62 79 74 65 73 22 20 76 61 72 69 6e 74  of bytes" varint
25e40 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 73  .** field that s
25e50 74 61 72 74 73 20 74 68 65 20 70 6f 73 69 74 69  tarts the positi
25e60 6f 6e 20 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e  on list on disk.
25e70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
25e80 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28 46  ts5IterPoslist(F
25e90 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
25ea0 74 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a  ter, const u8 **
25eb0 70 70 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20  pp, int *pn){.  
25ec0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
25ed0 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
25ee0 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 49  E_OK );.  if( pI
25ef0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b  ter->pDoclist ){
25f00 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65 72  .    *pn = pIter
25f10 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 6e 50 6f 73  ->pDoclist->nPos
25f20 6c 69 73 74 3b 0a 20 20 20 20 2a 70 70 20 3d 20  list;.    *pp = 
25f30 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d  pIter->pDoclist-
25f40 3e 61 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c  >aPoslist;.  }el
25f50 73 65 7b 0a 20 20 20 20 46 74 73 35 49 6e 64 65  se{.    Fts5Inde
25f60 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49  x *p = pIter->pI
25f70 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35 42 75  ndex;.    fts5Bu
25f80 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
25f90 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
25fa0 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c  ts5MultiIterPosl
25fb0 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 70 4d  ist(p, pIter->pM
25fc0 75 6c 74 69 2c 20 30 2c 20 26 70 49 74 65 72 2d  ulti, 0, &pIter-
25fd0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 2a  >poslist);.    *
25fe0 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  pn = pIter->posl
25ff0 69 73 74 2e 6e 3b 0a 20 20 20 20 2a 70 70 20 3d  ist.n;.    *pp =
26000 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
26010 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
26020 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
26030 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
26040 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
26050 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65  n iterator opene
26060 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
26070 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46  call to sqlite3F
26080 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e  ts5IndexQuery().
26090 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
260a0 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74  Fts5IterClose(Ft
260b0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
260c0 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
260d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65   ){.    if( pIte
260e0 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20  r->pDoclist ){. 
260f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
26100 65 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  e(pIter->pDoclis
26110 74 2d 3e 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  t->a);.      sql
26120 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
26130 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  >pDoclist);.    
26140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
26150 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
26160 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
26170 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20  ter->pMulti);.  
26180 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
26190 65 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  eRelease(pIter->
261a0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
261b0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
261c0 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
261d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 43  .    }.    fts5C
261e0 6c 6f 73 65 52 65 61 64 65 72 28 70 49 74 65 72  loseReader(pIter
261f0 2d 3e 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ->pIndex);.    s
26200 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
26210 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
26220 20 52 65 61 64 20 74 68 65 20 22 61 76 65 72 61   Read the "avera
26230 67 65 73 22 20 72 65 63 6f 72 64 20 69 6e 74 6f  ges" record into
26240 20 74 68 65 20 62 75 66 66 65 72 20 73 75 70 70   the buffer supp
26250 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  lied as the seco
26260 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
26270 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
26280 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
26290 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
262a0 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 66 20 61  ror code.** if a
262b0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
262c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
262d0 73 35 49 6e 64 65 78 47 65 74 41 76 65 72 61 67  s5IndexGetAverag
262e0 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  es(Fts5Index *p,
262f0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
26300 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  f){.  assert( p-
26310 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
26320 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 61 64  ;.  fts5DataRead
26330 4f 72 42 75 66 66 65 72 28 70 2c 20 70 42 75 66  OrBuffer(p, pBuf
26340 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
26350 52 4f 57 49 44 29 3b 0a 20 20 72 65 74 75 72 6e  ROWID);.  return
26360 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
26370 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
26380 70 6c 61 63 65 20 74 68 65 20 63 75 72 72 65 6e  place the curren
26390 74 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  t "averages" rec
263a0 6f 72 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ord with the con
263b0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 75 66  tents of the buf
263c0 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64  fer .** supplied
263d0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
263e0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
263f0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
26400 53 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35  SetAverages(Fts5
26410 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20  Index *p, const 
26420 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  u8 *pData, int n
26430 44 61 74 61 29 7b 0a 20 20 61 73 73 65 72 74 28  Data){.  assert(
26440 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
26450 4b 20 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57  K );.  fts5DataW
26460 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45  rite(p, FTS5_AVE
26470 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70 44 61  RAGES_ROWID, pDa
26480 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72 65  ta, nData);.  re
26490 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
264a0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
264b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
264c0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f  al number of blo
264d0 63 6b 73 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  cks this module 
264e0 68 61 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  has read from th
264f0 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c  e %_data.** tabl
26500 65 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 63  e since it was c
26510 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  reated..*/.int s
26520 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
26530 65 61 64 73 28 46 74 73 35 49 6e 64 65 78 20 2a  eads(Fts5Index *
26540 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
26550 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nRead;.}../*.** 
26560 53 65 74 20 74 68 65 20 33 32 2d 62 69 74 20 63  Set the 32-bit c
26570 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73 74 6f 72  ookie value stor
26580 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
26590 6f 66 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65  of all structure
265a0 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 6f 20   .** records to 
265b0 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
265c0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
265d0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52  rgument..**.** R
265e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
265f0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
26600 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
26610 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72  r code if an err
26620 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f  or.** occurs..*/
26630 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
26640 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65 28 46  IndexSetCookie(F
26650 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
26660 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74 20 72 63   iNew){.  int rc
26670 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26680 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
26690 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
266a0 3b 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34  ;.  u8 aCookie[4
266b0 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  ];.  int i;..  a
266c0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
266d0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
266e0 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61 43  ite3Fts5Put32(aC
266f0 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 20 20  ookie, iNew);.  
26700 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
26710 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 70 43 6f  ITE_OK && i<=pCo
26720 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
26730 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
26740 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30  _blob *pBlob = 0
26750 3b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  ;.    i64 iRowid
26760 20 3d 20 46 54 53 35 5f 53 54 52 55 43 54 55 52   = FTS5_STRUCTUR
26770 45 5f 52 4f 57 49 44 28 69 29 3b 0a 20 20 20 20  E_ROWID(i);.    
26780 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
26790 62 5f 6f 70 65 6e 28 0a 20 20 20 20 20 20 20 20  b_open(.        
267a0 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f  pConfig->db, pCo
267b0 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44  nfig->zDb, p->zD
267c0 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c  ataTbl, "block",
267d0 20 69 52 6f 77 69 64 2c 20 31 2c 20 26 70 42 6c   iRowid, 1, &pBl
267e0 6f 62 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ob.    );.    if
267f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26800 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26810 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f  _blob_write(pBlo
26820 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30  b, aCookie, 4, 0
26830 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
26840 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
26850 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20 7d 0a 20  (pBlob);.    }. 
26860 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
26870 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
26880 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66  ts5IndexLoadConf
26890 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ig(Fts5Index *p)
268a0 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
268b0 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53  e *pStruct;.  pS
268c0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
268d0 63 74 75 72 65 52 65 61 64 28 70 2c 20 30 29 3b  ctureRead(p, 0);
268e0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
268f0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
26900 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
26910 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
26920 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
26930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
26970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
269a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
269b0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
269c0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
269d0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
269e0 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  n of the fts5_de
269f0 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a  code() scalar.**
26a00 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a   function only..
26a10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  */../*.** Decode
26a20 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20   a segment-data 
26a30 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25  rowid from the %
26a40 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69  _data table. Thi
26a50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
26a60 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66   the opposite of
26a70 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d   macro FTS5_SEGM
26a80 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a  ENT_ROWID()..*/.
26a90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
26aa0 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69  DecodeRowid(.  i
26ab0 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ad0 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64  * Rowid from %_d
26ae0 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ata table */.  i
26af0 6e 74 20 2a 70 69 49 64 78 2c 20 20 20 20 20 20  nt *piIdx,      
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b10 2a 20 4f 55 54 3a 20 49 6e 64 65 78 20 2a 2f 0a  * OUT: Index */.
26b20 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20    int *piSegid, 
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b40 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e    /* OUT: Segmen
26b50 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  t id */.  int *p
26b60 69 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20  iHeight,        
26b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26b80 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e  : Height */.  in
26b90 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20  t *piPgno       
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26bb0 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65   OUT: Page numbe
26bc0 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e  r */.){.  *piPgn
26bd0 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  o = (int)(iRowid
26be0 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
26bf0 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29  TS5_DATA_PAGE_B)
26c00 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64   - 1));.  iRowid
26c10 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50   >>= FTS5_DATA_P
26c20 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69  AGE_B;..  *piHei
26c30 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  ght = (int)(iRow
26c40 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
26c50 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48   FTS5_DATA_HEIGH
26c60 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  T_B) - 1));.  iR
26c70 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
26c80 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20  TA_HEIGHT_B;..  
26c90 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29  *piSegid = (int)
26ca0 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
26cb0 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
26cc0 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69  ID_B) - 1));.  i
26cd0 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
26ce0 41 54 41 5f 49 44 5f 42 3b 0a 0a 20 20 2a 70 69  ATA_ID_B;..  *pi
26cf0 49 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  Idx = (int)(iRow
26d00 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
26d10 20 46 54 53 35 5f 44 41 54 41 5f 49 44 58 5f 42   FTS5_DATA_IDX_B
26d20 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74  ) - 1));.}..stat
26d30 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
26d40 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c  gRowid(int *pRc,
26d50 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
26d60 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20  f, i64 iKey){.  
26d70 69 6e 74 20 69 49 64 78 2c 69 53 65 67 69 64 2c  int iIdx,iSegid,
26d80 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20  iHeight,iPgno;  
26d90 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65  /* Rowid compene
26da0 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63  nts */.  fts5Dec
26db0 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26  odeRowid(iKey, &
26dc0 69 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20 26  iIdx, &iSegid, &
26dd0 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
26de0 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d  ;..  if( iSegid=
26df0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b  =0 ){.    if( iK
26e00 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45  ey==FTS5_AVERAGE
26e10 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  S_ROWID ){.     
26e20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
26e30 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
26e40 52 63 2c 20 70 42 75 66 2c 20 22 28 61 76 65 72  Rc, pBuf, "(aver
26e50 61 67 65 73 29 20 22 29 3b 0a 20 20 20 20 7d 65  ages) ");.    }e
26e60 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
26e70 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
26e80 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
26e90 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  uf, .          "
26ea0 7b 73 74 72 75 63 74 75 72 65 20 69 64 78 3d 25  {structure idx=%
26eb0 64 7d 22 2c 20 28 69 6e 74 29 28 69 4b 65 79 2d  d}", (int)(iKey-
26ec0 31 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  10).      );.   
26ed0 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66   }.  }.  else if
26ee0 28 20 69 48 65 69 67 68 74 3d 3d 46 54 53 35 5f  ( iHeight==FTS5_
26ef0 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47  SEGMENT_MAX_HEIG
26f00 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  HT ){.    sqlite
26f10 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
26f20 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
26f30 66 2c 20 22 28 64 6c 69 64 78 20 69 64 78 3d 25  f, "(dlidx idx=%
26f40 64 20 73 65 67 69 64 3d 25 64 20 70 67 6e 6f 3d  d segid=%d pgno=
26f50 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 69 49  %d)",.        iI
26f60 64 78 2c 20 69 53 65 67 69 64 2c 20 69 50 67 6e  dx, iSegid, iPgn
26f70 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  o.    );.  }else
26f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
26f90 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
26fa0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
26fb0 28 69 64 78 3d 25 64 20 73 65 67 69 64 3d 25 64  (idx=%d segid=%d
26fc0 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c   h=%d pgno=%d)",
26fd0 0a 20 20 20 20 20 20 20 20 69 49 64 78 2c 20 69  .        iIdx, i
26fe0 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
26ff0 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d  iPgno.    );.  }
27000 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
27010 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
27020 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  re(.  int *pRc, 
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27040 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
27050 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
27060 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
27070 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  f,.  Fts5Structu
27080 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69  re *p.){.  int i
27090 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20  Lvl, iSeg;      
270a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
270b0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
270c0 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a  vels, segments *
270d0 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  /..  for(iLvl=0;
270e0 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b   iLvl<p->nLevel;
270f0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74   iLvl++){.    Ft
27100 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
27110 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65   *pLvl = &p->aLe
27120 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73  vel[iLvl];.    s
27130 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
27140 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
27150 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20  , pBuf, .       
27160 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67   " {lvl=%d nMerg
27170 65 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76  e=%d", iLvl, pLv
27180 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20 20 20 29 3b  l->nMerge.    );
27190 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b  .    for(iSeg=0;
271a0 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67   iSeg<pLvl->nSeg
271b0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
271c0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
271d0 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
271e0 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
271f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
27200 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
27210 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
27220 0a 20 20 20 20 20 20 20 20 20 20 22 20 7b 69 64  .          " {id
27230 3d 25 64 20 68 3d 25 64 20 6c 65 61 76 65 73 3d  =%d h=%d leaves=
27240 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67 2d 3e  %d..%d}", pSeg->
27250 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 6e 48  iSegid, pSeg->nH
27260 65 69 67 68 74 2c 20 0a 20 20 20 20 20 20 20 20  eight, .        
27270 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
27280 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  t, pSeg->pgnoLas
27290 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
272a0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
272b0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
272c0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d  tf(pRc, pBuf, "}
272d0 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
272e0 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66   This is part of
272f0 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
27300 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64  () debugging aid
27310 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
27320 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f  s pBlob/nBlob co
27330 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a  ntain a serializ
27340 65 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ed Fts5Structure
27350 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a   object. This.**
27360 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
27370 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
27380 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
27390 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62  n of the same ob
273a0 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62  ject.** to the b
273b0 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20  uffer passed as 
273c0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
273d0 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ent. .*/.static 
273e0 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53  void fts5DecodeS
273f0 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20  tructure(.  int 
27400 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
27410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
27420 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64  N/OUT: error cod
27430 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
27440 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74  r *pBuf,.  const
27450 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20   u8 *pBlob, int 
27460 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72  nBlob.){.  int r
27470 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27490 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
274a0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20  ts5Structure *p 
274b0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
274c0 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74  * Decoded struct
274d0 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  ure object */.. 
274e0 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74   rc = fts5Struct
274f0 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c  ureDecode(pBlob,
27500 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a   nBlob, 0, &p);.
27510 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27520 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20  _OK ){.    *pRc 
27530 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
27540 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62  ;.  }..  fts5Deb
27550 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c  ugStructure(pRc,
27560 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73   pBuf, p);.  fts
27570 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
27580 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  e(p);.}../*.** B
27590 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61  uffer (a/n) is a
275a0 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
275b0 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69  n a list of seri
275c0 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20  alized varints. 
275d0 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72  Read.** each var
275e0 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69  int and append i
275f0 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ts string repres
27600 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66  entation to buff
27610 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a  er pBuf. Return.
27620 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20  ** after either 
27630 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
27640 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72   is exhausted or
27650 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65   a 0 value is re
27660 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ad..**.** The re
27670 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
27680 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
27690 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
276a0 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
276b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
276c0 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e  DecodePoslist(in
276d0 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
276e0 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
276f0 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
27700 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
27710 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
27720 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a  {.    int iVal;.
27730 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
27740 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
27750 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  Off], iVal);.   
27760 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
27770 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
27780 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c  Rc, pBuf, " %d",
27790 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
277a0 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
277b0 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66  .** The start of
277c0 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f   buffer (a/n) co
277d0 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74  ntains the start
277e0 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   of a doclist. T
277f0 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61  he doclist.** ma
27800 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e  y or may not fin
27810 69 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62  ish within the b
27820 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
27830 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74  tion appends a t
27840 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74  ext.** represent
27850 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
27860 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  t of the doclist
27870 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
27880 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   to buffer.** pB
27890 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  uf. .**.** The r
278a0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
278b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
278c0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
278d0 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
278e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
278f0 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69  5DecodeDoclist(i
27900 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
27910 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
27920 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
27930 20 20 69 36 34 20 69 44 6f 63 69 64 3b 0a 20 20    i64 iDocid;.  
27940 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
27950 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20   if( iOff<n ){. 
27960 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
27970 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  e3GetVarint(&a[i
27980 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 6f  Off], (u64*)&iDo
27990 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  cid);.    sqlite
279a0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
279b0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
279c0 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22  f, " rowid=%lld"
279d0 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20  , iDocid);.  }. 
279e0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
279f0 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  {.    int nPos;.
27a00 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
27a10 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
27a20 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
27a30 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  a[iOff], &nPos, 
27a40 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f  &bDummy);.    iO
27a50 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65  ff += fts5Decode
27a60 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75  Poslist(pRc, pBu
27a70 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e  f, &a[iOff], MIN
27a80 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b  (n-iOff, nPos));
27a90 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20  .    if( iOff<n 
27aa0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  ){.      i64 iDe
27ab0 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  lta;.      iOff 
27ac0 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
27ad0 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
27ae0 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
27af0 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d      if( iDelta==
27b00 30 20 29 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  0 ) return iOff;
27b10 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d  .      iDocid +=
27b20 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73   iDelta;.      s
27b30 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
27b40 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
27b50 2c 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64 3d  , pBuf, " rowid=
27b60 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a  %lld", iDocid);.
27b70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
27b80 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  urn iOff;.}../*.
27b90 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
27ba0 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65  ation of user-de
27bb0 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
27bc0 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64  ction fts5_decod
27bd0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
27be0 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46 75  oid fts5DecodeFu
27bf0 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
27c00 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
27c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
27c20 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
27c30 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
27c40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27c50 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27c60 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79  r of args (alway
27c70 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s 2) */.  sqlite
27c80 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
27c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
27ca0 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
27cb0 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77  */.){.  i64 iRow
27cc0 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
27cd0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
27ce0 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e   for record bein
27cf0 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69  g decoded */.  i
27d00 6e 74 20 69 49 64 78 2c 69 53 65 67 69 64 2c 69  nt iIdx,iSegid,i
27d10 48 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f  Height,iPgno;  /
27d20 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e  * Rowid componen
27d30 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ts */.  const u8
27d40 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20   *aBlob; int n; 
27d50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72          /* Recor
27d60 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20  d to decode */. 
27d70 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74   u8 *a = 0;.  Ft
27d80 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20 20  s5Buffer s;     
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27da0 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20 74   Build up text t
27db0 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f  o return here */
27dc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27dd0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
27de0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27df0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63  e */.  int nSpac
27e00 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
27e10 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d  ( nArg==2 );.  m
27e20 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
27e30 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
27e40 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  ;.  iRowid = sql
27e50 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
27e60 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20  (apVal[0]);.  n 
27e70 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
27e80 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b  bytes(apVal[1]);
27e90 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  aBlob = sqlit
27ea0 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70  e3_value_blob(ap
27eb0 56 61 6c 5b 31 5d 29 3b 0a 0a 20 20 6e 53 70 61  Val[1]);..  nSpa
27ec0 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41  ce = n + FTS5_DA
27ed0 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b  TA_ZERO_PADDING;
27ee0 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69  .  a = (u8*)sqli
27ef0 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
27f00 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a  o(&rc, nSpace);.
27f10 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74    if( a==0 ) got
27f20 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20  o decode_out;.  
27f30 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c  memcpy(a, aBlob,
27f40 20 6e 29 3b 0a 20 20 66 74 73 35 44 65 63 6f 64   n);.  fts5Decod
27f50 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26  eRowid(iRowid, &
27f60 69 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20 26  iIdx, &iSegid, &
27f70 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
27f80 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f  ;..  fts5DebugRo
27f90 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f  wid(&rc, &s, iRo
27fa0 77 69 64 29 3b 0a 20 20 69 66 28 20 69 48 65 69  wid);.  if( iHei
27fb0 67 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e  ght==FTS5_SEGMEN
27fc0 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 29 7b 0a  T_MAX_HEIGHT ){.
27fd0 20 20 20 20 46 74 73 35 44 61 74 61 20 64 6c 69      Fts5Data dli
27fe0 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  dx;.    Fts5Dlid
27ff0 78 49 74 65 72 20 69 74 65 72 3b 0a 0a 20 20 20  xIter iter;..   
28000 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20   dlidx.p = a;.  
28010 20 20 64 6c 69 64 78 2e 6e 20 3d 20 6e 3b 0a 20    dlidx.n = n;. 
28020 20 20 20 64 6c 69 64 78 2e 6e 52 65 66 20 3d 20     dlidx.nRef = 
28030 32 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  2;..    memset(&
28040 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  iter, 0, sizeof(
28050 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b  Fts5DlidxIter));
28060 0a 20 20 20 20 69 74 65 72 2e 70 44 61 74 61 20  .    iter.pData 
28070 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 69 74  = &dlidx;.    it
28080 65 72 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  er.iLeafPgno = i
28090 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66  Pgno;..    for(f
280a0 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
280b0 74 28 26 69 74 65 72 29 3b 20 69 74 65 72 2e 62  t(&iter); iter.b
280c0 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64  Eof==0; fts5Dlid
280d0 78 49 74 65 72 4e 65 78 74 28 26 69 74 65 72 29  xIterNext(&iter)
280e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
280f0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
28100 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20  Printf(&rc, &s, 
28110 0a 20 20 20 20 20 20 20 20 20 20 22 20 25 64 28  .          " %d(
28120 25 6c 6c 64 29 22 2c 20 69 74 65 72 2e 69 4c 65  %lld)", iter.iLe
28130 61 66 50 67 6e 6f 2c 20 69 74 65 72 2e 69 52 6f  afPgno, iter.iRo
28140 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  wid.      );.   
28150 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69   }.  }else if( i
28160 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
28170 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35  if( iRowid==FTS5
28180 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
28190 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f  ){.      /* todo
281a0 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
281b0 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53       fts5DecodeS
281c0 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73  tructure(&rc, &s
281d0 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , a, n);.    }. 
281e0 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 46 74 73   }else{..    Fts
281f0 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20  5Buffer term;.  
28200 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
28210 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
28220 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  ffer));..    if(
28230 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20   iHeight==0 ){. 
28240 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66       int iTermOf
28250 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  f = 0;.      int
28260 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a   iRowidOff = 0;.
28270 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
28280 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20        int nKeep 
28290 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
282a0 6e 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=4 ){.        
282b0 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
282c0 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20  GetU16(&a[0]);. 
282d0 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20         iTermOff 
282e0 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
282f0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  2]);.      }else
28300 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
28310 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
28320 72 63 2c 20 26 73 2c 20 38 2c 20 28 63 6f 6e 73  rc, &s, 8, (cons
28330 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29  t u8*)"corrupt")
28340 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  ;.        goto d
28350 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 20  ecode_out;.     
28360 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52   }..      if( iR
28370 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20  owidOff ){.     
28380 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64     iOff = iRowid
28390 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
283a0 20 69 66 28 20 69 54 65 72 6d 4f 66 66 20 29 7b   if( iTermOff ){
283b0 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20  .        iOff = 
283c0 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20  iTermOff;.      
283d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
283e0 4f 66 66 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Off = n;.      }
283f0 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
28400 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73  ePoslist(&rc, &s
28410 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29  , &a[4], iOff-4)
28420 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
28430 20 69 52 6f 77 69 64 4f 66 66 3d 3d 30 20 7c 7c   iRowidOff==0 ||
28440 20 69 4f 66 66 3d 3d 69 52 6f 77 69 64 4f 66 66   iOff==iRowidOff
28450 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52   );.      if( iR
28460 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20  owidOff ){.     
28470 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
28480 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
28490 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
284a0 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d  n-iOff);.      }
284b0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
284c0 69 54 65 72 6d 4f 66 66 3d 3d 30 20 7c 7c 20 69  iTermOff==0 || i
284d0 4f 66 66 3d 3d 69 54 65 72 6d 4f 66 66 20 29 3b  Off==iTermOff );
284e0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f  .      while( iO
284f0 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
28500 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  int nByte;.     
28510 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
28520 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
28530 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
28540 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65       term.n= nKe
28550 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ep;.        fts5
28560 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
28570 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79  (&rc, &term, nBy
28580 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  te, &a[iOff]);. 
28590 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
285a0 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20 73  Byte;..        s
285b0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
285c0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20  AppendPrintf(.  
285d0 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
285e0 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
285f0 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
28600 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
28610 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
28620 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
28630 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
28640 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69  s, &a[iOff], n-i
28650 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
28660 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
28670 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
28680 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
28690 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
286a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
286b0 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  }.      fts5Buff
286c0 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
286d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
286e0 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b  Fts5NodeIter ss;
286f0 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73 35 4e  .      for(fts5N
28700 6f 64 65 49 74 65 72 49 6e 69 74 28 61 2c 20 6e  odeIterInit(a, n
28710 2c 20 26 73 73 29 3b 20 73 73 2e 61 44 61 74 61  , &ss); ss.aData
28720 3b 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65  ; fts5NodeIterNe
28730 78 74 28 26 72 63 2c 20 26 73 73 29 29 7b 0a 20  xt(&rc, &ss)){. 
28740 20 20 20 20 20 20 20 69 66 28 20 73 73 2e 74 65         if( ss.te
28750 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rm.n==0 ){.     
28760 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
28770 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
28780 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 6c 65  tf(&rc, &s, " le
28790 66 74 3d 25 64 22 2c 20 73 73 2e 69 43 68 69 6c  ft=%d", ss.iChil
287a0 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
287b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
287c0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
287d0 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 26  pendPrintf(&rc,&
287e0 73 2c 20 22 20 5c 22 25 2e 2a 73 5c 22 22 2c 20  s, " \"%.*s\"", 
287f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
28800 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72  s.term.n, ss.ter
28810 6d 2e 70 0a 20 20 20 20 20 20 20 20 20 20 29 3b  m.p.          );
28820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28830 20 20 20 69 66 28 20 73 73 2e 6e 45 6d 70 74 79     if( ss.nEmpty
28840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
28850 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
28860 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
28870 20 26 73 2c 20 22 20 65 6d 70 74 79 3d 25 64 25   &s, " empty=%d%
28880 73 22 2c 20 73 73 2e 6e 45 6d 70 74 79 2c 0a 20  s", ss.nEmpty,. 
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 73 73 2e               ss.
288a0 62 44 6c 69 64 78 20 3f 20 22 2a 22 20 3a 20 22  bDlidx ? "*" : "
288b0 22 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ".          );. 
288c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
288d0 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49  .      fts5NodeI
288e0 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20 20  terFree(&ss);.  
288f0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f    }.  }.  . deco
28900 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  de_out:.  sqlite
28910 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28  3_free(a);.  if(
28920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28930 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
28940 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
28950 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70  (const char*)s.p
28960 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52  , s.n, SQLITE_TR
28970 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
28980 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
28990 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
289a0 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a  (pCtx, rc);.  }.
289b0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
289c0 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (&s);.}../*.** T
289d0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
289e0 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  n of user-define
289f0 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
28a00 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a  n fts5_rowid()..
28a10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
28a20 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e  ts5RowidFunction
28a30 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
28a40 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
28a50 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
28a60 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
28a70 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
28aa0 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
28ab0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
28ac0 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
28ad0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
28ae0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
28af0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
28b00 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d  rg;.  if( nArg==
28b10 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
28b20 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
28b30 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20  tx, "should be: 
28b40 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65  fts5_rowid(subje
28b50 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b  ct, ....)", -1);
28b60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41  .  }else{.    zA
28b70 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rg = (const char
28b80 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
28b90 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
28ba0 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
28bb0 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
28bc0 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20   "segment") ){. 
28bd0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b       i64 iRowid;
28be0 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 2c 20  .      int idx, 
28bf0 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70  segid, height, p
28c00 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  gno;.      if( n
28c10 41 72 67 21 3d 35 20 29 7b 0a 20 20 20 20 20 20  Arg!=5 ){.      
28c20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
28c30 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
28c40 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c            "shoul
28c50 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
28c60 28 27 73 65 67 6d 65 6e 74 27 2c 20 69 64 78 2c  ('segment', idx,
28c70 20 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20   segid, height, 
28c80 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20  pgno))", -1.    
28c90 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c      );.      }el
28ca0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 64 78 20  se{.        idx 
28cb0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
28cc0 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  int(apVal[1]);. 
28cd0 20 20 20 20 20 20 20 73 65 67 69 64 20 3d 20 73         segid = s
28ce0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
28cf0 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20  (apVal[2]);.    
28d00 20 20 20 20 68 65 69 67 68 74 20 3d 20 73 71 6c      height = sql
28d10 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
28d20 70 56 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 20 20  pVal[3]);.      
28d30 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33    pgno = sqlite3
28d40 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
28d50 5b 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52  [4]);.        iR
28d60 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
28d70 45 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73  ENT_ROWID(idx, s
28d80 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67  egid, height, pg
28d90 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  no);.        sql
28da0 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
28db0 34 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b  4(pCtx, iRowid);
28dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28dd0 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  se if( 0==sqlite
28de0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
28df0 22 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78 22  "start-of-index"
28e00 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  ) ){.      i64 i
28e10 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Rowid;.      int
28e20 20 69 64 78 3b 0a 20 20 20 20 20 20 69 66 28 20   idx;.      if( 
28e30 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
28e40 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
28e50 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20  t_error(pCtx, . 
28e60 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75             "shou
28e70 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69  ld be: fts5_rowi
28e80 64 28 27 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65  d('start-of-inde
28e90 78 27 2c 20 69 64 78 29 22 2c 20 2d 31 0a 20 20  x', idx)", -1.  
28ea0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
28eb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 64  else{.        id
28ec0 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  x = sqlite3_valu
28ed0 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b  e_int(apVal[1]);
28ee0 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20  .        iRowid 
28ef0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
28f00 4f 57 49 44 28 69 64 78 2c 20 31 2c 20 30 2c 20  OWID(idx, 1, 0, 
28f10 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
28f20 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
28f30 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
28f40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
28f50 65 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e {.      sqlite
28f60 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
28f70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66  Ctx, .        "f
28f80 69 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35  irst arg to fts5
28f90 5f 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65  _rowid() must be
28fa0 20 27 73 65 67 6d 65 6e 74 27 20 22 0a 20 20 20   'segment' ".   
28fb0 20 20 20 20 20 22 6f 72 20 27 73 74 61 72 74 2d       "or 'start-
28fc0 6f 66 2d 69 6e 64 65 78 27 22 0a 20 20 20 20 20  of-index'".     
28fd0 20 20 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b     , -1.      );
28fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
28ff0 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
29000 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ed as part of re
29010 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 46 54  gistering the FT
29020 53 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64  S5 module with d
29030 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
29040 63 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67  ction db. It reg
29050 69 73 74 65 72 73 20 73 65 76 65 72 61 6c 20 75  isters several u
29060 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
29070 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  ar functions use
29080 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35  ful.** with FTS5
29090 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
290a0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
290b0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
290c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
290d0 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  , some other.** 
290e0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
290f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  e is returned in
29100 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stead..*/.int sq
29110 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
29120 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
29130 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
29140 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
29150 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ion(.      db, "
29160 66 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c  fts5_decode", 2,
29170 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
29180 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
29190 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20  ion, 0, 0.  );. 
291a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
291b0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
291c0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
291d0 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
291e0 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22  db, "fts5_rowid"
291f0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
29200 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46  8, 0, fts5RowidF
29210 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
29220 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72    );.  }.  retur
29230 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
29240 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
29250 5f 46 54 53 35 20 2a 2f 0a                       _FTS5 */.