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

Artifact 699b716f1b84ef78da9ccee25a8b6fe020cff32a:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 23 69 66  s5Int.h..*/..#if
0280: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
0290: 45 5f 46 54 53 35 0a 0a 23 69 6e 63 6c 75 64 65  E_FTS5..#include
02a0: 20 22 66 74 73 35 49 6e 74 2e 68 22 0a 0a 2f 2a   "fts5Int.h"../*
02b0: 0a 2a 2a 20 4f 76 65 72 76 69 65 77 3a 0a 2a 2a  .** Overview:.**
02c0: 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74  .** The %_data t
02d0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c  able contains al
02e0: 6c 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 65  l the FTS indexe
02f0: 73 20 66 6f 72 20 61 6e 20 46 54 53 35 20 76 69  s for an FTS5 vi
0300: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  rtual table..** 
0310: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  As well as the m
0320: 61 69 6e 20 74 65 72 6d 20 69 6e 64 65 78 2c 20  ain term index, 
0330: 74 68 65 72 65 20 6d 61 79 20 62 65 20 75 70 20  there may be up 
0340: 74 6f 20 33 31 20 70 72 65 66 69 78 20 69 6e 64  to 31 prefix ind
0350: 65 78 65 73 2e 0a 2a 2a 20 54 68 65 20 66 6f 72  exes..** The for
0360: 6d 61 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74  mat is similar t
0370: 6f 20 46 54 53 33 2f 34 2c 20 65 78 63 65 70 74  o FTS3/4, except
0380: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
0390: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d 74   all segment b-t
03a0: 72 65 65 20 6c 65 61 66 20 64 61 74 61 20 69 73  ree leaf data is
03b0: 20 73 74 6f 72 65 64 20 69 6e 20 66 69 78 65 64   stored in fixed
03c0: 20 73 69 7a 65 20 70 61 67 65 20 72 65 63 6f 72   size page recor
03d0: 64 73 20 0a 2a 2a 20 20 20 20 20 28 65 2e 67 2e  ds .**     (e.g.
03e0: 20 31 30 30 30 20 62 79 74 65 73 29 2e 20 41 20   1000 bytes). A 
03f0: 73 69 6e 67 6c 65 20 64 6f 63 6c 69 73 74 20 6d  single doclist m
0400: 61 79 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65  ay span multiple
0410: 20 70 61 67 65 73 2e 20 43 61 72 65 20 69 73 20   pages. Care is 
0420: 0a 2a 2a 20 20 20 20 20 74 61 6b 65 6e 20 74 6f  .**     taken to
0430: 20 65 6e 73 75 72 65 20 69 74 20 69 73 20 70 6f   ensure it is po
0440: 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72 61 74  ssible to iterat
0450: 65 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  e in either dire
0460: 63 74 69 6f 6e 20 74 68 72 6f 75 67 68 20 0a 2a  ction through .*
0470: 2a 20 20 20 20 20 74 68 65 20 65 6e 74 72 69 65  *     the entrie
0480: 73 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2c 20  s in a doclist, 
0490: 6f 72 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 20  or to seek to a 
04a0: 73 70 65 63 69 66 69 63 20 65 6e 74 72 79 20 77  specific entry w
04b0: 69 74 68 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20  ithin a .**     
04c0: 64 6f 63 6c 69 73 74 2c 20 77 69 74 68 6f 75 74  doclist, without
04d0: 20 6c 6f 61 64 69 6e 67 20 69 74 20 69 6e 74 6f   loading it into
04e0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
04f0: 20 2a 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74   * large doclist
0500: 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
0510: 20 70 61 67 65 73 20 68 61 76 65 20 61 73 73 6f   pages have asso
0520: 63 69 61 74 65 64 20 22 64 6f 63 6c 69 73 74 20  ciated "doclist 
0530: 69 6e 64 65 78 22 0a 2a 2a 20 20 20 20 20 72 65  index".**     re
0540: 63 6f 72 64 73 20 74 68 61 74 20 63 6f 6e 74 61  cords that conta
0550: 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  in a copy of the
0560: 20 66 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20   first docid on 
0570: 65 61 63 68 20 70 61 67 65 20 73 70 61 6e 6e 65  each page spanne
0580: 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20  d by.**     the 
0590: 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 20 69 73  doclist. This is
05a0: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
05b0: 70 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  p seek operation
05c0: 73 2c 20 61 6e 64 20 6d 65 72 67 65 73 20 6f 66  s, and merges of
05d0: 0a 2a 2a 20 20 20 20 20 6c 61 72 67 65 20 64 6f  .**     large do
05e0: 63 6c 69 73 74 73 20 77 69 74 68 20 76 65 72 79  clists with very
05f0: 20 73 6d 61 6c 6c 20 64 6f 63 6c 69 73 74 73 2e   small doclists.
0600: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 65 78 74 72 61  .**.**   * extra
0610: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 22   fields in the "
0620: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
0630: 22 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  " record the sta
0640: 74 65 20 6f 66 20 6f 6e 67 6f 69 6e 67 0a 2a 2a  te of ongoing.**
0650: 20 20 20 20 20 69 6e 63 72 65 6d 65 6e 74 61 6c       incremental
0660: 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
0670: 73 2e 0a 2a 2a 0a 2a 2f 0a 0a 0a 23 64 65 66 69  s..**.*/...#defi
0680: 6e 65 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b  ne FTS5_OPT_WORK
0690: 5f 55 4e 49 54 20 20 31 30 30 30 20 20 2f 2a 20  _UNIT  1000  /* 
06a0: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
06b0: 61 67 65 73 20 70 65 72 20 6f 70 74 69 6d 69 7a  ages per optimiz
06c0: 65 20 73 74 65 70 20 2a 2f 0a 23 64 65 66 69 6e  e step */.#defin
06d0: 65 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54  e FTS5_WORK_UNIT
06e0: 20 20 20 20 20 20 36 34 20 20 20 20 2f 2a 20 4e        64    /* N
06f0: 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
0700: 67 65 73 20 69 6e 20 75 6e 69 74 20 6f 66 20 77  ges in unit of w
0710: 6f 72 6b 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ork */..#define 
0720: 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
0730: 49 5a 45 20 34 20 20 20 20 20 2f 2a 20 41 64 64  IZE 4     /* Add
0740: 20 64 6c 69 64 78 20 69 66 20 74 68 69 73 20 6d   dlidx if this m
0750: 61 6e 79 20 65 6d 70 74 79 20 70 61 67 65 73 20  any empty pages 
0760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c  */../*.** Detail
0770: 73 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  s:.**.** The %_d
0780: 61 74 61 20 74 61 62 6c 65 20 6d 61 6e 61 67 65  ata table manage
0790: 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65  d by this module
07a0: 2c 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  ,.**.**     CREA
07b0: 54 45 20 54 41 42 4c 45 20 25 5f 64 61 74 61 28  TE TABLE %_data(
07c0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
07d0: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c  RY KEY, block BL
07e0: 4f 42 29 3b 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e  OB);.**.** , con
07f0: 74 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tains the follow
0800: 69 6e 67 20 35 20 74 79 70 65 73 20 6f 66 20 72  ing 5 types of r
0810: 65 63 6f 72 64 73 2e 20 53 65 65 20 74 68 65 20  ecords. See the 
0820: 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e  comments surroun
0830: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 46 54 53 35  ding.** the FTS5
0840: 5f 2a 5f 52 4f 57 49 44 20 6d 61 63 72 6f 73 20  _*_ROWID macros 
0850: 62 65 6c 6f 77 20 66 6f 72 20 61 20 64 65 73 63  below for a desc
0860: 72 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 25  ription of how %
0870: 5f 64 61 74 61 20 72 6f 77 69 64 73 20 61 72 65  _data rowids are
0880: 20 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20 74 6f   .** assigned to
0890: 20 65 61 63 68 20 66 6f 20 74 68 65 6d 2e 0a 2a   each fo them..*
08a0: 2a 0a 2a 2a 20 31 2e 20 53 74 72 75 63 74 75 72  *.** 1. Structur
08b0: 65 20 52 65 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a  e Records:.**.**
08c0: 20 20 20 54 68 65 20 73 65 74 20 6f 66 20 73 65     The set of se
08d0: 67 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 6b 65  gments that make
08e0: 20 75 70 20 61 6e 20 69 6e 64 65 78 20 2d 20 74   up an index - t
08f0: 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
0900: 72 65 20 2d 20 61 72 65 0a 2a 2a 20 20 20 72 65  re - are.**   re
0910: 63 6f 72 64 65 64 20 69 6e 20 61 20 73 69 6e 67  corded in a sing
0920: 6c 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e  le record within
0930: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
0940: 65 2e 20 54 68 65 20 72 65 63 6f 72 64 20 63 6f  e. The record co
0950: 6e 73 69 73 74 73 0a 2a 2a 20 20 20 6f 66 20 61  nsists.**   of a
0960: 20 73 69 6e 67 6c 65 20 33 32 2d 62 69 74 20 63   single 32-bit c
0970: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
0980: 6b 69 65 20 76 61 6c 75 65 20 66 6f 6c 6c 6f 77  kie value follow
0990: 65 64 20 62 79 20 61 20 6c 69 73 74 20 6f 66 20  ed by a list of 
09a0: 0a 2a 2a 20 20 20 53 51 4c 69 74 65 20 76 61 72  .**   SQLite var
09b0: 69 6e 74 73 2e 20 49 66 20 74 68 65 20 46 54 53  ints. If the FTS
09c0: 20 74 61 62 6c 65 20 66 65 61 74 75 72 65 73 20   table features 
09d0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 69 6e  more than one in
09e0: 64 65 78 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  dex (because.** 
09f0: 20 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20    there are one 
0a00: 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20 69  or more prefix i
0a10: 6e 64 65 78 65 73 29 2c 20 69 74 20 69 73 20 67  ndexes), it is g
0a20: 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 61  uaranteed that a
0a30: 6c 6c 20 73 68 61 72 65 0a 2a 2a 20 20 20 74 68  ll share.**   th
0a40: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
0a50: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d  lue..**.**   Imm
0a60: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
0a70: 6e 67 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  ng the configura
0a80: 74 69 6f 6e 20 63 6f 6f 6b 69 65 2c 20 74 68 65  tion cookie, the
0a90: 20 72 65 63 6f 72 64 20 62 65 67 69 6e 73 20 77   record begins w
0aa0: 69 74 68 0a 2a 2a 20 20 20 74 68 72 65 65 20 76  ith.**   three v
0ab0: 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  arints:.**.**   
0ac0: 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65    + number of le
0ad0: 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 74  vels,.**     + t
0ae0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
0af0: 65 67 6d 65 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c  egments on all l
0b00: 65 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20  evels,.**     + 
0b10: 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 20 63  value of write c
0b20: 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  ounter..**.**   
0b30: 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 6c  Then, for each l
0b40: 65 76 65 6c 20 66 72 6f 6d 20 30 20 74 6f 20 6e  evel from 0 to n
0b50: 4d 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b  Max:.**.**     +
0b60: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   number of input
0b70: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 6e 67   segments in ong
0b80: 6f 69 6e 67 20 6d 65 72 67 65 2e 0a 2a 2a 20 20  oing merge..**  
0b90: 20 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65     + total numbe
0ba0: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e  r of segments in
0bb0: 20 6c 65 76 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b   level..**     +
0bc0: 20 66 6f 72 20 65 61 63 68 20 73 65 67 6d 65 6e   for each segmen
0bd0: 74 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f  t from oldest to
0be0: 20 6e 65 77 65 73 74 3a 0a 2a 2a 20 20 20 20 20   newest:.**     
0bf0: 20 20 20 20 2b 20 73 65 67 6d 65 6e 74 20 69 64      + segment id
0c00: 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a   (always > 0).**
0c10: 20 20 20 20 20 20 20 20 20 2b 20 62 2d 74 72 65           + b-tre
0c20: 65 20 68 65 69 67 68 74 20 28 31 20 2d 3e 20 72  e height (1 -> r
0c30: 6f 6f 74 20 69 73 20 6c 65 61 66 2c 20 32 20 2d  oot is leaf, 2 -
0c40: 3e 20 72 6f 6f 74 20 69 73 20 70 61 72 65 6e 74  > root is parent
0c50: 20 6f 66 20 6c 65 61 66 20 65 74 63 2e 29 0a 2a   of leaf etc.).*
0c60: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 72 73  *         + firs
0c70: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
0c80: 65 72 20 28 6f 66 74 65 6e 20 31 2c 20 61 6c 77  er (often 1, alw
0c90: 61 79 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ays greater than
0ca0: 20 30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b   0).**         +
0cb0: 20 66 69 6e 61 6c 20 6c 65 61 66 20 70 61 67 65   final leaf page
0cc0: 20 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e   number.**.** 2.
0cd0: 20 54 68 65 20 41 76 65 72 61 67 65 73 20 52 65   The Averages Re
0ce0: 63 6f 72 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20  cord:.**.**   A 
0cf0: 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 69  single record wi
0d00: 74 68 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  thin the %_data 
0d10: 74 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 20  table. The data 
0d20: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72  is a list of var
0d30: 69 6e 74 73 2e 0a 2a 2a 20 20 20 54 68 65 20 66  ints..**   The f
0d40: 69 72 73 74 20 76 61 6c 75 65 20 69 73 20 74 68  irst value is th
0d50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
0d60: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54   in the index. T
0d70: 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 63 6f  hen, for each co
0d80: 6c 75 6d 6e 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c  lumn.**   from l
0d90: 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 74 68  eft to right, th
0da0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
0db0: 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20  f tokens in the 
0dc0: 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a  column for all .
0dd0: 2a 2a 20 20 20 72 6f 77 73 20 6f 66 20 74 68 65  **   rows of the
0de0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e   table..**.** 3.
0df0: 20 53 65 67 6d 65 6e 74 20 6c 65 61 76 65 73 3a   Segment leaves:
0e00: 0a 2a 2a 0a 2a 2a 20 20 20 54 45 52 4d 20 44 4f  .**.**   TERM DO
0e10: 43 4c 49 53 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a  CLIST FORMAT:.**
0e20: 0a 2a 2a 20 20 20 20 20 4d 6f 73 74 20 6f 66 20  .**     Most of 
0e30: 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61  each segment lea
0e40: 66 20 69 73 20 74 61 6b 65 6e 20 75 70 20 62 79  f is taken up by
0e50: 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61   term/doclist da
0e60: 74 61 2e 20 54 68 65 20 0a 2a 2a 20 20 20 20 20  ta. The .**     
0e70: 67 65 6e 65 72 61 6c 20 66 6f 72 6d 61 74 20 6f  general format o
0e80: 66 20 74 68 65 20 74 65 72 6d 2f 64 6f 63 6c 69  f the term/docli
0e90: 73 74 20 64 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a  st data is:.**.*
0ea0: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
0eb0: 20 3a 20 73 69 7a 65 20 6f 66 20 66 69 72 73 74   : size of first
0ec0: 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20   term.**        
0ed0: 20 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74 20   blob:    first 
0ee0: 74 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20  term data.**    
0ef0: 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 66 69       doclist: fi
0f00: 72 73 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20  rst doclist.**  
0f10: 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d         zero-or-m
0f20: 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ore {.**        
0f30: 20 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62     varint:  numb
0f40: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  er of bytes in c
0f50: 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65 76 69  ommon with previ
0f60: 6f 75 73 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20  ous term.**     
0f70: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 6e        varint:  n
0f80: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
0f90: 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 20  f new term data 
0fa0: 28 6e 4e 65 77 29 0a 2a 2a 20 20 20 20 20 20 20  (nNew).**       
0fb0: 20 20 20 20 62 6c 6f 62 3a 20 20 20 20 6e 4e 65      blob:    nNe
0fc0: 77 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74  w bytes of new t
0fd0: 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20  erm data.**     
0fe0: 20 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 6e        doclist: n
0ff0: 65 78 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20  ext doclist.**  
1000: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1010: 20 20 20 64 6f 63 6c 69 73 74 20 66 6f 72 6d 61     doclist forma
1020: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1030: 20 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74 20   varint:  first 
1040: 72 6f 77 69 64 0a 2a 2a 20 20 20 20 20 20 20 20  rowid.**        
1050: 20 70 6f 73 6c 69 73 74 3a 20 66 69 72 73 74 20   poslist: first 
1060: 70 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  poslist.**      
1070: 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20     zero-or-more 
1080: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76  {.**           v
1090: 61 72 69 6e 74 3a 20 20 72 6f 77 69 64 20 64 65  arint:  rowid de
10a0: 6c 74 61 20 28 61 6c 77 61 79 73 20 3e 20 30 29  lta (always > 0)
10b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 70 6f  .**           po
10c0: 73 6c 69 73 74 3a 20 6e 65 78 74 20 70 6f 73 6c  slist: next posl
10d0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
10e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30 30  .**         0x00
10f0: 20 62 79 74 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20   byte.**.**     
1100: 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a  poslist format:.
1110: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61  **.**         va
1120: 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66 20 70 6f  rint: size of po
1130: 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 6d  slist in bytes m
1140: 75 6c 74 69 70 6c 69 65 64 20 62 79 20 32 2c 20  ultiplied by 2, 
1150: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  not including.**
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 20 74 68 69 73 20 66 69 65 6c 64 2e 20 50 6c 75   this field. Plu
1180: 73 20 31 20 69 66 20 74 68 69 73 20 65 6e 74 72  s 1 if this entr
1190: 79 20 63 61 72 72 69 65 73 20 74 68 65 20 22 64  y carries the "d
11a0: 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a 2a 2a 20  elete" flag..** 
11b0: 20 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a          collist:
11c0: 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c   collist for col
11d0: 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20 20 20 20  umn 0.**        
11e0: 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a   zero-or-more {.
11f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 30 78 30  **           0x0
1200: 31 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  1 byte.**       
1210: 20 20 20 20 76 61 72 69 6e 74 3a 20 63 6f 6c 75      varint: colu
1220: 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29 0a 2a 2a  mn number (I).**
1230: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69             colli
1240: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
1250: 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20 20 20 20  column I.**     
1260: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
1270: 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a  collist format:.
1280: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61  **.**         va
1290: 72 69 6e 74 3a 20 66 69 72 73 74 20 6f 66 66 73  rint: first offs
12a0: 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20 20 20 20  et + 2.**       
12b0: 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b    zero-or-more {
12c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
12d0: 72 69 6e 74 3a 20 6f 66 66 73 65 74 20 64 65 6c  rint: offset del
12e0: 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20 20 20 20  ta + 2.**       
12f0: 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 49    }.**.**   PAGI
1300: 4e 41 54 49 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20 20  NATION.**.**    
1310: 20 54 68 65 20 66 6f 72 6d 61 74 20 64 65 73 63   The format desc
1320: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 6f  ribed above is o
1330: 6e 6c 79 20 61 63 63 75 72 61 74 65 20 69 66 20  nly accurate if 
1340: 74 68 65 20 65 6e 74 69 72 65 20 74 65 72 6d 2f  the entire term/
1350: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 64  doclist.**     d
1360: 61 74 61 20 66 69 74 73 20 6f 6e 20 61 20 73 69  ata fits on a si
1370: 6e 67 6c 65 20 6c 65 61 66 20 70 61 67 65 2e 20  ngle leaf page. 
1380: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
1390: 68 65 20 63 61 73 65 2c 20 74 68 65 20 66 6f 72  he case, the for
13a0: 6d 61 74 0a 2a 2a 20 20 20 20 20 69 73 20 63 68  mat.**     is ch
13b0: 61 6e 67 65 64 20 69 6e 20 74 77 6f 20 77 61 79  anged in two way
13c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b  s:.**.**       +
13d0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 72 6f   if the first ro
13e0: 77 69 64 20 6f 6e 20 61 20 70 61 67 65 20 6f 63  wid on a page oc
13f0: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1400: 66 69 72 73 74 20 74 65 72 6d 2c 20 69 74 0a 2a  first term, it.*
1410: 2a 20 20 20 20 20 20 20 20 20 69 73 20 73 74 6f  *         is sto
1420: 72 65 64 20 61 73 20 61 20 6c 69 74 65 72 61 6c  red as a literal
1430: 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   value:.**.**   
1440: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
1450: 3a 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a  :  first rowid.*
1460: 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 74 68 65  *.**       + the
1470: 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 65   first term on e
1480: 61 63 68 20 70 61 67 65 20 69 73 20 73 74 6f 72  ach page is stor
1490: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
14a0: 61 79 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 20  ay as the.**    
14b0: 20 20 20 20 20 76 65 72 79 20 66 69 72 73 74 20       very first 
14c0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 67 6d  term of the segm
14d0: 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ent:.**.**      
14e0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20         varint : 
14f0: 73 69 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65  size of first te
1500: 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  rm.**           
1510: 20 20 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74    blob:    first
1520: 20 74 65 72 6d 20 64 61 74 61 0a 2a 2a 0a 2a 2a   term data.**.**
1530: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1540: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 3a  age begins with:
1550: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32  .**.**       + 2
1560: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63  -byte unsigned c
1570: 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74  ontaining offset
1580: 20 74 6f 20 66 69 72 73 74 20 72 6f 77 69 64 20   to first rowid 
1590: 28 6f 72 20 30 29 2e 0a 2a 2a 20 20 20 20 20 20  (or 0)..**      
15a0: 20 2b 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   + 2-byte unsign
15b0: 65 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 66  ed containing of
15c0: 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 74 65  fset to first te
15d0: 72 6d 20 28 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a  rm (or 0)..**.**
15e0: 20 20 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 74     Followed by t
15f0: 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61  erm/doclist data
1600: 2e 0a 2a 2a 0a 2a 2a 20 34 2e 20 53 65 67 6d 65  ..**.** 4. Segme
1610: 6e 74 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  nt interior node
1620: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 69  s:.**.**   The i
1630: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 74 75  nterior nodes tu
1640: 72 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6c  rn the list of l
1650: 65 61 76 65 73 20 69 6e 74 6f 20 61 20 62 2b 74  eaves into a b+t
1660: 72 65 65 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 45 61  ree. .**.**   Ea
1670: 63 68 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  ch interior node
1680: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 76   begins with a v
1690: 61 72 69 6e 74 20 2d 20 74 68 65 20 70 61 67 65  arint - the page
16a0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
16b0: 65 66 74 0a 2a 2a 20 20 20 6d 6f 73 74 20 63 68  eft.**   most ch
16c0: 69 6c 64 20 6e 6f 64 65 2e 20 46 6f 6c 6c 6f 77  ild node. Follow
16d0: 69 6e 67 20 74 68 69 73 2c 20 66 6f 72 20 65 61  ing this, for ea
16e0: 63 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63  ch leaf page exc
16f0: 65 70 74 20 74 68 65 20 66 69 72 73 74 2c 0a 2a  ept the first,.*
1700: 2a 20 20 20 74 68 65 20 69 6e 74 65 72 69 6f 72  *   the interior
1710: 20 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e 3a 0a   nodes contain:.
1720: 2a 2a 0a 2a 2a 20 20 20 20 20 61 29 20 49 66 20  **.**     a) If 
1730: 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 63 6f  the leaf page co
1740: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
1750: 6f 6e 65 20 74 65 72 6d 2c 20 74 68 65 6e 20 61  one term, then a
1760: 20 74 65 72 6d 2d 70 72 65 66 69 78 20 74 68 61   term-prefix tha
1770: 74 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20 67  t.**        is g
1780: 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
1790: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 73 2c 20  previous terms, 
17a0: 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 6f 72  and less than or
17b0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a   equal to the.**
17c0: 20 20 20 20 20 20 20 20 66 69 72 73 74 20 74 65          first te
17d0: 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70  rm on the leaf p
17e0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62  age..**.**     b
17f0: 29 20 49 66 20 74 68 65 20 6c 65 61 66 20 70 61  ) If the leaf pa
1800: 67 65 20 6e 6f 20 74 65 72 6d 73 2c 20 61 20 72  ge no terms, a r
1810: 65 63 6f 72 64 20 69 6e 64 69 63 61 74 69 6e 67  ecord indicating
1820: 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6e 73 65 63   how many consec
1830: 75 74 69 76 65 0a 2a 2a 20 20 20 20 20 20 20 20  utive.**        
1840: 6c 65 61 76 65 73 20 63 6f 6e 74 61 69 6e 20 6e  leaves contain n
1850: 6f 20 74 65 72 6d 73 2c 20 61 6e 64 20 77 68 65  o terms, and whe
1860: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72  ther or not ther
1870: 65 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74  e is an associat
1880: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 62 79 2d  ed.**        by-
1890: 72 6f 77 69 64 20 69 6e 64 65 78 20 72 65 63 6f  rowid index reco
18a0: 72 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 42 79 20 64  rd..**.**   By d
18b0: 65 66 69 6e 69 74 69 6f 6e 2c 20 74 68 65 72 65  efinition, there
18c0: 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
18d0: 68 61 6e 20 6f 6e 65 20 74 79 70 65 20 28 62 29  han one type (b)
18e0: 20 72 65 63 6f 72 64 20 69 6e 20 61 20 72 6f 77   record in a row
18f0: 2e 0a 2a 2a 20 20 20 54 79 70 65 20 28 62 29 20  ..**   Type (b) 
1900: 72 65 63 6f 72 64 73 20 6f 6e 6c 79 20 65 76 65  records only eve
1910: 72 20 61 70 70 65 61 72 20 6f 6e 20 68 65 69 67  r appear on heig
1920: 68 74 3d 31 20 70 61 67 65 73 20 2d 20 69 6d 6d  ht=1 pages - imm
1930: 65 64 69 61 74 65 20 70 61 72 65 6e 74 73 0a 2a  ediate parents.*
1940: 2a 20 20 20 6f 66 20 6c 65 61 76 65 73 2e 20 4f  *   of leaves. O
1950: 6e 6c 79 20 74 79 70 65 20 28 61 29 20 72 65 63  nly type (a) rec
1960: 6f 72 64 73 20 61 72 65 20 70 75 73 68 65 64 20  ords are pushed 
1970: 74 6f 20 68 69 67 68 65 72 20 6c 65 76 65 6c 73  to higher levels
1980: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 65 72 6d 20 66  ..**.**   Term f
1990: 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ormat:.**.**    
19a0: 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74   * Number of byt
19b0: 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74  es in common wit
19c0: 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  h previous term 
19d0: 70 6c 75 73 20 32 2c 20 61 73 20 61 20 76 61 72  plus 2, as a var
19e0: 69 6e 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 4e 75  int..**     * Nu
19f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1a00: 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2c 20   new term data, 
1a10: 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 20  as a varint..** 
1a20: 20 20 20 20 2a 20 6e 65 77 20 74 65 72 6d 20 64      * new term d
1a30: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d  ata..**.**   No-
1a40: 74 65 72 6d 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a  term format:.**.
1a50: 2a 2a 20 20 20 20 20 2a 20 65 69 74 68 65 72 20  **     * either 
1a60: 61 6e 20 30 78 30 30 20 6f 72 20 30 78 30 31 20  an 0x00 or 0x01 
1a70: 62 79 74 65 2e 20 49 66 20 74 68 65 20 76 61 6c  byte. If the val
1a80: 75 65 20 30 78 30 31 20 69 73 20 75 73 65 64 2c  ue 0x01 is used,
1a90: 20 74 68 65 6e 20 74 68 65 72 65 20 0a 2a 2a 20   then there .** 
1aa0: 20 20 20 20 20 20 69 73 20 61 6e 20 61 73 73 6f        is an asso
1ab0: 63 69 61 74 65 64 20 69 6e 64 65 78 2d 62 79 2d  ciated index-by-
1ac0: 72 6f 77 69 64 20 72 65 63 6f 72 64 2e 0a 2a 2a  rowid record..**
1ad0: 20 20 20 20 20 2a 20 74 68 65 20 6e 75 6d 62 65       * the numbe
1ae0: 72 20 6f 66 20 7a 65 72 6f 2d 74 65 72 6d 20 6c  r of zero-term l
1af0: 65 61 76 65 73 20 61 73 20 61 20 76 61 72 69 6e  eaves as a varin
1b00: 74 2e 0a 2a 2a 0a 2a 2a 20 35 2e 20 53 65 67 6d  t..**.** 5. Segm
1b10: 65 6e 74 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ent doclist inde
1b20: 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 6c  xes:.**.**   A l
1b30: 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e 20  ist of varints. 
1b40: 49 66 20 74 68 65 20 66 69 72 73 74 20 74 65 72  If the first ter
1b50: 6d 6c 65 73 73 20 70 61 67 65 20 63 6f 6e 74 61  mless page conta
1b60: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
1b70: 0a 2a 2a 20 20 20 64 6f 63 69 64 2c 20 74 68 65  .**   docid, the
1b80: 20 6c 69 73 74 20 62 65 67 69 6e 73 20 77 69 74   list begins wit
1b90: 68 20 74 68 61 74 20 64 6f 63 69 64 20 61 73 20  h that docid as 
1ba0: 61 20 76 61 72 69 6e 74 20 66 6f 6c 6c 6f 77 65  a varint followe
1bb0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 20 20 76 61  d by the.**   va
1bc0: 6c 75 65 20 31 20 28 30 78 30 31 29 2e 20 4f 72  lue 1 (0x01). Or
1bd0: 2c 20 69 66 20 74 68 65 20 66 69 72 73 74 20 74  , if the first t
1be0: 65 72 6d 6c 65 73 73 20 70 61 67 65 20 63 6f 6e  ermless page con
1bf0: 74 61 69 6e 73 20 6e 6f 20 64 6f 63 69 64 73 2c  tains no docids,
1c00: 0a 2a 2a 20 20 20 61 20 76 61 72 69 6e 74 20 63  .**   a varint c
1c10: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61  ontaining the la
1c20: 73 74 20 64 6f 63 69 64 20 73 74 6f 72 65 64 20  st docid stored 
1c30: 6f 6e 20 74 68 65 20 74 65 72 6d 20 70 61 67 65  on the term page
1c40: 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 20 20 62   followed.**   b
1c50: 79 20 61 20 30 20 28 30 78 30 30 29 20 76 61 6c  y a 0 (0x00) val
1c60: 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  ue..**.**   For 
1c70: 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1c80: 70 61 67 65 20 69 6e 20 74 68 65 20 64 6f 63 6c  page in the docl
1c90: 69 73 74 2c 20 65 69 74 68 65 72 20 61 20 30 78  ist, either a 0x
1ca0: 30 30 20 62 79 74 65 20 69 66 20 74 68 65 0a 2a  00 byte if the.*
1cb0: 2a 20 20 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  *   page contain
1cc0: 73 20 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 20 61  s no terms, or a
1cd0: 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 64   delta-encoded d
1ce0: 6f 63 69 64 20 28 61 6c 77 61 79 73 20 2b 76 65  ocid (always +ve
1cf0: 29 20 0a 2a 2a 20 20 20 72 65 70 72 65 73 65 6e  ) .**   represen
1d00: 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 64  ting the first d
1d10: 6f 63 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  ocid on the page
1d20: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 0a   otherwise..*/..
1d30: 2f 2a 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72  /*.** Rowids for
1d40: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 61 6e   the averages an
1d50: 64 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  d structure reco
1d60: 72 64 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74  rds in the %_dat
1d70: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66  a table..*/.#def
1d80: 69 6e 65 20 46 54 53 35 5f 41 56 45 52 41 47 45  ine FTS5_AVERAGE
1d90: 53 5f 52 4f 57 49 44 20 20 20 20 20 31 20 20 20  S_ROWID     1   
1da0: 20 2f 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66   /* Rowid used f
1db0: 6f 72 20 74 68 65 20 61 76 65 72 61 67 65 73 20  or the averages 
1dc0: 72 65 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e  record */.#defin
1dd0: 65 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  e FTS5_STRUCTURE
1de0: 5f 52 4f 57 49 44 28 69 49 64 78 29 20 28 31 30  _ROWID(iIdx) (10
1df0: 20 2b 20 28 69 49 64 78 29 29 20 20 20 20 20 2f   + (iIdx))     /
1e00: 2a 20 46 6f 72 20 73 74 72 75 63 74 75 72 65 20  * For structure 
1e10: 72 65 63 6f 72 64 73 20 2a 2f 0a 0a 2f 2a 0a 2a  records */../*.*
1e20: 2a 20 4d 61 63 72 6f 73 20 64 65 74 65 72 6d 69  * Macros determi
1e30: 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 73 20  ning the rowids 
1e40: 75 73 65 64 20 62 79 20 73 65 67 6d 65 6e 74 20  used by segment 
1e50: 6e 6f 64 65 73 2e 20 41 6c 6c 20 6e 6f 64 65 73  nodes. All nodes
1e60: 20 69 6e 20 61 6c 6c 0a 2a 2a 20 73 65 67 6d 65   in all.** segme
1e70: 6e 74 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 65  nts for all inde
1e80: 78 65 73 20 28 74 68 65 20 72 65 67 75 6c 61 72  xes (the regular
1e90: 20 46 54 53 20 69 6e 64 65 78 20 61 6e 64 20 61   FTS index and a
1ea0: 6e 79 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  ny prefix indexe
1eb0: 73 29 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  s).** are stored
1ec0: 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74   in the %_data t
1ed0: 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67 65 20  able with large 
1ee0: 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 73 2e  positive rowids.
1ef0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74  .**.** The %_dat
1f00: 61 20 74 61 62 6c 65 20 6d 61 79 20 63 6f 6e 74  a table may cont
1f10: 61 69 6e 20 75 70 20 74 6f 20 28 31 3c 3c 46 54  ain up to (1<<FT
1f20: 53 35 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58  S5_SEGMENT_INDEX
1f30: 5f 42 49 54 53 29 20 0a 2a 2a 20 69 6e 64 65 78  _BITS) .** index
1f40: 65 73 20 2d 20 6f 6e 65 20 72 65 67 75 6c 61 72  es - one regular
1f50: 20 74 65 72 6d 20 69 6e 64 65 78 20 61 6e 64 20   term index and 
1f60: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 72 65  zero or more pre
1f70: 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a  fix indexes..**.
1f80: 2a 2a 20 45 61 63 68 20 73 65 67 6d 65 6e 74 20  ** Each segment 
1f90: 69 6e 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20  in an index has 
1fa0: 61 20 75 6e 69 71 75 65 20 69 64 20 67 72 65 61  a unique id grea
1fb0: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a  ter than zero..*
1fc0: 2a 0a 2a 2a 20 45 61 63 68 20 6e 6f 64 65 20 69  *.** Each node i
1fd0: 6e 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  n a segment b-tr
1fe0: 65 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61  ee is assigned a
1ff0: 20 22 70 61 67 65 20 6e 75 6d 62 65 72 22 20 74   "page number" t
2000: 68 61 74 20 69 73 20 75 6e 69 71 75 65 0a 2a 2a  hat is unique.**
2010: 20 77 69 74 68 69 6e 20 6e 6f 64 65 73 20 6f 66   within nodes of
2020: 20 69 74 73 20 68 65 69 67 68 74 20 77 69 74 68   its height with
2030: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 28  in the segment (
2040: 6c 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20  leaf nodes have 
2050: 61 20 68 65 69 67 68 74 20 0a 2a 2a 20 6f 66 20  a height .** of 
2060: 30 2c 20 70 61 72 65 6e 74 73 20 31 2c 20 65 74  0, parents 1, et
2070: 63 2e 29 2e 20 50 61 67 65 20 6e 75 6d 62 65 72  c.). Page number
2080: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
2090: 73 65 71 75 65 6e 74 69 61 6c 6c 79 20 73 6f 20  sequentially so 
20a0: 74 68 61 74 0a 2a 2a 20 61 20 6e 6f 64 65 73 20  that.** a nodes 
20b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 61  page number is a
20c0: 6c 77 61 79 73 20 6f 6e 65 20 6d 6f 72 65 20 74  lways one more t
20d0: 68 61 6e 20 69 74 73 20 6c 65 66 74 20 73 69 62  han its left sib
20e0: 6c 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ling..**.** The 
20f0: 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 64 65  rowid for a node
2100: 20 69 73 20 74 68 65 6e 20 66 6f 75 6e 64 20 75   is then found u
2110: 73 69 6e 67 20 74 68 65 20 46 54 53 35 5f 53 45  sing the FTS5_SE
2120: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 6d 61  GMENT_ROWID() ma
2130: 63 72 6f 0a 2a 2a 20 62 65 6c 6f 77 2e 20 54 68  cro.** below. Th
2140: 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 2a  e FTS5_SEGMENT_*
2150: 5f 42 49 54 53 20 6d 61 63 72 6f 73 20 64 65 66  _BITS macros def
2160: 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
2170: 66 20 62 69 74 73 20 75 73 65 64 0a 2a 2a 20 74  f bits used.** t
2180: 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 74 68 72  o encode the thr
2190: 65 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ee FTS5_SEGMENT_
21a0: 52 4f 57 49 44 28 29 20 61 72 67 75 6d 65 6e 74  ROWID() argument
21b0: 73 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 72  s. This module r
21c0: 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
21d0: 5f 46 55 4c 4c 20 61 6e 64 20 66 61 69 6c 73 20  _FULL and fails 
21e0: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65 72  the current oper
21f0: 61 74 69 6f 6e 20 69 66 20 74 68 65 79 20 65 76  ation if they ev
2200: 65 72 20 70 72 6f 76 65 20 74 6f 6f 20 73 6d 61  er prove too sma
2210: 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ll..*/.#define F
2220: 54 53 35 5f 44 41 54 41 5f 49 44 58 5f 42 20 20  TS5_DATA_IDX_B  
2230: 20 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78 20     5     /* Max 
2240: 6f 66 20 33 31 20 70 72 65 66 69 78 20 69 6e 64  of 31 prefix ind
2250: 65 78 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  exes */.#define 
2260: 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 20  FTS5_DATA_ID_B  
2270: 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61 78     16     /* Max
2280: 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20 36   seg id number 6
2290: 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20  5535 */.#define 
22a0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
22b0: 5f 42 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78  _B  5     /* Max
22c0: 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 20 6f   b-tree height o
22d0: 66 20 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20  f 32 */.#define 
22e0: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
22f0: 20 20 20 33 31 20 20 20 20 20 2f 2a 20 4d 61 78     31     /* Max
2300: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2310: 32 31 34 37 34 38 33 36 34 38 20 2a 2f 0a 0a 23  2147483648 */..#
2320: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
2330: 45 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73  ENT_ROWID(idx, s
2340: 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67  egid, height, pg
2350: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2370: 20 28 28 69 36 34 29 28 69 64 78 29 20 20 20 20   ((i64)(idx)    
2380: 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 49 44  << (FTS5_DATA_ID
2390: 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  _B + FTS5_DATA_P
23a0: 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54  AGE_B + FTS5_DAT
23b0: 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20 5c  A_HEIGHT_B)) + \
23c0: 0a 20 28 28 69 36 34 29 28 73 65 67 69 64 29 20  . ((i64)(segid) 
23d0: 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 50   << (FTS5_DATA_P
23e0: 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54  AGE_B + FTS5_DAT
23f0: 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20 20  A_HEIGHT_B)) +  
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 5c 0a 20 28 28 69 36 34 29 28 68 65 69 67 68 74  \. ((i64)(height
2420: 29 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f  ) << (FTS5_DATA_
2430: 50 41 47 45 5f 42 29 29 20 2b 20 20 20 20 20 20  PAGE_B)) +      
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 5c 0a 20 28 28 69 36 34 29 28 70 67 6e 6f 29   \. ((i64)(pgno)
2470: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 5c 0a 29 0a 0a 23 69 66 20 46 54 53 35 5f    \.)..#if FTS5_
24c0: 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58  MAX_PREFIX_INDEX
24d0: 45 53 20 3e 20 28 28 31 3c 3c 46 54 53 35 5f 44  ES > ((1<<FTS5_D
24e0: 41 54 41 5f 49 44 58 5f 42 29 2d 31 29 20 0a 23  ATA_IDX_B)-1) .#
24f0: 20 65 72 72 6f 72 20 22 46 54 53 35 5f 4d 41 58   error "FTS5_MAX
2500: 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20  _PREFIX_INDEXES 
2510: 69 73 20 74 6f 6f 20 6c 61 72 67 65 22 0a 23 65  is too large".#e
2520: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
2530: 68 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e  height of segmen
2540: 74 20 62 2d 74 72 65 65 73 20 69 73 20 61 63 74  t b-trees is act
2550: 75 61 6c 6c 79 20 6c 69 6d 69 74 65 64 20 74 6f  ually limited to
2560: 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20 0a   one less than .
2570: 2a 2a 20 28 31 3c 3c 48 45 49 47 48 54 5f 42 49  ** (1<<HEIGHT_BI
2580: 54 53 29 2e 20 54 68 69 73 20 69 73 20 62 65 63  TS). This is bec
2590: 61 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 61  ause the rowid a
25a0: 64 64 72 65 73 73 20 73 70 61 63 65 20 66 6f 72  ddress space for
25b0: 20 6e 6f 64 65 73 0a 2a 2a 20 77 69 74 68 20 73   nodes.** with s
25c0: 75 63 68 20 61 20 68 65 69 67 68 74 20 69 73 20  uch a height is 
25d0: 75 73 65 64 20 62 79 20 64 6f 63 6c 69 73 74 20  used by doclist 
25e0: 69 6e 64 65 78 65 73 2e 0a 2a 2f 0a 23 64 65 66  indexes..*/.#def
25f0: 69 6e 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  ine FTS5_SEGMENT
2600: 5f 4d 41 58 5f 48 45 49 47 48 54 20 28 28 31 20  _MAX_HEIGHT ((1 
2610: 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  << FTS5_DATA_HEI
2620: 47 48 54 5f 42 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a  GHT_B)-1)../*.**
2630: 20 4d 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74   Maximum segment
2640: 73 20 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61  s permitted in a
2650: 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a   single index .*
2660: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d  /.#define FTS5_M
2670: 41 58 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a  AX_SEGMENT 2000.
2680: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64  ./*.** The rowid
2690: 20 66 6f 72 20 74 68 65 20 64 6f 63 6c 69 73 74   for the doclist
26a0: 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
26b0: 64 20 77 69 74 68 20 6c 65 61 66 20 70 61 67 65  d with leaf page
26c0: 20 70 67 6e 6f 20 6f 66 20 73 65 67 6d 65 6e 74   pgno of segment
26d0: 0a 2a 2a 20 73 65 67 69 64 20 69 6e 20 69 6e 64  .** segid in ind
26e0: 65 78 20 69 64 78 2e 0a 2a 2f 0a 23 64 65 66 69  ex idx..*/.#defi
26f0: 6e 65 20 46 54 53 35 5f 44 4f 43 4c 49 53 54 5f  ne FTS5_DOCLIST_
2700: 49 44 58 5f 52 4f 57 49 44 28 69 64 78 2c 20 73  IDX_ROWID(idx, s
2710: 65 67 69 64 2c 20 70 67 6e 6f 29 20 5c 0a 20 20  egid, pgno) \.  
2720: 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45        FTS5_SEGME
2730: 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73 65  NT_ROWID(idx, se
2740: 67 69 64 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e  gid, FTS5_SEGMEN
2750: 54 5f 4d 41 58 5f 48 45 49 47 48 54 2c 20 70 67  T_MAX_HEIGHT, pg
2760: 6e 6f 29 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  no)..#ifdef SQLI
2770: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
2780: 69 74 65 33 46 74 73 35 43 6f 72 72 75 70 74 28  ite3Fts5Corrupt(
2790: 29 20 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) { return SQLIT
27a0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3b 20  E_CORRUPT_VTAB; 
27b0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
27c0: 20 45 61 63 68 20 74 69 6d 65 20 61 20 62 6c 6f   Each time a blo
27d0: 62 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  b is read from t
27e0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2c  he %_data table,
27f0: 20 69 74 20 69 73 20 70 61 64 64 65 64 20 77 69   it is padded wi
2800: 74 68 20 74 68 69 73 0a 2a 2a 20 6d 61 6e 79 20  th this.** many 
2810: 7a 65 72 6f 20 62 79 74 65 73 2e 20 54 68 69 73  zero bytes. This
2820: 20 6d 61 6b 65 73 20 69 74 20 65 61 73 69 65 72   makes it easier
2830: 20 74 6f 20 64 65 63 6f 64 65 20 74 68 65 20 76   to decode the v
2840: 61 72 69 6f 75 73 20 72 65 63 6f 72 64 20 66 6f  arious record fo
2850: 72 6d 61 74 73 0a 2a 2a 20 77 69 74 68 6f 75 74  rmats.** without
2860: 20 6f 76 65 72 72 65 61 64 69 6e 67 20 69 66 20   overreading if 
2870: 74 68 65 20 72 65 63 6f 72 64 73 20 61 72 65 20  the records are 
2880: 63 6f 72 72 75 70 74 2e 0a 2a 2f 0a 23 64 65 66  corrupt..*/.#def
2890: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 5a 45  ine FTS5_DATA_ZE
28a0: 52 4f 5f 50 41 44 44 49 4e 47 20 38 0a 0a 74 79  RO_PADDING 8..ty
28b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
28c0: 35 42 74 72 65 65 49 74 65 72 20 46 74 73 35 42  5BtreeIter Fts5B
28d0: 74 72 65 65 49 74 65 72 3b 0a 74 79 70 65 64 65  treeIter;.typede
28e0: 66 20 73 74 72 75 63 74 20 46 74 73 35 42 74 72  f struct Fts5Btr
28f0: 65 65 49 74 65 72 4c 65 76 65 6c 20 46 74 73 35  eeIterLevel Fts5
2900: 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 3b 0a  BtreeIterLevel;.
2910: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2920: 74 73 35 43 68 75 6e 6b 49 74 65 72 20 46 74 73  ts5ChunkIter Fts
2930: 35 43 68 75 6e 6b 49 74 65 72 3b 0a 74 79 70 65  5ChunkIter;.type
2940: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2950: 61 74 61 20 46 74 73 35 44 61 74 61 3b 0a 74 79  ata Fts5Data;.ty
2960: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2970: 35 44 6c 69 64 78 49 74 65 72 20 46 74 73 35 44  5DlidxIter Fts5D
2980: 6c 69 64 78 49 74 65 72 3b 0a 74 79 70 65 64 65  lidxIter;.typede
2990: 66 20 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c  f struct Fts5Mul
29a0: 74 69 53 65 67 49 74 65 72 20 46 74 73 35 4d 75  tiSegIter Fts5Mu
29b0: 6c 74 69 53 65 67 49 74 65 72 3b 0a 74 79 70 65  ltiSegIter;.type
29c0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 4e  def struct Fts5N
29d0: 6f 64 65 49 74 65 72 20 46 74 73 35 4e 6f 64 65  odeIter Fts5Node
29e0: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
29f0: 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69  ruct Fts5PageWri
2a00: 74 65 72 20 46 74 73 35 50 61 67 65 57 72 69 74  ter Fts5PageWrit
2a10: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2a20: 63 74 20 46 74 73 35 50 6f 73 49 74 65 72 20 46  ct Fts5PosIter F
2a30: 74 73 35 50 6f 73 49 74 65 72 3b 0a 74 79 70 65  ts5PosIter;.type
2a40: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2a50: 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74  egIter Fts5SegIt
2a60: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2a70: 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  ct Fts5DoclistIt
2a80: 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  er Fts5DoclistIt
2a90: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2aa0: 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72  ct Fts5SegWriter
2ab0: 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a   Fts5SegWriter;.
2ac0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2ad0: 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73  ts5Structure Fts
2ae0: 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65  5Structure;.type
2af0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2b00: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74  tructureLevel Ft
2b10: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2b20: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2b30: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2b40: 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74  gment Fts5Struct
2b50: 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72  ureSegment;..str
2b60: 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20  uct Fts5Data {. 
2b70: 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20   u8 *p;         
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
2ba0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
2bb0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
2bc0: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2be0: 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69  Size of record i
2bf0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
2c00: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c20: 52 65 66 20 63 6f 75 6e 74 20 2a 2f 0a 7d 3b 0a  Ref count */.};.
2c30: 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 62 6a 65 63  ./*.** One objec
2c40: 74 20 70 65 72 20 25 5f 64 61 74 61 20 74 61 62  t per %_data tab
2c50: 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  le..*/.struct Ft
2c60: 73 35 49 6e 64 65 78 20 7b 0a 20 20 46 74 73 35  s5Index {.  Fts5
2c70: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b  Config *pConfig;
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2c90: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e  irtual table con
2ca0: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  figuration */.  
2cb0: 63 68 61 72 20 2a 7a 44 61 74 61 54 62 6c 3b 20  char *zDataTbl; 
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 25 5f 64 61 74  /* Name of %_dat
2ce0: 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
2cf0: 20 6e 57 6f 72 6b 55 6e 69 74 3b 20 20 20 20 20   nWorkUnit;     
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d10: 4c 65 61 66 20 70 61 67 65 73 20 69 6e 20 61 20  Leaf pages in a 
2d20: 22 75 6e 69 74 22 20 6f 66 20 77 6f 72 6b 20 2a  "unit" of work *
2d30: 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 56 61 72  /..  /*.  ** Var
2d40: 69 61 62 6c 65 73 20 72 65 6c 61 74 65 64 20 74  iables related t
2d50: 6f 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 69  o the accumulati
2d60: 6f 6e 20 6f 66 20 74 6f 6b 65 6e 73 20 61 6e 64  on of tokens and
2d70: 20 64 6f 63 6c 69 73 74 73 20 77 69 74 68 69 6e   doclists within
2d80: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d   the.  ** in-mem
2d90: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
2da0: 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
2db0: 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e  flushed to disk.
2dc0: 0a 20 20 2a 2f 0a 20 20 46 74 73 35 48 61 73 68  .  */.  Fts5Hash
2dd0: 20 2a 2a 61 70 48 61 73 68 3b 20 20 20 20 20 20   **apHash;      
2de0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
2df0: 20 6f 66 20 68 61 73 68 20 74 61 62 6c 65 73 20   of hash tables 
2e00: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e  */.  int nMaxPen
2e10: 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20  dingData;       
2e20: 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64       /* Max pend
2e30: 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72 65 20  ing data before 
2e40: 66 6c 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f  flush to disk */
2e50: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44  .  int nPendingD
2e60: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2e70: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2e80: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2e90: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2ea0: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2ec0: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2ed0: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2ee0: 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73  */..  /* Error s
2ef0: 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  tate. */.  int r
2f00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2f20: 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  rrent error code
2f30: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   */..  /* State 
2f40: 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  used by the fts5
2f50: 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69  DataXXX() functi
2f60: 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2f70: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b  3_blob *pReader;
2f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20            /* RO 
2f90: 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f  incr-blob open o
2fa0: 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  n %_data table *
2fb0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2fc0: 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
2fd0: 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e      /* "INSERT .
2fe0: 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53  .. %_data VALUES
2ff0: 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  (?,?)" */.  sqli
3000: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
3010: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22  er;         /* "
3020: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
3030: 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44  ta ... id>=? AND
3040: 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 69 6e 74   id<=?" */.  int
3050: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3070: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
3080: 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d  blocks read */.}
3090: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f  ;..struct Fts5Do
30a0: 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 69 6e  clistIter {.  in
30b0: 74 20 62 44 65 73 63 3b 20 20 20 20 20 20 20 20  t bDesc;        
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 72 75 65 20 66 6f 72 20 44 45 53 43 20 6f   True for DESC o
30e0: 72 64 65 72 2c 20 66 61 6c 73 65 20 66 6f 72 20  rder, false for 
30f0: 41 53 43 20 2a 2f 0a 20 20 75 38 20 2a 61 3b 0a  ASC */.  u8 *a;.
3100: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69    int n;.  int i
3110: 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76  ;..  /* Output v
3120: 61 72 69 61 62 6c 65 73 2e 20 61 50 6f 73 6c 69  ariables. aPosli
3130: 73 74 3d 3d 30 20 61 74 20 45 4f 46 20 2a 2f 0a  st==0 at EOF */.
3140: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
3150: 75 38 20 2a 61 50 6f 73 6c 69 73 74 3b 0a 20 20  u8 *aPoslist;.  
3160: 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 7d 3b  int nPoslist;.};
3170: 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 74 65  ../*.** Each ite
3180: 72 61 74 6f 72 20 75 73 65 64 20 62 79 20 65 78  rator used by ex
3190: 74 65 72 6e 61 6c 20 6d 6f 64 75 6c 65 73 20 69  ternal modules i
31a0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
31b0: 20 74 68 69 73 20 74 79 70 65 2e 0a 2a 2f 0a 73   this type..*/.s
31c0: 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 49  truct Fts5IndexI
31d0: 74 65 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65  ter {.  Fts5Inde
31e0: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 46 74 73  x *pIndex;.  Fts
31f0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
3200: 75 63 74 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69  uct;.  Fts5Multi
3210: 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 3b  SegIter *pMulti;
3220: 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  .  Fts5DoclistIt
3230: 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20  er *pDoclist;.  
3240: 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69  Fts5Buffer posli
3250: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
3260: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
3270: 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73  ning current pos
3280: 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  list */.};../*.*
3290: 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * The contents o
32a0: 66 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65  f the "structure
32b0: 22 20 72 65 63 6f 72 64 20 66 6f 72 20 65 61 63  " record for eac
32c0: 68 20 69 6e 64 65 78 20 61 72 65 20 72 65 70 72  h index are repr
32d0: 65 73 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67  esented.** using
32e0: 20 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72   an Fts5Structur
32f0: 65 20 72 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f  e record in memo
3300: 72 79 2e 20 57 68 69 63 68 20 75 73 65 73 20 69  ry. Which uses i
3310: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
3320: 0a 2a 2a 20 6f 74 68 65 72 20 46 74 73 35 53 74  .** other Fts5St
3330: 72 75 63 74 75 72 65 58 58 58 20 74 79 70 65 73  ructureXXX types
3340: 20 61 73 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a   as components..
3350: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 74  */.struct Fts5St
3360: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 7b  ructureSegment {
3370: 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20  .  int iSegid;  
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64     /* Segment id
33a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 65 69 67 68   */.  int nHeigh
33b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
33c0: 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20        /* Height 
33d0: 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65  of segment b-tre
33e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 46  e */.  int pgnoF
33f0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
3400: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3410: 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
3420: 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20   in segment */. 
3430: 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 3b 20 20   int pgnoLast;  
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61   /* Last leaf pa
3460: 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67  ge number in seg
3470: 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  ment */.};.struc
3480: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  t Fts5StructureL
3490: 65 76 65 6c 20 7b 0a 20 20 69 6e 74 20 6e 4d 65  evel {.  int nMe
34a0: 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rge;            
34b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
34c0: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69  er of segments i
34d0: 6e 20 69 6e 63 72 2d 6d 65 72 67 65 20 2a 2f 0a  n incr-merge */.
34e0: 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20    int nSeg;     
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3500: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
3510: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e  r of segments on
3520: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 46 74 73 35   level */.  Fts5
3530: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
3540: 20 2a 61 53 65 67 3b 20 20 20 20 20 2f 2a 20 41   *aSeg;     /* A
3550: 72 72 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 73  rray of segments
3560: 2e 20 61 53 65 67 5b 30 5d 20 69 73 20 6f 6c 64  . aSeg[0] is old
3570: 65 73 74 2e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63  est. */.};.struc
3580: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  t Fts5Structure 
3590: 7b 0a 20 20 75 36 34 20 6e 57 72 69 74 65 43 6f  {.  u64 nWriteCo
35a0: 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  unter;          
35b0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6c 65 61      /* Total lea
35c0: 76 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6c  ves written to l
35d0: 65 76 65 6c 20 30 20 2a 2f 0a 20 20 69 6e 74 20  evel 0 */.  int 
35e0: 6e 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 20  nSegment;       
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3600: 6f 74 61 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e  otal segments in
3610: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
3620: 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b  */.  int nLevel;
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3650: 66 20 6c 65 76 65 6c 73 20 69 6e 20 74 68 69 73  f levels in this
3660: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35   index */.  Fts5
3670: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 61  StructureLevel a
3680: 4c 65 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20 41  Level[0];   /* A
3690: 72 72 61 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c  rray of nLevel l
36a0: 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  evel objects */.
36b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a  };../*.** An obj
36c0: 65 63 74 20 6f 66 20 74 79 70 65 20 46 74 73 35  ect of type Fts5
36d0: 53 65 67 57 72 69 74 65 72 20 69 73 20 75 73 65  SegWriter is use
36e0: 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 73 65  d to write to se
36f0: 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63  gments..*/.struc
3700: 74 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72  t Fts5PageWriter
3710: 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20   {.  int pgno;  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
3740: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
3750: 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
3760: 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  r buf;          
3770: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
3780: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67 65   containing page
3790: 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73 35 42   data */.  Fts5B
37a0: 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
37b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
37c0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
37d0: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 6f 6e  previous term on
37e0: 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75   page */.};.stru
37f0: 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72  ct Fts5SegWriter
3800: 20 7b 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20   {.  int iIdx;  
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
3830: 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
3840: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3860: 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69 74 65  * Segid to write
3870: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 72   to */.  int nWr
3880: 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
3890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
38a0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
38b0: 20 61 57 72 69 74 65 72 20 2a 2f 0a 20 20 46 74   aWriter */.  Ft
38c0: 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 61 57  s5PageWriter *aW
38d0: 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 2f 2a  riter;        /*
38e0: 20 41 72 72 61 79 20 6f 66 20 50 61 67 65 57 72   Array of PageWr
38f0: 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  iter objects */.
3900: 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69 64    i64 iPrevRowid
3910: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3920: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f    /* Previous do
3930: 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63  cid written to c
3940: 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20  urrent leaf */. 
3950: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3960: 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
3970: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3980: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3990: 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  in doclist */.  
39a0: 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e  u8 bFirstRowidIn
39b0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
39c0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
39d0: 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69  rowid is first i
39e0: 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 62  n page */.  u8 b
39f0: 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 3b  FirstTermInPage;
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3a10: 72 75 65 20 69 66 20 6e 65 78 74 20 74 65 72 6d  rue if next term
3a20: 20 77 69 6c 6c 20 62 65 20 66 69 72 73 74 20 69   will be first i
3a30: 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20  n leaf */.  int 
3a40: 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 20 20 20  nLeafWritten;   
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3a60: 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
3a70: 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ges written */. 
3a80: 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20 20   int nEmpty;    
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3aa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
3ab0: 6e 74 69 67 75 6f 75 73 20 74 65 72 6d 2d 6c 65  ntiguous term-le
3ac0: 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 46 74  ss nodes */.  Ft
3ad0: 73 35 42 75 66 66 65 72 20 63 64 6c 69 64 78 3b  s5Buffer cdlidx;
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3af0: 2a 20 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  * Doclist index 
3b00: 2a 2f 0a 20 20 69 36 34 20 69 44 6c 69 64 78 50  */.  i64 iDlidxP
3b10: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
3b20: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
3b30: 20 72 6f 77 69 64 20 61 70 70 65 6e 64 65 64 20   rowid appended 
3b40: 74 6f 20 64 6c 69 64 78 20 2a 2f 0a 20 20 69 6e  to dlidx */.  in
3b50: 74 20 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69  t bDlidxPrevVali
3b60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
3b70: 20 54 72 75 65 20 69 66 20 69 44 6c 69 64 78 50   True if iDlidxP
3b80: 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rev is valid */.
3b90: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  };../*.** Object
3ba0: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
3bb0: 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67 65  hrough the merge
3bc0: 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65  d results of one
3bd0: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
3be0: 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20 65  s,.** visiting e
3bf0: 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 20 70  ach term/docid p
3c00: 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67 65  air in the merge
3c10: 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53  d data..**.** nS
3c20: 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20 70  eg is always a p
3c30: 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65 61  ower of two grea
3c40: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
3c50: 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  l to the number 
3c60: 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74  of.** segments t
3c70: 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hat this object 
3c80: 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20  is merging data 
3c90: 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20 61  from. Both the a
3ca0: 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69  Seg[] and.** aFi
3cb0: 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72 65  rst[] arrays are
3cc0: 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20 65   sized at nSeg e
3cd0: 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65 67  ntries. The aSeg
3ce0: 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64 64  [] array is padd
3cf0: 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65  ed.** with zeroe
3d00: 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65 73  d objects - thes
3d10: 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73  e are handled as
3d20: 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69 74   if they were it
3d30: 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  erators opened.*
3d40: 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d 65  * on empty segme
3d50: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  nts..**.** The r
3d60: 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72  esults of compar
3d70: 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53 65  ing segments aSe
3d80: 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b  g[N] and aSeg[N+
3d90: 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20 61  1], where N is a
3da0: 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72  n.** even number
3db0: 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  , is stored in a
3dc0: 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32  First[(nSeg+N)/2
3dd0: 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22 20  ]. The "result" 
3de0: 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61  of the .** compa
3df0: 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f  rison in this co
3e00: 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e 64  ntext is the ind
3e10: 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  ex of the iterat
3e20: 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  or that currentl
3e30: 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  y.** points to t
3e40: 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f  he smaller term/
3e50: 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  rowid combinatio
3e60: 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74 20  n. Iterators at 
3e70: 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69  EOF are.** consi
3e80: 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65 61  dered to be grea
3e90: 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68  ter than all oth
3ea0: 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a  er iterators..**
3eb0: 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63 6f  .** aFirst[1] co
3ec0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
3ed0: 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74 68   in aSeg[] of th
3ee0: 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  e iterator that 
3ef0: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
3f00: 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76   smallest key ov
3f10: 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d  erall. aFirst[0]
3f20: 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f 0a   is unused. .*/.
3f30: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3f40: 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35  Fts5CResult Fts5
3f50: 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20  CResult;.struct 
3f60: 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20  Fts5CResult {.  
3f70: 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20  u16 iFirst;     
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20  /* aSeg[] index 
3fa0: 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72  of firstest iter
3fb0: 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65  ator */.  u8 bTe
3fc0: 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rmEq;           
3fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3fe0: 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61  e if the terms a
3ff0: 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a  re equal */.};..
4000: 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c 74 69  struct Fts5Multi
4010: 53 65 67 49 74 65 72 20 7b 0a 20 20 69 6e 74 20  SegIter {.  int 
4020: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
4030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4040: 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61 72  ize of aSeg[] ar
4050: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ray */.  int bRe
4060: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
4070: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
4080: 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20 72   to iterate in r
4090: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
40a0: 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74 79    int bSkipEmpty
40b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40c0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b 69    /* True to ski
40d0: 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69 65  p deleted entrie
40e0: 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
40f0: 65 72 20 2a 61 53 65 67 3b 20 20 20 20 20 20 20  er *aSeg;       
4100: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
4110: 6f 66 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  of segment itera
4120: 74 6f 72 73 20 2a 2f 0a 20 20 46 74 73 35 43 52  tors */.  Fts5CR
4130: 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20  esult *aFirst;  
4140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4150: 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65  rent merge state
4160: 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a   (see above) */.
4170: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  };../*.** Object
4180: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
4190: 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c 65 20  hrough a single 
41a0: 73 65 67 6d 65 6e 74 2c 20 76 69 73 69 74 69 6e  segment, visitin
41b0: 67 20 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69  g each term/doci
41c0: 64 0a 2a 2a 20 70 61 69 72 20 69 6e 20 74 68 65  d.** pair in the
41d0: 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
41e0: 70 53 65 67 3a 0a 2a 2a 20 20 20 54 68 65 20 73  pSeg:.**   The s
41f0: 65 67 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74  egment to iterat
4200: 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a  e through..**.**
4210: 20 69 4c 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20   iLeafPgno:.**  
4220: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   Current leaf pa
4230: 67 65 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  ge number within
4240: 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
4250: 69 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20  iLeafOffset:.** 
4260: 20 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69    Byte offset wi
4270: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
4280: 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 74 68   leaf that is th
4290: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
42a0: 74 68 65 20 0a 2a 2a 20 20 20 70 6f 73 69 74 69  the .**   positi
42b0: 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 28 6f 6e  on list data (on
42c0: 65 20 62 79 74 65 20 70 61 73 73 65 64 20 74 68  e byte passed th
42d0: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
42e0: 73 69 7a 65 20 66 69 65 6c 64 29 2e 0a 2a 2a 20  size field)..** 
42f0: 20 20 72 6f 77 69 64 20 66 69 65 6c 64 20 6f 66    rowid field of
4300: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
4310: 72 79 2e 20 55 73 75 61 6c 6c 79 20 74 68 69 73  ry. Usually this
4320: 20 69 73 20 74 68 65 20 73 69 7a 65 20 66 69 65   is the size fie
4330: 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 70  ld of the.**   p
4340: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
4350: 61 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  a. The exception
4360: 20 69 73 20 69 66 20 74 68 65 20 72 6f 77 69 64   is if the rowid
4370: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
4380: 20 65 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73 20   entry .**   is 
4390: 74 68 65 20 6c 61 73 74 20 74 68 69 6e 67 20 6f  the last thing o
43a0: 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e  n the leaf page.
43b0: 0a 2a 2a 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a  .**.** pLeaf:.**
43c0: 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69     Buffer contai
43d0: 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 6c 65 61  ning current lea
43e0: 66 20 70 61 67 65 20 64 61 74 61 2e 20 53 65 74  f page data. Set
43f0: 20 74 6f 20 4e 55 4c 4c 20 61 74 20 45 4f 46 2e   to NULL at EOF.
4400: 0a 2a 2a 0a 2a 2a 20 69 54 65 72 6d 4c 65 61 66  .**.** iTermLeaf
4410: 50 67 6e 6f 2c 20 69 54 65 72 6d 4c 65 61 66 4f  Pgno, iTermLeafO
4420: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 4c 65 61 66  ffset:.**   Leaf
4430: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 63 6f 6e   page number con
4440: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74  taining the last
4450: 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20   term read from 
4460: 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 41 6e 64  the segment. And
4470: 0a 2a 2a 20 20 20 74 68 65 20 6f 66 66 73 65 74  .**   the offset
4480: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4490: 6c 6f 77 69 6e 67 20 74 68 65 20 74 65 72 6d 20  lowing the term 
44a0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67  data..**.** flag
44b0: 73 3a 0a 2a 2a 20 20 20 4d 61 73 6b 20 6f 66 20  s:.**   Mask of 
44c0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 58 58 58  FTS5_SEGITER_XXX
44d0: 20 76 61 6c 75 65 73 2e 20 49 6e 74 65 72 70 72   values. Interpr
44e0: 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
44f0: 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45  .**.**   FTS5_SE
4500: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a  GITER_ONETERM:.*
4510: 2a 20 20 20 20 20 49 66 20 73 65 74 2c 20 73 65  *     If set, se
4520: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  t the iterator t
4530: 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20 61  o point to EOF a
4540: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
4550: 20 64 6f 63 6c 69 73 74 20 0a 2a 2a 20 20 20 20   doclist .**    
4560: 20 68 61 73 20 62 65 65 6e 20 65 78 68 61 75 73   has been exhaus
4570: 74 65 64 2e 20 44 6f 20 6e 6f 74 20 70 72 6f 63  ted. Do not proc
4580: 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  eed to the next 
4590: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
45a0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53  ent..**.**   FTS
45b0: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
45c0: 45 3a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66  E:.**     This f
45d0: 6c 61 67 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  lag is only ever
45e0: 20 73 65 74 20 69 66 20 46 54 53 35 5f 53 45 47   set if FTS5_SEG
45f0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 69 73 20  ITER_ONETERM is 
4600: 61 6c 73 6f 20 73 65 74 2e 20 49 66 0a 2a 2a 20  also set. If.** 
4610: 20 20 20 20 69 74 20 69 73 20 73 65 74 2c 20 69      it is set, i
4620: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64  terate through d
4630: 6f 63 69 64 73 20 69 6e 20 64 65 73 63 65 6e 64  ocids in descend
4640: 69 6e 67 20 6f 72 64 65 72 20 69 6e 73 74 65 61  ing order instea
4650: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20  d of the.**     
4660: 64 65 66 61 75 6c 74 20 61 73 63 65 6e 64 69 6e  default ascendin
4670: 67 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 69  g order..**.** i
4680: 52 6f 77 69 64 4f 66 66 73 65 74 2f 6e 52 6f 77  RowidOffset/nRow
4690: 69 64 4f 66 66 73 65 74 2f 61 52 6f 77 69 64 4f  idOffset/aRowidO
46a0: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 20 20 54 68  ffset:.**     Th
46b0: 65 73 65 20 61 72 65 20 75 73 65 64 20 69 66 20  ese are used if 
46c0: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
46d0: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
46e0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   set..**.**     
46f0: 46 6f 72 20 65 61 63 68 20 72 6f 77 69 64 20 6f  For each rowid o
4700: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 72 72 65  n the page corre
4710: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
4720: 63 75 72 72 65 6e 74 20 74 65 72 6d 2c 20 74 68  current term, th
4730: 65 0a 2a 2a 20 20 20 20 20 63 6f 72 72 65 73 70  e.**     corresp
4740: 6f 6e 64 69 6e 67 20 61 52 6f 77 69 64 4f 66 66  onding aRowidOff
4750: 73 65 74 5b 5d 20 65 6e 74 72 79 20 69 73 20 73  set[] entry is s
4760: 65 74 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f  et to the byte o
4770: 66 66 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ffset of the.** 
4780: 20 20 20 20 73 74 61 72 74 20 6f 66 20 74 68 65      start of the
4790: 20 22 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2d   "position-list-
47a0: 73 69 7a 65 22 20 66 69 65 6c 64 20 77 69 74 68  size" field with
47b0: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  in the page..*/.
47c0: 73 74 72 75 63 74 20 46 74 73 35 53 65 67 49 74  struct Fts5SegIt
47d0: 65 72 20 7b 0a 20 20 46 74 73 35 53 74 72 75 63  er {.  Fts5Struc
47e0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
47f0: 67 3b 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g;     /* Segmen
4800: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
4810: 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ough */.  int iI
4820: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
4830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
4840: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
4850: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
4860: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e    /* Mask of con
4890: 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67 73  figuration flags
48a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
48b0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
48c0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
48d0: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
48e0: 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  r */.  Fts5Data 
48f0: 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  *pLeaf;         
4900: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4910: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20  t leaf data */. 
4920: 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65 74   int iLeafOffset
4930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4940: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
4950: 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c  within current l
4960: 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  eaf */..  /* The
4970: 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73 65 74   page and offset
4980: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20   from which the 
4990: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77 61 73  current term was
49a0: 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66 73 65   read. The offse
49b0: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6f  t .  ** is the o
49c0: 66 66 73 65 74 20 6f 66 20 74 68 65 20 66 69 72  ffset of the fir
49d0: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
49e0: 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e  current doclist.
49f0: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d    */.  int iTerm
4a00: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
4a10: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
4a20: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
4a30: 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75 73  wing are only us
4a40: 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53  ed if the FTS5_S
4a50: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66  EGITER_REVERSE f
4a60: 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20  lag is set. */. 
4a70: 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65   int iRowidOffse
4a80: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4a90: 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e 74 72   /* Current entr
4aa0: 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66 73 65  y in aRowidOffse
4ab0: 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f  t[] */.  int nRo
4ac0: 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  widOffset;      
4ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
4ae0: 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 52  cated size of aR
4af0: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72  owidOffset[] arr
4b00: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f  ay */.  int *aRo
4b10: 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  widOffset;      
4b20: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4b30: 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20 72 6f   of offset to ro
4b40: 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20  wid fields */.. 
4b50: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
4b60: 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20  pDlidx;         
4b70: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
4b80: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
4b90: 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c  */..  /* Variabl
4ba0: 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73  es populated bas
4bb0: 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e  ed on current en
4bc0: 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75  try. */.  Fts5Bu
4bd0: 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
4be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4bf0: 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  rent term */.  i
4c00: 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c20: 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20  * Current rowid 
4c30: 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20  */.  int nPos;  
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4c60: 66 20 62 79 74 65 73 20 69 6e 20 63 75 72 72 65  f bytes in curre
4c70: 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  nt position list
4c80: 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 3b 20   */.  int bDel; 
4c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ca0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4cb0: 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67   the delete flag
4cc0: 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a 23   is set */.};..#
4cd0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49  define FTS5_SEGI
4ce0: 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31  TER_ONETERM 0x01
4cf0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45  .#define FTS5_SE
4d00: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 30 78  GITER_REVERSE 0x
4d10: 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  02.../*.** Objec
4d20: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
4d30: 74 68 72 6f 75 67 68 20 70 61 67 69 6e 61 74 65  through paginate
4d40: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63  d data..*/.struc
4d50: 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20  t Fts5ChunkIter 
4d60: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
4d70: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
4d80: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
4d90: 65 61 66 20 64 61 74 61 2e 20 4e 55 4c 4c 20 2d  eaf data. NULL -
4da0: 3e 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 36 34 20  > EOF. */.  i64 
4db0: 69 4c 65 61 66 52 6f 77 69 64 3b 20 20 20 20 20  iLeafRowid;     
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4dd0: 62 73 6f 6c 75 74 65 20 72 6f 77 69 64 20 6f 66  bsolute rowid of
4de0: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
4df0: 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20  .  int nRem;    
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20     /* Remaining 
4e20: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 74 6f  bytes of data to
4e30: 20 72 65 61 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   read */..  /* O
4e40: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
4e50: 20 2a 2f 0a 20 20 75 38 20 2a 70 3b 20 20 20 20   */.  u8 *p;    
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
4e80: 20 74 6f 20 63 68 75 6e 6b 20 6f 66 20 64 61 74   to chunk of dat
4e90: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  a */.  int n;   
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4ec0: 66 20 62 75 66 66 65 72 20 70 20 69 6e 20 62 79  f buffer p in by
4ed0: 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  tes */.};../*.**
4ee0: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
4ef0: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20  ating through a 
4f00: 73 69 6e 67 6c 65 20 70 6f 73 69 74 69 6f 6e 20  single position 
4f10: 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  list on disk..*/
4f20: 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 49  .struct Fts5PosI
4f30: 74 65 72 20 7b 0a 20 20 46 74 73 35 43 68 75 6e  ter {.  Fts5Chun
4f40: 6b 49 74 65 72 20 63 68 75 6e 6b 3b 20 20 20 20  kIter chunk;    
4f50: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4f60: 6e 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61  nt chunk of data
4f70: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
4fa0: 77 69 74 68 69 6e 20 63 68 75 6e 6b 20 64 61 74  within chunk dat
4fb0: 61 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43 6f 6c  a */..  int iCol
4fc0: 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a 7d 3b  ;.  int iPos;.};
4fd0: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66  ../*.** Object f
4fe0: 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
4ff0: 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e 74 73  ough the conents
5000: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69 6e 74   of a single int
5010: 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 0a 2a  ernal node in .*
5020: 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 72  * memory..*/.str
5030: 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65 72  uct Fts5NodeIter
5040: 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e 61 6c   {.  /* Internal
5050: 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61 67 65  . Set and manage
5060: 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49 74 65  d by fts5NodeIte
5070: 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  rXXX() functions
5080: 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a 2a 20  . Except, .  ** 
5090: 74 68 65 20 45 4f 46 20 74 65 73 74 20 66 6f 72  the EOF test for
50a0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
50b0: 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72 2e 61   (Fts5NodeIter.a
50c0: 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a 20 20  Data==0).  */.  
50d0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 3b  const u8 *aData;
50e0: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20  .  int nData;.  
50f0: 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f 2a 20  int iOff;..  /* 
5100: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
5110: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
5120: 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 45 6d   term;.  int nEm
5130: 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68 69 6c  pty;.  int iChil
5140: 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b  d;.  int bDlidx;
5150: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
5160: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
5170: 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73 20  llowing type is 
5180: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
5190: 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74  through the cont
51a0: 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f 63  ents.** of a doc
51b0: 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72  list-index recor
51c0: 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a 0a  d..**.** pData:.
51d0: 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e 74  **   Record cont
51e0: 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  aining the docli
51f0: 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a 2a  st-index data..*
5200: 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20 20  *.** bEof:.**   
5210: 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63 65  Set to true once
5220: 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72 65   iterator has re
5230: 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  ached EOF..**.**
5240: 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74 20   iOff:.**   Set 
5250: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  to the current o
5260: 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65 63  ffset within rec
5270: 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73 74  ord pData..*/.st
5280: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74  ruct Fts5DlidxIt
5290: 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  er {.  Fts5Data 
52a0: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
52b0: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
52c0: 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 2c 20   doclist index, 
52d0: 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
52e0: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
52f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
5300: 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 74 6f  rent offset into
5310: 20 70 44 6c 69 64 78 20 2a 2f 0a 20 20 69 6e 74   pDlidx */.  int
5320: 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20   bEof;          
5330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
5340: 20 45 4f 46 20 61 6c 72 65 61 64 79 20 2a 2f 0a   EOF already */.
5350: 20 20 69 6e 74 20 69 46 69 72 73 74 4f 66 66 3b    int iFirstOff;
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 2f 2a 20 55 73 65 64 20 62 79 20 72 65 76 65 72  /* Used by rever
5380: 73 65 20 69 74 65 72 61 74 6f 72 73 20 6f 6e 6c  se iterators onl
5390: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  y */..  /* Outpu
53a0: 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  t variables */. 
53b0: 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20   int iLeafPgno; 
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
53d0: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
53e0: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
53f0: 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ge */.  i64 iRow
5400: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
5410: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
5420: 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65  owid on leaf iLe
5430: 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  afPgno */.};.../
5440: 2a 0a 2a 2a 20 41 6e 20 46 74 73 35 42 74 72 65  *.** An Fts5Btre
5450: 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20  eIter object is 
5460: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
5470: 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72  through all entr
5480: 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d  ies in the.** b-
5490: 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20 62  tree hierarchy b
54a0: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 73 69  elonging to a si
54b0: 6e 67 6c 65 20 66 74 73 35 20 73 65 67 6d 65 6e  ngle fts5 segmen
54c0: 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
54d0: 74 68 65 0a 2a 2a 20 22 62 2d 74 72 65 65 20 68  the.** "b-tree h
54e0: 69 65 72 61 72 63 68 79 22 20 69 73 20 61 6c 6c  ierarchy" is all
54f0: 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 65 78   b-tree nodes ex
5500: 63 65 70 74 20 6c 65 61 76 65 73 2e 20 45 61 63  cept leaves. Eac
5510: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  h entry in the.*
5520: 2a 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  * b-tree hierarc
5530: 68 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  hy consists of t
5540: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
5550: 0a 2a 2a 20 20 20 69 4c 65 61 66 3a 20 20 54 68  .**   iLeaf:  Th
5560: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
5570: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 74   the leaf page t
5580: 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 20  he entry points 
5590: 74 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72 6d  to..**.**   term
55a0: 3a 20 20 20 41 20 73 70 6c 69 74 2d 6b 65 79 20  :   A split-key 
55b0: 74 68 61 74 20 61 6c 6c 20 74 65 72 6d 73 20 6f  that all terms o
55c0: 6e 20 6c 65 61 66 20 70 61 67 65 20 24 69 4c 65  n leaf page $iLe
55d0: 61 66 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  af must be great
55e0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
55f0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
5600: 2e 20 54 68 65 20 22 74 65 72 6d 22 20 61 73 73  . The "term" ass
5610: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
5620: 20 66 69 72 73 74 20 62 2d 74 72 65 65 0a 2a 2a   first b-tree.**
5630: 20 20 20 20 20 20 20 20 20 20 20 68 69 65 72 61             hiera
5640: 72 63 68 79 20 65 6e 74 72 79 20 28 74 68 65 20  rchy entry (the 
5650: 6f 6e 65 20 74 68 61 74 20 70 6f 69 6e 74 73 20  one that points 
5660: 74 6f 20 6c 65 61 66 20 70 61 67 65 20 31 29 20  to leaf page 1) 
5670: 69 73 20 61 6c 77 61 79 73 20 0a 2a 2a 20 20 20  is always .**   
5680: 20 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79          an empty
5690: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20   string..**.**  
56a0: 20 6e 45 6d 70 74 79 3a 20 54 68 65 20 6e 75 6d   nEmpty: The num
56b0: 62 65 72 20 6f 66 20 65 6d 70 74 79 20 28 74 65  ber of empty (te
56c0: 72 6d 6c 65 73 73 29 20 6c 65 61 66 20 70 61 67  rmless) leaf pag
56d0: 65 73 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74  es that immediat
56e0: 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ely.**          
56f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65 61 66   following iLeaf
5700: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
5710: 42 74 72 65 65 49 74 65 72 20 6f 62 6a 65 63 74  BtreeIter object
5720: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
5730: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 74   part of the int
5740: 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63 6f 64  egrity-check cod
5750: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  e..*/.struct Fts
5760: 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20  5BtreeIterLevel 
5770: 7b 0a 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72  {.  Fts5NodeIter
5780: 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
5790: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
57a0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
57b0: 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  node */.  Fts5Da
57c0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
57d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
57e0: 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  a for the curren
57f0: 74 20 6e 6f 64 65 20 2a 2f 0a 7d 3b 0a 73 74 72  t node */.};.str
5800: 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74 65  uct Fts5BtreeIte
5810: 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r {.  Fts5Index 
5820: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
5830: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
5840: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
5850: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
5860: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
5870: 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
5880: 6f 75 67 68 20 74 68 69 73 20 73 65 67 6d 65 6e  ough this segmen
5890: 74 27 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  t's b-tree */.  
58a0: 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 2f 2a 20 49 6e 64 65 78 20 70 53 65 67 20 62 65  /* Index pSeg be
58d0: 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  longs to */.  in
58e0: 74 20 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t nLvl;         
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5900: 20 53 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d 20   Size of aLvl[] 
5910: 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 42  array */.  Fts5B
5920: 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 61  treeIterLevel *a
5930: 4c 76 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65  Lvl;       /* Le
5940: 76 65 6c 20 66 6f 72 20 65 61 63 68 20 74 69 65  vel for each tie
5950: 72 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  r of b-tree */..
5960: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
5970: 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  ables */.  Fts5B
5980: 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
5990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
59a0: 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  rrent term */.  
59b0: 69 6e 74 20 69 4c 65 61 66 3b 20 20 20 20 20 20  int iLeaf;      
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 2f 2a 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e 69  /* Leaf containi
59e0: 6e 67 20 74 65 72 6d 73 20 3e 3d 20 63 75 72 72  ng terms >= curr
59f0: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ent term */.  in
5a00: 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20  t nEmpty;       
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a20: 20 4e 75 6d 62 65 72 20 6f 66 20 22 65 6d 70 74   Number of "empt
5a30: 79 22 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  y" leaves follow
5a40: 69 6e 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20 69  ing iLeaf */.  i
5a50: 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20  nt bEof;        
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5a70: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 61 74  * Set to true at
5a80: 20 45 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62 44   EOF */.  int bD
5a90: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  lidx;           
5aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
5ab0: 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
5ac0: 73 20 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b 0a  s a dlidx */.};.
5ad0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
5ae0: 73 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75  s5PutU16(u8 *aOu
5af0: 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20  t, u16 iVal){.  
5b00: 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e  aOut[0] = (iVal>
5b10: 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d  >8);.  aOut[1] =
5b20: 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a   (iVal&0xFF);.}.
5b30: 0a 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35  .static u16 fts5
5b40: 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20  GetU16(const u8 
5b50: 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  *aIn){.  return 
5b60: 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20  ((u16)aIn[0] << 
5b70: 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a  8) + aIn[1];.}..
5b80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
5b90: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 71 6c 69  copy of the sqli
5ba0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
5bb0: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74 68   routine from th
5bc0: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a 2a  e SQLite core..*
5bd0: 2a 20 45 78 63 65 70 74 2c 20 74 68 69 73 20 76  * Except, this v
5be0: 65 72 73 69 6f 6e 20 64 6f 65 73 20 68 61 6e 64  ersion does hand
5bf0: 6c 65 20 74 68 65 20 73 69 6e 67 6c 65 20 62 79  le the single by
5c00: 74 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  te case that the
5c10: 20 63 6f 72 65 0a 2a 2a 20 76 65 72 73 69 6f 6e   core.** version
5c20: 20 64 65 70 65 6e 64 73 20 6f 6e 20 62 65 69 6e   depends on bein
5c30: 67 20 68 61 6e 64 6c 65 64 20 62 65 66 6f 72 65  g handled before
5c40: 20 69 74 73 20 66 75 6e 63 74 69 6f 6e 20 69 73   its function is
5c50: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20   called..*/.int 
5c60: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
5c70: 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73  rint32(const uns
5c80: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75  igned char *p, u
5c90: 33 32 20 2a 76 29 7b 0a 20 20 75 33 32 20 61 2c  32 *v){.  u32 a,
5ca0: 62 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 31 2d 62  b;..  /* The 1-b
5cb0: 79 74 65 20 63 61 73 65 2e 20 4f 76 65 72 77 68  yte case. Overwh
5cc0: 65 6c 6d 69 6e 67 6c 79 20 74 68 65 20 6d 6f 73  elmingly the mos
5cd0: 74 20 63 6f 6d 6d 6f 6e 2e 20 2a 2f 0a 20 20 61  t common. */.  a
5ce0: 20 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70   = *p;.  /* a: p
5cf0: 30 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a  0 (unmasked) */.
5d00: 20 20 69 66 20 28 21 28 61 26 30 78 38 30 29 29    if (!(a&0x80))
5d10: 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75  .  {.    /* Valu
5d20: 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  es between 0 and
5d30: 20 31 32 37 20 2a 2f 0a 20 20 20 20 2a 76 20 3d   127 */.    *v =
5d40: 20 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   a;.    return 1
5d50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
5d60: 32 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20  2-byte case */. 
5d70: 20 70 2b 2b 3b 0a 20 20 62 20 3d 20 2a 70 3b 0a   p++;.  b = *p;.
5d80: 20 20 2f 2a 20 62 3a 20 70 31 20 28 75 6e 6d 61    /* b: p1 (unma
5d90: 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21  sked) */.  if (!
5da0: 28 62 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20  (b&0x80)).  {.  
5db0: 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77    /* Values betw
5dc0: 65 65 6e 20 31 32 38 20 61 6e 64 20 31 36 33 38  een 128 and 1638
5dd0: 33 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20 30 78  3 */.    a &= 0x
5de0: 37 66 3b 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37  7f;.    a = a<<7
5df0: 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20 62  ;.    *v = a | b
5e00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  ;.    return 2;.
5e10: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 33 2d    }..  /* The 3-
5e20: 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20 70  byte case */.  p
5e30: 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34 3b  ++;.  a = a<<14;
5e40: 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a  .  a |= *p;.  /*
5e50: 20 61 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32 20   a: p0<<14 | p2 
5e60: 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20  (unmasked) */.  
5e70: 69 66 20 28 21 28 61 26 30 78 38 30 29 29 0a 20  if (!(a&0x80)). 
5e80: 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73   {.    /* Values
5e90: 20 62 65 74 77 65 65 6e 20 31 36 33 38 34 20 61   between 16384 a
5ea0: 6e 64 20 32 30 39 37 31 35 31 20 2a 2f 0a 20 20  nd 2097151 */.  
5eb0: 20 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34    a &= (0x7f<<14
5ec0: 29 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 62 20  )|(0x7f);.    b 
5ed0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 62 20 3d  &= 0x7f;.    b =
5ee0: 20 62 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20   b<<7;.    *v = 
5ef0: 61 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75 72  a | b;.    retur
5f00: 6e 20 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  n 3;.  }..  /* A
5f10: 20 33 32 2d 62 69 74 20 76 61 72 69 6e 74 20 69   32-bit varint i
5f20: 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
5f30: 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  size information
5f40: 20 69 6e 20 62 74 72 65 65 73 2e 0a 20 20 2a 2a   in btrees..  **
5f50: 20 4f 62 6a 65 63 74 73 20 61 72 65 20 72 61 72   Objects are rar
5f60: 65 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ely larger than 
5f70: 32 4d 69 42 20 6c 69 6d 69 74 20 6f 66 20 61 20  2MiB limit of a 
5f80: 33 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20  3-byte varint.. 
5f90: 20 2a 2a 20 41 20 33 2d 62 79 74 65 20 76 61 72   ** A 3-byte var
5fa0: 69 6e 74 20 69 73 20 73 75 66 66 69 63 69 65 6e  int is sufficien
5fb0: 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  t, for example, 
5fc0: 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 69  to record the si
5fd0: 7a 65 0a 20 20 2a 2a 20 6f 66 20 61 20 31 30 34  ze.  ** of a 104
5fe0: 38 35 36 39 2d 62 79 74 65 20 42 4c 4f 42 20 6f  8569-byte BLOB o
5ff0: 72 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2a 0a 20  r string..  **. 
6000: 20 2a 2a 20 57 65 20 6f 6e 6c 79 20 75 6e 72 6f   ** We only unro
6010: 6c 6c 20 74 68 65 20 66 69 72 73 74 20 31 2d 2c  ll the first 1-,
6020: 20 32 2d 2c 20 61 6e 64 20 33 2d 20 62 79 74 65   2-, and 3- byte
6030: 20 63 61 73 65 73 2e 20 20 54 68 65 20 76 65 72   cases.  The ver
6040: 79 0a 20 20 2a 2a 20 72 61 72 65 20 6c 61 72 67  y.  ** rare larg
6050: 65 72 20 63 61 73 65 73 20 63 61 6e 20 62 65 20  er cases can be 
6060: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 73  handled by the s
6070: 6c 6f 77 65 72 20 36 34 2d 62 69 74 20 76 61 72  lower 64-bit var
6080: 69 6e 74 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  int.  ** routine
6090: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75  ..  */.  {.    u
60a0: 36 34 20 76 36 34 3b 0a 20 20 20 20 75 38 20 6e  64 v64;.    u8 n
60b0: 3b 0a 20 20 20 20 70 20 2d 3d 20 32 3b 0a 20 20  ;.    p -= 2;.  
60c0: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 47 65 74    n = sqlite3Get
60d0: 56 61 72 69 6e 74 28 70 2c 20 26 76 36 34 29 3b  Varint(p, &v64);
60e0: 0a 20 20 20 20 2a 76 20 3d 20 28 75 33 32 29 76  .    *v = (u32)v
60f0: 36 34 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  64;.    assert( 
6100: 6e 3e 33 20 26 26 20 6e 3c 3d 39 20 29 3b 0a 20  n>3 && n<=9 );. 
6110: 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 7d     return n;.  }
6120: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
6130: 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28  ts5GetVarintLen(
6140: 75 33 32 20 69 56 61 6c 29 7b 0a 20 20 69 66 28  u32 iVal){.  if(
6150: 20 69 56 61 6c 3c 28 31 20 3c 3c 20 37 20 29 20   iVal<(1 << 7 ) 
6160: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
6170: 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 31 34 29  ( iVal<(1 << 14)
6180: 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
6190: 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32 31  f( iVal<(1 << 21
61a0: 29 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  ) ) return 3;.  
61b0: 69 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32  if( iVal<(1 << 2
61c0: 38 29 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  8) ) return 4;. 
61d0: 20 72 65 74 75 72 6e 20 35 3b 0a 7d 0a 0a 2f 2a   return 5;.}../*
61e0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
61f0: 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72   return a buffer
6200: 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20   at least nByte 
6210: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
6220: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
6230: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
6240: 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  red, return NULL
6250: 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72   and set the err
6260: 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68  or code in.** th
6270: 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  e Fts5Index hand
6280: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
6290: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
62a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
62b0: 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46  *fts5IdxMalloc(F
62c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
62d0: 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20   nByte){.  void 
62e0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
62f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6300: 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  K ){.    pRet = 
6310: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
6320: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
6330: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ret==0 ){.      
6340: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
6350: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
6360: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52  .      memset(pR
6370: 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  et, 0, nByte);. 
6380: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6390: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
63a0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   Compare the con
63b0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65  tents of the pLe
63c0: 66 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74  ft buffer with t
63d0: 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74  he pRight/nRight
63e0: 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   blob..**.** Ret
63f0: 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74  urn -ve if pLeft
6400: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
6410: 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68   pRight, 0 if th
6420: 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a  ey are equal or.
6430: 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74  ** +ve if pRight
6440: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
6450: 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72   pLeft. In other
6460: 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   words:.**.**   
6470: 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d    res = *pLeft -
6480: 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74   *pRight.*/.stat
6490: 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65  ic int fts5Buffe
64a0: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20  rCompareBlob(.  
64b0: 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66  Fts5Buffer *pLef
64c0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
64d0: 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64  /* Left hand sid
64e0: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
64f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
6500: 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68  Right, int nRigh
6510: 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61  t    /* Right ha
6520: 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  nd side of compa
6530: 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rison */.){.  in
6540: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
6550: 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a  ft->n, nRight);.
6560: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
6570: 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69  mp(pLeft->p, pRi
6580: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
6590: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
65a0: 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68  pLeft->n - nRigh
65b0: 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f  t) : res);.}.../
65c0: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
65d0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
65e0: 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69   two buffers usi
65f0: 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20  ng memcmp(). If 
6600: 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73  one buffer.** is
6610: 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
6620: 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f   other, it is co
6630: 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73  nsidered the les
6640: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ser..**.** Retur
6650: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
6660: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
6670: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
6680: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
6690: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
66a0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
66b0: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
66c0: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
66d0: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
66e0: 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63  pRight.*/.static
66f0: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
6700: 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65  ompare(Fts5Buffe
6710: 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75  r *pLeft, Fts5Bu
6720: 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  ffer *pRight){. 
6730: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
6740: 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74  pLeft->n, pRight
6750: 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ->n);.  int res 
6760: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e  = memcmp(pLeft->
6770: 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43  p, pRight->p, nC
6780: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
6790: 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e  es==0 ? (pLeft->
67a0: 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a  n - pRight->n) :
67b0: 20 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66   res);.}..#ifdef
67c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
67d0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 6c 6f  atic int fts5Blo
67e0: 62 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73  bCompare(.  cons
67f0: 74 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74  t u8 *pLeft, int
6800: 20 6e 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74   nLeft, .  const
6810: 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74   u8 *pRight, int
6820: 20 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74   nRight.){.  int
6830: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66   nCmp = MIN(nLef
6840: 74 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e  t, nRight);.  in
6850: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
6860: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43  Left, pRight, nC
6870: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
6880: 65 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d  es==0 ? (nLeft -
6890: 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b   nRight) : res);
68a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
68b0: 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64  * Close the read
68c0: 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c  -only blob handl
68d0: 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  e, if it is open
68e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
68f0: 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
6900: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
6910: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
6920: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6930: 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20  blob *pReader = 
6940: 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20  p->pReader;.    
6950: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
6960: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
6970: 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b  _close(pReader);
6980: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
6990: 65 63 6b 20 69 66 20 72 6f 77 20 69 52 6f 77 69  eck if row iRowi
69a0: 64 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  d exists in the 
69b0: 25 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 61 6e  %_data table, an
69c0: 64 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  d that it contai
69d0: 6e 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 76 61 6c  ns.** a blob val
69e0: 75 65 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72  ue. If so, retur
69f0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 28  n SQLITE_ERROR (
6a00: 79 65 73 20 2d 20 53 51 4c 49 54 45 5f 45 52 52  yes - SQLITE_ERR
6a10: 4f 52 2c 20 6e 6f 74 20 0a 2a 2a 20 53 51 4c 49  OR, not .** SQLI
6a20: 54 45 5f 4f 4b 29 2e 20 49 66 20 6e 6f 74 2c 20  TE_OK). If not, 
6a30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6a40: 52 52 55 50 54 5f 56 54 41 42 2e 0a 2a 2a 0a 2a  RRUPT_VTAB..**.*
6a50: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6a60: 63 75 72 73 20 28 65 2e 67 2e 20 4f 4f 4d 20 6f  curs (e.g. OOM o
6a70: 72 20 49 4f 45 52 52 29 2c 20 72 65 74 75 72 6e  r IOERR), return
6a80: 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 65 72   the relevant er
6a90: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
6aa0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
6ab0: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
6ac0: 65 20 65 66 66 69 63 69 65 6e 74 2e 20 49 74 20  e efficient. It 
6ad0: 69 73 20 70 61 72 74 20 6f 66 20 76 61 72 79 20  is part of vary 
6ae0: 72 61 72 65 6c 79 0a 2a 2a 20 69 6e 76 6f 6b 65  rarely.** invoke
6af0: 64 20 65 72 72 6f 72 20 68 61 6e 64 6c 69 6e 67  d error handling
6b00: 20 63 6f 64 65 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23   code only..*/.#
6b10: 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20  if 0.static int 
6b20: 66 74 73 35 43 68 65 63 6b 4d 69 73 73 69 6e 67  fts5CheckMissing
6b30: 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 20  Rowid(Fts5Index 
6b40: 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  *p, i64 iRowid){
6b50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6b60: 46 6d 74 20 3d 20 22 53 45 4c 45 43 54 20 74 79  Fmt = "SELECT ty
6b70: 70 65 6f 66 28 62 6c 6f 63 6b 29 3d 3d 27 62 6c  peof(block)=='bl
6b80: 6f 62 27 20 46 52 4f 4d 20 27 25 71 27 2e 25 51  ob' FROM '%q'.%Q
6b90: 20 57 48 45 52 45 20 69 64 3d 25 6c 6c 64 22 3b   WHERE id=%lld";
6ba0: 0a 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a  .  int bOk = 0;.
6bb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
6bc0: 20 2a 7a 53 71 6c 3b 0a 0a 20 20 7a 53 71 6c 20   *zSql;..  zSql 
6bd0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
6be0: 66 28 7a 46 6d 74 2c 20 70 2d 3e 70 43 6f 6e 66  f(zFmt, p->pConf
6bf0: 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74  ig->zDb, p->zDat
6c00: 61 54 62 6c 2c 20 69 52 6f 77 69 64 29 3b 0a 20  aTbl, iRowid);. 
6c10: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
6c20: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6c30: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
6c40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
6c50: 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 72 63 20   *pStmt;.    rc 
6c60: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6c70: 65 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d  e_v2(p->pConfig-
6c80: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
6c90: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
6ca0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6cb0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 53 51   ){.      if( SQ
6cc0: 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
6cd0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
6ce0: 0a 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 73  .        bOk = s
6cf0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
6d00: 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
6d10: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
6d20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
6d30: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20  (pStmt);.    }. 
6d40: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6d50: 7a 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  zSql);.  }..  if
6d60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6d70: 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 4f 6b 20  ){.    rc = bOk 
6d80: 3f 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 3a  ? SQLITE_ERROR :
6d90: 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
6da0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
6db0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  .}.#endif..stati
6dc0: 63 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35  c Fts5Data *fts5
6dd0: 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72  DataReadOrBuffer
6de0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
6df0: 2c 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  , .  Fts5Buffer 
6e00: 2a 70 42 75 66 2c 20 0a 20 20 69 36 34 20 69 52  *pBuf, .  i64 iR
6e10: 6f 77 69 64 0a 29 7b 0a 20 20 46 74 73 35 44 61  owid.){.  Fts5Da
6e20: 74 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  ta *pRet = 0;.  
6e30: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
6e40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
6e50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6e60: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61  .    if( p->pRea
6e70: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  der ){.      /* 
6e80: 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65  This call may re
6e90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
6ea0: 54 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  T if there has b
6eb0: 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a  een a savepoint.
6ec0: 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
6ed0: 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  k since it was l
6ee0: 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69  ast used. In thi
6ef0: 73 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f  s case a new blo
6f00: 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a  b handle.      *
6f10: 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  * is required.  
6f20: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
6f30: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
6f40: 6e 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 69 52  n(p->pReader, iR
6f50: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
6f60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52   rc==SQLITE_ABOR
6f70: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  T ){.        fts
6f80: 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
6f90: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
6fa0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
6fb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
6fc0: 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c  f the blob handl
6fd0: 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  e is not yet ope
6fe0: 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65 65 6b  n, open and seek
6ff0: 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   it. Otherwise, 
7000: 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  use.    ** the b
7010: 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41 50 49  lob_reopen() API
7020: 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65 20 65   to reseek the e
7030: 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68 61 6e  xisting blob han
7040: 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  dle.  */.    if(
7050: 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29   p->pReader==0 )
7060: 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e 66  {.      Fts5Conf
7070: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
7080: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20  >pConfig;.      
7090: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
70a0: 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e  b_open(pConfig->
70b0: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  db, .          p
70c0: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
70d0: 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b  zDataTbl, "block
70e0: 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26 70  ", iRowid, 0, &p
70f0: 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20 20  ->pReader.      
7100: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7110: 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
7120: 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  e sqlite3_blob_o
7130: 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
7140: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 63  _blob_reopen() c
7150: 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61 62 6f 76  alls.    ** abov
7160: 65 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54  e returned SQLIT
7170: 45 5f 45 52 52 4f 52 2c 20 72 65 74 75 72 6e 20  E_ERROR, return 
7180: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
7190: 54 41 42 20 69 6e 73 74 65 61 64 2e 0a 20 20 20  TAB instead..   
71a0: 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72 65 61 73   ** All the reas
71b0: 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e 63 74 69  ons those functi
71c0: 6f 6e 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e  ons might return
71d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 2d 20   SQLITE_ERROR - 
71e0: 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74  missing.    ** t
71f0: 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67 20 72 6f  able, missing ro
7200: 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74 65 78 74  w, non-blob/text
7210: 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c 75 6d 6e   in block column
7220: 20 2d 20 69 6e 64 69 63 61 74 65 20 0a 20 20 20   - indicate .   
7230: 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73 74 6f 72   ** backing stor
7240: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  e corruption.  *
7250: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
7260: 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 72 63 20  LITE_ERROR ) rc 
7270: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
7280: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
7290: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
72a0: 75 38 20 2a 61 4f 75 74 3b 20 20 20 20 20 20 20  u8 *aOut;       
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
72c0: 65 61 64 20 62 6c 6f 62 20 64 61 74 61 20 69 6e  ead blob data in
72d0: 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a  to this buffer *
72e0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  /.      int nByt
72f0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  e = sqlite3_blob
7300: 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61 64 65  _bytes(p->pReade
7310: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  r);.      if( pB
7320: 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  uf ){.        ft
7330: 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75  s5BufferZero(pBu
7340: 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  f);.        fts5
7350: 42 75 66 66 65 72 47 72 6f 77 28 26 72 63 2c 20  BufferGrow(&rc, 
7360: 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
7370: 20 20 20 20 20 20 61 4f 75 74 20 3d 20 70 42 75        aOut = pBu
7380: 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 70 42  f->p;.        pB
7390: 75 66 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  uf->n = nByte;. 
73a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
73b0: 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d      int nSpace =
73c0: 20 6e 42 79 74 65 20 2b 20 46 54 53 35 5f 44 41   nByte + FTS5_DA
73d0: 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b  TA_ZERO_PADDING;
73e0: 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
73f0: 28 46 74 73 35 44 61 74 61 2a 29 73 71 6c 69 74  (Fts5Data*)sqlit
7400: 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
7410: 28 26 72 63 2c 20 6e 53 70 61 63 65 2b 73 69 7a  (&rc, nSpace+siz
7420: 65 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a  eof(Fts5Data));.
7430: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 74          if( pRet
7440: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
7450: 65 74 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  et->n = nByte;. 
7460: 20 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d 20           aOut = 
7470: 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26  pRet->p = (u8*)&
7480: 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 20  pRet[1];.       
7490: 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20     pRet->nRef = 
74a0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
74b0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
74c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
74d0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
74e0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28  lite3_blob_read(
74f0: 70 2d 3e 70 52 65 61 64 65 72 2c 20 61 4f 75 74  p->pReader, aOut
7500: 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20  , nByte, 0);.   
7510: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
7520: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
7530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7540: 66 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20  free(pRet);.    
7550: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
7560: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
7570: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
7580: 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a  p->nRead++;.  }.
7590: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
75a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
75b0: 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  e a record from 
75c0: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
75d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
75e0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
75f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
7600: 20 61 6e 20 65 72 72 6f 72 20 6c 65 66 74 20 69   an error left i
7610: 6e 20 74 68 65 20 0a 2a 2a 20 46 74 73 35 49 6e  n the .** Fts5In
7620: 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  dex object..*/.s
7630: 74 61 74 69 63 20 46 74 73 35 44 61 74 61 20 2a  tatic Fts5Data *
7640: 66 74 73 35 44 61 74 61 52 65 61 64 28 46 74 73  fts5DataRead(Fts
7650: 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
7660: 52 6f 77 69 64 29 7b 0a 20 20 46 74 73 35 44 61  Rowid){.  Fts5Da
7670: 74 61 20 2a 70 52 65 74 20 3d 20 66 74 73 35 44  ta *pRet = fts5D
7680: 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28  ataReadOrBuffer(
7690: 70 2c 20 30 2c 20 69 52 6f 77 69 64 29 3b 0a 20  p, 0, iRowid);. 
76a0: 20 61 73 73 65 72 74 28 20 28 70 52 65 74 3d 3d   assert( (pRet==
76b0: 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51 4c 49  0)==(p->rc!=SQLI
76c0: 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65 74 75  TE_OK) );.  retu
76d0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
76e0: 2a 20 52 65 61 64 20 61 20 72 65 63 6f 72 64 20  * Read a record 
76f0: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
7700: 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65 20 62  table into the b
7710: 75 66 66 65 72 20 73 75 70 70 6c 69 65 64 20 61  uffer supplied a
7720: 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  s the.** second 
7730: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
7740: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
7750: 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20  rs, an error is 
7760: 6c 65 66 74 20 69 6e 20 74 68 65 20 46 74 73 35  left in the Fts5
7770: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66  Index object. If
7780: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73   an.** error has
7790: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
77a0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
77b0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
77c0: 69 74 20 69 73 20 61 20 0a 2a 2a 20 6e 6f 2d 6f  it is a .** no-o
77d0: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
77e0: 64 20 66 74 73 35 44 61 74 61 42 75 66 66 65 72  d fts5DataBuffer
77f0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
7800: 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
7810: 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20   i64 iRowid){.  
7820: 28 76 6f 69 64 29 66 74 73 35 44 61 74 61 52 65  (void)fts5DataRe
7830: 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20 70 42  adOrBuffer(p, pB
7840: 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 7d 0a 0a  uf, iRowid);.}..
7850: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
7860: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64 61 74  reference to dat
7870: 61 20 72 65 63 6f 72 64 20 72 65 74 75 72 6e 65  a record returne
7880: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
7890: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44  call to.** fts5D
78a0: 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74  ataRead()..*/.st
78b0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
78c0: 74 61 52 65 6c 65 61 73 65 28 46 74 73 35 44 61  taRelease(Fts5Da
78d0: 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 69 66  ta *pData){.  if
78e0: 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 61  ( pData ){.    a
78f0: 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e 6e 52  ssert( pData->nR
7900: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 44 61 74  ef>0 );.    pDat
7910: 61 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  a->nRef--;.    i
7920: 66 28 20 70 44 61 74 61 2d 3e 6e 52 65 66 3d 3d  f( pData->nRef==
7930: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
7940: 28 70 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pData);.  }.}..
7950: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7960: 44 61 74 61 52 65 66 65 72 65 6e 63 65 28 46 74  DataReference(Ft
7970: 73 35 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a  s5Data *pData){.
7980: 20 20 70 44 61 74 61 2d 3e 6e 52 65 66 2b 2b 3b    pData->nRef++;
7990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54  .}../*.** INSERT
79a0: 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72 65   OR REPLACE a re
79b0: 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f  cord into the %_
79c0: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  data table..*/.s
79d0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
79e0: 61 74 61 57 72 69 74 65 28 46 74 73 35 49 6e 64  ataWrite(Fts5Ind
79f0: 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
7a00: 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  d, const u8 *pDa
7a10: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a  ta, int nData){.
7a20: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
7a30: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
7a40: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74  ..  if( p->pWrit
7a50: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  er==0 ){.    int
7a60: 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e   rc;.    Fts5Con
7a70: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
7a80: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63  ->pConfig;.    c
7a90: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
7aa0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
7ab0: 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e       "REPLACE IN
7ac0: 54 4f 20 27 25 71 27 2e 25 51 28 69 64 2c 20 62  TO '%q'.%Q(id, b
7ad0: 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f  lock) VALUES(?,?
7ae0: 29 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62  )", pConfig->zDb
7af0: 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20  , p->zDataTbl.  
7b00: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71    );.    if( zSq
7b10: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
7b20: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7b30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7b40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
7b50: 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69  repare_v2(pConfi
7b60: 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  g->db, zSql, -1,
7b70: 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 30 29   &p->pWriter, 0)
7b80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
7b90: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
7ba0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
7bb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
7bc0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
7bd0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
7be0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
7bf0: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57  bind_int64(p->pW
7c00: 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64  riter, 1, iRowid
7c10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
7c20: 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65  d_blob(p->pWrite
7c30: 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61  r, 2, pData, nDa
7c40: 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  ta, SQLITE_STATI
7c50: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  C);.  sqlite3_st
7c60: 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  ep(p->pWriter);.
7c70: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
7c80: 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74  3_reset(p->pWrit
7c90: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  er);.}../*.** Ex
7ca0: 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77  ecute the follow
7cb0: 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20  ing SQL:.**.**  
7cc0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25     DELETE FROM %
7cd0: 5f 64 61 74 61 20 57 48 45 52 45 20 69 64 20 42  _data WHERE id B
7ce0: 45 54 57 45 45 4e 20 24 69 46 69 72 73 74 20 41  ETWEEN $iFirst A
7cf0: 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61  ND $iLast.*/.sta
7d00: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
7d10: 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65  aDelete(Fts5Inde
7d20: 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74  x *p, i64 iFirst
7d30: 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20  , i64 iLast){.  
7d40: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
7d50: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
7d60: 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65    if( p->pDelete
7d70: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  r==0 ){.    int 
7d80: 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66  rc;.    Fts5Conf
7d90: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
7da0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68  >pConfig;.    ch
7db0: 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
7dc0: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
7dd0: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
7de0: 20 27 25 71 27 2e 25 51 20 57 48 45 52 45 20 69   '%q'.%Q WHERE i
7df0: 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 2c  d>=? AND id<=?",
7e00: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
7e10: 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 29  ->zDataTbl.    )
7e20: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
7e30: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
7e40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7e50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
7e60: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
7e70: 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e  are_v2(pConfig->
7e80: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
7e90: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30 29 3b 0a  ->pDeleter, 0);.
7ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
7eb0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  ee(zSql);.    }.
7ec0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
7ed0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
7ee0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
7ef0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
7f00: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   }..  sqlite3_bi
7f10: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c  nd_int64(p->pDel
7f20: 65 74 65 72 2c 20 31 2c 20 69 46 69 72 73 74 29  eter, 1, iFirst)
7f30: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
7f40: 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65 74  _int64(p->pDelet
7f50: 65 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a 20  er, 2, iLast);. 
7f60: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
7f70: 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 70 2d  >pDeleter);.  p-
7f80: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
7f90: 73 65 74 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  set(p->pDeleter)
7fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
7fb0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
7fc0: 62 20 68 61 6e 64 6c 65 20 75 73 65 64 20 74 6f  b handle used to
7fd0: 20 72 65 61 64 20 72 65 63 6f 72 64 73 20 66 72   read records fr
7fe0: 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
7ff0: 62 6c 65 2e 0a 2a 2a 20 41 6e 64 20 64 69 73 63  ble..** And disc
8000: 61 72 64 20 61 6e 79 20 63 61 63 68 65 64 20 72  ard any cached r
8010: 65 61 64 73 2e 20 54 68 69 73 20 66 75 6e 63 74  eads. This funct
8020: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
8030: 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61   the end of.** a
8040: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
8050: 6e 20 6f 72 20 77 68 65 6e 20 61 6e 79 20 73 75  n or when any su
8060: 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  b-transaction is
8070: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
8080: 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f  .#if 0.static vo
8090: 69 64 20 66 74 73 35 44 61 74 61 52 65 73 65 74  id fts5DataReset
80a0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
80b0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
80c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
80d0: 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d 3e 70 52  blob_close(p->pR
80e0: 65 61 64 65 72 29 3b 0a 20 20 20 20 70 2d 3e 70  eader);.    p->p
80f0: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 7d 0a  Reader = 0;.  }.
8100: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8110: 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72  Remove all recor
8120: 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ds associated wi
8130: 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69  th segment iSegi
8140: 64 20 69 6e 20 69 6e 64 65 78 20 69 49 64 78 2e  d in index iIdx.
8150: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8160: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
8170: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
8180: 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 69 6e  *p, int iIdx, in
8190: 74 20 69 53 65 67 69 64 29 7b 0a 20 20 69 36 34  t iSegid){.  i64
81a0: 20 69 46 69 72 73 74 20 3d 20 46 54 53 35 5f 53   iFirst = FTS5_S
81b0: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
81c0: 78 2c 20 69 53 65 67 69 64 2c 20 30 2c 20 30 29  x, iSegid, 0, 0)
81d0: 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
81e0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
81f0: 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2b  ID(iIdx, iSegid+
8200: 31 2c 20 30 2c 20 30 29 2d 31 3b 0a 20 20 66 74  1, 0, 0)-1;.  ft
8210: 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20  s5DataDelete(p, 
8220: 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a  iFirst, iLast);.
8230: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
8240: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
8250: 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65  an Fts5Structure
8260: 20 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64   object returned
8270: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a   by an earlier .
8280: 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53  ** call to fts5S
8290: 74 72 75 63 74 75 72 65 52 65 61 64 28 29 20 6f  tructureRead() o
82a0: 72 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  r fts5StructureD
82b0: 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ecode()..*/.stat
82c0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
82d0: 63 74 75 72 65 52 65 6c 65 61 73 65 28 46 74 73  ctureRelease(Fts
82e0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
82f0: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72  uct){.  if( pStr
8300: 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  uct ){.    int i
8310: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8320: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
8330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
8340: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
8350: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53  ct->aLevel[i].aS
8360: 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eg);.    }.    s
8370: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72  qlite3_free(pStr
8380: 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  uct);.  }.}../*.
8390: 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 61  ** Deserialize a
83a0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74  nd return the st
83b0: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 63  ructure record c
83c0: 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
83d0: 69 6e 20 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a  in serialized.**
83e0: 20 66 6f 72 6d 20 77 69 74 68 69 6e 20 62 75 66   form within buf
83f0: 66 65 72 20 70 44 61 74 61 2f 6e 44 61 74 61 2e  fer pData/nData.
8400: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53  .**.** The Fts5S
8410: 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b  tructure.aLevel[
8420: 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53  ] and each Fts5S
8430: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53  tructureLevel.aS
8440: 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  eg[] array.** ar
8450: 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64  e over-allocated
8460: 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68   by one slot. Th
8470: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 73 74  is allows the st
8480: 72 75 63 74 75 72 65 20 63 6f 6e 74 65 6e 74 73  ructure contents
8490: 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72 65 20 65  .** to be more e
84a0: 61 73 69 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a  asily edited..**
84b0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
84c0: 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75 74 20 69  occurs, *ppOut i
84d0: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
84e0: 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  d an SQLite erro
84f0: 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e  r code.** return
8500: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 2a  ed. Otherwise, *
8510: 70 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  ppOut is set to 
8520: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
8530: 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53   object and.** S
8540: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
8550: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8560: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
8570: 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 75 38  code(.  const u8
8580: 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20   *pData,        
8590: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
85a0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72  r containing ser
85b0: 69 61 6c 69 7a 65 64 20 73 74 72 75 63 74 75 72  ialized structur
85c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61  e */.  int nData
85d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
85e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
85f0: 66 20 62 75 66 66 65 72 20 70 44 61 74 61 20 69  f buffer pData i
8600: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
8610: 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20   *piCookie,     
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8630: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  Configuration co
8640: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
8650: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
8660: 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
8670: 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c  /* OUT: Deserial
8680: 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  ized object */.)
8690: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
86a0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20  ITE_OK;.  int i 
86b0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b  = 0;.  int iLvl;
86c0: 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20  .  int nLevel = 
86d0: 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  0;.  int nSegmen
86e0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79  t = 0;.  int nBy
86f0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
8700: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
8710: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
8720: 6c 6f 63 61 74 65 20 61 74 20 70 52 65 74 20 2a  locate at pRet *
8730: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
8740: 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  e *pRet = 0;    
8750: 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65      /* Structure
8760: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   object to retur
8770: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20  n */..  /* Grab 
8780: 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  the cookie value
8790: 20 2a 2f 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b   */.  if( piCook
87a0: 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d  ie ) *piCookie =
87b0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 33   sqlite3Fts5Get3
87c0: 32 28 70 44 61 74 61 29 3b 0a 20 20 69 20 3d 20  2(pData);.  i = 
87d0: 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  4;..  /* Read th
87e0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
87f0: 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73 65 67  f levels and seg
8800: 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73  ments from the s
8810: 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tart of the.  **
8820: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
8830: 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74  d.  */.  i += ft
8840: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8850: 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29  Data[i], nLevel)
8860: 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  ;.  i += fts5Get
8870: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8880: 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20  i], nSegment);. 
8890: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
88a0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
88b0: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
88d0: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
88e0: 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
88f0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
8900: 29 20 2a 20 28 6e 4c 65 76 65 6c 29 20 20 20 20  ) * (nLevel)    
8910: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
8920: 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52  ray */.  );.  pR
8930: 65 74 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  et = (Fts5Struct
8940: 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ure*)sqlite3Fts5
8950: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
8960: 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70  nByte);..  if( p
8970: 52 65 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d  Ret ){.    pRet-
8980: 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c  >nLevel = nLevel
8990: 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67  ;.    pRet->nSeg
89a0: 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b  ment = nSegment;
89b0: 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65  .    i += sqlite
89c0: 33 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  3GetVarint(&pDat
89d0: 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72  a[i], &pRet->nWr
89e0: 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  iteCounter);..  
89f0: 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63    for(iLvl=0; rc
8a00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
8a10: 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  Lvl<nLevel; iLvl
8a20: 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
8a30: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
8a40: 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65  Lvl = &pRet->aLe
8a50: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
8a60: 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a 20 20 20   int nTotal;.   
8a70: 20 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20     int iSeg;..  
8a80: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8a90: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8aa0: 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  i], pLvl->nMerge
8ab0: 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  );.      i += ft
8ac0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
8ad0: 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29  Data[i], nTotal)
8ae0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8af0: 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d  nTotal>=pLvl->nM
8b00: 65 72 67 65 20 29 3b 0a 20 20 20 20 20 20 70 4c  erge );.      pL
8b10: 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  vl->aSeg = (Fts5
8b20: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8b30: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
8b40: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20  locZero(&rc, .  
8b50: 20 20 20 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a          nTotal *
8b60: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8b70: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 0a 20 20  ctureSegment).  
8b80: 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20 69 66      );..      if
8b90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8ba0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  ){.        pLvl-
8bb0: 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a  >nSeg = nTotal;.
8bc0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
8bd0: 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b  =0; iSeg<nTotal;
8be0: 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
8bf0: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8c00: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8c10: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
8c20: 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  Seg].iSegid);.  
8c30: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
8c40: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
8c50: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
8c60: 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74  eg[iSeg].nHeight
8c70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
8c80: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
8c90: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
8ca0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
8cb0: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
8cc0: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8cd0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8ce0: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
8cf0: 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg].pgnoLast);.
8d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8d10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
8d20: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
8d30: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
8d40: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
8d50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
8d60: 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b    *ppOut = pRet;
8d70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8d80: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
8d90: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
8da0: 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20  ureAddLevel(int 
8db0: 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74  *pRc, Fts5Struct
8dc0: 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b  ure **ppStruct){
8dd0: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
8de0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
8df0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
8e00: 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
8e10: 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c  ;.    int nLevel
8e20: 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   = pStruct->nLev
8e30: 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  el;.    int nByt
8e40: 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69  e = (.        si
8e50: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
8e60: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
8e70: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
8e80: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
8e90: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
8ea0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
8eb0: 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20   (nLevel+1)  /* 
8ec0: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
8ed0: 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53  /.    );..    pS
8ee0: 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f  truct = sqlite3_
8ef0: 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c  realloc(pStruct,
8f00: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
8f10: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
8f20: 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63    memset(&pStruc
8f30: 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c  t->aLevel[nLevel
8f40: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  ], 0, sizeof(Fts
8f50: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
8f60: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
8f70: 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20  ->nLevel++;.    
8f80: 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
8f90: 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65  truct;.    }else
8fa0: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
8fb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8fc0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8fd0: 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76  Extend level iLv
8fe0: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  l so that there 
8ff0: 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c  is room for at l
9000: 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65  east nExtra more
9010: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f  .** segments..*/
9020: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9030: 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
9040: 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52  Level(.  int *pR
9050: 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74  c, .  Fts5Struct
9060: 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20  ure *pStruct, . 
9070: 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e   int iLvl, .  in
9080: 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74  t nExtra, .  int
9090: 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66   bInsert.){.  if
90a0: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
90b0: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
90c0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
90d0: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
90e0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
90f0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9100: 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20  ment *aNew;.    
9110: 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  int nByte;..    
9120: 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nByte = (pLvl->n
9130: 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20  Seg + nExtra) * 
9140: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
9150: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
9160: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
9170: 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61  _realloc(pLvl->a
9180: 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Seg, nByte);.   
9190: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
91a0: 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d     if( bInsert==
91b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ){.        mem
91c0: 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e  set(&aNew[pLvl->
91d0: 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSeg], 0, sizeof
91e0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
91f0: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
9200: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9210: 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65         int nMove
9220: 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20   = pLvl->nSeg * 
9230: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
9240: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
9250: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61        memmove(&a
9260: 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65  New[nExtra], aNe
9270: 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20  w, nMove);.     
9280: 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20     memset(aNew, 
9290: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
92a0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20  ructureSegment) 
92b0: 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  * nExtra);.     
92c0: 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61   }.      pLvl->a
92d0: 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  Seg = aNew;.    
92e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
92f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
9300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
9310: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
9320: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
9330: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
9340: 72 65 63 6f 72 64 20 66 6f 72 20 69 6e 64 65 78  record for index
9350: 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   iIdx..**.** The
9360: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61   Fts5Structure.a
9370: 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68  Level[] and each
9380: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9390: 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79  vel.aSeg[] array
93a0: 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c  .** are over-all
93b0: 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72 69  ocated as descri
93c0: 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  bed for function
93d0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
93e0: 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65  code() .** above
93f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
9400: 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
9410: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
9420: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c   an error code l
9430: 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74  eft in the.** Ft
9440: 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20  s5Index handle. 
9450: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
9460: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
9470: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
9480: 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
9490: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
94a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 53  .*/.static Fts5S
94b0: 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53 74  tructure *fts5St
94c0: 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73 35  ructureRead(Fts5
94d0: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49  Index *p, int iI
94e0: 64 78 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  dx){.  Fts5Confi
94f0: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
9500: 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 53  pConfig;.  Fts5S
9510: 74 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d  tructure *pRet =
9520: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 62   0;        /* Ob
9530: 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a  ject to return *
9540: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
9550: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
9560: 20 20 20 20 2f 2a 20 25 5f 64 61 74 61 20 65 6e      /* %_data en
9570: 74 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73  try containing s
9580: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20  tructure record 
9590: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  */.  int iCookie
95a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
95b0: 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
95c0: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
95d0: 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
95e0: 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  =pConfig->nPrefi
95f0: 78 20 29 3b 0a 20 20 70 44 61 74 61 20 3d 20 66  x );.  pData = f
9600: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
9610: 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
9620: 57 49 44 28 69 49 64 78 29 29 3b 0a 20 20 69 66  WID(iIdx));.  if
9630: 28 20 21 70 44 61 74 61 20 29 20 72 65 74 75 72  ( !pData ) retur
9640: 6e 20 30 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66  n 0;.  p->rc = f
9650: 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
9660: 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61  de(pData->p, pDa
9670: 74 61 2d 3e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c  ta->n, &iCookie,
9680: 20 26 70 52 65 74 29 3b 0a 0a 20 20 69 66 28 20   &pRet);..  if( 
9690: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
96a0: 20 26 26 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f   && pConfig->iCo
96b0: 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b  okie!=iCookie ){
96c0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
96d0: 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f  ite3Fts5ConfigLo
96e0: 61 64 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f  ad(pConfig, iCoo
96f0: 6b 69 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  kie);.  }..  fts
9700: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
9710: 74 61 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ta);.  if( p->rc
9720: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9730: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
9740: 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20  Release(pRet);. 
9750: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d     pRet = 0;.  }
9760: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
9770: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9780: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
9790: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
97a0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
97b0: 70 53 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a  pStruct. This.**
97c0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
97d0: 79 20 65 76 65 72 20 75 73 65 64 20 61 73 20 70  y ever used as p
97e0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
97f0: 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23  conditions..*/.#
9800: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9810: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  UG.static int ft
9820: 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
9830: 53 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72  Segments(Fts5Str
9840: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
9850: 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  {.  int nSegment
9860: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9870: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
9880: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
9890: 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  */.  if( pStruct
98a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
98b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
98c0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
98d0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
98e0: 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66   levels */.    f
98f0: 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
9900: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9910: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
9920: 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72  nSegment += pStr
9930: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
9940: 5d 2e 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20  ].nSeg;.    }.  
9950: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67  }..  return nSeg
9960: 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ment;.}.#endif..
9970: 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20  /*.** Serialize 
9980: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22 73  and store the "s
9990: 74 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64  tructure" record
99a0: 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78 2e   for index iIdx.
99b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
99c0: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
99d0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
99e0: 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  n the Fts5Index 
99f0: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a  object. If an.**
9a00: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
9a10: 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
9a20: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
9a30: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
9a40: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
9a50: 75 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64  ureWrite(Fts5Ind
9a60: 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c  ex *p, int iIdx,
9a70: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
9a80: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20  pStruct){.  if( 
9a90: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9aa0: 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66   ){.    Fts5Buff
9ab0: 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  er buf;         
9ac0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
9ad0: 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63  to serialize rec
9ae0: 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20  ord into */.    
9af0: 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b10: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
9b20: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
9b30: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b  */.    int iCook
9b40: 69 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ie;             
9b50: 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76       /* Cookie v
9b60: 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f  alue to store */
9b70: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ..    assert( pS
9b80: 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d  truct->nSegment=
9b90: 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f  =fts5StructureCo
9ba0: 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72  untSegments(pStr
9bb0: 75 63 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d 73  uct) );.    mems
9bc0: 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
9bd0: 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
9be0: 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
9bf0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  the current conf
9c00: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
9c10: 20 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20   */.    iCookie 
9c20: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43  = p->pConfig->iC
9c30: 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 69  ookie;.    if( i
9c40: 43 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b  Cookie<0 ) iCook
9c50: 69 65 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35  ie = 0;.    fts5
9c60: 42 75 66 66 65 72 41 70 70 65 6e 64 33 32 28 26  BufferAppend32(&
9c70: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 69 43 6f  p->rc, &buf, iCo
9c80: 6f 6b 69 65 29 3b 0a 0a 20 20 20 20 66 74 73 35  okie);..    fts5
9c90: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9ca0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9cb0: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
9cc0: 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
9cd0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9ce0: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72  ->rc, &buf, pStr
9cf0: 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a  uct->nSegment);.
9d00: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9d10: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9d20: 63 2c 20 26 62 75 66 2c 20 28 69 36 34 29 70 53  c, &buf, (i64)pS
9d30: 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75  truct->nWriteCou
9d40: 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nter);..    for(
9d50: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
9d60: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
9d70: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  vl++){.      int
9d80: 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
9d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
9da0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
9db0: 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a  rough segments *
9dc0: 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  /.      Fts5Stru
9dd0: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
9de0: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9df0: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
9e00: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
9e10: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
9e20: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72  &buf, pLvl->nMer
9e30: 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  ge);.      fts5B
9e40: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
9e50: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
9e60: 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20  pLvl->nSeg);.   
9e70: 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
9e80: 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
9e90: 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f  Seg );..      fo
9ea0: 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
9eb0: 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl->nSeg; iSeg+
9ec0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  +){.        fts5
9ed0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9ee0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9ef0: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
9f00: 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20  ].iSegid);.     
9f10: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
9f20: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
9f30: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
9f40: 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74  eg[iSeg].nHeight
9f50: 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
9f60: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
9f70: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
9f80: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
9f90: 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20  .pgnoFirst);.   
9fa0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
9fb0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
9fc0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
9fd0: 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c  aSeg[iSeg].pgnoL
9fe0: 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ast);.      }.  
9ff0: 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44 61 74    }..    fts5Dat
a000: 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53  aWrite(p, FTS5_S
a010: 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69  TRUCTURE_ROWID(i
a020: 49 64 78 29 2c 20 62 75 66 2e 70 2c 20 62 75 66  Idx), buf.p, buf
a030: 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .n);.    fts5Buf
a040: 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20  ferFree(&buf);. 
a050: 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74   }.}..#if 0.stat
a060: 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
a070: 67 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c  gStructure(int*,
a080: 46 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35  Fts5Buffer*,Fts5
a090: 53 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61  Structure*);.sta
a0a0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 72 69  tic void fts5Pri
a0b0: 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73  ntStructure(cons
a0c0: 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e  t char *zCaption
a0d0: 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
a0e0: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
a0f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a100: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
a110: 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66  f;.  memset(&buf
a120: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  , 0, sizeof(buf)
a130: 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53 74  );.  fts5DebugSt
a140: 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 62 75  ructure(&rc, &bu
a150: 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66  f, pStruct);.  f
a160: 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
a170: 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74  %s: %s\n", zCapt
a180: 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66  ion, buf.p);.  f
a190: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
a1a0: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
a1b0: 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  &buf);.}.#else.#
a1c0: 20 64 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e   define fts5Prin
a1d0: 74 53 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a  tStructure(x,y).
a1e0: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
a1f0: 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69  nt fts5SegmentSi
a200: 7a 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65  ze(Fts5Structure
a210: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a  Segment *pSeg){.
a220: 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65    return 1 + pSe
a230: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53  g->pgnoLast - pS
a240: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d  eg->pgnoFirst;.}
a250: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
a260: 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73   copy of index s
a270: 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
a280: 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74  . Except, promot
a290: 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65  e as many .** se
a2a0: 67 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62  gments as possib
a2b0: 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f  le to level iPro
a2c0: 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  mote. If an OOM 
a2d0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
a2e0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
a2f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
a300: 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
a310: 65 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78  eTo(.  Fts5Index
a320: 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d   *p,.  int iProm
a330: 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f  ote,.  int szPro
a340: 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75  mote,.  Fts5Stru
a350: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29  cture *pStruct.)
a360: 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a  {.  int il, is;.
a370: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
a380: 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53  evel *pOut = &pS
a390: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50  truct->aLevel[iP
a3a0: 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20  romote];..  if( 
a3b0: 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20  pOut->nMerge==0 
a3c0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50  ){.    for(il=iP
a3d0: 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74  romote+1; il<pSt
a3e0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c  ruct->nLevel; il
a3f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  ++){.      Fts5S
a400: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
a410: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
a420: 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20  aLevel[il];.    
a430: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
a440: 67 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ge ) return;.   
a450: 20 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e     for(is=pLvl->
a460: 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69  nSeg-1; is>=0; i
a470: 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  s--){.        in
a480: 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65  t sz = fts5Segme
a490: 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53  ntSize(&pLvl->aS
a4a0: 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20  eg[is]);.       
a4b0: 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74   if( sz>szPromot
a4c0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
a4d0: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
a4e0: 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d  eExtendLevel(&p-
a4f0: 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50  >rc, pStruct, iP
a500: 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20  romote, 1, 1);. 
a510: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
a520: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
a530: 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e     memcpy(pOut->
a540: 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  aSeg, &pLvl->aSe
a550: 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74  g[is], sizeof(Ft
a560: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
a570: 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nt));.        pO
a580: 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20  ut->nSeg++;.    
a590: 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d      pLvl->nSeg--
a5a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a5b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e    }.}../*.** A n
a5c0: 65 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a  ew segment has j
a5d0: 75 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ust been written
a5e0: 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f   to level iLvl o
a5f0: 66 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  f index structur
a600: 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68  e.** pStruct. Th
a610: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
a620: 72 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65  rmines if any se
a630: 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  gments should be
a640: 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20   promoted.** as 
a650: 61 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e  a result. Segmen
a660: 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20  ts are promoted 
a670: 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
a680: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20  :.**.**   a) If 
a690: 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74  the segment just
a6a0: 20 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c   written is smal
a6b0: 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20  ler than one or 
a6c0: 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a  more segments.**
a6d0: 20 20 20 20 20 20 77 69 74 68 69 6e 20 74 68 65        within the
a6e0: 20 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61   previous popula
a6f0: 74 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73  ted level, it is
a700: 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65   promoted to the
a710: 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20   previous.**    
a720: 20 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65    populated leve
a730: 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66  l..**.**   b) If
a740: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73   the segment jus
a750: 74 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72  t written is lar
a760: 67 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77  ger than the new
a770: 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a  est segment on.*
a780: 2a 20 20 20 20 20 20 74 68 65 20 6e 65 78 74 20  *      the next 
a790: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c  populated level,
a7a0: 20 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65   then that segme
a7b0: 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65  nt, and any othe
a7c0: 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20  r adjacent.**   
a7d0: 20 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74     segments that
a7e0: 20 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65   are also smalle
a7f0: 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a  r than the one j
a800: 75 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65  ust written, are
a810: 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74   .**      promot
a820: 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e  ed. .**.** If on
a830: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
a840: 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c  ts are promoted,
a850: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f   the structure o
a860: 62 6a 65 63 74 20 69 73 20 75 70 64 61 74 65 64  bject is updated
a870: 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74  .** to reflect t
a880: 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  his..*/.static v
a890: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
a8a0: 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35  ePromote(.  Fts5
a8b0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
a8d0: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
a8e0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  ct */.  int iLvl
a8f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a900: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
a910: 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61   level just upda
a920: 74 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ted */.  Fts5Str
a930: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
a940: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
a950: 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  x structure */.)
a960: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
a970: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a980: 69 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e  int iTst;.    in
a990: 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b  t iPromote = -1;
a9a0: 0a 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f  .    int szPromo
a9b0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
a9c0: 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e     /* Promote an
a9d0: 79 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65  ything this size
a9e0: 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20   or smaller */. 
a9f0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
aa00: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
aa10: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74   /* Segment just
aa20: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
aa30: 69 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20  int szSeg;      
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa50: 20 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74   Size of segment
aa60: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
aa70: 0a 0a 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  ...    pSeg = &p
aa80: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
aa90: 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63  Lvl].aSeg[pStruc
aaa0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
aab0: 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53  nSeg-1];.    szS
aac0: 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e  eg = (1 + pSeg->
aad0: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
aae0: 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20  >pgnoFirst);..  
aaf0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
ab00: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a  ondition (a) */.
ab10: 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76      for(iTst=iLv
ab20: 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20  l-1; iTst>=0 && 
ab30: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
ab40: 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69  iTst].nSeg==0; i
ab50: 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20  Tst--);.    if( 
ab60: 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iTst>=0 ){.     
ab70: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
ab80: 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20  t szMax = 0;.   
ab90: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
aba0: 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70  Level *pTst = &p
abb0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
abc0: 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Tst];.      asse
abd0: 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65  rt( pTst->nMerge
abe0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
abf0: 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53  (i=0; i<pTst->nS
ac00: 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
ac10: 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d    int sz = pTst-
ac20: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73  >aSeg[i].pgnoLas
ac30: 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69  t - pTst->aSeg[i
ac40: 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b  ].pgnoFirst + 1;
ac50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
ac60: 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20  szMax ) szMax = 
ac70: 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
ac80: 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53    if( szMax>=szS
ac90: 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  eg ){.        /*
aca0: 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69   Condition (a) i
acb0: 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20  s true. Promote 
acc0: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
acd0: 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20  nt on level .   
ace0: 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20       ** iLvl to 
acf0: 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a  level iTst.  */.
ad00: 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65          iPromote
ad10: 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20   = iTst;.       
ad20: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d   szPromote = szM
ad30: 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ax;.      }.    
ad40: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e  }..    /* If con
ad50: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f  dition (a) is no
ad60: 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62  t met, assume (b
ad70: 29 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63  ) is true. Struc
ad80: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a  turePromoteTo().
ad90: 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f      ** is a no-o
ada0: 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  p if it is not. 
adb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f   */.    if( iPro
adc0: 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  mote<0 ){.      
add0: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b  iPromote = iLvl;
ade0: 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65  .      szPromote
adf0: 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a   = szSeg;.    }.
ae00: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
ae10: 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50  ePromoteTo(p, iP
ae20: 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74  romote, szPromot
ae30: 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  e, pStruct);.  }
ae40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
ae50: 65 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 6f 66  e pIter->iOff of
ae60: 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70  fset currently p
ae70: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
ae80: 79 20 69 6e 64 69 63 61 74 69 6e 67 20 6f 6e 65  y indicating one
ae90: 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d  .** or more term
aea0: 2d 6c 65 73 73 20 6e 6f 64 65 73 2c 20 61 64 76  -less nodes, adv
aeb0: 61 6e 63 65 20 70 61 73 74 20 69 74 20 61 6e 64  ance past it and
aec0: 20 73 65 74 20 70 49 74 65 72 2d 3e 6e 45 6d 70   set pIter->nEmp
aed0: 74 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d  ty to.** the num
aee0: 62 65 72 20 6f 66 20 65 6d 70 74 79 20 63 68 69  ber of empty chi
aef0: 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61  ld nodes..*/.sta
af00: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64  tic void fts5Nod
af10: 65 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74  eIterGobbleNEmpt
af20: 79 28 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a  y(Fts5NodeIter *
af30: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
af40: 74 65 72 2d 3e 69 4f 66 66 3c 70 49 74 65 72 2d  ter->iOff<pIter-
af50: 3e 6e 44 61 74 61 20 26 26 20 30 3d 3d 28 70 49  >nData && 0==(pI
af60: 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72  ter->aData[pIter
af70: 2d 3e 69 4f 66 66 5d 20 26 20 30 78 66 65 29 20  ->iOff] & 0xfe) 
af80: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44  ){.    pIter->bD
af90: 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 44  lidx = pIter->aD
afa0: 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d  ata[pIter->iOff]
afb0: 20 26 20 30 78 30 31 3b 0a 20 20 20 20 70 49 74   & 0x01;.    pIt
afc0: 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20 20 20 20  er->iOff++;.    
afd0: 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66  pIter->iOff += f
afe0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
aff0: 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74  pIter->aData[pIt
b000: 65 72 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72  er->iOff], pIter
b010: 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c  ->nEmpty);.  }el
b020: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e  se{.    pIter->n
b030: 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Empty = 0;.    p
b040: 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30  Iter->bDlidx = 0
b050: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
b060: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
b070: 78 74 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20  xt entry within 
b080: 74 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61  the node..*/.sta
b090: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64  tic void fts5Nod
b0a0: 65 49 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70  eIterNext(int *p
b0b0: 52 63 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72  Rc, Fts5NodeIter
b0c0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
b0d0: 70 49 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74  pIter->iOff>=pIt
b0e0: 65 72 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20  er->nData ){.   
b0f0: 20 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20   pIter->aData = 
b100: 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43  0;.    pIter->iC
b110: 68 69 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e  hild += pIter->n
b120: 45 6d 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Empty;.  }else{.
b130: 20 20 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e      int nPre, nN
b140: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ew;.    pIter->i
b150: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
b160: 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61  rint32(&pIter->a
b170: 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66  Data[pIter->iOff
b180: 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20 20 70 49  ], nPre);.    pI
b190: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  ter->iOff += fts
b1a0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49  5GetVarint32(&pI
b1b0: 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72  ter->aData[pIter
b1c0: 2d 3e 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  ->iOff], nNew);.
b1d0: 20 20 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e      pIter->term.
b1e0: 6e 20 3d 20 6e 50 72 65 2d 32 3b 0a 20 20 20 20  n = nPre-2;.    
b1f0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
b200: 42 6c 6f 62 28 70 52 63 2c 20 26 70 49 74 65 72  Blob(pRc, &pIter
b210: 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 70 49  ->term, nNew, pI
b220: 74 65 72 2d 3e 61 44 61 74 61 2b 70 49 74 65 72  ter->aData+pIter
b230: 2d 3e 69 4f 66 66 29 3b 0a 20 20 20 20 70 49 74  ->iOff);.    pIt
b240: 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65 77  er->iOff += nNew
b250: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68  ;.    pIter->iCh
b260: 69 6c 64 20 2b 3d 20 28 31 20 2b 20 70 49 74 65  ild += (1 + pIte
b270: 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20  r->nEmpty);.    
b280: 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62  fts5NodeIterGobb
b290: 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b  leNEmpty(pIter);
b2a0: 0a 20 20 20 20 69 66 28 20 2a 70 52 63 20 29 20  .    if( *pRc ) 
b2b0: 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30  pIter->aData = 0
b2c0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
b2d0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69  Initialize the i
b2e0: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70  terator object p
b2f0: 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20  Iter to iterate 
b300: 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65  through the inte
b310: 72 6e 61 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 20  rnal.** segment 
b320: 6e 6f 64 65 20 69 6e 20 70 44 61 74 61 2e 0a 2a  node in pData..*
b330: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
b340: 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 63  s5NodeIterInit(c
b350: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20  onst u8 *aData, 
b360: 69 6e 74 20 6e 44 61 74 61 2c 20 46 74 73 35 4e  int nData, Fts5N
b370: 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b  odeIter *pIter){
b380: 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
b390: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
b3a0: 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 44  r));.  pIter->aD
b3b0: 61 74 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70  ata = aData;.  p
b3c0: 49 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44  Iter->nData = nD
b3d0: 61 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4f  ata;.  pIter->iO
b3e0: 66 66 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  ff = fts5GetVari
b3f0: 6e 74 33 32 28 61 44 61 74 61 2c 20 70 49 74 65  nt32(aData, pIte
b400: 72 2d 3e 69 43 68 69 6c 64 29 3b 0a 20 20 66 74  r->iChild);.  ft
b410: 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65  s5NodeIterGobble
b420: 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a 7d  NEmpty(pIter);.}
b430: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
b440: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
b450: 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
b460: 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  r object..*/.sta
b470: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64  tic void fts5Nod
b480: 65 49 74 65 72 46 72 65 65 28 46 74 73 35 4e 6f  eIterFree(Fts5No
b490: 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  deIter *pIter){.
b4a0: 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
b4b0: 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
b4c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
b4d0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
b4e0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
b4f0: 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f  nt has the follo
b500: 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a  wing fields set.
b510: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54  ** as follows. T
b520: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
b530: 73 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66  s up the rest of
b540: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
b550: 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e   that it.** poin
b560: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
b570: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
b580: 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  list-index..**.*
b590: 2a 20 20 20 70 44 61 74 61 3a 20 70 6f 69 6e 74  *   pData: point
b5a0: 65 72 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e  er to doclist-in
b5b0: 64 65 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 20  dex record, .** 
b5c0: 20 20 69 4c 65 61 66 50 67 6e 6f 3a 20 70 61 67    iLeafPgno: pag
b5d0: 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 74 68  e number that th
b5e0: 69 73 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  is doclist-index
b5f0: 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77   is associated w
b600: 69 74 68 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ith..**.** When 
b610: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
b620: 20 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69   called pIter->i
b630: 4c 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20  LeafPgno is the 
b640: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a  page number the.
b650: 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73  ** doclist is as
b660: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 28 74  sociated with (t
b670: 68 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67  he one featuring
b680: 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73   the term)..*/.s
b690: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
b6a0: 69 64 78 49 74 65 72 46 69 72 73 74 28 46 74 73  idxIterFirst(Fts
b6b0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
b6c0: 72 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  r){.  Fts5Data *
b6d0: 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  pData = pIter->p
b6e0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Data;.  int i;. 
b6f0: 20 69 6e 74 20 62 50 72 65 73 65 6e 74 3b 0a 0a   int bPresent;..
b700: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
b710: 3e 70 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >pData );.  asse
b720: 72 74 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  rt( pIter->iLeaf
b730: 50 67 6e 6f 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  Pgno>0 );..  /* 
b740: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 72  Read the first r
b750: 6f 77 69 64 20 76 61 6c 75 65 2e 20 41 6e 64 20  owid value. And 
b760: 74 68 65 20 22 70 72 65 73 65 6e 74 22 20 66 6c  the "present" fl
b770: 61 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ag that follows 
b780: 69 74 2e 20 2a 2f 0a 20 20 70 49 74 65 72 2d 3e  it. */.  pIter->
b790: 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
b7a0: 74 28 26 70 44 61 74 61 2d 3e 70 5b 30 5d 2c 20  t(&pData->p[0], 
b7b0: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
b7c0: 6f 77 69 64 29 3b 0a 20 20 62 50 72 65 73 65 6e  owid);.  bPresen
b7d0: 74 20 3d 20 70 44 61 74 61 2d 3e 70 5b 70 49 74  t = pData->p[pIt
b7e0: 65 72 2d 3e 69 4f 66 66 2b 2b 5d 3b 0a 20 20 69  er->iOff++];.  i
b7f0: 66 28 20 62 50 72 65 73 65 6e 74 20 29 7b 0a 20  f( bPresent ){. 
b800: 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 65 6c 73     i = 0;.  }els
b810: 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20  e{.    /* Count 
b820: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  the number of le
b830: 61 64 69 6e 67 20 30 78 30 30 20 62 79 74 65 73  ading 0x00 bytes
b840: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31  . */.    for(i=1
b850: 3b 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 44  ; pIter->iOff<pD
b860: 61 74 61 2d 3e 6e 3b 20 69 2b 2b 29 7b 20 0a 20  ata->n; i++){ . 
b870: 20 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e       if( pData->
b880: 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20 29  p[pIter->iOff] )
b890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
b8a0: 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20 20 20  ter->iOff++;.   
b8b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 65 73   }..    /* Unles
b8c0: 73 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  s we are already
b8d0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
b8e0: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
b8f0: 2c 20 6c 6f 61 64 20 74 68 65 20 66 69 72 73 74  , load the first
b900: 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 76 61  .    ** rowid va
b910: 6c 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  lue.  */.    if(
b920: 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 44 61   pIter->iOff<pDa
b930: 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69  ta->n ){.      i
b940: 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70  64 iVal;.      p
b950: 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65  Iter->iOff += ge
b960: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
b970: 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20  p[pIter->iOff], 
b980: 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20  (u64*)&iVal);.  
b990: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
b9a0: 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 7d  d += iVal;.    }
b9b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
b9c0: 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  r->bEof = 1;.   
b9d0: 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e   }.  }.  pIter->
b9e0: 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 2b  iLeafPgno += (i+
b9f0: 31 29 3b 0a 0a 20 20 70 49 74 65 72 2d 3e 69 46  1);..  pIter->iF
ba00: 69 72 73 74 4f 66 66 20 3d 20 70 49 74 65 72 2d  irstOff = pIter-
ba10: 3e 69 4f 66 66 3b 0a 20 20 72 65 74 75 72 6e 20  >iOff;.  return 
ba20: 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a  pIter->bEof;.}..
ba30: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
ba40: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
ba50: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
ba60: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
ba70: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
ba80: 74 65 72 4e 65 78 74 28 46 74 73 35 44 6c 69 64  terNext(Fts5Dlid
ba90: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
baa0: 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
bab0: 20 3d 20 70 49 74 65 72 2d 3e 70 44 61 74 61 3b   = pIter->pData;
bac0: 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20  .  int iOff;..  
bad0: 66 6f 72 28 69 4f 66 66 3d 70 49 74 65 72 2d 3e  for(iOff=pIter->
bae0: 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61 74 61  iOff; iOff<pData
baf0: 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20  ->n; iOff++){.  
bb00: 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69    if( pData->p[i
bb10: 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20  Off] ) break; . 
bb20: 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70   }..  if( iOff<p
bb30: 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  Data->n ){.    i
bb40: 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 70 49 74  64 iVal;.    pIt
bb50: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d  er->iLeafPgno +=
bb60: 20 28 69 4f 66 66 20 2d 20 70 49 74 65 72 2d 3e   (iOff - pIter->
bb70: 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20 20 20 69  iOff) + 1;.    i
bb80: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
bb90: 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d  (&pData->p[iOff]
bba0: 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a  , (u64*)&iVal);.
bbb0: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
bbc0: 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70  d += iVal;.    p
bbd0: 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  Iter->iOff = iOf
bbe0: 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
bbf0: 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b  pIter->bEof = 1;
bc00: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
bc10: 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73  Iter->bEof;.}..s
bc20: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
bc30: 69 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49  idxIterEof(Fts5I
bc40: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
bc50: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
bc60: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
bc70: 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bEof;.}..static 
bc80: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
bc90: 65 72 4c 61 73 74 28 46 74 73 35 44 6c 69 64 78  erLast(Fts5Dlidx
bca0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
bcb0: 69 66 28 20 66 74 73 35 44 6c 69 64 78 49 74 65  if( fts5DlidxIte
bcc0: 72 46 69 72 73 74 28 70 49 74 65 72 29 3d 3d 30  rFirst(pIter)==0
bcd0: 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 30   ){.    while( 0
bce0: 3d 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  ==fts5DlidxIterN
bcf0: 65 78 74 28 70 49 74 65 72 29 20 29 3b 0a 20 20  ext(pIter) );.  
bd00: 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
bd10: 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
bd20: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
bd30: 65 72 50 72 65 76 28 46 74 73 35 44 6c 69 64 78  erPrev(Fts5Dlidx
bd40: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
bd50: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
bd60: 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72  ->iOff;..  asser
bd70: 74 28 20 70 49 74 65 72 2d 3e 62 45 6f 66 3d 3d  t( pIter->bEof==
bd80: 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c  0 );.  if( iOff<
bd90: 3d 70 49 74 65 72 2d 3e 69 46 69 72 73 74 4f 66  =pIter->iFirstOf
bda0: 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
bdb0: 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  bEof = 1;.  }els
bdc0: 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  e{.    u8 *a = p
bdd0: 49 74 65 72 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a  Iter->pData->p;.
bde0: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
bdf0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 0a 20    int iLimit;.. 
be00: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20     /* Currently 
be10: 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20 74  iOff points to t
be20: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
be30: 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20   a varint. This 
be40: 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65  block .    ** de
be50: 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e  crements iOff un
be60: 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
be70: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
be80: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
be90: 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20  .    ** varint. 
bea0: 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20  Taking care not 
beb0: 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f  to read any memo
bec0: 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61  ry locations tha
bed0: 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20 62  t occur.    ** b
bee0: 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  efore the buffer
bef0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a   in memory.  */.
bf00: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f      iLimit = (iO
bf10: 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20  ff>9 ? iOff-9 : 
bf20: 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66  0);.    for(iOff
bf30: 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b  --; iOff>iLimit;
bf40: 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20   iOff--){.      
bf50: 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26  if( (a[iOff-1] &
bf60: 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65 61   0x80)==0 ) brea
bf70: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 67 65  k;.    }..    ge
bf80: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
bf90: 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a  , (u64*)&iVal);.
bfa0: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
bfb0: 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70  d -= iVal;.    p
bfc0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
bfd0: 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20  -;..    /* Skip 
bfe0: 62 61 63 6b 77 61 72 64 73 20 70 61 73 73 65 64  backwards passed
bff0: 20 61 6e 79 20 30 78 30 30 20 62 79 74 65 73 2e   any 0x00 bytes.
c000: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 69   */.    while( i
c010: 4f 66 66 3e 70 49 74 65 72 2d 3e 69 46 69 72 73  Off>pIter->iFirs
c020: 74 4f 66 66 20 0a 20 20 20 20 20 20 20 20 26 26  tOff .        &&
c030: 20 61 5b 69 4f 66 66 2d 31 5d 3d 3d 30 78 30 30   a[iOff-1]==0x00
c040: 20 26 26 20 28 61 5b 69 4f 66 66 2d 32 5d 20 26   && (a[iOff-2] &
c050: 20 30 78 38 30 29 3d 3d 30 20 0a 20 20 20 20 29   0x80)==0 .    )
c060: 7b 0a 20 20 20 20 20 20 69 4f 66 66 2d 2d 3b 0a  {.      iOff--;.
c070: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
c080: 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 7d 0a  afPgno--;.    }.
c090: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
c0a0: 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 72  = iOff;.  }..  r
c0b0: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f  eturn pIter->bEo
c0c0: 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73  f;.}..static Fts
c0d0: 35 44 6c 69 64 78 49 74 65 72 20 2a 66 74 73 35  5DlidxIter *fts5
c0e0: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20  DlidxIterInit(. 
c0f0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64   /* Fts5 Backend
c120: 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
c130: 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  in */.  int bRev
c140: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c150: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
c160: 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53 43  for ORDER BY ASC
c170: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
c180: 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20  int iSegid,     
c190: 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
c1a0: 20 69 53 65 67 69 64 20 77 69 74 68 69 6e 20 69   iSegid within i
c1b0: 6e 64 65 78 20 69 49 64 78 20 2a 2f 0a 20 20 69  ndex iIdx */.  i
c1c0: 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20 20 20  nt iLeafPg      
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c1e0: 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  * Leaf page numb
c1f0: 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78  er to load dlidx
c200: 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73   for */.){.  Fts
c210: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
c220: 72 3b 0a 0a 20 20 70 49 74 65 72 20 3d 20 28 46  r;..  pIter = (F
c230: 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29 66 74  ts5DlidxIter*)ft
c240: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73  s5IdxMalloc(p, s
c250: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49  izeof(Fts5DlidxI
c260: 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70 49 74  ter));.  if( pIt
c270: 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  er==0 ) return 0
c280: 3b 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 61 74  ;..  pIter->pDat
c290: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
c2a0: 28 70 2c 20 46 54 53 35 5f 44 4f 43 4c 49 53 54  (p, FTS5_DOCLIST
c2b0: 5f 49 44 58 5f 52 4f 57 49 44 28 69 49 64 78 2c  _IDX_ROWID(iIdx,
c2c0: 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 50 67   iSegid, iLeafPg
c2d0: 29 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  ));.  if( pIter-
c2e0: 3e 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20  >pData==0 ){.   
c2f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
c300: 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20  ter);.    pIter 
c310: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
c320: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
c330: 6e 6f 20 3d 20 69 4c 65 61 66 50 67 3b 0a 20 20  no = iLeafPg;.  
c340: 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b    if( bRev==0 ){
c350: 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
c360: 49 74 65 72 46 69 72 73 74 28 70 49 74 65 72 29  IterFirst(pIter)
c370: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c380: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
c390: 4c 61 73 74 28 70 49 74 65 72 29 3b 0a 20 20 20  Last(pIter);.   
c3a0: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
c3b0: 20 70 49 74 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pIter;.}../*.**
c3c0: 20 46 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d   Free a doclist-
c3d0: 69 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f  index iterator o
c3e0: 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20  bject allocated 
c3f0: 62 79 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  by fts5DlidxIter
c400: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
c410: 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78  c void fts5Dlidx
c420: 49 74 65 72 46 72 65 65 28 46 74 73 35 44 6c 69  IterFree(Fts5Dli
c430: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
c440: 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20    if( pIter ){. 
c450: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
c460: 73 65 28 70 49 74 65 72 2d 3e 70 44 61 74 61 29  se(pIter->pData)
c470: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
c480: 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  ee(pIter);.  }.}
c490: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
c4a0: 73 35 4c 65 61 66 48 65 61 64 65 72 28 46 74 73  s5LeafHeader(Fts
c4b0: 35 44 61 74 61 20 2a 70 4c 65 61 66 2c 20 69 6e  5Data *pLeaf, in
c4c0: 74 20 2a 70 69 52 6f 77 69 64 2c 20 69 6e 74 20  t *piRowid, int 
c4d0: 2a 70 69 54 65 72 6d 29 7b 0a 20 20 2a 70 69 52  *piTerm){.  *piR
c4e0: 6f 77 69 64 20 3d 20 28 69 6e 74 29 66 74 73 35  owid = (int)fts5
c4f0: 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
c500: 5b 30 5d 29 3b 0a 20 20 2a 70 69 54 65 72 6d 20  [0]);.  *piTerm 
c510: 3d 20 28 69 6e 74 29 66 74 73 35 47 65 74 55 31  = (int)fts5GetU1
c520: 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b  6(&pLeaf->p[2]);
c530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  .}../*.** Load t
c540: 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67  he next leaf pag
c550: 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65  e into the segme
c560: 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a  nt iterator..*/.
c570: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c580: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
c590: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5b0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
c5c0: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
c5d0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
c5e0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
c5f0: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
c600: 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61  vance to next pa
c610: 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  ge */.){.  Fts5S
c620: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
c630: 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70  *pSeg = pIter->p
c640: 53 65 67 3b 0a 20 20 66 74 73 35 44 61 74 61 52  Seg;.  fts5DataR
c650: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
c660: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  eaf);.  pIter->i
c670: 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66  LeafPgno++;.  if
c680: 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ( pIter->iLeafPg
c690: 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  no<=pSeg->pgnoLa
c6a0: 73 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  st ){.    pIter-
c6b0: 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74  >pLeaf = fts5Dat
c6c0: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
c6d0: 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52    FTS5_SEGMENT_R
c6e0: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 49 64 78  OWID(pIter->iIdx
c6f0: 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
c700: 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  0, pIter->iLeafP
c710: 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65  gno).    );.  }e
c720: 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
c730: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d  pLeaf = 0;.  }.}
c740: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
c750: 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62   p points to a b
c760: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
c770: 20 61 20 76 61 72 69 6e 74 20 74 6f 20 62 65 20   a varint to be 
c780: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
c790: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  .** position lis
c7a0: 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65  t size field. Re
c7b0: 61 64 20 74 68 65 20 76 61 72 69 6e 74 20 61 6e  ad the varint an
c7c0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  d return the num
c7d0: 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20  ber of bytes.** 
c7e0: 72 65 61 64 2e 20 42 65 66 6f 72 65 20 72 65 74  read. Before ret
c7f0: 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53  urning, set *pnS
c800: 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  z to the number 
c810: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
c820: 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74  position.** list
c830: 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20  , and *pbDel to 
c840: 74 72 75 65 20 69 66 20 74 68 65 20 64 65 6c 65  true if the dele
c850: 74 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  te flag is set, 
c860: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
c870: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
c880: 74 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  t fts5GetPoslist
c890: 53 69 7a 65 28 63 6f 6e 73 74 20 75 38 20 2a 70  Size(const u8 *p
c8a0: 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74  , int *pnSz, int
c8b0: 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20   *pbDel){.  int 
c8c0: 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 66  nSz;.  int n = f
c8d0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70  ts5GetVarint32(p
c8e0: 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72 74  , nSz);.  assert
c8f0: 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20  _nc( nSz>=0 );. 
c900: 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a   *pnSz = nSz/2;.
c910: 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26    *pbDel = nSz &
c920: 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75 72   0x0001;.  retur
c930: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74  n n;.}../*.** Ft
c940: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
c950: 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20  ffset currently 
c960: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
c970: 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a  rst byte of a.**
c980: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
c990: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
c9a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
c9b0: 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72 65   field and store
c9c0: 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f   it.** in the fo
c9d0: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
c9e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53  s:.**.**   Fts5S
c9f0: 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20  egIter.nPos.**  
ca00: 20 46 74 73 35 53 65 67 49 74 65 72 2e 62 44 65   Fts5SegIter.bDe
ca10: 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74  l.**.** Leave Ft
ca20: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
ca30: 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20 74  ffset pointing t
ca40: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
ca50: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69   of the .** posi
ca60: 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e  tion list conten
ca70: 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73  t (if any)..*/.s
ca80: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
ca90: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46  egIterLoadNPos(F
caa0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
cab0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
cac0: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
cad0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cae0: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
caf0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ->iLeafOffset;  
cb00: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61  /* Offset to rea
cb10: 64 20 61 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  d at */.    if( 
cb20: 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65  iOff>=pIter->pLe
cb30: 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 70  af->n ){.      p
cb40: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
cb50: 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UPT;.    }else{.
cb60: 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
cb70: 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61  a = &pIter->pLea
cb80: 66 2d 3e 70 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  f->p[iOff];.    
cb90: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
cba0: 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74 50  fset += fts5GetP
cbb0: 6f 73 6c 69 73 74 53 69 7a 65 28 61 2c 20 26 70  oslistSize(a, &p
cbc0: 49 74 65 72 2d 3e 6e 50 6f 73 2c 20 26 70 49 74  Iter->nPos, &pIt
cbd0: 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20 20 20 7d  er->bDel);.    }
cbe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74  .  }.}../*.** Ft
cbf0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
cc00: 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20  ffset currently 
cc10: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
cc20: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
cc30: 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69  .** "nSuffix" fi
cc40: 65 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46  eld of a term. F
cc50: 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
cc60: 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73  r nKeep contains
cc70: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
cc80: 20 74 68 65 20 22 6e 50 72 65 66 69 78 22 20 66   the "nPrefix" f
cc90: 69 65 6c 64 20 28 69 66 20 74 68 65 72 65 20 77  ield (if there w
cca0: 61 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70  as one - it is p
ccb0: 61 73 73 65 64 20 30 20 69 66 20 74 68 69 73 20  assed 0 if this 
ccc0: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
ccd0: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
cce0: 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ent)..**.** This
ccf0: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
cd00: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  tes:.**.**   Fts
cd10: 35 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a  5SegIter.term.**
cd20: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 72     Fts5SegIter.r
cd30: 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72  owid.**.** accor
cd40: 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65  dingly and leave
cd50: 73 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  s (Fts5SegIter.i
cd60: 4c 65 61 66 4f 66 66 73 65 74 29 20 73 65 74 20  LeafOffset) set 
cd70: 74 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  to the content o
cd80: 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70  f.** the first p
cd90: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68  osition list. Th
cda0: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
cdb0: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63  belonging to doc
cdc0: 75 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53  ument .** (Fts5S
cdd0: 65 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a  egIter.iRowid)..
cde0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
cdf0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
ce00: 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  rm(Fts5Index *p,
ce10: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
ce20: 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b  ter, int nKeep){
ce30: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
ce40: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20  ->pLeaf->p;     
ce50: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
ce60: 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a  read data from *
ce70: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70  /.  int iOff = p
ce80: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ce90: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
cea0: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e   read at */.  in
ceb0: 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ced0: 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   Bytes of new da
cee0: 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d  ta */..  iOff +=
cef0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
cf00: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29  (&a[iOff], nNew)
cf10: 3b 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e  ;.  pIter->term.
cf20: 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73  n = nKeep;.  fts
cf30: 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
cf40: 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  b(&p->rc, &pIter
cf50: 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61  ->term, nNew, &a
cf60: 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20  [iOff]);.  iOff 
cf70: 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72  += nNew;.  pIter
cf80: 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
cf90: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65  t = iOff;.  pIte
cfa0: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
cfb0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50   = pIter->iLeafP
cfc0: 67 6e 6f 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e  gno;.  if( iOff>
cfd0: 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e  =pIter->pLeaf->n
cfe0: 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49   ){.    fts5SegI
cff0: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
d000: 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
d010: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
d020: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
d030: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
d040: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
d050: 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  UPT;.      retur
d060: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66  n;.    }.    iOf
d070: 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70  f = 4;.    a = p
d080: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
d090: 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71    }.  iOff += sq
d0a0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26  lite3GetVarint(&
d0b0: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
d0c0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
d0d0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d0e0: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a  fset = iOff;.}..
d0f0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
d100: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
d110: 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69 74  ject pIter to it
d120: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
d130: 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20  e entries in.** 
d140: 73 65 67 6d 65 6e 74 20 70 53 65 67 20 77 69 74  segment pSeg wit
d150: 68 69 6e 20 69 6e 64 65 78 20 69 49 64 78 2e 20  hin index iIdx. 
d160: 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  The iterator is 
d170: 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
d180: 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 65   the .** first e
d190: 6e 74 72 79 20 77 68 65 6e 20 74 68 69 73 20 66  ntry when this f
d1a0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
d1b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
d1c0: 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
d1d0: 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
d1e0: 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
d1f0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
d200: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73  .** an error has
d210: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
d220: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
d230: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
d240: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
d250: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
d260: 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20  s5SegIterInit(. 
d270: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
d280: 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
d290: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
d2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
d2b0: 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64  nfig.aHash[] ind
d2c0: 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20  ex of FTS index 
d2d0: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
d2e0: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
d2f0: 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
d300: 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
d310: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
d320: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
d330: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
d340: 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
d350: 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f    if( pSeg->pgno
d360: 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  First==0 ){.    
d370: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
d380: 69 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69  if the segment i
d390: 73 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20  s being used as 
d3a0: 61 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69  an input to an i
d3b0: 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a  ncremental.    *
d3c0: 2a 20 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20  * merge and all 
d3d0: 64 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79  data has already
d3e0: 20 62 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e   been "trimmed".
d3f0: 20 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20   See function.  
d400: 20 20 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67    ** fts5TrimSeg
d410: 6d 65 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61  ments() for deta
d420: 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ils. In this cas
d430: 65 20 6c 65 61 76 65 20 74 68 65 20 69 74 65 72  e leave the iter
d440: 61 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20  ator empty..    
d450: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  ** The caller wi
d460: 6c 6c 20 73 65 65 20 74 68 65 20 28 70 49 74 65  ll see the (pIte
d470: 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64  r->pLeaf==0) and
d480: 20 61 73 73 75 6d 65 20 74 68 65 20 69 74 65 72   assume the iter
d490: 61 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61  ator is.    ** a
d4a0: 74 20 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a  t EOF already. *
d4b0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
d4c0: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b  ter->pLeaf==0 );
d4d0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d4e0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
d4f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d500: 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
d510: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
d520: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65  ;.    pIter->pSe
d530: 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 70 49  g = pSeg;.    pI
d540: 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78  ter->iIdx = iIdx
d550: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
d560: 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70  afPgno = pSeg->p
d570: 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20  gnoFirst-1;.    
d580: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
d590: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
d5a0: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
d5b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d5c0: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
d5d0: 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 70  >pLeaf->p;.    p
d5e0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d5f0: 74 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  t = fts5GetU16(&
d600: 61 5b 32 5d 29 3b 0a 20 20 20 20 66 74 73 35 53  a[2]);.    fts5S
d610: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
d620: 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20  , pIter, 0);.   
d630: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
d640: 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
d650: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
d660: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
d670: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 6f  ly ever called o
d680: 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72 65 61  n iterators crea
d690: 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a  ted by calls to.
d6a0: 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75 65 72  ** Fts5IndexQuer
d6b0: 79 28 29 20 77 69 74 68 20 74 68 65 20 46 54 53  y() with the FTS
d6c0: 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
d6d0: 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  C flag set..**.*
d6e0: 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  * The iterator i
d6f0: 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20  s in an unusual 
d700: 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
d710: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d720: 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73 35 53  ed: the.** Fts5S
d730: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
d740: 65 74 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  et variable is s
d750: 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  et to the offset
d760: 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f 66   of the start of
d770: 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  .** the position
d780: 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
d790: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
d7a0: 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e  elevant rowid on
d7b0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74   the page..** Ft
d7c0: 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 20  s5SegIter.rowid 
d7d0: 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50 6f 73  is set, but nPos
d7e0: 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20 6e 6f   and bDel are no
d7f0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  t..**.** This fu
d800: 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73 20  nction advances 
d810: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20  the iterator so 
d820: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
d830: 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72  o the last .** r
d840: 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e  elevant rowid on
d850: 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c 20 69   the page and, i
d860: 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69  f necessary, ini
d870: 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a  tializes the .**
d880: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
d890: 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74  and iRowidOffset
d8a0: 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74 20 74   variables. At t
d8b0: 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 69 74  his point the it
d8c0: 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20  erator.** is in 
d8d0: 69 74 73 20 72 65 67 75 6c 61 72 20 73 74 61 74  its regular stat
d8e0: 65 20 2d 20 46 74 73 35 53 65 67 49 74 65 72 2e  e - Fts5SegIter.
d8f0: 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e  iLeafOffset poin
d900: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  ts to the first.
d910: 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65 20 70  ** byte of the p
d920: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  osition list con
d930: 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  tent associated 
d940: 77 69 74 68 20 73 61 69 64 20 72 6f 77 69 64 2e  with said rowid.
d950: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d960: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
d970: 73 65 49 6e 69 74 50 61 67 65 28 46 74 73 35 49  seInitPage(Fts5I
d980: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
d990: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
d9a0: 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70  int n = pIter->p
d9b0: 4c 65 61 66 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69  Leaf->n;.  int i
d9c0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
d9d0: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d  ffset;.  u8 *a =
d9e0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
d9f0: 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  ;.  int iRowidOf
da00: 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69  fset = 0;..  whi
da10: 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34  le( 1 ){.    i64
da20: 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20   iDelta = 0;.   
da30: 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69   int nPos;.    i
da40: 6e 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20 20  nt bDummy;..    
da50: 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c  i += fts5GetPosl
da60: 69 73 74 53 69 7a 65 28 26 61 5b 69 5d 2c 20 26  istSize(&a[i], &
da70: 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  nPos, &bDummy);.
da80: 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20      i += nPos;. 
da90: 20 20 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72     if( i>=n ) br
daa0: 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 67 65  eak;.    i += ge
dab0: 74 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28  tVarint(&a[i], (
dac0: 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
dad0: 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
dae0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49   ) break;.    pI
daf0: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
db00: 44 65 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20  Delta;..    if( 
db10: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49  iRowidOffset>=pI
db20: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
db30: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
db40: 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f  New = pIter->nRo
db50: 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20  widOffset + 8;. 
db60: 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d       int *aNew =
db70: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
db80: 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52  ealloc(pIter->aR
db90: 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77  owidOffset, nNew
dba0: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
dbb0: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
dbc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
dbd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
dbe0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
dbf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
dc00: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
dc10: 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  et = aNew;.     
dc20: 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66   pIter->nRowidOf
dc30: 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  fset = nNew;.   
dc40: 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   }..    pIter->a
dc50: 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77  RowidOffset[iRow
dc60: 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49  idOffset++] = pI
dc70: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dc80: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
dc90: 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20  afOffset = i;.  
dca0: 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69  }.  pIter->iRowi
dcb0: 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64  dOffset = iRowid
dcc0: 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35 53 65  Offset;.  fts5Se
dcd0: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
dce0: 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pIter);.}../*.*
dcf0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
dd00: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
dd10: 72 73 65 4e 65 77 50 61 67 65 28 46 74 73 35 49  rseNewPage(Fts5I
dd20: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
dd30: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
dd40: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
dd50: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
dd60: 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20  TER_REVERSE );. 
dd70: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
dd80: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
dd90: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
dda0: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
ddb0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
ddc0: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ;.  pIter->pLeaf
ddd0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
dde0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
ddf0: 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  && pIter->iLeafP
de00: 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d  gno>pIter->iTerm
de10: 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
de20: 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a  Fts5Data *pNew;.
de30: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
de40: 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77  Pgno--;.    pNew
de50: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
de60: 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
de70: 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20  ROWID(.         
de80: 20 70 49 74 65 72 2d 3e 69 49 64 78 2c 20 70 49   pIter->iIdx, pI
de90: 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
dea0: 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65  d, 0, pIter->iLe
deb0: 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20  afPgno.    ));. 
dec0: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
ded0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
dee0: 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72  iLeafPgno==pIter
def0: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
df00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
df10: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
df20: 66 66 73 65 74 3c 70 4e 65 77 2d 3e 6e 20 29 7b  ffset<pNew->n ){
df30: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
df40: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
df50: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
df60: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  >iLeafOffset = p
df70: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
df80: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
df90: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
dfa0: 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
dfb0: 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a 20 20 20 20  Off, dummy;.    
dfc0: 20 20 20 20 66 74 73 35 4c 65 61 66 48 65 61 64      fts5LeafHead
dfd0: 65 72 28 70 4e 65 77 2c 20 26 69 52 6f 77 69 64  er(pNew, &iRowid
dfe0: 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Off, &dummy);.  
dff0: 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
e000: 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Off ){.         
e010: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
e020: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  pNew;.          
e030: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e040: 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a  et = iRowidOff;.
e050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e060: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  }..      if( pIt
e070: 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
e080: 20 20 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49       u8 *a = &pI
e090: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49  ter->pLeaf->p[pI
e0a0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
e0b0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ];.        pIter
e0c0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d  ->iLeafOffset +=
e0d0: 20 67 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75   getVarint(a, (u
e0e0: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
e0f0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  id);.        bre
e100: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
e110: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
e120: 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a  aRelease(pNew);.
e130: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e140: 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  }..  if( pIter->
e150: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73  pLeaf ){.    fts
e160: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
e170: 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  nitPage(p, pIter
e180: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
e190: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
e1a0: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
e1b0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
e1c0: 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e   argument curren
e1d0: 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  tly.** points to
e1e0: 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72   a delete marker
e1f0: 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b 65  . A delete marke
e200: 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77 69  r is an entry wi
e210: 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20 70  th a 0 byte.** p
e220: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f  osition-list..*/
e230: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
e240: 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79  MultiIterIsEmpty
e250: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
e260: 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
e270: 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53  *pIter){.  Fts5S
e280: 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
e290: 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65  pIter->aSeg[pIte
e2a0: 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
e2b0: 72 73 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28  rst];.  return (
e2c0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
e2d0: 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20   && pSeg->pLeaf 
e2e0: 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30  && pSeg->nPos==0
e2f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
e300: 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70 49 74  nce iterator pIt
e310: 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  er to the next e
e320: 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ntry. .**.** If 
e330: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
e340: 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73   Fts5Index.rc is
e350: 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f   set to an appro
e360: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
e370: 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74  e. It .** is not
e380: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
e390: 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72  rror if the iter
e3a0: 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
e3b0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
e3c0: 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
e3d0: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
e3e0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
e3f0: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
e400: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
e410: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
e420: 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  xt(.  Fts5Index 
e430: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
e440: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
e450: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
e460: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
e470: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
e480: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
e490: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
e4a0: 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e4c0: 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65   OUT: Set for ne
e4d0: 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61  w term */.){.  a
e4e0: 73 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d  ssert( pbNewTerm
e4f0: 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72  ==0 || *pbNewTer
e500: 6d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  m==0 );.  if( p-
e510: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
e520: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
e530: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e540: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b  GITER_REVERSE ){
e550: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ..      if( pIte
e560: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e  r->iRowidOffset>
e570: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  0 ){.        u8 
e580: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
e590: 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  f->p;.        in
e5a0: 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  t iOff;.        
e5b0: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
e5c0: 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
e5d0: 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
e5e0: 3b 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ;..        pIter
e5f0: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d  ->iRowidOffset--
e600: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
e610: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
e620: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f  Off = pIter->aRo
e630: 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d  widOffset[pIter-
e640: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a  >iRowidOffset];.
e650: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
e660: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
e670: 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50  ze(&a[iOff], &nP
e680: 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
e690: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50        iOff += nP
e6a0: 6f 73 3b 0a 20 20 20 20 20 20 20 20 67 65 74 56  os;.        getV
e6b0: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
e6c0: 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
e6d0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e6e0: 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b  Rowid -= iDelta;
e6f0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
e700: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
e710: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65  pIter);.      }e
e720: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
e730: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
e740: 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  ewPage(p, pIter)
e750: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e760: 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 44  lse{.      Fts5D
e770: 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
e780: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
e790: 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
e7a0: 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20   int bNewTerm = 
e7b0: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65  0;.      int nKe
e7c0: 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f  ep = 0;..      /
e7d0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65  * Search for the
e7e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69   end of the posi
e7f0: 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e  tion list within
e800: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
e810: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a  e. */.      u8 *
e820: 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  a = pLeaf->p;.  
e830: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65 61      int n = pLea
e840: 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f 66  f->n;..      iOf
e850: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
e860: 4f 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e  Offset + pIter->
e870: 6e 50 6f 73 3b 0a 0a 20 20 20 20 20 20 69 66 28  nPos;..      if(
e880: 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
e890: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65     /* The next e
e8a0: 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63  ntry is on the c
e8b0: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
e8c0: 20 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74         u64 iDelt
e8d0: 61 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  a;.        iOff 
e8e0: 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
e8f0: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69  int(&a[iOff], &i
e900: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
e910: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e920: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
e930: 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
e940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e   ){.          bN
e950: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
e960: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
e970: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
e980: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
e990: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
e9b0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e9c0: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   4;.          }e
e9d0: 6c 73 65 20 69 66 28 20 69 4f 66 66 21 3d 66 74  lse if( iOff!=ft
e9e0: 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 20  s5GetU16(&a[2]) 
e9f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
ea00: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ea10: 74 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  t += fts5GetVari
ea20: 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
ea30: 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Keep);.         
ea40: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
ea50: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
ea60: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
ea70: 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  lta;.        }. 
ea80: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
ea90: 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b  Iter->pSeg==0 ){
eaa0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75  .        const u
eab0: 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
eac0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
ead0: 20 2a 7a 54 65 72 6d 3b 0a 20 20 20 20 20 20 20   *zTerm;.       
eae0: 20 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20   int nList;.    
eaf0: 20 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65      if( 0==(pIte
eb00: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
eb10: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29  SEGITER_ONETERM)
eb20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
eb30: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
eb40: 6e 4e 65 78 74 28 70 2d 3e 61 70 48 61 73 68 5b  nNext(p->apHash[
eb50: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  0]);.          s
eb60: 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
eb70: 61 6e 45 6e 74 72 79 28 70 2d 3e 61 70 48 61 73  anEntry(p->apHas
eb80: 68 5b 30 5d 2c 20 26 7a 54 65 72 6d 2c 20 26 70  h[0], &zTerm, &p
eb90: 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
eba0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ebb0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
ebc0: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
ebd0: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
ebe0: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
ebf0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
ec00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
ec10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
ec20: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d  Iter->pLeaf->p =
ec30: 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
ec40: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
ec50: 65 61 66 2d 3e 6e 20 3d 20 6e 4c 69 73 74 3b 0a  eaf->n = nList;.
ec60: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ec70: 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
ec80: 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
ec90: 65 72 6d 2c 20 73 74 72 6c 65 6e 28 7a 54 65 72  erm, strlen(zTer
eca0: 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b  m), (u8*)zTerm);
ecb0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
ecc0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
ecd0: 67 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74 2c  getVarint(pList,
ece0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
ecf0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
ed00: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
ed10: 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 30 3b         iOff = 0;
ed20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74  .        /* Next
ed30: 20 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e   entry is not on
ed40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ed50: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  e */.        whi
ed60: 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20  le( iOff==0 ){. 
ed70: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
ed80: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
ed90: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
eda0: 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
edb0: 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20  >pLeaf;.        
edc0: 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
edd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
ede0: 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74    if( (iOff = ft
edf0: 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
ee00: 3e 70 5b 30 5d 29 29 20 29 7b 0a 20 20 20 20 20  >p[0])) ){.     
ee10: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
ee20: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
ee30: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
ee40: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
ee50: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
ee60: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ee70: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
ee80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ee90: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 69       else if( (i
eea0: 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
eeb0: 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 29 20  (&pLeaf->p[2])) 
eec0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
eed0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
eee0: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
eef0: 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d        bNewTerm =
ef00: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
ef10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ef20: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  }..      /* Chec
ef30: 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  k if the iterato
ef40: 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e  r is now at EOF.
ef50: 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65   If so, return e
ef60: 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  arly. */.      i
ef70: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
ef80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ){.        if( b
ef90: 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  NewTerm ){.     
efa0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
efb0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
efc0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a  ITER_ONETERM ){.
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
efe0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
eff0: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
f000: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
f010: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eaf = 0;.       
f020: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f030: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
f040: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
f050: 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  er, nKeep);.    
f060: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
f070: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
f080: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
f090: 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d     if( pbNewTerm
f0a0: 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20   ) *pbNewTerm = 
f0b0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
f0c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
f0d0: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
f0e0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
f0f0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
f100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f110: 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57   }.}..#define SW
f120: 41 50 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b  APVAL(T, a, b) {
f130: 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61   T tmp; tmp=a; a
f140: 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 2f 2a  =b; b=tmp; }../*
f150: 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
f160: 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
f170: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
f180: 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c   rowid in a docl
f190: 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ist. This.** fun
f1a0: 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69  ction sets the i
f1b0: 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68  terator up so th
f1c0: 61 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72  at iterates in r
f1d0: 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72  everse order thr
f1e0: 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c  ough.** the docl
f1f0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
f200: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
f210: 65 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78  everse(Fts5Index
f220: 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46   *p, int iIdx, F
f230: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
f240: 72 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  r){.  Fts5DlidxI
f250: 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49  ter *pDlidx = pI
f260: 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46  ter->pDlidx;.  F
f270: 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d  ts5Data *pLast =
f280: 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61   0;.  int pgnoLa
f290: 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  st = 0;..  if( p
f2a0: 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 2f 2a 20  Dlidx ){.    /* 
f2b0: 49 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  If the doclist-i
f2c0: 74 65 72 61 74 6f 72 20 69 73 20 61 6c 72 65 61  terator is alrea
f2d0: 64 79 20 61 74 20 45 4f 46 2c 20 74 68 65 6e 20  dy at EOF, then 
f2e0: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
f2f0: 69 73 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ist.    ** conta
f300: 69 6e 73 20 6e 6f 20 65 6e 74 72 69 65 73 20 65  ins no entries e
f310: 78 63 65 70 74 20 74 68 6f 73 65 20 6f 6e 20 74  xcept those on t
f320: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
f330: 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 74 73 35   */.    if( fts5
f340: 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
f350: 70 44 6c 69 64 78 29 3d 3d 30 20 29 7b 0a 20 20  pDlidx)==0 ){.  
f360: 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
f370: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
f380: 65 67 69 64 3b 0a 20 20 20 20 20 20 70 67 6e 6f  egid;.      pgno
f390: 4c 61 73 74 20 3d 20 70 44 6c 69 64 78 2d 3e 69  Last = pDlidx->i
f3a0: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20  LeafPgno;.      
f3b0: 70 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74 61  pLast = fts5Data
f3c0: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
f3d0: 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c  MENT_ROWID(iIdx,
f3e0: 20 69 53 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f   iSegid, 0, pgno
f3f0: 4c 61 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  Last));.    }els
f400: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
f410: 69 4c 65 61 66 4f 66 66 73 65 74 20 2d 3d 20 73  iLeafOffset -= s
f420: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
f430: 69 6e 74 4c 65 6e 28 70 49 74 65 72 2d 3e 6e 50  intLen(pIter->nP
f440: 6f 73 2a 32 2b 70 49 74 65 72 2d 3e 62 44 65 6c  os*2+pIter->bDel
f450: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
f460: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20  {.    int iOff; 
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f490: 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74   Byte offset wit
f4a0: 68 69 6e 20 70 4c 65 61 66 20 2a 2f 0a 20 20 20  hin pLeaf */.   
f4b0: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
f4c0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
f4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
f4e0: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
f4f0: 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ..    /* Current
f500: 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65 72 2e  ly, Fts5SegIter.
f510: 69 4c 65 61 66 4f 66 66 73 65 74 20 28 61 6e 64  iLeafOffset (and
f520: 20 69 4f 66 66 29 20 70 6f 69 6e 74 73 20 74 6f   iOff) points to
f530: 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
f540: 2a 2a 20 62 79 74 65 20 6f 66 20 70 6f 73 69 74  ** byte of posit
f550: 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion-list content
f560: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
f570: 20 72 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20   rowid. Back it 
f580: 75 70 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61  up.    ** so tha
f590: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
f5a0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f5b0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
f5c0: 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20  ze field. */.   
f5d0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f5e0: 73 65 74 20 2d 3d 20 73 71 6c 69 74 65 33 46 74  set -= sqlite3Ft
f5f0: 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 70  s5GetVarintLen(p
f600: 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74  Iter->nPos*2+pIt
f610: 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20 20 20 69  er->bDel);.    i
f620: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
f630: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 61 73  afOffset;.    as
f640: 73 65 72 74 28 20 69 4f 66 66 3e 3d 34 20 29 3b  sert( iOff>=4 );
f650: 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  ..    /* Search 
f660: 66 6f 72 20 61 20 6e 65 77 20 74 65 72 6d 20 77  for a new term w
f670: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
f680: 74 20 6c 65 61 66 2e 20 49 66 20 6f 6e 65 20 63  t leaf. If one c
f690: 61 6e 20 62 65 20 66 6f 75 6e 64 2c 0a 20 20 20  an be found,.   
f6a0: 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 70 61   ** then this pa
f6b0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ge contains the 
f6c0: 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f  largest rowid fo
f6d0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  r the current te
f6e0: 72 6d 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  rm. */.    while
f6f0: 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20  ( iOff<pLeaf->n 
f700: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  ){.      int nPo
f710: 73 3b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  s;.      i64 iDe
f720: 6c 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  lta;.      int b
f730: 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 20 20 2f 2a  Dummy;..      /*
f740: 20 52 65 61 64 20 74 68 65 20 70 6f 73 69 74 69   Read the positi
f750: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
f760: 6c 64 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66  ld */.      iOff
f770: 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
f780: 73 74 53 69 7a 65 28 26 70 4c 65 61 66 2d 3e 70  stSize(&pLeaf->p
f790: 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
f7a0: 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69  bDummy);.      i
f7b0: 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  Off += nPos;.   
f7c0: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
f7d0: 61 66 2d 3e 6e 20 29 20 62 72 65 61 6b 3b 0a 0a  af->n ) break;..
f7e0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 64        /* Rowid d
f7f0: 65 6c 74 61 2e 20 4f 72 2c 20 69 66 20 30 78 30  elta. Or, if 0x0
f800: 30 2c 20 74 68 65 20 65 6e 64 20 6f 66 20 64 6f  0, the end of do
f810: 63 6c 69 73 74 20 6d 61 72 6b 65 72 2e 20 2a 2f  clist marker. */
f820: 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 67 65  .      nPos = ge
f830: 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
f840: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
f850: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69  iDelta);.      i
f860: 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62  f( iDelta==0 ) b
f870: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 4f 66 66  reak;.      iOff
f880: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a   += nPos;.    }.
f890: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f8a0: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
f8b0: 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65  e then the large
f8c0: 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  st rowid for the
f8d0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
f8e0: 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20  term may not be 
f8f0: 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75  stored on the cu
f900: 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73  rrent page. So s
f910: 65 61 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f  earch forward to
f920: 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72  .    ** see wher
f930: 65 20 73 61 69 64 20 72 6f 77 69 64 20 72 65 61  e said rowid rea
f940: 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20  lly is.  */.    
f950: 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d  if( iOff>=pLeaf-
f960: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >n ){.      int 
f970: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73 35  pgno;.      Fts5
f980: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
f990: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
f9a0: 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pSeg;..      /* 
f9b0: 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69  The last rowid i
f9c0: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61  n the doclist ma
f9d0: 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20  y not be on the 
f9e0: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65  current page. Se
f9f0: 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f  arch.      ** fo
fa00: 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68  rward to find th
fa10: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  e page containin
fa20: 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  g the last rowid
fa30: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
fa40: 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61  pgno=pIter->iLea
fa50: 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20  fPgno+1; !p->rc 
fa60: 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  && pgno<=pSeg->p
fa70: 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29  gnoLast; pgno++)
fa80: 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 41  {.        i64 iA
fa90: 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  bs = FTS5_SEGMEN
faa0: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53  T_ROWID(iIdx, pS
fab0: 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  eg->iSegid, 0, p
fac0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74  gno);.        Ft
fad0: 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66  s5Data *pNew = f
fae0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
faf0: 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Abs);.        if
fb00: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
fb10: 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20      int iRowid, 
fb20: 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  iTerm;.         
fb30: 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28   fts5LeafHeader(
fb40: 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 2c 20 26  pNew, &iRowid, &
fb50: 69 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iTerm);.        
fb60: 20 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a    if( iRowid ){.
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50              SWAP
fb80: 56 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70  VAL(Fts5Data*, p
fb90: 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20  New, pLast);.   
fba0: 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73           pgnoLas
fbb0: 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  t = pgno;.      
fbc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fbd0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
fbe0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
fbf0: 20 69 66 28 20 69 54 65 72 6d 20 29 20 62 72 65   if( iTerm ) bre
fc00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
fc10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
fc20: 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69  .  /* If pLast i
fc30: 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70  s NULL at this p
fc40: 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c  oint, then the l
fc50: 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68  ast rowid for th
fc60: 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20  is doclist.  ** 
fc70: 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
fc80: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63   currently indic
fc90: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
fca0: 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ator. In this ca
fcb0: 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e  se .  ** pIter->
fcc0: 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73 20 61  iLeafOffset is a
fcd0: 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 70 6f  lready set to po
fce0: 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74  int to the posit
fcf0: 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20  ion-list size.  
fd00: 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63 69 61  ** field associa
fd10: 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
fd20: 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69  st relevant rowi
fd30: 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  d on the page.. 
fd40: 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20   **.  ** Or, if 
fd50: 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  pLast is non-NUL
fd60: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  L, then it is th
fd70: 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
fd80: 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20  ains the last.  
fd90: 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74 68 69  ** rowid. In thi
fda0: 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75 72 65  s case configure
fdb0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
fdc0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
fdd0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  to the.  ** firs
fde0: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69 73 20  t rowid on this 
fdf0: 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
fe00: 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e   pLast ){.    in
fe10: 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74  t dummy;.    int
fe20: 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44   iOff;.    fts5D
fe30: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
fe40: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49  ->pLeaf);.    pI
fe50: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61  ter->pLeaf = pLa
fe60: 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  st;.    pIter->i
fe70: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c  LeafPgno = pgnoL
fe80: 61 73 74 3b 0a 20 20 20 20 66 74 73 35 4c 65 61  ast;.    fts5Lea
fe90: 66 48 65 61 64 65 72 28 70 4c 61 73 74 2c 20 26  fHeader(pLast, &
fea0: 69 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  iOff, &dummy);. 
feb0: 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
fec0: 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69  rint(&pLast->p[i
fed0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
fee0: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
fef0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
ff00: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a  set = iOff;.  }.
ff10: 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65  .  fts5SegIterRe
ff20: 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
ff30: 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pIter);.}../*.*
ff40: 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
ff50: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
ff60: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
ff70: 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73  owid of a doclis
ff80: 74 20 77 69 74 68 69 6e 0a 2a 2a 20 69 6e 64 65  t within.** inde
ff90: 78 20 69 49 64 78 2e 20 54 68 65 72 65 20 69 73  x iIdx. There is
ffa0: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
ffb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ffc0: 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20   the final term 
ffd0: 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
ffe0: 74 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 63  t page. If the c
fff0: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74  urrent term is t
10000 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20  he last term on 
10010 74 68 65 20 70 61 67 65 2c 20 0a 2a 2a 20 6c 6f  the page, .** lo
10020 61 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  ad the doclist-i
10030 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61  ndex from disk a
10040 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  nd initialize an
10050 20 69 74 65 72 61 74 6f 72 20 61 74 20 0a 2a 2a   iterator at .**
10060 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29   (pIter->pDlidx)
10070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10080 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
10090 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20  Dlidx(Fts5Index 
100a0 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74  *p, int iIdx, Ft
100b0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
100c0 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20  ){.  int iSeg = 
100d0 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
100e0 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20  gid;.  int bRev 
100f0 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  = (pIter->flags 
10100 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
10110 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44  EVERSE);.  Fts5D
10120 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
10130 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75  er->pLeaf; /* Cu
10140 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
10150 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  */..  assert( pI
10160 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
10170 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
10180 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
10190 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20  Iter->pDlidx==0 
101a0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
101b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  f the current do
101c0 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68  clist ends on th
101d0 69 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64  is page. If it d
101e0 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  oes, return.  **
101f0 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c   early without l
10200 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  oading the docli
10210 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20  st-index (as it 
10220 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66  belongs to a dif
10230 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d  ferent.  ** term
10240 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72  . */.  if( pIter
10250 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d  ->iTermLeafPgno=
10260 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
10270 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  o ){.    int iOf
10280 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
10290 4f 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e  Offset + pIter->
102a0 6e 50 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65 28  nPos;.    while(
102b0 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29   iOff<pLeaf->n )
102c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d  {.      int bDum
102d0 6d 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50  my;.      int nP
102e0 6f 73 3b 0a 20 20 20 20 20 20 69 36 34 20 69 44  os;.      i64 iD
102f0 65 6c 74 61 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  elta;..      /* 
10300 69 4f 66 66 20 69 73 20 63 75 72 72 65 6e 74 6c  iOff is currentl
10310 79 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  y the offset of 
10320 74 68 65 20 73 74 61 72 74 20 6f 66 20 70 6f 73  the start of pos
10330 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20  ition list data 
10340 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  */.      iOff +=
10350 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61   getVarint(&pLea
10360 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
10370 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
10380 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
10390 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
103a0 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c  assert_nc( iOff<
103b0 70 4c 65 61 66 2d 3e 6e 20 29 3b 0a 20 20 20 20  pLeaf->n );.    
103c0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
103d0 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 4c  tPoslistSize(&pL
103e0 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e  eaf->p[iOff], &n
103f0 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
10400 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f       iOff += nPo
10410 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  s;.    }.  }..  
10420 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20  pIter->pDlidx = 
10430 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
10440 74 28 70 2c 20 62 52 65 76 2c 20 69 49 64 78 2c  t(p, bRev, iIdx,
10450 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e 69 54   iSeg, pIter->iT
10460 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a  ermLeafPgno);.}.
10470 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
10480 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74  e the object pIt
10490 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
104a0 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
104b0 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a  within segment.*
104c0 2a 20 70 53 65 67 2c 20 69 6e 64 65 78 20 69 49  * pSeg, index iI
104d0 64 78 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  dx. If there is 
104e0 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20  no such term in 
104f0 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69  the index, the i
10500 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 73 65  terator.** is se
10510 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  t to EOF..**.** 
10520 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10530 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
10540 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
10550 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
10560 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
10570 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
10580 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
10590 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
105a0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
105b0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
105c0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
105d0 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74  erSeekInit(.  Ft
105e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10600 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f   FTS5 backend */
10610 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61     /* Config.aHa
10640 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46 54  sh[] index of FT
10650 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  S index */.  con
10660 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
10670 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
10680 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
10690 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106b0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
106c0 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c  FTS5INDEX_XXX fl
106d0 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ags */.  Fts5Str
106e0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
106f0 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
10700 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
10710 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
10720 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
10730 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
10740 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
10750 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20  .){.  int iPg = 
10760 31 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  1;.  int h;.  in
10770 74 20 62 47 65 20 3d 20 28 28 66 6c 61 67 73 20  t bGe = ((flags 
10780 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
10790 59 5f 50 52 45 46 49 58 29 20 26 26 20 69 49 64  Y_PREFIX) && iId
107a0 78 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 62 44 6c  x==0);.  int bDl
107b0 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  idx = 0;        
107c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
107d0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
107e0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
107f0 0a 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d  .  assert( bGe==
10800 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
10810 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
10820 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  SC)==0 );.  asse
10830 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65  rt( pTerm && nTe
10840 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  rm );.  memset(p
10850 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
10860 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
10870 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
10880 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20    pIter->iIdx = 
10890 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  iIdx;..  /* This
108a0 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74 61 63   block sets stac
108b0 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67 20 74  k variable iPg t
108c0 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  o the leaf page 
108d0 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 79 0a  number that may.
108e0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72    ** contain ter
108f0 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
10900 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
10910 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  t in the segment
10920 2e 20 2a 2f 0a 20 20 66 6f 72 28 68 3d 70 53 65  . */.  for(h=pSe
10930 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20 68 3e  g->nHeight-1; h>
10940 30 3b 20 68 2d 2d 29 7b 0a 20 20 20 20 46 74 73  0; h--){.    Fts
10950 35 4e 6f 64 65 49 74 65 72 20 6e 6f 64 65 3b 20  5NodeIter node; 
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10970 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
10980 72 6f 75 67 68 20 69 6e 74 65 72 6e 61 6c 20 6e  rough internal n
10990 6f 64 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20  odes */.    i64 
109a0 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
109b0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
109c0 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
109d0 68 2c 20 69 50 67 29 3b 0a 20 20 20 20 46 74 73  h, iPg);.    Fts
109e0 35 44 61 74 61 20 2a 70 4e 6f 64 65 20 3d 20 66  5Data *pNode = f
109f0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
10a00 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  Rowid);.    if( 
10a10 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b  pNode==0 ) break
10a20 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49  ;..    fts5NodeI
10a30 74 65 72 49 6e 69 74 28 70 4e 6f 64 65 2d 3e 70  terInit(pNode->p
10a40 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26 6e 6f 64  , pNode->n, &nod
10a50 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
10a60 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29  node.term.n==0 )
10a70 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20 6e 6f 64  ;..    iPg = nod
10a80 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 62 44  e.iChild;.    bD
10a90 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44 6c 69  lidx = node.bDli
10aa0 64 78 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35  dx;.    for(fts5
10ab0 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
10ac0 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20  >rc, &node);.   
10ad0 20 20 20 20 20 6e 6f 64 65 2e 61 44 61 74 61 20       node.aData 
10ae0 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  && fts5BufferCom
10af0 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64 65 2e 74  pareBlob(&node.t
10b00 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
10b10 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20 20 20 66  m)<=0;.        f
10b20 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
10b30 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 0a 20  &p->rc, &node). 
10b40 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 67 20     ){.      iPg 
10b50 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20  = node.iChild;. 
10b60 20 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f       bDlidx = no
10b70 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20 7d  de.bDlidx;.    }
10b80 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
10b90 72 46 72 65 65 28 26 6e 6f 64 65 29 3b 0a 20 20  rFree(&node);.  
10ba0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
10bb0 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20  e(pNode);.  }.. 
10bc0 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70   if( iPg<pSeg->p
10bd0 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20  gnoFirst ){.    
10be0 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  iPg = pSeg->pgno
10bf0 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64  First;.    bDlid
10c00 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49  x = 0;.  }..  pI
10c10 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
10c20 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35   iPg - 1;.  fts5
10c30 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
10c40 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66  p, pIter);..  if
10c50 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
10c60 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  {.    int res;. 
10c70 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
10c80 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 55  ffset = fts5GetU
10c90 31 36 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66  16(&pIter->pLeaf
10ca0 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 66 74 73  ->p[2]);.    fts
10cb0 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
10cc0 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
10cd0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
10ce0 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
10cf0 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
10d00 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65   res = fts5Buffe
10d10 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49  rCompareBlob(&pI
10d20 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d  ter->term, pTerm
10d30 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , nTerm);.      
10d40 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62 72 65  if( res>=0 ) bre
10d50 61 6b 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  ak;.      fts5Se
10d60 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  gIterNext(p, pIt
10d70 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 77 68 69  er, 0);.    }whi
10d80 6c 65 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  le( pIter->pLeaf
10d90 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
10da0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 69 66 28  E_OK );..    if(
10db0 20 62 47 65 3d 3d 30 20 26 26 20 72 65 73 20 29   bGe==0 && res )
10dc0 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69  {.      /* Set i
10dd0 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74  terator to point
10de0 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20 20 20 20   to EOF */.     
10df0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
10e00 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
10e10 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
10e20 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  af = 0;.    }.  
10e30 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
10e40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65  SQLITE_OK && bGe
10e50 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ==0 ){.    pIter
10e60 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
10e70 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b  SEGITER_ONETERM;
10e80 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
10e90 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  pLeaf ){.      i
10ea0 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
10eb0 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
10ec0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ){.        pIter
10ed0 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
10ee0 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b  SEGITER_REVERSE;
10ef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10f00 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20  f( bDlidx ){.   
10f10 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
10f20 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 69 49 64  LoadDlidx(p, iId
10f30 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  x, pIter);.     
10f40 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61   }.      if( fla
10f50 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
10f60 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
10f70 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
10f80 52 65 76 65 72 73 65 28 70 2c 20 69 49 64 78 2c  Reverse(p, iIdx,
10f90 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
10fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
10fb0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
10fc0 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20  he object pIter 
10fd0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d  to point to term
10fe0 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74   pTerm/nTerm wit
10ff0 68 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65  hin the.** in-me
11000 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20  mory hash table 
11010 69 49 64 78 2e 20 49 66 20 74 68 65 72 65 20 69  iIdx. If there i
11020 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
11030 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 74 68 65  n the table, the
11040 20 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73   .** iterator is
11050 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a   set to EOF..**.
11060 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
11070 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78  ccurs, Fts5Index
11080 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  .rc is set to an
11090 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
110a0 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20  or code. If .** 
110b0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
110c0 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
110d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
110e0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
110f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
11100 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
11110 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20  gIterHashInit(. 
11120 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11140 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
11150 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e        /* Config.
11180 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66  aHash[] index of
11190 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20   FTS index */.  
111a0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
111b0 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
111c0 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
111d0 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
111e0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
111f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
11200 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
11210 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
11220 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
11230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11240 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
11250 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 48 61  e */.){.  Fts5Ha
11260 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 61  sh *pHash = p->a
11270 70 48 61 73 68 5b 69 49 64 78 5d 3b 0a 20 20 63  pHash[iIdx];.  c
11280 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
11290 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20   0;.  int nList 
112a0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  = 0;.  const u8 
112b0 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20  *z = 0;.  int n 
112c0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
112d0 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65 72  pHash );.  asser
112e0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
112f0 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 54  _OK );..  if( pT
11300 65 72 6d 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3d  erm==0 || (iIdx=
11310 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20 46  =0 && (flags & F
11320 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
11330 52 45 46 49 58 29 29 20 29 7b 0a 20 20 20 20 70  REFIX)) ){.    p
11340 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
11350 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70  s5HashScanInit(p
11360 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
11370 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  r*)pTerm, nTerm)
11380 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
11390 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
113a0 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
113b0 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
113c0 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
113d0 20 28 7a 20 3f 20 73 74 72 6c 65 6e 28 28 63 6f   (z ? strlen((co
113e0 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30  nst char*)z) : 0
113f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11400 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
11410 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
11420 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65  TERM;.    sqlite
11430 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28 70  3Fts5HashQuery(p
11440 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
11450 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  r*)pTerm, nTerm,
11460 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
11470 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b  ;.    z = pTerm;
11480 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a  .    n = nTerm;.
11490 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74    }..  if( pList
114a0 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
114b0 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c   *pLeaf;.    sql
114c0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
114d0 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
114e0 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20  ->term, n, z);. 
114f0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49     pLeaf = fts5I
11500 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
11510 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20  of(Fts5Data));. 
11520 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20     if( pLeaf==0 
11530 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  ) return;.    pL
11540 65 61 66 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  eaf->nRef = 1;. 
11550 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75     pLeaf->p = (u
11560 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c  8*)pList;.    pL
11570 65 61 66 2d 3e 6e 20 3d 20 6e 4c 69 73 74 3b 0a  eaf->n = nList;.
11580 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
11590 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70 49   = pLeaf;.    pI
115a0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
115b0 20 3d 20 67 65 74 56 61 72 69 6e 74 28 70 4c 65   = getVarint(pLe
115c0 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49  af->p, (u64*)&pI
115d0 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 0a 20  ter->iRowid);.. 
115e0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
115f0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
11600 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ESC ){.      pIt
11610 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
11620 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
11630 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  E;.      fts5Seg
11640 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
11650 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
11660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11670 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
11680 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
11690 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
116a0 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61  * Zero the itera
116b0 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
116c0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
116d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
116e0 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
116f0 28 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49  (Fts5SegIter *pI
11700 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66  ter){.  fts5Buff
11710 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74  erFree(&pIter->t
11720 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61  erm);.  fts5Data
11730 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
11740 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69  Leaf);.  fts5Dli
11750 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72  dxIterFree(pIter
11760 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c  ->pDlidx);.  sql
11770 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
11780 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a  >aRowidOffset);.
11790 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
117a0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
117b0 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64  gIter));.}..#ifd
117c0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
117d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
117e0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20  tion is used as 
117f0 70 61 72 74 20 6f 66 20 74 68 65 20 62 69 67 20  part of the big 
11800 61 73 73 65 72 74 28 29 20 70 72 6f 63 65 64 75  assert() procedu
11810 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  re implemented b
11820 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d  y.** fts5AssertM
11830 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 29 2e  ultiIterSetup().
11840 20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61 74   It ensures that
11850 20 74 68 65 20 72 65 73 75 6c 74 20 63 75 72 72   the result curr
11860 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20  ently stored.** 
11870 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65 20  in *pRes is the 
11880 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f  correct result o
11890 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  f comparing the 
118a0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
118b0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20  s of the.** two 
118c0 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74  iterators..*/.st
118d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
118e0 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
118f0 73 75 6c 74 28 0a 20 20 46 74 73 35 4d 75 6c 74  sult(.  Fts5Mult
11900 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
11910 20 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20   .  Fts5SegIter 
11920 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74  *p1,.  Fts5SegIt
11930 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52  er *p2,.  Fts5CR
11940 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20  esult *pRes.){. 
11950 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70   int i1 = p1 - p
11960 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e  Iter->aSeg;.  in
11970 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65  t i2 = p2 - pIte
11980 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20  r->aSeg;..  if( 
11990 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d  p1->pLeaf || p2-
119a0 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66  >pLeaf ){.    if
119b0 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
119c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
119d0 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
119e0 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   );.    }else if
119f0 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
11a00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11a10 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
11a20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   );.    }else{. 
11a30 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20       int nMin = 
11a40 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20  MIN(p1->term.n, 
11a50 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  p2->term.n);.   
11a60 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d     int res = mem
11a70 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c 20  cmp(p1->term.p, 
11a80 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e  p2->term.p, nMin
11a90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  );.      if( res
11aa0 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d 3e  ==0 ) res = p1->
11ab0 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65 72  term.n - p2->ter
11ac0 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  m.n;..      if( 
11ad0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
11ae0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
11af0 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20 20  bTermEq==1 );.  
11b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
11b10 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69 52  ->iRowid!=p2->iR
11b20 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
11b30 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
11b40 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
11b50 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
11b60 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20 20 7d   -1 : 1;.      }
11b70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
11b80 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
11b90 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  mEq==0 );.      
11ba0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  }..      if( res
11bb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  <0 ){.        as
11bc0 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72  sert( pRes->iFir
11bd0 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20 20  st==i1 );.      
11be0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
11bf0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
11c00 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 20  rst==i2 );.     
11c10 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
11c20 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11c30 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75  ion is a no-op u
11c40 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45 42  nless SQLITE_DEB
11c50 55 47 20 69 73 20 64 65 66 69 6e 65 64 20 77 68  UG is defined wh
11c60 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  en this module.*
11c70 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20 49  * is compiled. I
11c80 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 69  n that case, thi
11c90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 73  s function is es
11ca0 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73 73  sentially an ass
11cb0 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
11cc0 65 6e 74 20 75 73 65 64 20 74 6f 20 76 65 72 69  ent used to veri
11cd0 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  fy that the cont
11ce0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65  ents of the pIte
11cf0 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72 72 61  r->aFirst[] arra
11d00 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65 63 74  y.** are correct
11d10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11d20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
11d30 49 74 65 72 53 65 74 75 70 28 46 74 73 35 49 6e  IterSetup(Fts5In
11d40 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74  dex *p, Fts5Mult
11d50 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  iSegIter *pIter)
11d60 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
11d70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11d80 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
11d90 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
11da0 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  g; i+=2){.      
11db0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
11dc0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
11dd0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
11de0 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65  Iter *p2 = &pIte
11df0 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20  r->aSeg[i+1];.  
11e00 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20      Fts5CResult 
11e10 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
11e20 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e  aFirst[(pIter->n
11e30 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20  Seg + i) / 2];. 
11e40 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43       fts5AssertC
11e50 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
11e60 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70  pIter, p1, p2, p
11e70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Res);.    }..   
11e80 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74   for(i=1; i<(pIt
11e90 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69  er->nSeg / 2); i
11ea0 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35  +=2){.      Fts5
11eb0 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20  CResult *pRes = 
11ec0 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69  &pIter->aFirst[i
11ed0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
11ee0 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65  Iter *p1 = &pIte
11ef0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
11f00 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72  aFirst[i*2].iFir
11f10 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  st ];.      Fts5
11f20 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70  SegIter *p2 = &p
11f30 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
11f40 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d  r->aFirst[i*2+1]
11f50 2e 69 46 69 72 73 74 20 5d 3b 0a 0a 20 20 20 20  .iFirst ];..    
11f60 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70    fts5AssertComp
11f70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74  arisonResult(pIt
11f80 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73  er, p1, p2, pRes
11f90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
11fa0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
11fb0 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
11fc0 72 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e 64  rSetup(x,y).#end
11fd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65  if../*.** Do the
11fe0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65   comparison nece
11ff0 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74  ssary to populat
12000 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  e pIter->aFirst[
12010 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  iOut]..**.** If 
12020 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
12030 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ue is non-zero, 
12040 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 69  then it is the i
12050 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79  ndex of an entry
12060 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72  .** in the pIter
12070 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74  ->aSeg[] array t
12080 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61  hat is (a) not a
12090 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70  t EOF, and (b) p
120a0 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
120b0 6b 65 79 20 74 68 61 74 20 69 73 20 61 20 64 75  key that is a du
120c0 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68  plicate of anoth
120d0 65 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72  er, higher prior
120e0 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  ity, .** segment
120f0 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65  -iterator in the
12100 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72   pSeg->aSeg[] ar
12110 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
12120 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
12130 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 4d 75  DoCompare(Fts5Mu
12140 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
12150 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20  r, int iOut){.  
12160 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20 20  int i1;         
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74  /* Index of left
12190 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
121a0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20  r */.  int i2;  
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
121d0 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74  of right-hand Ft
121e0 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69  s5SegIter */.  i
121f0 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53  nt iRes;.  Fts5S
12200 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20  egIter *p1;     
12210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
12220 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ft-hand Fts5SegI
12230 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ter */.  Fts5Seg
12240 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20  Iter *p2;       
12250 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
12260 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
12270 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  er */.  Fts5CRes
12280 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74  ult *pRes = &pIt
12290 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d  er->aFirst[iOut]
122a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75  ;..  assert( iOu
122b0 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26  t<pIter->nSeg &&
122c0 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73   iOut>0 );.  ass
122d0 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76  ert( pIter->bRev
122e0 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52  ==0 || pIter->bR
122f0 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ev==1 );..  if( 
12300 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53  iOut>=(pIter->nS
12310 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20  eg/2) ){.    i1 
12320 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d  = (iOut - pIter-
12330 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20  >nSeg/2) * 2;.  
12340 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20    i2 = i1 + 1;. 
12350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d   }else{.    i1 =
12360 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
12370 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20  Out*2].iFirst;. 
12380 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61     i2 = pIter->a
12390 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e  First[iOut*2+1].
123a0 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31  iFirst;.  }.  p1
123b0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
123c0 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74  i1];.  p2 = &pIt
123d0 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20  er->aSeg[i2];.. 
123e0 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d   pRes->bTermEq =
123f0 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c   0;.  if( p1->pL
12400 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  eaf==0 ){       
12410 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20      /* If p1 is 
12420 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52  at EOF */.    iR
12430 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65  es = i2;.  }else
12440 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d   if( p2->pLeaf==
12450 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70  0 ){     /* If p
12460 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  2 is at EOF */. 
12470 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20     iRes = i1;.  
12480 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
12490 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43  es = fts5BufferC
124a0 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d  ompare(&p1->term
124b0 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20  , &p2->term);.  
124c0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
124d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32        assert( i2
124e0 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >i1 );.      ass
124f0 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20  ert( i2!=0 );.  
12500 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45      pRes->bTermE
12510 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  q = 1;.      if(
12520 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d   p1->iRowid==p2-
12530 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
12540 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32     p1->bDel = p2
12550 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20 20  ->bDel;.        
12560 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20  return i2;.     
12570 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28   }.      res = (
12580 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32  (p1->iRowid > p2
12590 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
125a0 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b  ->bRev) ? -1 : +
125b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
125c0 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20  ert( res!=0 );. 
125d0 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
125e0 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b        iRes = i1;
125f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12600 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20    iRes = i2;.   
12610 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e   }.  }..  pRes->
12620 69 46 69 72 73 74 20 3d 20 69 52 65 73 3b 0a 20  iFirst = iRes;. 
12630 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
12640 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67  .** Move the seg
12650 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20 69 74  -iter so that it
12660 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
12670 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61  irst rowid on pa
12680 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a  ge iLeafPgno..**
12690 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
126a0 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e  if leaf iLeafPgn
126b0 6f 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  o contains no ro
126c0 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  wid..*/.static v
126d0 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47  oid fts5SegIterG
126e0 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49  otoPage(.  Fts5I
126f0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
12700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
12710 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
12720 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
12730 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
12740 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
12750 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
12760 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
12770 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c  .){.  assert( iL
12780 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
12790 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 70 49  LeafPgno );.  pI
127a0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
127b0 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20   iLeafPgno-1;.  
127c0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
127d0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
127e0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
127f0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
12800 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69  er->iLeafPgno==i
12810 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69  LeafPgno );..  i
12820 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12830 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
12840 4f 66 66 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d  Off;.    u8 *a =
12850 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
12860 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49  ;.    int n = pI
12870 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 0a  ter->pLeaf->n;..
12880 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47      iOff = fts5G
12890 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20  etU16(&a[0]);.  
128a0 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
128b0 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  iOff>=n ){.     
128c0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
128d0 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
128e0 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  {.      iOff += 
128f0 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  getVarint(&a[iOf
12900 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
12910 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
12920 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
12930 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
12940 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
12950 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
12960 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12970 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
12980 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
12990 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
129a0 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20  gument until it 
129b0 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73  is at or .** pas
129c0 74 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52  t rowid iFrom. R
129d0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
129e0 20 76 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c   value of iFrom,
129f0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
12a00 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64 76 61 6e  .** always advan
12a10 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ced at least onc
12a20 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
12a30 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
12a40 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
12a50 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
12a60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
12a70 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
12a80 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
12a90 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
12aa0 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
12ab0 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
12ac0 20 69 36 34 20 69 4d 61 74 63 68 20 20 20 20 20   i64 iMatch     
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ae0 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72   /* Advance iter
12af0 61 74 6f 72 20 61 74 20 6c 65 61 73 74 20 74 68  ator at least th
12b00 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69  is far */.){.  i
12b10 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72  nt bRev = (pIter
12b20 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
12b30 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b  EGITER_REVERSE);
12b40 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
12b50 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72   *pDlidx = pIter
12b60 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20  ->pDlidx;.  int 
12b70 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  iLeafPgno = pIte
12b80 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  r->iLeafPgno;.  
12b90 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a  int bMove = 1;..
12ba0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
12bb0 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
12bc0 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b  GITER_ONETERM );
12bd0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
12be0 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73  ->pDlidx );.  as
12bf0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65  sert( pIter->pLe
12c00 61 66 20 29 3b 0a 0a 20 20 69 66 28 20 62 52 65  af );..  if( bRe
12c10 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  v==0 ){.    whil
12c20 65 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  e( fts5DlidxIter
12c30 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
12c40 30 20 26 26 20 69 4d 61 74 63 68 3e 70 44 6c 69  0 && iMatch>pDli
12c50 64 78 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  dx->iRowid ){.  
12c60 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
12c70 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e  pDlidx->iLeafPgn
12c80 6f 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  o;.      fts5Dli
12c90 64 78 49 74 65 72 4e 65 78 74 28 70 44 6c 69 64  dxIterNext(pDlid
12ca0 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  x);.    }.    as
12cb0 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e  sert( iLeafPgno>
12cc0 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
12cd0 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20  o || p->rc );.  
12ce0 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e    if( iLeafPgno>
12cf0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12d00 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
12d10 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c  gIterGotoPage(p,
12d20 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e   pIter, iLeafPgn
12d30 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20  o);.      bMove 
12d40 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
12d50 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
12d60 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52  iMatch<pIter->iR
12d70 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c  owid );.    whil
12d80 65 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  e( fts5DlidxIter
12d90 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
12da0 30 20 26 26 20 69 4d 61 74 63 68 3c 70 44 6c 69  0 && iMatch<pDli
12db0 64 78 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  dx->iRowid ){.  
12dc0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
12dd0 72 50 72 65 76 28 70 44 6c 69 64 78 29 3b 0a 20  rPrev(pDlidx);. 
12de0 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67     }.    iLeafPg
12df0 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65  no = pDlidx->iLe
12e00 61 66 50 67 6e 6f 3b 0a 0a 20 20 20 20 61 73 73  afPgno;..    ass
12e10 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74  ert( fts5DlidxIt
12e20 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
12e30 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70   || iLeafPgno<=p
12e40 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
12e50 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c 65 61  );..    if( iLea
12e60 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65  fPgno<pIter->iLe
12e70 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
12e80 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12e90 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a   = iLeafPgno+1;.
12ea0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12eb0 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
12ec0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
12ed0 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20   bMove = 0;.    
12ee0 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  }.  }..  while( 
12ef0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12f00 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76   ){.    if( bMov
12f10 65 20 29 20 66 74 73 35 53 65 67 49 74 65 72 4e  e ) fts5SegIterN
12f20 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29  ext(p, pIter, 0)
12f30 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
12f40 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61  >pLeaf==0 ) brea
12f50 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d  k;.    if( bRev=
12f60 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
12f70 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
12f80 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65  eak;.    if( bRe
12f90 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69  v!=0 && pIter->i
12fa0 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20  Rowid<=iMatch ) 
12fb0 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65  break;.    bMove
12fc0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   = 1;.  }.}.../*
12fd0 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74 65  .** Free the ite
12fe0 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
12ff0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
13000 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
13010 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
13020 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74 73  ultiIterFree(Fts
13030 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d  5Index *p, Fts5M
13040 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
13050 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
13060 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
13070 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
13080 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
13090 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
130a0 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d 3e  erClear(&pIter->
130b0 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aSeg[i]);.    }.
130c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
130d0 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pIter);.  }.}..
130e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
130f0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
13100 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
13110 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13120 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
13130 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
13140 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35  within */.  Fts5
13150 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
13160 74 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 49  ter,        /* I
13170 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74  terator to updat
13180 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  e aFirst[] array
13190 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
131a0 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20  hanged,         
131b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
131c0 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74  ex of sub-iterat
131d0 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64  or just advanced
131e0 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65   */.  int iMinse
131f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
13200 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
13210 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74   entry in aFirst
13220 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a  [] to set */.){.
13230 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
13240 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43  =(pIter->nSeg+iC
13250 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d  hanged)/2; i>=iM
13260 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d  inset && p->rc==
13270 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32  SQLITE_OK; i=i/2
13280 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a  ){.    int iEq;.
13290 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66      if( (iEq = f
132a0 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f  ts5MultiIterDoCo
132b0 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29 29  mpare(pIter, i))
132c0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
132d0 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70 49  gIterNext(p, &pI
132e0 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 2c 20  ter->aSeg[iEq], 
132f0 30 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49  0);.      i = pI
13300 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b  ter->nSeg + iEq;
13310 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
13320 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c  atic int fts5Mul
13330 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77  tiIterAdvanceRow
13340 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  id(.  Fts5Index 
13350 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
13360 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
13370 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
13380 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
13390 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
133a0 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Iter,        /* 
133b0 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61  Iterator to upda
133c0 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  te aFirst[] arra
133d0 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  y for */.  int i
133e0 43 68 61 6e 67 65 64 20 20 20 20 20 20 20 20 20  Changed         
133f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
13400 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61  dex of sub-itera
13410 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65  tor just advance
13420 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  d */.){.  int i;
13430 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
13440 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61  pNew = &pIter->a
13450 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 20  Seg[iChanged];. 
13460 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f   Fts5SegIter *pO
13470 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  ther = &pIter->a
13480 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30  Seg[iChanged ^ 0
13490 78 30 30 30 31 5d 3b 0a 0a 20 20 66 6f 72 28 69  x0001];..  for(i
134a0 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43  =(pIter->nSeg+iC
134b0 68 61 6e 67 65 64 29 2f 32 3b 20 70 2d 3e 72 63  hanged)/2; p->rc
134c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69  ==SQLITE_OK; i=i
134d0 2f 32 29 7b 0a 20 20 20 20 46 74 73 35 43 52 65  /2){.    Fts5CRe
134e0 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
134f0 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a  ter->aFirst[i];.
13500 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
13510 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20  w->pLeaf );.    
13520 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54  assert( pRes->bT
13530 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68  ermEq==0 || pOth
13540 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20  er->pLeaf );.   
13550 20 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e   .    if( pRes->
13560 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20  bTermEq ){.     
13570 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69   if( pNew->iRowi
13580 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69  d==pOther->iRowi
13590 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
135a0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 1;.      }el
135b0 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e  se if( (pOther->
135c0 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f  iRowid>pNew->iRo
135d0 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
135e0 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  v ){.        pNe
135f0 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20 20  w = pOther;.    
13600 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 52    }.    }.    pR
13610 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 70 4e  es->iFirst = (pN
13620 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  ew - pIter->aSeg
13630 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 31 20  );.    if( i==1 
13640 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70 4f  ) break;..    pO
13650 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  ther = &pIter->a
13660 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
13670 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e 69  st[i ^ 0x0001].i
13680 46 69 72 73 74 20 5d 3b 0a 20 20 7d 0a 0a 20 20  First ];.  }..  
13690 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
136a0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
136b0 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
136c0 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49   entry. .**.** I
136d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
136e0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
136f0 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35   is left in Fts5
13700 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73 20  Index.rc. It is 
13710 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72  not .** consider
13720 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
13730 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
13740 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20 69  hes EOF, or if i
13750 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  t is already at 
13760 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68 69  .** EOF when thi
13770 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13780 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
13790 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
137a0 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e  erNext(.  Fts5In
137b0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 4d  dex *p, .  Fts5M
137c0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
137d0 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c  er,.  int bFrom,
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
13800 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20   argument iFrom 
13810 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36  is valid */.  i6
13820 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20 20  4 iFrom         
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13840 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61 73   Advance at leas
13850 74 20 61 73 20 66 61 72 20 61 73 20 74 68 69 73  t as far as this
13860 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
13870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13880 0a 20 20 20 20 69 6e 74 20 62 55 73 65 46 72 6f  .    int bUseFro
13890 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 20 20 64  m = bFrom;.    d
138a0 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46  o {.      int iF
138b0 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46  irst = pIter->aF
138c0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a  irst[1].iFirst;.
138d0 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65        int bNewTe
138e0 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74  rm = 0;.      Ft
138f0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
13900 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13910 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 61 73  First];.      as
13920 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
13930 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
13940 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20  if( bUseFrom && 
13950 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a  pSeg->pDlidx ){.
13960 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
13970 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70  terNextFrom(p, p
13980 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20  Seg, iFrom);.   
13990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
139a0 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
139b0 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77  t(p, pSeg, &bNew
139c0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  Term);.      }..
139d0 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
139e0 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77  pLeaf==0 || bNew
139f0 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20  Term .       || 
13a00 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
13a10 61 6e 63 65 52 6f 77 69 64 28 70 2c 20 70 49 74  anceRowid(p, pIt
13a20 65 72 2c 20 69 46 69 72 73 74 29 0a 20 20 20 20  er, iFirst).    
13a30 20 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73    ){.        fts
13a40 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
13a50 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  ed(p, pIter, iFi
13a60 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  rst, 1);.      }
13a70 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
13a80 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
13a90 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20  p, pIter);..    
13aa0 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a    bUseFrom = 0;.
13ab0 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65      }while( pIte
13ac0 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26  r->bSkipEmpty &&
13ad0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
13ae0 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20  Empty(p, pIter) 
13af0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
13b00 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46  Allocate a new F
13b10 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
13b20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
13b30 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
13b40 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
13b50 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 61 74  rate through dat
13b60 61 20 69 6e 20 73 74 72 75 63 74 75 72 65 20 70  a in structure p
13b70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c  Struct..** If iL
13b80 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68 65  evel is -ve, the
13b90 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c  n all data in al
13ba0 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d 65  l segments is me
13bb0 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65  rged. Or, if iLe
13bc0 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f  vel.** is zero o
13bd0 72 20 67 72 65 61 74 65 72 2c 20 64 61 74 61 20  r greater, data 
13be0 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 6e  from the first n
13bf0 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73  Segment segments
13c00 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c   on level iLevel
13c10 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a  .** is merged..*
13c20 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
13c30 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e  r initially poin
13c40 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
13c50 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79  term/rowid entry
13c60 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65 72   in the .** iter
13c70 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ated data..*/.st
13c80 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
13c90 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46 74  ltiIterNew(.  Ft
13ca0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13cc0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
13cd0 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
13ce0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
13cf0 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20  re *pStruct,    
13d00 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72       /* Structur
13d10 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 69 6e  e of specific in
13d20 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  dex */.  int iId
13d30 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
13d40 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
13d50 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78  ig.aHash[] index
13d60 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f   of FTS index */
13d70 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74  .  int bSkipEmpt
13d80 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
13d90 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 67     /* True to ig
13da0 6e 6f 72 65 20 64 65 6c 65 74 65 2d 6b 65 79 73  nore delete-keys
13db0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13dd0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 49 4e 44        /* FTS5IND
13de0 45 58 5f 51 55 45 52 59 5f 58 58 58 20 66 6c 61  EX_QUERY_XXX fla
13df0 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  gs */.  const u8
13e00 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
13e10 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm,     /* Term 
13e20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e  to seek to (or N
13e30 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20  ULL/0) */.  int 
13e40 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20  iLevel,         
13e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13e60 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20  evel to iterate 
13e70 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a  (-1 for all) */.
13e80 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20    int nSegment, 
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
13eb0 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65  egments to merge
13ec0 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a   (iLevel>=0) */.
13ed0 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
13ee0 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  er **ppOut      
13ef0 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20    /* New object 
13f00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  */.){.  int nSeg
13f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13f20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13f30 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65  r of segment-ite
13f40 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  rs in use */.  i
13f50 6e 74 20 6e 53 6c 6f 74 20 3d 20 30 3b 20 20 20  nt nSlot = 0;   
13f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f70 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e  * Power of two >
13f80 3d 20 6e 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20  = nSeg */.  int 
13f90 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  iIter = 0;      
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a              /* *
13fb0 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20  /.  int iSeg;   
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fd0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
13fe0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
13ff0 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73  egments */.  Fts
14000 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
14010 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c  *pLvl;.  Fts5Mul
14020 74 69 53 65 67 49 74 65 72 20 2a 70 4e 65 77 3b  tiSegIter *pNew;
14030 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  ..  assert( (pTe
14040 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d  rm==0 && nTerm==
14050 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29  0) || iLevel<0 )
14060 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
14070 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
14080 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65  ew multi-seg-ite
14090 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20  rator. */.  if( 
140a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
140b0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76   ){.    if( iLev
140c0 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73  el<0 ){.      as
140d0 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
140e0 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72  Segment==fts5Str
140f0 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
14100 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a  nts(pStruct) );.
14110 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74        nSeg = pSt
14120 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a  ruct->nSegment;.
14130 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70        nSeg += (p
14140 2d 3e 61 70 48 61 73 68 20 3f 20 31 20 3a 20 30  ->apHash ? 1 : 0
14150 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14160 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70      nSeg = MIN(p
14170 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
14180 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65  Level].nSeg, nSe
14190 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  gment);.    }.  
141a0 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e    for(nSlot=2; n
141b0 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74  Slot<nSeg; nSlot
141c0 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 7d 0a 0a  =nSlot*2);.  }..
141d0 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20    *ppOut = pNew 
141e0 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  = fts5IdxMalloc(
141f0 70 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  p, .      sizeof
14200 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65  (Fts5MultiSegIte
14210 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a  r) +          /*
14220 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73   pNew */.      s
14230 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65  izeof(Fts5SegIte
14240 72 29 20 2a 20 6e 53 6c 6f 74 20 2b 20 20 20 20  r) * nSlot +    
14250 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67     /* pNew->aSeg
14260 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  [] */.      size
14270 6f 66 28 46 74 73 35 43 52 65 73 75 6c 74 29 20  of(Fts5CResult) 
14280 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20  * nSlot         
14290 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b  /* pNew->aFirst[
142a0 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  ] */.  );.  if( 
142b0 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
142c0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d  ;.  pNew->nSeg =
142d0 20 6e 53 6c 6f 74 3b 0a 20 20 70 4e 65 77 2d 3e   nSlot;.  pNew->
142e0 61 53 65 67 20 3d 20 28 46 74 73 35 53 65 67 49  aSeg = (Fts5SegI
142f0 74 65 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  ter*)&pNew[1];. 
14300 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d 20   pNew->aFirst = 
14310 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26 70  (Fts5CResult*)&p
14320 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d  New->aSeg[nSlot]
14330 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d  ;.  pNew->bRev =
14340 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54   (0!=(flags & FT
14350 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
14360 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53  SC));.  pNew->bS
14370 6b 69 70 45 6d 70 74 79 20 3d 20 62 53 6b 69 70  kipEmpty = bSkip
14380 45 6d 70 74 79 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Empty;..  /* Ini
14390 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20  tialize each of 
143a0 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65  the component se
143b0 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e  gment iterators.
143c0 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c   */.  if( iLevel
143d0 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  <0 ){.    Fts5St
143e0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45  ructureLevel *pE
143f0 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  nd = &pStruct->a
14400 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
14410 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 69 66 28 20  Level];.    if( 
14420 70 2d 3e 61 70 48 61 73 68 20 29 7b 0a 20 20 20  p->apHash ){.   
14430 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d     /* Add a segm
14440 65 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ent iterator for
14450 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
14460 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73  tents of the has
14470 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
14480 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14490 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
144a0 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20  eg[iIter++];.   
144b0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 48 61     fts5SegIterHa
144c0 73 68 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20  shInit(p, iIdx, 
144d0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c  pTerm, nTerm, fl
144e0 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  ags, pIter);.   
144f0 20 7d 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d   }.    for(pLvl=
14500 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
14510 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20  [0]; pLvl<pEnd; 
14520 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66  pLvl++){.      f
14530 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53  or(iSeg=pLvl->nS
14540 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
14550 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Seg--){.        
14560 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
14570 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
14580 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
14590 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
145a0 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
145b0 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
145c0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
145d0 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Term==0 ){.     
145e0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
145f0 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 70 53  Init(p, iIdx, pS
14600 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
14610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14620 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14630 53 65 65 6b 49 6e 69 74 28 70 2c 20 69 49 64 78  SeekInit(p, iIdx
14640 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , pTerm, nTerm, 
14650 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74  flags, pSeg, pIt
14660 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
14670 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14680 65 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c 20 3d  else{.    pLvl =
14690 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
146a0 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66  l[iLevel];.    f
146b0 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20  or(iSeg=nSeg-1; 
146c0 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29  iSeg>=0; iSeg--)
146d0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
146e0 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78 2c  terInit(p, iIdx,
146f0 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
14700 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  g], &pNew->aSeg[
14710 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d  iIter++]);.    }
14720 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
14730 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20  Iter==nSeg );.. 
14740 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
14750 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
14760 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
14770 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f  iterators now po
14780 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68  ints .  ** to th
14790 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
147a0 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e   its segment. In
147b0 20 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69   this case initi
147c0 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20  alize the .  ** 
147d0 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20  aFirst[] array. 
147e0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
147f0 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72  has occurred, fr
14800 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  ee the iterator.
14810 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20    ** object and 
14820 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  set the output v
14830 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e  ariable to NULL.
14840 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
14850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14860 20 20 20 66 6f 72 28 69 49 74 65 72 3d 6e 53 6c     for(iIter=nSl
14870 6f 74 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69  ot-1; iIter>0; i
14880 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69  Iter--){.      i
14890 6e 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66  nt iEq;.      if
148a0 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c  ( (iEq = fts5Mul
148b0 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
148c0 70 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b  pNew, iIter)) ){
148d0 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
148e0 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70 4e 65  IterNext(p, &pNe
148f0 77 2d 3e 61 53 65 67 5b 69 45 71 5d 2c 20 30 29  w->aSeg[iEq], 0)
14900 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
14910 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
14920 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49  p, pNew, iEq, iI
14930 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
14940 20 20 7d 0a 20 20 20 20 66 74 73 35 41 73 73 65    }.    fts5Asse
14950 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
14960 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  (p, pNew);..    
14970 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45  if( pNew->bSkipE
14980 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74  mpty && fts5Mult
14990 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
149a0 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66  pNew) ){.      f
149b0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
149c0 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b  (p, pNew, 0, 0);
149d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
149e0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
149f0 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a  rFree(p, pNew);.
14a00 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a      *ppOut = 0;.
14a10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
14a20 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
14a30 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
14a40 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  OF or if an erro
14a50 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  r has occurred. 
14a60 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77  .** False otherw
14a70 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
14a80 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
14a90 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
14aa0 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  , Fts5MultiSegIt
14ab0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
14ac0 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
14ad0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
14ae0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
14af0 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3b  rst ].pLeaf==0);
14b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14b10 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
14b20 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
14b30 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
14b40 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  tly points.** to
14b50 2e 20 49 66 20 74 68 65 20 69 74 65 72 61 74 6f  . If the iterato
14b60 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20  r points to EOF 
14b70 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
14b80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
14b90 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20  .** results are 
14ba0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
14bb0 61 74 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c  atic i64 fts5Mul
14bc0 74 69 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  tiIterRowid(Fts5
14bd0 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
14be0 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
14bf0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
14c00 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
14c10 69 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a  irst ].pLeaf );.
14c20 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
14c30 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
14c40 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
14c50 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iRowid;.}../*.**
14c60 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74   Move the iterat
14c70 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
14c80 6e 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f  ntry at or follo
14c90 77 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a  wing iMatch..*/.
14ca0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14cb0 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f  MultiIterNextFro
14cc0 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
14cd0 70 2c 20 0a 20 20 46 74 73 35 4d 75 6c 74 69 53  p, .  Fts5MultiS
14ce0 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  egIter *pIter, .
14cf0 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a    i64 iMatch.){.
14d00 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
14d10 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
14d20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
14d30 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c  ext(p, pIter, 1,
14d40 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66   iMatch);.    if
14d50 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
14d60 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 20 62  of(p, pIter) ) b
14d70 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64  reak;.    iRowid
14d80 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
14d90 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
14da0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65    if( pIter->bRe
14db0 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d  v==0 && iRowid>=
14dc0 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
14dd0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62      if( pIter->b
14de0 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64  Rev!=0 && iRowid
14df0 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  <=iMatch ) break
14e00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
14e10 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
14e20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
14e30 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20  aining the term 
14e40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
14e50 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68  the .** entry th
14e60 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  at the iterator 
14e70 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
14e80 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63   to..*/.static c
14e90 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c  onst u8 *fts5Mul
14ea0 74 69 49 74 65 72 54 65 72 6d 28 46 74 73 35 4d  tiIterTerm(Fts5M
14eb0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
14ec0 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20  er, int *pn){.  
14ed0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d  Fts5SegIter *p =
14ee0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
14ef0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
14f00 69 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20  iFirst ];.  *pn 
14f10 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72  = p->term.n;.  r
14f20 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b  eturn p->term.p;
14f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14f40 20 74 72 75 65 20 69 66 20 74 68 65 20 63 68 75   true if the chu
14f50 6e 6b 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  nk iterator pass
14f60 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
14f70 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
14f80 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20 61 6e  at EOF. Or if an
14f90 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
14fa0 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f 74 68  dy occurred. Oth
14fb0 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 66  erwise, return f
14fc0 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alse..*/.static 
14fd0 69 6e 74 20 66 74 73 35 43 68 75 6e 6b 49 74 65  int fts5ChunkIte
14fe0 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
14ff0 70 2c 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72  p, Fts5ChunkIter
15000 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
15010 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74  rn (p->rc || pIt
15020 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d  er->pLeaf==0);.}
15030 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
15040 74 68 65 20 63 68 75 6e 6b 2d 69 74 65 72 61 74  the chunk-iterat
15050 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  or to the next c
15060 68 75 6e 6b 20 6f 66 20 64 61 74 61 20 74 6f 20  hunk of data to 
15070 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  read..*/.static 
15080 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74  void fts5ChunkIt
15090 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
150a0 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b 49 74   *p, Fts5ChunkIt
150b0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
150c0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 6e 52 65  sert( pIter->nRe
150d0 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20 29 3b 0a 20  m>=pIter->n );. 
150e0 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20 2d 3d 20   pIter->nRem -= 
150f0 70 49 74 65 72 2d 3e 6e 3b 0a 20 20 66 74 73 35  pIter->n;.  fts5
15100 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
15110 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74  r->pLeaf);.  pIt
15120 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
15130 20 70 49 74 65 72 2d 3e 70 20 3d 20 30 3b 0a 20   pIter->p = 0;. 
15140 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 52 65 6d   if( pIter->nRem
15150 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  >0 ){.    Fts5Da
15160 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 70  ta *pLeaf;.    p
15170 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64  Iter->iLeafRowid
15180 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20  ++;.    pLeaf = 
15190 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66  pIter->pLeaf = f
151a0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 70  ts5DataRead(p, p
151b0 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64  Iter->iLeafRowid
151c0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
151d0 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
151e0 3e 6e 20 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e  >n = MIN(pIter->
151f0 6e 52 65 6d 2c 20 70 4c 65 61 66 2d 3e 6e 2d 34  nRem, pLeaf->n-4
15200 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
15210 70 20 3d 20 70 4c 65 61 66 2d 3e 70 2b 34 3b 0a  p = pLeaf->p+4;.
15220 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
15230 2a 2a 20 49 6e 74 69 61 6c 69 7a 65 20 74 68 65  ** Intialize the
15240 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20   chunk iterator 
15250 74 6f 20 72 65 61 64 20 74 68 65 20 70 6f 73 69  to read the posi
15260 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 66  tion list data f
15270 6f 72 20 77 68 69 63 68 20 0a 2a 2a 20 74 68 65  or which .** the
15280 20 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61   size field is a
15290 74 20 6f 66 66 73 65 74 20 69 4f 66 66 20 6f 66  t offset iOff of
152a0 20 6c 65 61 66 20 70 4c 65 61 66 2e 20 0a 2a 2f   leaf pLeaf. .*/
152b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
152c0 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74 28 0a  5ChunkIterInit(.
152d0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
152e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152f0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
15300 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
15310 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c  s5SegIter *pSeg,
15320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15330 20 53 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   Segment iterato
15340 72 20 74 6f 20 72 65 61 64 20 70 6f 73 6c 69 73  r to read poslis
15350 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 74 73 35  t from */.  Fts5
15360 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74 65 72  ChunkIter *pIter
15370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15380 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6f  nitialize this o
15390 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74  bject */.){.  Ft
153a0 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
153b0 70 53 65 67 2d 3e 70 4c 65 61 66 3b 0a 20 20 69  pSeg->pLeaf;.  i
153c0 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e  nt iOff = pSeg->
153d0 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20  iLeafOffset;..  
153e0 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
153f0 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
15400 3b 0a 20 20 2f 2a 20 49 66 20 46 74 73 35 53 65  ;.  /* If Fts5Se
15410 67 49 74 65 72 2e 70 53 65 67 20 69 73 20 4e 55  gIter.pSeg is NU
15420 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 74  LL, then this it
15430 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 20  erator iterates 
15440 74 68 72 6f 75 67 68 20 64 61 74 61 0a 20 20 2a  through data.  *
15450 2a 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  * currently stor
15460 65 64 20 69 6e 20 61 20 68 61 73 68 20 74 61 62  ed in a hash tab
15470 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  le. In this case
15480 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 65 61   there is no lea
15490 66 2d 72 6f 77 69 64 0a 20 20 2a 2a 20 74 6f 20  f-rowid.  ** to 
154a0 63 61 6c 63 75 6c 61 74 65 2e 20 20 2a 2f 0a 20  calculate.  */. 
154b0 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 20   if( pSeg->pSeg 
154c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d  ){.    int iId =
154d0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65   pSeg->pSeg->iSe
154e0 67 69 64 3b 0a 20 20 20 20 69 36 34 20 72 6f 77  gid;.    i64 row
154f0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
15500 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 49  T_ROWID(pSeg->iI
15510 64 78 2c 20 69 49 64 2c 20 30 2c 20 70 53 65 67  dx, iId, 0, pSeg
15520 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ->iLeafPgno);.  
15530 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f    pIter->iLeafRo
15540 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20 7d  wid = rowid;.  }
15550 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 66 65  ..  fts5DataRefe
15560 72 65 6e 63 65 28 70 4c 65 61 66 29 3b 0a 20 20  rence(pLeaf);.  
15570 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
15580 4c 65 61 66 3b 0a 20 20 70 49 74 65 72 2d 3e 6e  Leaf;.  pIter->n
15590 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  Rem = pSeg->nPos
155a0 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d  ;.  pIter->n = M
155b0 49 4e 28 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f  IN(pLeaf->n - iO
155c0 66 66 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29  ff, pIter->nRem)
155d0 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70  ;.  pIter->p = p
155e0 4c 65 61 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a  Leaf->p + iOff;.
155f0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 3d 3d    if( pIter->n==
15600 30 20 29 7b 0a 20 20 20 20 66 74 73 35 43 68 75  0 ){.    fts5Chu
15610 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  nkIterNext(p, pI
15620 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
15630 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
15640 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 46 74  nkIterRelease(Ft
15650 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74  s5ChunkIter *pIt
15660 65 72 29 7b 0a 20 20 66 74 73 35 44 61 74 61 52  er){.  fts5DataR
15670 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
15680 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
15690 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a  Leaf = 0;.}.../*
156a0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
156b0 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f  ew segment-id fo
156c0 72 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  r the structure 
156d0 70 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77  pStruct. The new
156e0 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d   segment.** id m
156f0 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31  ust be between 1
15700 20 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75   and 65335 inclu
15710 73 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e  sive, and must n
15720 6f 74 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a  ot be used by .*
15730 2a 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20  * any currently 
15740 65 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74  existing segment
15750 2e 20 49 66 20 61 20 66 72 65 65 20 73 65 67 6d  . If a free segm
15760 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65  ent id cannot be
15770 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
15780 45 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  E_FULL is return
15790 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
157a0 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
157b0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
157c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
157d0 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72  o-op. 0 is .** r
157e0 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20  eturned in this 
157f0 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  case..*/.static 
15800 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  int fts5Allocate
15810 53 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20  Segid(Fts5Index 
15820 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  *p, Fts5Structur
15830 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
15840 6e 74 20 69 3b 0a 20 20 75 33 32 20 69 53 65 67  nt i;.  u32 iSeg
15850 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  id = 0;..  if( p
15860 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15870 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  ){.    if( pStru
15880 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46 54  ct->nSegment>=FT
15890 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29  S5_MAX_SEGMENT )
158a0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
158b0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
158c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68   }else{.      wh
158d0 69 6c 65 28 20 69 53 65 67 69 64 3d 3d 30 20 29  ile( iSegid==0 )
158e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c  {.        int iL
158f0 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
15900 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
15910 6e 65 73 73 28 73 69 7a 65 6f 66 28 75 33 32 29  ness(sizeof(u32)
15920 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64  , (void*)&iSegid
15930 29 3b 0a 20 20 20 20 20 20 20 20 69 53 65 67 69  );.        iSegi
15940 64 20 3d 20 28 69 53 65 67 69 64 20 25 20 28 28  d = (iSegid % ((
15950 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
15960 44 5f 42 29 20 2d 20 32 29 29 20 2b 20 31 3b 0a  D_B) - 2)) + 1;.
15970 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15980 69 53 65 67 69 64 3e 30 20 26 26 20 69 53 65 67  iSegid>0 && iSeg
15990 69 64 3c 3d 36 35 35 33 35 20 29 3b 0a 20 20 20  id<=65535 );.   
159a0 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
159b0 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
159c0 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
159d0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 53            for(iS
159e0 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
159f0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
15a00 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
15a10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15a20 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74 2d  iSegid==pStruct-
15a30 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
15a40 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20  eg[iSeg].iSegid 
15a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
15a60 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 20 20 20   iSegid = 0;.   
15a70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
15a90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15aa0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 69 6e   }..  return (in
15ab0 74 29 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a  t)iSegid;.}../*.
15ac0 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64  ** Discard all d
15ad0 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ata currently ca
15ae0 63 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68  ched in the hash
15af0 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  -tables..*/.stat
15b00 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
15b10 78 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73  xDiscardData(Fts
15b20 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73  5Index *p){.  as
15b30 73 65 72 74 28 20 70 2d 3e 61 70 48 61 73 68 20  sert( p->apHash 
15b40 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  || p->nPendingDa
15b50 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ta==0 );.  if( p
15b60 2d 3e 61 70 48 61 73 68 20 29 7b 0a 20 20 20 20  ->apHash ){.    
15b70 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
15b80 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
15b90 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
15ba0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f   for(i=0; i<=pCo
15bb0 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
15bc0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
15bd0 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
15be0 70 2d 3e 61 70 48 61 73 68 5b 69 5d 29 3b 0a 20  p->apHash[i]);. 
15bf0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 50 65 6e     }.    p->nPen
15c00 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20  dingData = 0;.  
15c10 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
15c20 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
15c30 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74  e prefix, in byt
15c40 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20  es, that buffer 
15c50 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72  (nNew/pNew) shar
15c60 65 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65  es.** with buffe
15c70 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a  r (nOld/pOld)..*
15c80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
15c90 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
15ca0 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e  .  int nOld, con
15cb0 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69  st u8 *pOld,.  i
15cc0 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75  nt nNew, const u
15cd0 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74  8 *pNew.){.  int
15ce0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74   i;.  assert( ft
15cf0 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4f  s5BlobCompare(pO
15d00 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e 65 77 2c 20  ld, nOld, pNew, 
15d10 6e 4e 65 77 29 3c 30 20 29 3b 0a 20 20 66 6f 72  nNew)<0 );.  for
15d20 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
15d30 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  +){.    if( pOld
15d40 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62  [i]!=pNew[i] ) b
15d50 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
15d60 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn i;.}../*.** I
15d70 66 20 61 6e 20 22 6e 45 6d 70 74 79 22 20 72 65  f an "nEmpty" re
15d80 63 6f 72 64 20 6d 75 73 74 20 62 65 20 77 72 69  cord must be wri
15d90 74 74 65 6e 20 74 6f 20 74 68 65 20 62 2d 74 72  tten to the b-tr
15da0 65 65 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65  ee before the ne
15db0 78 74 0a 2a 2a 20 74 65 72 6d 2c 20 77 72 69 74  xt.** term, writ
15dc0 65 20 69 74 20 6e 6f 77 2e 20 0a 2a 2f 0a 73 74  e it now. .*/.st
15dd0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
15de0 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 46  iteBtreeNEmpty(F
15df0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
15e00 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
15e10 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72 69  ter){.  if( pWri
15e20 74 65 72 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a 20  ter->nEmpty ){. 
15e30 20 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30     int bFlag = 0
15e40 3b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  ;.    Fts5PageWr
15e50 69 74 65 72 20 2a 70 50 67 3b 0a 20 20 20 20 70  iter *pPg;.    p
15e60 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  Pg = &pWriter->a
15e70 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 20 20 69  Writer[1];.    i
15e80 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  f( pWriter->nEmp
15e90 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ty>=FTS5_MIN_DLI
15ea0 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  DX_SIZE ){.     
15eb0 20 69 36 34 20 69 4b 65 79 20 3d 20 46 54 53 35   i64 iKey = FTS5
15ec0 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57  _DOCLIST_IDX_ROW
15ed0 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 57  ID(.          pW
15ee0 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
15ef0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 0a 20  iter->iSegid, . 
15f00 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72           pWriter
15f10 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
15f20 6f 20 2d 20 31 20 2d 20 70 57 72 69 74 65 72 2d  o - 1 - pWriter-
15f30 3e 6e 45 6d 70 74 79 0a 20 20 20 20 20 20 29 3b  >nEmpty.      );
15f40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15f50 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2e 6e  Writer->cdlidx.n
15f60 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  >0 );.      fts5
15f70 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4b 65  DataWrite(p, iKe
15f80 79 2c 20 70 57 72 69 74 65 72 2d 3e 63 64 6c 69  y, pWriter->cdli
15f90 64 78 2e 70 2c 20 70 57 72 69 74 65 72 2d 3e 63  dx.p, pWriter->c
15fa0 64 6c 69 64 78 2e 6e 29 3b 0a 20 20 20 20 20 20  dlidx.n);.      
15fb0 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d  bFlag = 1;.    }
15fc0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
15fd0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
15fe0 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 62  rc, &pPg->buf, b
15ff0 46 6c 61 67 29 3b 0a 20 20 20 20 66 74 73 35 42  Flag);.    fts5B
16000 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
16010 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e  t(&p->rc, &pPg->
16020 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e 6e 45  buf, pWriter->nE
16030 6d 70 74 79 29 3b 0a 20 20 20 20 70 57 72 69 74  mpty);.    pWrit
16040 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a  er->nEmpty = 0;.
16050 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65    }..  /* Whethe
16060 72 20 6f 72 20 6e 6f 74 20 69 74 20 77 61 73 20  r or not it was 
16070 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2c  written to disk,
16080 20 7a 65 72 6f 20 74 68 65 20 64 6f 63 6c 69 73   zero the doclis
16090 74 20 69 6e 64 65 78 20 61 74 20 74 68 69 73 0a  t index at this.
160a0 20 20 2a 2a 20 70 6f 69 6e 74 20 2a 2f 0a 20 20    ** point */.  
160b0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
160c0 72 5a 65 72 6f 28 26 70 57 72 69 74 65 72 2d 3e  rZero(&pWriter->
160d0 63 64 6c 69 64 78 29 3b 0a 20 20 70 57 72 69 74  cdlidx);.  pWrit
160e0 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61  er->bDlidxPrevVa
160f0 6c 69 64 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74  lid = 0;.}..stat
16100 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
16110 65 42 74 72 65 65 47 72 6f 77 28 46 74 73 35 49  eBtreeGrow(Fts5I
16120 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
16130 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
16140 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
16150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16160 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
16170 61 4e 65 77 3b 0a 20 20 20 20 46 74 73 35 50 61  aNew;.    Fts5Pa
16180 67 65 57 72 69 74 65 72 20 2a 70 4e 65 77 3b 0a  geWriter *pNew;.
16190 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 73      int nNew = s
161a0 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72  izeof(Fts5PageWr
161b0 69 74 65 72 29 20 2a 20 28 70 57 72 69 74 65 72  iter) * (pWriter
161c0 2d 3e 6e 57 72 69 74 65 72 2b 31 29 3b 0a 0a 20  ->nWriter+1);.. 
161d0 20 20 20 61 4e 65 77 20 3d 20 28 46 74 73 35 50     aNew = (Fts5P
161e0 61 67 65 57 72 69 74 65 72 2a 29 73 71 6c 69 74  ageWriter*)sqlit
161f0 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69 74  e3_realloc(pWrit
16200 65 72 2d 3e 61 57 72 69 74 65 72 2c 20 6e 4e 65  er->aWriter, nNe
16210 77 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  w);.    if( aNew
16220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
16230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
16240 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  M;.      return;
16250 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 65 77  .    }..    pNew
16260 20 3d 20 26 61 4e 65 77 5b 70 57 72 69 74 65 72   = &aNew[pWriter
16270 2d 3e 6e 57 72 69 74 65 72 5d 3b 0a 20 20 20 20  ->nWriter];.    
16280 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20  memset(pNew, 0, 
16290 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57  sizeof(Fts5PageW
162a0 72 69 74 65 72 29 29 3b 0a 20 20 20 20 70 4e 65  riter));.    pNe
162b0 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  w->pgno = 1;.   
162c0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
162d0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
162e0 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29 3b 0a  &pNew->buf, 1);.
162f0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 57  .    pWriter->nW
16300 72 69 74 65 72 2b 2b 3b 0a 20 20 20 20 70 57 72  riter++;.    pWr
16310 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20  iter->aWriter = 
16320 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  aNew;.  }.}../*.
16330 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
16340 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
16350 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74  leaf page except
16360 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20   the first that 
16370 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c  contains.** at l
16380 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41  east one term. A
16390 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70  rgument (nTerm/p
163a0 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c  Term) is the spl
163b0 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20  it-key - a term 
163c0 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65  that.** is large
163d0 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73  r than all terms
163e0 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c   written to earl
163f0 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20  ier leaves, and 
16400 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73  equal to or.** s
16410 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
16420 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  first term on th
16430 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a  e new leaf..**.*
16440 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
16450 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
16460 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
16470 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20  ts5Index.rc. If 
16480 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20  an error.** has 
16490 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
164a0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
164b0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
164c0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
164d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
164e0 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
164f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16510 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
16520 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
16530 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16540 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
16550 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
16560 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
16570 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
16580 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65       /* First te
16590 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a  rm on new page *
165a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65 69 67  /.){.  int iHeig
165b0 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69 67 68  ht;.  for(iHeigh
165c0 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68 74 2b  t=1; 1; iHeight+
165d0 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65  +){.    Fts5Page
165e0 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b 0a 0a  Writer *pPage;..
165f0 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3e      if( iHeight>
16600 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65  =pWriter->nWrite
16610 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  r ){.      fts5W
16620 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c  riteBtreeGrow(p,
16630 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
16640 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
16650 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
16660 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
16670 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67 68 74  >aWriter[iHeight
16680 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
16690 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c 20  eBtreeNEmpty(p, 
166a0 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20 20 69  pWriter);..    i
166b0 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
166c0 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
166d0 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  z ){.      /* pP
166e0 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69 74  age will be writ
166f0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ten to disk. The
16700 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77 72   term will be wr
16710 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 20  itten into the. 
16720 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6f       ** parent o
16730 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20 20  f pPage.  */.   
16740 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
16750 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
16760 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 57  ID(.          pW
16770 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
16780 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 48  iter->iSegid, iH
16790 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70 67  eight, pPage->pg
167a0 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  no.      );.    
167b0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
167c0 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
167d0 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
167e0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  buf.n);.      ft
167f0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
16800 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20  age->buf);.     
16810 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
16820 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a 20  &pPage->term);. 
16830 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
16840 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
16850 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
16860 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29   pPage[-1].pgno)
16870 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
16880 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  gno++;.    }else
16890 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65  {.      int nPre
168a0 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
168b0 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72  press(pPage->ter
168c0 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  m.n, pPage->term
168d0 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  .p, nTerm, pTerm
168e0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
168f0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
16900 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
16910 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20 20  buf, nPre+2);.  
16920 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
16930 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
16940 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
16950 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20 20  nTerm-nPre);.   
16960 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
16970 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
16980 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
16990 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b 6e  rm-nPre, pTerm+n
169a0 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  Pre);.      fts5
169b0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
169c0 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
169d0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
169e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
169f0 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
16a00 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
16a10 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73  reeNoTerm(.  Fts
16a20 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16a40 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
16a50 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
16a60 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
16a70 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
16a80 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
16a90 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
16aa0 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
16ab0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72 6f   ){.    /* No ro
16ac0 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67  wids on this pag
16ad0 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30 78 30  e. Append an 0x0
16ae0 30 20 62 79 74 65 20 74 6f 20 74 68 65 20 63 75  0 byte to the cu
16af0 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64 6f  rrent .    ** do
16b00 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20  clist-index */. 
16b10 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e     if( pWriter->
16b20 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 3d  bDlidxPrevValid=
16b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  =0 ){.      i64 
16b40 69 52 6f 77 69 64 20 3d 20 70 57 72 69 74 65 72  iRowid = pWriter
16b50 2d 3e 69 50 72 65 76 52 6f 77 69 64 3b 0a 20 20  ->iPrevRowid;.  
16b60 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
16b70 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
16b80 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  t(&p->rc, &pWrit
16b90 65 72 2d 3e 63 64 6c 69 64 78 2c 20 69 52 6f 77  er->cdlidx, iRow
16ba0 69 64 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74  id);.      pWrit
16bb0 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61  er->bDlidxPrevVa
16bc0 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  lid = 1;.      p
16bd0 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78 50 72  Writer->iDlidxPr
16be0 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  ev = iRowid;.   
16bf0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
16c00 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
16c10 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57  rint(&p->rc, &pW
16c20 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c 20 30  riter->cdlidx, 0
16c30 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72  );.  }.  pWriter
16c40 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 2f  ->nEmpty++;.}../
16c50 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77 69  *.** Rowid iRowi
16c60 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  d has just been 
16c70 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
16c80 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
16c90 65 2e 20 41 73 20 69 74 20 69 73 0a 2a 2a 20 74  e. As it is.** t
16ca0 68 65 20 66 69 72 73 74 20 6f 6e 20 69 74 73 20  he first on its 
16cb0 70 61 67 65 2c 20 61 70 70 65 6e 64 20 61 6e 20  page, append an 
16cc0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75 72  entry to the cur
16cd0 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64  rent doclist-ind
16ce0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
16cf0 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  id fts5WriteDlid
16d00 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49  xAppend(.  Fts5I
16d10 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
16d20 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
16d30 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  er, .  i64 iRowi
16d40 64 0a 29 7b 0a 20 20 69 36 34 20 69 56 61 6c 3b  d.){.  i64 iVal;
16d50 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
16d60 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64 20  bDlidxPrevValid 
16d70 29 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20 69 52  ){.    iVal = iR
16d80 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e  owid - pWriter->
16d90 69 44 6c 69 64 78 50 72 65 76 3b 0a 20 20 7d 65  iDlidxPrev;.  }e
16da0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
16db0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
16dc0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
16dd0 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c  pWriter->cdlidx,
16de0 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 56   iRowid);.    iV
16df0 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71  al = 1;.  }.  sq
16e00 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
16e10 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
16e20 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 63 64  rc, &pWriter->cd
16e30 6c 69 64 78 2c 20 69 56 61 6c 29 3b 0a 20 20 70  lidx, iVal);.  p
16e40 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72  Writer->bDlidxPr
16e50 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 70  evValid = 1;.  p
16e60 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78 50 72  Writer->iDlidxPr
16e70 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a  ev = iRowid;.}..
16e80 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
16e90 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46  WriteFlushLeaf(F
16ea0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
16eb0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
16ec0 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ter){.  static c
16ed0 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d  onst u8 zero[] =
16ee0 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30   { 0x00, 0x00, 0
16ef0 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46  x00, 0x00 };.  F
16f00 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
16f10 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
16f20 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 69  >aWriter[0];.  i
16f30 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 69 66  64 iRowid;..  if
16f40 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
16f50 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
16f60 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61     /* No term wa
16f70 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
16f80 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  s page. */.    a
16f90 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65  ssert( 0==fts5Ge
16fa0 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
16fb0 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66 74  .p[2]) );.    ft
16fc0 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
16fd0 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  rm(p, pWriter);.
16fe0 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
16ff0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
17000 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a 20   to the db. */. 
17010 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53   iRowid = FTS5_S
17020 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72  EGMENT_ROWID(pWr
17030 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69  iter->iIdx, pWri
17040 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20  ter->iSegid, 0, 
17050 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
17060 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
17070 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e   iRowid, pPage->
17080 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75  buf.p, pPage->bu
17090 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  f.n);..  /* Init
170a0 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20  ialize the next 
170b0 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42  page. */.  fts5B
170c0 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65  ufferZero(&pPage
170d0 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75  ->buf);.  fts5Bu
170e0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
170f0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
17100 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20  uf, 4, zero);.  
17110 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a  pPage->pgno++;..
17120 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68    /* Increase th
17130 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e  e leaves written
17140 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57   counter */.  pW
17150 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74  riter->nLeafWrit
17160 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65  ten++;..  /* The
17170 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20   new leaf holds 
17180 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69  no terms or rowi
17190 64 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  ds */.  pWriter-
171a0 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
171b0 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  e = 1;.  pWriter
171c0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
171d0 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  age = 1;.}../*.*
171e0 2a 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54  * Append term pT
171f0 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65  erm/nTerm to the
17200 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77   segment being w
17210 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72  ritten by the wr
17220 69 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61  iter passed.** a
17230 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
17240 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
17250 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
17260 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
17270 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
17280 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
17290 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
172a0 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
172b0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
172c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
172d0 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
172e0 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
172f0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
17300 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
17310 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f  .  int nTerm, co
17320 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29  nst u8 *pTerm .)
17330 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  {.  int nPrefix;
17340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17350 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
17360 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69  prefix compressi
17370 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20  on for term */. 
17380 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
17390 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
173a0 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a  r->aWriter[0];..
173b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
173c0 3e 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61  >buf.n==0 || pPa
173d0 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20  ge->buf.n>4 );. 
173e0 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
173f0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a  n==0 ){.    /* Z
17400 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 74 65  ero the first te
17410 72 6d 20 61 6e 64 20 66 69 72 73 74 20 64 6f 63  rm and first doc
17420 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20  id fields */.   
17430 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
17440 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30   zero[] = { 0x00
17450 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
17460 30 30 20 7d 3b 0a 20 20 20 20 66 74 73 35 42 75  00 };.    fts5Bu
17470 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
17480 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
17490 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20  uf, 4, zero);.  
174a0 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65    assert( pWrite
174b0 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
174c0 61 67 65 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  age );.  }.  if(
174d0 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
174e0 0a 20 20 0a 20 20 69 66 28 20 70 57 72 69 74 65  .  .  if( pWrite
174f0 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
17500 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70  age ){.    /* Up
17510 64 61 74 65 20 74 68 65 20 22 66 69 72 73 74 20  date the "first 
17520 74 65 72 6d 22 20 66 69 65 6c 64 20 6f 66 20 74  term" field of t
17530 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20  he page header. 
17540 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
17550 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d  Page->buf.p[2]==
17560 30 20 26 26 20 70 50 61 67 65 2d 3e 62 75 66 2e  0 && pPage->buf.
17570 70 5b 33 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66  p[3]==0 );.    f
17580 74 73 35 50 75 74 55 31 36 28 26 70 50 61 67 65  ts5PutU16(&pPage
17590 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67  ->buf.p[2], pPag
175a0 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 6e  e->buf.n);.    n
175b0 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20  Prefix = 0;.    
175c0 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21  if( pPage->pgno!
175d0 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =1 ){.      /* T
175e0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
175f0 20 74 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20   term on a leaf 
17600 74 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20  that is not the 
17610 6c 65 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e  leftmost leaf in
17620 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65  .      ** the se
17630 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e  gment b-tree. In
17640 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
17650 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 64   necessary to ad
17660 64 20 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20  d a term to.    
17670 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20    ** the b-tree 
17680 68 69 65 72 61 72 63 68 79 20 74 68 61 74 20 69  hierarchy that i
17690 73 20 28 61 29 20 6c 61 72 67 65 72 20 74 68 61  s (a) larger tha
176a0 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65  n the largest te
176b0 72 6d 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  rm .      ** alr
176c0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
176d0 74 68 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20  the segment and 
176e0 28 62 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  (b) smaller than
176f0 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20   or equal to.   
17700 20 20 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e     ** this term.
17710 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
17720 20 61 20 70 72 65 66 69 78 20 6f 66 20 28 70 54   a prefix of (pT
17730 65 72 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20  erm/nTerm) that 
17740 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  is one.      ** 
17750 62 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e  byte longer than
17760 20 74 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65   the longest pre
17770 66 69 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  fix (pTerm/nTerm
17780 29 20 73 68 61 72 65 73 20 77 69 74 68 20 74 68  ) shares with th
17790 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69  e.      ** previ
177a0 6f 75 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20  ous term. .     
177b0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75   **.      ** Usu
177c0 61 6c 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f  ally, the previo
177d0 75 73 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c  us term is avail
177e0 61 62 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74  able in pPage->t
177f0 65 72 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69  erm. The excepti
17800 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69  on.      ** is i
17810 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
17820 72 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e  rst term written
17830 20 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   in an increment
17840 61 6c 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20  al-merge step.. 
17850 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
17860 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
17870 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76  s term is not av
17880 61 69 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74  ailable, so just
17890 20 77 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a   write a.      *
178a0 2a 20 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d  * copy of (pTerm
178b0 2f 6e 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65  /nTerm) into the
178c0 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68   parent node. Th
178d0 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20  is is slightly. 
178e0 20 20 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69       ** ineffici
178f0 65 6e 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63  ent, but still c
17900 6f 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20  orrect.  */.    
17910 20 20 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b    int n = nTerm;
17920 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
17930 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20  ->term.n ){.    
17940 20 20 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35      n = 1 + fts5
17950 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
17960 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50  Page->term.n, pP
17970 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65  age->term.p, nTe
17980 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
17990 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72    }.      fts5Wr
179a0 69 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20  iteBtreeTerm(p, 
179b0 70 57 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72  pWriter, n, pTer
179c0 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  m);.      pPage 
179d0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
179e0 74 65 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20  ter[0];.    }.  
179f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66  }else{.    nPref
17a00 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  ix = fts5PrefixC
17a10 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74  ompress(pPage->t
17a20 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65  erm.n, pPage->te
17a30 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65  rm.p, nTerm, pTe
17a40 72 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  rm);.    fts5Buf
17a50 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
17a60 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
17a70 62 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20  buf, nPrefix);. 
17a80 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
17a90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
17aa0 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c  tes of new data,
17ab0 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64   then the term d
17ac0 61 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ata itself.  ** 
17ad0 74 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  to the page. */.
17ae0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
17af0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
17b00 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
17b10 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a  erm - nPrefix);.
17b20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
17b30 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
17b40 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
17b50 6d 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54  m - nPrefix, &pT
17b60 65 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a  erm[nPrefix]);..
17b70 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
17b80 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74  Fts5PageWriter.t
17b90 65 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  erm field. */.  
17ba0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
17bb0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65  ->rc, &pPage->te
17bc0 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
17bd0 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  );.  pWriter->bF
17be0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
17bf0 20 30 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e   0;..  pWriter->
17c00 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
17c10 65 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72  e = 0;.  pWriter
17c20 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
17c30 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 2f  oclist = 1;..  /
17c40 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
17c50 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 66 75   leaf page is fu
17c60 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20  ll, flush it to 
17c70 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70  disk. */.  if( p
17c80 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e  Page->buf.n>=p->
17c90 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
17ca0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c  .    fts5WriteFl
17cb0 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
17cc0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
17cd0 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63 69 64  * Append a docid
17ce0 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   and position-li
17cf0 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f  st size field to
17d00 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74   the writers out
17d10 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  put. .*/.static 
17d20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
17d30 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73  pendRowid(.  Fts
17d40 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
17d50 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
17d60 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77  iter,.  i64 iRow
17d70 69 64 2c 0a 20 20 69 6e 74 20 6e 50 6f 73 0a 29  id,.  int nPos.)
17d80 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
17d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17da0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
17db0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
17dc0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20  ->aWriter[0];.. 
17dd0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
17de0 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
17df0 20 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74   docid written t
17e00 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20  o the page, set 
17e10 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 6f 63 69  the .    ** doci
17e20 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  d-pointer in the
17e30 20 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c   page-header. Al
17e40 73 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75  so append a valu
17e50 65 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20  e to the dlidx. 
17e60 20 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e     ** buffer, in
17e70 20 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d   case a doclist-
17e80 69 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65  index is require
17e90 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
17ea0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
17eb0 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
17ec0 20 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50     fts5PutU16(pP
17ed0 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67  age->buf.p, pPag
17ee0 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20  e->buf.n);.     
17ef0 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41   fts5WriteDlidxA
17f00 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72  ppend(p, pWriter
17f10 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , iRowid);.    }
17f20 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ..    /* Write t
17f30 68 65 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 20  he docid. */.   
17f40 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
17f50 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
17f60 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62  st || pWriter->b
17f70 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
17f80 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
17f90 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
17fa0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
17fb0 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20  >buf, iRowid);. 
17fc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17fd0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c  assert( p->rc ||
17fe0 20 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d   iRowid>pWriter-
17ff0 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20  >iPrevRowid );. 
18000 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
18010 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
18020 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
18030 20 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65   iRowid - pWrite
18040 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a  r->iPrevRowid);.
18050 20 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65      }.    pWrite
18060 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20  r->iPrevRowid = 
18070 69 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69  iRowid;.    pWri
18080 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
18090 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20  InDoclist = 0;. 
180a0 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
180b0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
180c0 30 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66  0;..    fts5Buff
180d0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
180e0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
180f0 75 66 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20  uf, nPos);..    
18100 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
18110 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  >=p->pConfig->pg
18120 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  sz ){.      fts5
18130 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
18140 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
18150 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73  }.  }.}..#if 0.s
18160 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
18170 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
18180 74 49 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65  tInt(.  Fts5Inde
18190 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
181a0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
181b0 0a 20 20 69 6e 74 20 69 56 61 6c 0a 29 7b 0a 20  .  int iVal.){. 
181c0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
181d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
181e0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
181f0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  ge = &pWriter->a
18200 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 20 20 66  Writer[0];.    f
18210 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
18220 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
18230 50 61 67 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29  Page->buf, iVal)
18240 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
18250 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
18260 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
18270 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
18280 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
18290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
182a0 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 76 6f 69  ndif..static voi
182b0 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
182c0 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20  dPoslistData(.  
182d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
182e0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
182f0 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73  pWriter, .  cons
18300 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20  t u8 *aData, .  
18310 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46  int nData.){.  F
18320 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
18330 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
18340 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 63  >aWriter[0];.  c
18350 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61  onst u8 *a = aDa
18360 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44  ta;.  int n = nD
18370 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ata;.  .  assert
18380 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  ( p->pConfig->pg
18390 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  sz>0 );.  while(
183a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
183b0 4b 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75 66  K && (pPage->buf
183c0 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e  .n + n)>=p->pCon
183d0 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
183e0 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70   int nReq = p->p
183f0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70  Config->pgsz - p
18400 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 20 20 20  Page->buf.n;.   
18410 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a   int nCopy = 0;.
18420 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70 79      while( nCopy
18430 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20 69  <nReq ){.      i
18440 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  64 dummy;.      
18450 6e 43 6f 70 79 20 2b 3d 20 67 65 74 56 61 72 69  nCopy += getVari
18460 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75  nt(&a[nCopy], (u
18470 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20  64*)&dummy);.   
18480 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
18490 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
184a0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
184b0 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20   nCopy, a);.    
184c0 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  a += nCopy;.    
184d0 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  n -= nCopy;.    
184e0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
184f0 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
18500 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
18510 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
18520 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
18530 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
18540 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  , a);.  }.}..sta
18550 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
18560 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65  teAppendZerobyte
18570 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
18580 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
18590 72 69 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75  riter){.  fts5Bu
185a0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
185b0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
185c0 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75  r->aWriter[0].bu
185d0 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
185e0 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63  Flush any data c
185f0 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69  ached by the wri
18600 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ter object to th
18610 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65  e database. Free
18620 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   any.** allocati
18630 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
18640 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a  ith the writer..
18650 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
18660 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a  ts5WriteFinish(.
18670 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
18680 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
18690 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
186a0 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
186b0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ect */.  int *pn
186c0 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
186d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
186e0 20 48 65 69 67 68 74 20 6f 66 20 74 68 65 20 62   Height of the b
186f0 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  -tree */.  int *
18700 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20  pnLeaf          
18710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
18720 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  T: Number of lea
18730 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65  f pages in b-tre
18740 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
18750 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
18760 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
18770 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
18780 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d  Leaf = &pWriter-
18790 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 20  >aWriter[0];.   
187a0 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f   if( pLeaf->pgno
187b0 3d 3d 31 20 26 26 20 70 4c 65 61 66 2d 3e 62 75  ==1 && pLeaf->bu
187c0 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
187d0 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  *pnLeaf = 0;.   
187e0 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 30     *pnHeight = 0
187f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18800 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75     if( pLeaf->bu
18810 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 20  f.n>4 ){.       
18820 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
18830 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
18840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
18850 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e  pnLeaf = pLeaf->
18860 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 20 20 69 66  pgno-1;.      if
18870 28 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74  ( pWriter->nWrit
18880 65 72 3d 3d 31 20 26 26 20 70 57 72 69 74 65 72  er==1 && pWriter
18890 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d  ->nEmpty>=FTS5_M
188a0 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b  IN_DLIDX_SIZE ){
188b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69  .        fts5Wri
188c0 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c 20 70  teBtreeGrow(p, p
188d0 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Writer);.      }
188e0 0a 20 20 20 20 20 20 69 66 28 20 70 57 72 69 74  .      if( pWrit
188f0 65 72 2d 3e 6e 57 72 69 74 65 72 3e 31 20 29 7b  er->nWriter>1 ){
18900 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69  .        fts5Wri
18910 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c  teBtreeNEmpty(p,
18920 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
18930 20 7d 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67   }.      *pnHeig
18940 68 74 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 57  ht = pWriter->nW
18950 72 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 66 6f  riter;..      fo
18960 72 28 69 3d 31 3b 20 69 3c 70 57 72 69 74 65 72  r(i=1; i<pWriter
18970 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b  ->nWriter; i++){
18980 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 61 67  .        Fts5Pag
18990 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26  eWriter *pPg = &
189a0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
189b0 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73  [i];.        fts
189c0 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
189d0 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
189e0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
189f0 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
18a00 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
18a10 20 70 50 67 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20   pPg->pgno), .  
18a20 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 62            pPg->b
18a30 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e  uf.p, pPg->buf.n
18a40 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
18a50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
18a60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74  for(i=0; i<pWrit
18a70 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b  er->nWriter; i++
18a80 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57  ){.    Fts5PageW
18a90 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57  riter *pPg = &pW
18aa0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69  riter->aWriter[i
18ab0 5d 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ];.    fts5Buffe
18ac0 72 46 72 65 65 28 26 70 50 67 2d 3e 74 65 72 6d  rFree(&pPg->term
18ad0 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
18ae0 72 46 72 65 65 28 26 70 50 67 2d 3e 62 75 66 29  rFree(&pPg->buf)
18af0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
18b00 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 57  free(pWriter->aW
18b10 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  riter);.  sqlite
18b20 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
18b30 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78  &pWriter->cdlidx
18b40 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
18b50 64 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  d fts5WriteInit(
18b60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
18b70 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
18b80 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
18b90 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65  nt iIdx, int iSe
18ba0 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28  gid.){.  memset(
18bb0 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  pWriter, 0, size
18bc0 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
18bd0 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  ));.  pWriter->i
18be0 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57  Idx = iIdx;.  pW
18bf0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  riter->iSegid = 
18c00 69 53 65 67 69 64 3b 0a 0a 20 20 70 57 72 69 74  iSegid;..  pWrit
18c10 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 28 46  er->aWriter = (F
18c20 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29 66  ts5PageWriter*)f
18c30 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 73  ts5IdxMalloc(p,s
18c40 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72  izeof(Fts5PageWr
18c50 69 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70 57  iter));.  if( pW
18c60 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 3d 3d  riter->aWriter==
18c70 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 57  0 ) return;.  pW
18c80 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d  riter->nWriter =
18c90 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61   1;.  pWriter->a
18ca0 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d  Writer[0].pgno =
18cb0 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
18cc0 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
18cd0 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  = 1;.}..static v
18ce0 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69  oid fts5WriteIni
18cf0 74 46 6f 72 41 70 70 65 6e 64 28 0a 20 20 46 74  tForAppend(.  Ft
18d00 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
18d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d20 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
18d30 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
18d40 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
18d50 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
18d60 74 65 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ter to initializ
18d70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  e */.  int iIdx,
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
18da0 73 65 67 6d 65 6e 74 20 69 73 20 61 20 70 61 72  segment is a par
18db0 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53 74  t of */.  Fts5St
18dc0 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
18dd0 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
18de0 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f 20 61  ment object to a
18df0 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  ppend to */.){. 
18e00 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70 53 65   int nByte = pSe
18e10 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73 69 7a  g->nHeight * siz
18e20 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
18e30 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 57  er);.  memset(pW
18e40 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
18e50 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
18e60 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64  ;.  pWriter->iId
18e70 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57 72 69  x = iIdx;.  pWri
18e80 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 70 53  ter->iSegid = pS
18e90 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 70 57  eg->iSegid;.  pW
18ea0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d  riter->aWriter =
18eb0 20 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72   (Fts5PageWriter
18ec0 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
18ed0 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 57 72  p, nByte);.  pWr
18ee0 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20  iter->nWriter = 
18ef0 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3b 0a 0a  pSeg->nHeight;..
18f00 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
18f10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
18f20 74 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20  t pgno = 1;.    
18f30 69 6e 74 20 69 3b 0a 20 20 20 20 70 57 72 69 74  int i;.    pWrit
18f40 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70  er->aWriter[0].p
18f50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
18f60 4c 61 73 74 2b 31 3b 0a 20 20 20 20 66 6f 72 28  Last+1;.    for(
18f70 69 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d  i=pSeg->nHeight-
18f80 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
18f90 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
18fa0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
18fb0 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64  WID(pWriter->iId
18fc0 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  x, pWriter->iSeg
18fd0 69 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a 20 20  id, i, pgno);.  
18fe0 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
18ff0 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74  er *pPg = &pWrit
19000 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a  er->aWriter[i];.
19010 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20        pPg->pgno 
19020 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74  = pgno;.      ft
19030 73 35 44 61 74 61 42 75 66 66 65 72 28 70 2c 20  s5DataBuffer(p, 
19040 26 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f 77 69  &pPg->buf, iRowi
19050 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  d);.      if( p-
19060 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19070 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 4e 6f  {.        Fts5No
19080 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20 20  deIter ss;.     
19090 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49     fts5NodeIterI
190a0 6e 69 74 28 70 50 67 2d 3e 62 75 66 2e 70 2c 20  nit(pPg->buf.p, 
190b0 70 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73 73 29  pPg->buf.n, &ss)
190c0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
190d0 20 73 73 2e 61 44 61 74 61 20 29 20 66 74 73 35   ss.aData ) fts5
190e0 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
190f0 3e 72 63 2c 20 26 73 73 29 3b 0a 20 20 20 20 20  >rc, &ss);.     
19100 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
19110 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 74  (&p->rc, &pPg->t
19120 65 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c 20  erm, ss.term.n, 
19130 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20  ss.term.p);.    
19140 20 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e 69 43      pgno = ss.iC
19150 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20 66 74  hild;.        ft
19160 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26  s5NodeIterFree(&
19170 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ss);.      }.   
19180 20 7d 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d   }.    if( pSeg-
19190 3e 6e 48 65 69 67 68 74 3d 3d 31 20 29 7b 0a 20  >nHeight==1 ){. 
191a0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 45       pWriter->nE
191b0 6d 70 74 79 20 3d 20 70 53 65 67 2d 3e 70 67 6e  mpty = pSeg->pgn
191c0 6f 4c 61 73 74 2d 31 3b 0a 20 20 20 20 7d 0a 20  oLast-1;.    }. 
191d0 20 20 20 61 73 73 65 72 74 28 20 28 70 67 6e 6f     assert( (pgno
191e0 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79  +pWriter->nEmpty
191f0 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  )==pSeg->pgnoLas
19200 74 20 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72  t );.    pWriter
19210 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
19220 67 65 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65  ge = 1;.    asse
19230 72 74 28 20 70 57 72 69 74 65 72 2d 3e 61 57 72  rt( pWriter->aWr
19240 69 74 65 72 5b 30 5d 2e 74 65 72 6d 2e 6e 3d 3d  iter[0].term.n==
19250 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  0 );.  }.}../*.*
19260 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
19270 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65   was used to ite
19280 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
19290 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
192a0 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72  of on an.** incr
192b0 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70  emental merge op
192c0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  eration. This fu
192d0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
192e0 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   if the incremen
192f0 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65  tal.** merge ste
19300 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62  p has finished b
19310 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  ut the input has
19320 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65   not been comple
19330 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a  tely exhausted..
19340 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
19350 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
19360 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
19370 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
19380 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
19390 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
193a0 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66  f;.  memset(&buf
193b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
193c0 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72 28  Buffer));.  for(
193d0 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
193e0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  eg; i++){.    Ft
193f0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
19400 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
19410 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ];.    if( pSeg-
19420 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >pSeg==0 ){.    
19430 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
19440 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 67    }else if( pSeg
19450 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
19460 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20      /* All keys 
19470 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20  from this input 
19480 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62 65 65  segment have bee
19490 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f 20  n transfered to 
194a0 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 20  the output..    
194b0 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20 74 68    ** Set both th
194c0 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74  e first and last
194d0 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 74 6f   page-numbers to
194e0 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74   0 to indicate t
194f0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
19500 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77 20   segment is now 
19510 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
19520 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
19530 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Last = 0;.      
19540 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
19550 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  First = 0;.    }
19560 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
19570 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65  iOff = pSeg->iTe
19580 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20  rmLeafOffset;   
19590 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e    /* Offset on n
195a0 65 77 20 66 69 72 73 74 20 6c 65 61 66 20 70 61  ew first leaf pa
195b0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  ge */.      i64 
195c0 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20  iLeafRowid;.    
195d0 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
195e0 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  a;.      int iId
195f0 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69   = pSeg->pSeg->i
19600 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20  Segid;.      u8 
19610 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c  aHdr[4] = {0x00,
19620 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
19630 34 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66  4};..      iLeaf
19640 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
19650 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
19660 3e 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 70  >iIdx, iId, 0, p
19670 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
19680 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61  no);.      pData
19690 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
196a0 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  p, iLeafRowid);.
196b0 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 20        if( pData 
196c0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
196d0 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b  ufferZero(&buf);
196e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
196f0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
19700 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65  ->rc, &buf, size
19710 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b  of(aHdr), aHdr);
19720 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
19730 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19740 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
19750 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  eg->term.n);.   
19760 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
19770 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
19780 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
19790 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d  rm.n, pSeg->term
197a0 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .p);.        fts
197b0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
197c0 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
197d0 70 44 61 74 61 2d 3e 6e 20 2d 20 69 4f 66 66 2c  pData->n - iOff,
197e0 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d   &pData->p[iOff]
197f0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
19800 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
19810 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d  );.        pSeg-
19820 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
19830 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
19840 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20  afPgno;.        
19850 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
19860 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
19870 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c  OWID(pSeg->iIdx,
19880 20 69 49 64 2c 20 30 2c 20 31 29 2c 69 4c 65 61   iId, 0, 1),iLea
19890 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  fRowid);.       
198a0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
198b0 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75  , iLeafRowid, bu
198c0 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
198d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
198e0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
198f0 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  &buf);.}../*.**.
19900 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
19910 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
19920 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  el(.  Fts5Index 
19930 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
19940 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
19950 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
19960 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
19970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19980 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f    /* Index to wo
19990 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53  rk on */.  Fts5S
199a0 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
199b0 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
199c0 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
199d0 66 20 69 6e 64 65 78 20 69 49 64 78 20 2a 2f 0a  f index iIdx */.
199e0 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20    int iLvl,     
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a00 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65    /* Level to re
19a10 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f  ad input from */
19a20 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20  .  int *pnRem   
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a40 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74     /* Write up t
19a50 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70  o this many outp
19a60 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a  ut leaves */.){.
19a70 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
19a80 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
19a90 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
19aa0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
19ab0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
19ac0 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73  vel[iLvl];.  Fts
19ad0 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
19ae0 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35  *pLvlOut;.  Fts5
19af0 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
19b00 74 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ter = 0;    /* I
19b10 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20  terator to read 
19b20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20  input data */.  
19b30 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d  int nRem = pnRem
19b40 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20   ? *pnRem : 0;  
19b50 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70  /* Output leaf p
19b60 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
19b70 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  te */.  int nInp
19b80 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
19b90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19ba0 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
19bb0 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  nts */.  Fts5Seg
19bc0 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20  Writer writer;  
19bd0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
19be0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  er object */.  F
19bf0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
19c00 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
19c10 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  * Output segment
19c20 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
19c30 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 52 65   term;.  int bRe
19c40 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d  quireDoclistTerm
19c50 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44 6f 63 6c   = 0;    /* Docl
19c60 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 28  ist terminator (
19c70 30 78 30 30 29 20 72 65 71 75 69 72 65 64 20 2a  0x00) required *
19c80 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b  /.  int bOldest;
19c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ca0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
19cb0 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
19cc0 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20  t is the oldest 
19cd0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
19ce0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
19cf0 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
19d00 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
19d10 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d  vl->nSeg );..  m
19d20 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
19d30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
19d40 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Writer));.  mems
19d50 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
19d60 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
19d70 3b 0a 20 20 77 72 69 74 65 72 2e 69 49 64 78 20  ;.  writer.iIdx 
19d80 3d 20 69 49 64 78 3b 0a 20 20 69 66 28 20 70 4c  = iIdx;.  if( pL
19d90 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20  vl->nMerge ){.  
19da0 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74    pLvlOut = &pSt
19db0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
19dc0 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l+1];.    assert
19dd0 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e  ( pLvlOut->nSeg>
19de0 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20  0 );.    nInput 
19df0 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a  = pLvl->nMerge;.
19e00 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
19e10 74 46 6f 72 41 70 70 65 6e 64 28 70 2c 20 26 77  tForAppend(p, &w
19e20 72 69 74 65 72 2c 20 69 49 64 78 2c 20 26 70 4c  riter, iIdx, &pL
19e30 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
19e40 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 29 3b 0a 20  Out->nSeg-1]);. 
19e50 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
19e60 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
19e70 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20 7d 65 6c  ->nSeg-1];.  }el
19e80 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  se{.    int iSeg
19e90 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74  id = fts5Allocat
19ea0 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63  eSegid(p, pStruc
19eb0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65  t);..    /* Exte
19ec0 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63  nd the Fts5Struc
19ed0 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72  ture object as r
19ee0 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72  equired to ensur
19ef0 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  e the output.   
19f00 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73   ** segment exis
19f10 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ts. */.    if( i
19f20 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c  Lvl==pStruct->nL
19f30 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  evel-1 ){.      
19f40 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
19f50 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70  Level(&p->rc, pp
19f60 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
19f70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
19f80 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ct;.    }.    ft
19f90 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
19fa0 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
19fb0 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20  Struct, iLvl+1, 
19fc0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
19fd0 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
19fe0 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75     pLvl = &pStru
19ff0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1a000 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20  ;.    pLvlOut = 
1a010 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1a020 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66  [iLvl+1];..    f
1a030 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1a040 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c 20 69  &writer, iIdx, i
1a050 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20  Segid);..    /* 
1a060 41 64 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d  Add the new segm
1a070 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ent to the outpu
1a080 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  t level */.    i
1a090 66 28 20 69 4c 76 6c 2b 31 3d 3d 70 53 74 72 75  f( iLvl+1==pStru
1a0a0 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 20 70 53 74  ct->nLevel ) pSt
1a0b0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a  ruct->nLevel++;.
1a0c0 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c      pSeg = &pLvl
1a0d0 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75  Out->aSeg[pLvlOu
1a0e0 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c  t->nSeg];.    pL
1a0f0 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20  vlOut->nSeg++;. 
1a100 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
1a110 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67  st = 1;.    pSeg
1a120 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1a130 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e  d;.    pStruct->
1a140 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20  nSegment++;..   
1a150 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66   /* Read input f
1a160 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rom all segments
1a170 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65   in the input le
1a180 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75  vel */.    nInpu
1a190 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a  t = pLvl->nSeg;.
1a1a0 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20    }.  bOldest = 
1a1b0 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d  (pLvlOut->nSeg==
1a1c0 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c  1 && pStruct->nL
1a1d0 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a  evel==iLvl+2);..
1a1e0 23 69 66 20 30 0a 66 70 72 69 6e 74 66 28 73 74  #if 0.fprintf(st
1a1f0 64 6f 75 74 2c 20 22 6d 65 72 67 69 6e 67 20 25  dout, "merging %
1a200 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  d segments from 
1a210 6c 65 76 65 6c 20 25 64 21 22 2c 20 6e 49 6e 70  level %d!", nInp
1a220 75 74 2c 20 69 4c 76 6c 29 3b 0a 66 66 6c 75 73  ut, iLvl);.fflus
1a230 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69  h(stdout);.#endi
1a240 66 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  f..  assert( iLv
1a250 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74  l>=0 );.  for(ft
1a260 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
1a270 2c 20 70 53 74 72 75 63 74 2c 20 69 49 64 78 2c  , pStruct, iIdx,
1a280 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76   0, 0, 0, 0, iLv
1a290 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65  l, nInput, &pIte
1a2a0 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
1a2b0 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
1a2c0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
1a2d0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
1a2e0 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
1a2f0 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  .  ){.    Fts5Se
1a300 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1a310 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1a320 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1a330 72 73 74 20 5d 3b 0a 20 20 20 20 46 74 73 35 43  rst ];.    Fts5C
1a340 68 75 6e 6b 49 74 65 72 20 73 50 6f 73 3b 20 20  hunkIter sPos;  
1a350 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1a360 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1a370 75 67 68 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ugh position lis
1a380 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 6f  t */.    int nPo
1a390 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1a3a0 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69         /* positi
1a3b0 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
1a3c0 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  ld value */.    
1a3d0 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63  int nTerm;.    c
1a3e0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a  onst u8 *pTerm;.
1a3f0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
1a400 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69  r key annihilati
1a410 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  on. */.    if( p
1a420 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20  Seg->nPos==0 && 
1a430 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67  (bOldest || pSeg
1a440 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e  ->bDel==0) ) con
1a450 74 69 6e 75 65 3b 0a 0a 20 20 20 20 66 74 73 35  tinue;..    fts5
1a460 43 68 75 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c  ChunkIterInit(p,
1a470 20 70 53 65 67 2c 20 26 73 50 6f 73 29 3b 0a 0a   pSeg, &sPos);..
1a480 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35      pTerm = fts5
1a490 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
1a4a0 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20  ter, &nTerm);.  
1a4b0 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72    if( nTerm!=ter
1a4c0 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54  m.n || memcmp(pT
1a4d0 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65  erm, term.p, nTe
1a4e0 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rm) ){.      if(
1a4f0 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72   pnRem && writer
1a500 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52  .nLeafWritten>nR
1a510 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  em ){.        ft
1a520 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61  s5ChunkIterRelea
1a530 73 65 28 26 73 50 6f 73 29 3b 0a 20 20 20 20 20  se(&sPos);.     
1a540 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a550 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  }..      /* This
1a560 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20   is a new term. 
1a570 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f  Append a term to
1a580 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
1a590 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ent. */.      if
1a5a0 28 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73  ( bRequireDoclis
1a5b0 74 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  tTerm ){.       
1a5c0 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
1a5d0 5a 65 72 6f 62 79 74 65 28 70 2c 20 26 77 72 69  Zerobyte(p, &wri
1a5e0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
1a5f0 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
1a600 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74  endTerm(p, &writ
1a610 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  er, nTerm, pTerm
1a620 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
1a630 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
1a640 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
1a650 72 6d 29 3b 0a 20 20 20 20 20 20 62 52 65 71 75  rm);.      bRequ
1a660 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d  ireDoclistTerm =
1a670 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
1a680 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f 77  * Append the row
1a690 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  id to the output
1a6a0 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49 54 45   */.    /* WRITE
1a6b0 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20  POSLISTSIZE */. 
1a6c0 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67 2d 3e     nPos = pSeg->
1a6d0 6e 50 6f 73 2a 32 20 2b 20 70 53 65 67 2d 3e 62  nPos*2 + pSeg->b
1a6e0 44 65 6c 3b 0a 20 20 20 20 66 74 73 35 57 72 69  Del;.    fts5Wri
1a6f0 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c  teAppendRowid(p,
1a700 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75   &writer, fts5Mu
1a710 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
1a720 65 72 29 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20  er), nPos);..   
1a730 20 66 6f 72 28 2f 2a 20 6e 6f 6f 70 20 2a 2f 3b   for(/* noop */;
1a740 20 21 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45   !fts5ChunkIterE
1a750 6f 66 28 70 2c 20 26 73 50 6f 73 29 3b 20 66 74  of(p, &sPos); ft
1a760 73 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28  s5ChunkIterNext(
1a770 70 2c 20 26 73 50 6f 73 29 29 7b 0a 20 20 20 20  p, &sPos)){.    
1a780 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
1a790 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70 2c 20  dPoslistData(p, 
1a7a0 26 77 72 69 74 65 72 2c 20 73 50 6f 73 2e 70 2c  &writer, sPos.p,
1a7b0 20 73 50 6f 73 2e 6e 29 3b 0a 20 20 20 20 7d 0a   sPos.n);.    }.
1a7c0 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74  .    fts5ChunkIt
1a7d0 65 72 52 65 6c 65 61 73 65 28 26 73 50 6f 73 29  erRelease(&sPos)
1a7e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  ;.  }..  /* Flus
1a7f0 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20  h the last leaf 
1a800 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65  page to disk. Se
1a810 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  t the output seg
1a820 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67  ment b-tree heig
1a830 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74  ht.  ** and last
1a840 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
1a850 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
1a860 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72  me.  */.  fts5Wr
1a870 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
1a880 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65  iter, &pSeg->nHe
1a890 69 67 68 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e  ight, &pSeg->pgn
1a8a0 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66  oLast);..  if( f
1a8b0 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
1a8c0 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
1a8d0 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
1a8e0 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
1a8f0 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
1a900 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
1a910 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ble */.    for(i
1a920 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b  =0; i<nInput; i+
1a930 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
1a940 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
1a950 70 2c 20 69 49 64 78 2c 20 70 4c 76 6c 2d 3e 61  p, iIdx, pLvl->a
1a960 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a  Seg[i].iSegid);.
1a970 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1a980 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
1a990 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nt segments from
1a9a0 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
1a9b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c   */.    if( pLvl
1a9c0 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29  ->nSeg!=nInput )
1a9d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76  {.      int nMov
1a9e0 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20  e = (pLvl->nSeg 
1a9f0 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65  - nInput) * size
1aa00 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
1aa10 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Segment);.      
1aa20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53  memmove(pLvl->aS
1aa30 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  eg, &pLvl->aSeg[
1aa40 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b  nInput], nMove);
1aa50 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 75  .    }.    pStru
1aa60 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20  ct->nSegment -= 
1aa70 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c  nInput;.    pLvl
1aa80 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74  ->nSeg -= nInput
1aa90 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72  ;.    pLvl->nMer
1aaa0 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ge = 0;.    if( 
1aab0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d  pSeg->pgnoLast==
1aac0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f  0 ){.      pLvlO
1aad0 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20  ut->nSeg--;.    
1aae0 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d    pStruct->nSegm
1aaf0 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ent--;.    }.  }
1ab00 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1ab10 28 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3e  ( pSeg->nHeight>
1ab20 30 20 26 26 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  0 && pSeg->pgnoL
1ab30 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73  ast>0 );.    fts
1ab40 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c  5TrimSegments(p,
1ab50 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76   pIter);.    pLv
1ab60 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70  l->nMerge = nInp
1ab70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d  ut;.  }..  fts5M
1ab80 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
1ab90 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75  pIter);.  fts5Bu
1aba0 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
1abb0 0a 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a  .  if( pnRem ) *
1abc0 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e  pnRem -= writer.
1abd0 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a  nLeafWritten;.}.
1abe0 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  ./*.** A total o
1abf0 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67  f nLeaf leaf pag
1ac00 65 73 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a  es of data has j
1ac10 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64  ust been flushed
1ac20 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a   to a level-0.**
1ac30 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64   segments in ind
1ac40 65 78 20 69 49 64 78 20 77 69 74 68 20 73 74 72  ex iIdx with str
1ac50 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
1ac60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70  This function up
1ac70 64 61 74 65 73 20 74 68 65 0a 2a 2a 20 77 72 69  dates the.** wri
1ac80 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72  te-counter accor
1ac90 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 20 6e  dingly and, if n
1aca0 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72  ecessary, perfor
1acb0 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  ms incremental m
1acc0 65 72 67 65 0a 2a 2a 20 77 6f 72 6b 2e 0a 2a 2a  erge.** work..**
1acd0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1ace0 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
1acf0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
1ad00 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
1ad10 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
1ad20 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
1ad30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ad40 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1ad50 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1ad60 78 57 6f 72 6b 28 0a 20 20 46 74 73 35 49 6e 64  xWork(.  Fts5Ind
1ad70 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1ad80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1ad90 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1ada0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adc0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
1add0 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74   work on */.  Ft
1ade0 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1adf0 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
1ae00 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1ae10 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1ae20 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  dex */.  int nLe
1ae30 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
1ae40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ae50 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61  er of output lea
1ae60 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ves just written
1ae70 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
1ae80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ae90 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1aea0 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
1aeb0 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 36 34  pStruct;.    i64
1aec0 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
1aed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1aee0 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77  itial value of w
1aef0 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  rite-counter */.
1af00 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20      int nWork;  
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
1af30 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65  ork-quanta to pe
1af40 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  rform */.    int
1af50 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
1af60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1af70 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
1af80 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
1af90 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   */..    /* Upda
1afa0 74 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75  te the write-cou
1afb0 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e  nter. While doin
1afc0 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e  g so, set nWork.
1afd0 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d   */.    nWrite =
1afe0 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
1aff0 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f  Counter;.    nWo
1b000 72 6b 20 3d 20 28 28 6e 57 72 69 74 65 20 2b 20  rk = ((nWrite + 
1b010 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72  nLeaf) / p->nWor
1b020 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74 65  kUnit) - (nWrite
1b030 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
1b040 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  ;.    pStruct->n
1b050 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20  WriteCounter += 
1b060 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20  nLeaf;.    nRem 
1b070 3d 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a  = p->nWorkUnit *
1b080 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74   nWork * pStruct
1b090 2d 3e 6e 4c 65 76 65 6c 3b 0a 0a 20 20 20 20 77  ->nLevel;..    w
1b0a0 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a  hile( nRem>0 ){.
1b0b0 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20        int iLvl; 
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20    /* To iterate 
1b0e0 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
1b0f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 65 73  /.      int iBes
1b100 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  tLvl = 0;       
1b110 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66      /* Level off
1b120 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69  ering the most i
1b130 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
1b140 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 65 73 74  .      int nBest
1b150 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b160 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b170 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
1b180 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
1b190 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69 42  .      /* Set iB
1b1a0 65 73 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65  estLvl to the le
1b1b0 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75  vel to read inpu
1b1c0 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e  t segments from.
1b1d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1b1e0 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
1b1f0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  l>0 );.      for
1b200 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1b210 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1b220 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
1b230 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
1b240 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
1b250 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1b260 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
1b270 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
1b280 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76           if( pLv
1b290 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20  l->nMerge>nBest 
1b2a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1b2b0 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a  BestLvl = iLvl;.
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 65 73              nBes
1b2d0 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
1b2e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b2f0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b310 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e   if( pLvl->nSeg>
1b320 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  nBest ){.       
1b330 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
1b340 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20 20  >nSeg;.         
1b350 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
1b360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b370 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
1b380 20 6e 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20   nBest is still 
1b390 30 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65  0, then the inde
1b3a0 78 20 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e  x must be empty.
1b3b0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1b3c0 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 6f  E_DEBUG.      fo
1b3d0 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d  r(iLvl=0; nBest=
1b3e0 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75  =0 && iLvl<pStru
1b3f0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1b400 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
1b410 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c  ert( pStruct->aL
1b420 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d  evel[iLvl].nSeg=
1b430 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  =0 );.      }.#e
1b440 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
1b450 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67  nBest<p->pConfig
1b460 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a 20 20  ->nAutomerge .  
1b470 20 20 20 20 20 26 26 20 70 53 74 72 75 63 74 2d       && pStruct-
1b480 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c  >aLevel[iBestLvl
1b490 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20  ].nMerge==0 .   
1b4a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72     ){.        br
1b4b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1b4c0 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1b4d0 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78 2c 20  eLevel(p, iIdx, 
1b4e0 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c  &pStruct, iBestL
1b4f0 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
1b500 20 20 61 73 73 65 72 74 28 20 6e 52 65 6d 3d 3d    assert( nRem==
1b510 30 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  0 || p->rc==SQLI
1b520 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
1b530 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1b540 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e  _OK && pStruct->
1b550 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d  aLevel[iBestLvl]
1b560 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  .nMerge==0 ){.  
1b570 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
1b580 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42  urePromote(p, iB
1b590 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  estLvl+1, pStruc
1b5a0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1b5b0 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
1b5c0 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  truct;.    }..  
1b5d0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1b5e0 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1b5f0 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  Merge(.  Fts5Ind
1b600 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1b610 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1b620 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1b630 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
1b660 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74   work on */.  Ft
1b670 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1b680 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a  Struct        /*
1b690 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1b6a0 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1b6b0 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  dex */.){.  Fts5
1b6c0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1b6d0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1b6e0 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a    int iLvl = 0;.
1b6f0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1b700 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
1b710 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74   && iLvl<pStruct
1b720 2d 3e 6e 4c 65 76 65 6c 0a 20 20 20 20 20 20 26  ->nLevel.      &
1b730 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
1b740 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 70 2d  l[iLvl].nSeg>=p-
1b750 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69  >pConfig->nCrisi
1b760 73 4d 65 72 67 65 20 0a 20 20 29 7b 0a 20 20 20  sMerge .  ){.   
1b770 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
1b780 65 76 65 6c 28 70 2c 20 69 49 64 78 2c 20 26 70  evel(p, iIdx, &p
1b790 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29  Struct, iLvl, 0)
1b7a0 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
1b7b0 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c  urePromote(p, iL
1b7c0 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a  vl+1, pStruct);.
1b7d0 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a      iLvl++;.  }.
1b7e0 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
1b7f0 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
1b800 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65   int fts5IndexRe
1b810 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a  turn(Fts5Index *
1b820 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  p){.  int rc = p
1b830 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ->rc;.  p->rc = 
1b840 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74  SQLITE_OK;.  ret
1b850 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64  urn rc;.}..typed
1b860 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c  ef struct Fts5Fl
1b870 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68  ushCtx Fts5Flush
1b880 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35  Ctx;.struct Fts5
1b890 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73  FlushCtx {.  Fts
1b8a0 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20  5Index *pIdx;.  
1b8b0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
1b8c0 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  iter; .};../*.**
1b8d0 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63   Buffer aBuf[] c
1b8e0 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f  ontains a list o
1b8f0 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73  f varints, all s
1b900 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66  mall enough to f
1b910 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69  it.** in a 32-bi
1b920 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72  t integer. Retur
1b930 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1b940 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69 78  e largest prefix
1b950 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73   of this .** lis
1b960 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20  t nMax bytes or 
1b970 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  less in size..*/
1b980 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1b990 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f  PoslistPrefix(co
1b9a0 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e  nst u8 *aBuf, in
1b9b0 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72  t nMax){.  int r
1b9c0 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b  et;.  u32 dummy;
1b9d0 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65 74  .  ret = fts5Get
1b9e0 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64  Varint32(aBuf, d
1b9f0 75 6d 6d 79 29 3b 0a 20 20 77 68 69 6c 65 28 20  ummy);.  while( 
1ba00 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  1 ){.    int i =
1ba10 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
1ba20 28 26 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d  (&aBuf[ret], dum
1ba30 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 28 72 65  my);.    if( (re
1ba40 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20  t + i) > nMax ) 
1ba50 62 72 65 61 6b 3b 0a 20 20 20 20 72 65 74 20 2b  break;.    ret +
1ba60 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
1ba70 6e 20 72 65 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e  n ret;.}..#defin
1ba80 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65  e fts5BufferSafe
1ba90 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
1baa0 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b   pBlob, nBlob) {
1bab0 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 42 75   \.  assert( pBu
1bac0 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66  f->nSpace>=(pBuf
1bad0 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20  ->n+nBlob) );   
1bae0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d 65            \.  me
1baf0 6d 63 70 79 28 26 70 42 75 66 2d 3e 70 5b 70 42  mcpy(&pBuf->p[pB
1bb00 75 66 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e  uf->n], pBlob, n
1bb10 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20 20  Blob);          
1bb20 20 20 20 5c 0a 20 20 70 42 75 66 2d 3e 6e 20 2b     \.  pBuf->n +
1bb30 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20  = nBlob;        
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
1bb60 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65  ./*.** Flush the
1bb70 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d   contents of in-
1bb80 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1bb90 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77  e iHash to a new
1bba0 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67   level-0 .** seg
1bbb0 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c  ment on disk. Al
1bbc0 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f  so update the co
1bbd0 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75  rresponding stru
1bbe0 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a  cture record..**
1bbf0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1bc00 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
1bc10 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
1bc20 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
1bc30 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
1bc40 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
1bc50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1bc60 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1bc70 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73  ic void fts5Flus
1bc80 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64  hOneHash(Fts5Ind
1bc90 65 78 20 2a 70 2c 20 69 6e 74 20 69 48 61 73 68  ex *p, int iHash
1bca0 2c 20 69 6e 74 20 2a 70 6e 4c 65 61 66 29 7b 0a  , int *pnLeaf){.
1bcb0 20 20 46 74 73 35 48 61 73 68 20 2a 70 48 61 73    Fts5Hash *pHas
1bcc0 68 20 3d 20 70 2d 3e 61 70 48 61 73 68 5b 69 48  h = p->apHash[iH
1bcd0 61 73 68 5d 3b 0a 20 20 46 74 73 35 53 74 72 75  ash];.  Fts5Stru
1bce0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
1bcf0 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
1bd00 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
1bd10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bd20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70    /* Last leaf p
1bd30 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
1bd40 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  gment */..  /* O
1bd50 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
1bd60 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73  e to the index s
1bd70 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
1bd80 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d  ocate a new segm
1bd90 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20  ent-id.  ** for 
1bda0 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20  the new level-0 
1bdb0 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70  segment.  */.  p
1bdc0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1bdd0 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69 48  uctureRead(p, iH
1bde0 61 73 68 29 3b 0a 20 20 69 53 65 67 69 64 20 3d  ash);.  iSegid =
1bdf0 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
1be00 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  id(p, pStruct);.
1be10 0a 20 20 69 66 28 20 69 53 65 67 69 64 20 29 7b  .  if( iSegid ){
1be20 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70  .    const int p
1be30 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  gsz = p->pConfig
1be40 2d 3e 70 67 73 7a 3b 0a 0a 20 20 20 20 46 74 73  ->pgsz;..    Fts
1be50 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1be60 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65  t *pSeg;   /* Ne
1be70 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e  w segment within
1be80 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20   pStruct */.    
1be90 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20  int nHeight;    
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1beb0 20 48 65 69 67 68 74 20 6f 66 20 6e 65 77 20 73   Height of new s
1bec0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f  egment b-tree */
1bed0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
1bee0 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  *pBuf;          
1bef0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20     /* Buffer in 
1bf00 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c  which to assembl
1bf10 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  e leaf page */. 
1bf20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 72     const u8 *zPr
1bf30 65 76 20 3d 20 30 3b 0a 0a 20 20 20 20 46 74 73  ev = 0;..    Fts
1bf40 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
1bf50 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  r;.    fts5Write
1bf60 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c  Init(p, &writer,
1bf70 20 69 48 61 73 68 2c 20 69 53 65 67 69 64 29 3b   iHash, iSegid);
1bf80 0a 0a 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c  ..    /* Pre-all
1bf90 6f 63 61 74 65 20 74 68 65 20 62 75 66 66 65 72  ocate the buffer
1bfa0 20 75 73 65 64 20 74 6f 20 61 73 73 65 6d 62 6c   used to assembl
1bfb0 65 20 6c 65 61 66 20 70 61 67 65 73 20 74 6f 20  e leaf pages to 
1bfc0 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
1bfd0 2a 20 70 61 67 65 20 73 69 7a 65 2e 20 20 2a 2f  * page size.  */
1bfe0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 73  .    assert( pgs
1bff0 7a 3e 30 20 29 3b 0a 20 20 20 20 70 42 75 66 20  z>0 );.    pBuf 
1c000 3d 20 26 77 72 69 74 65 72 2e 61 57 72 69 74 65  = &writer.aWrite
1c010 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 66 74  r[0].buf;.    ft
1c020 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1c030 3e 72 63 2c 20 70 42 75 66 2c 20 70 67 73 7a 20  >rc, pBuf, pgsz 
1c040 2b 20 32 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42  + 20);..    /* B
1c050 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68  egin scanning th
1c060 72 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c 65  rough hash table
1c070 20 65 6e 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   entries. */.   
1c080 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
1c0a0 65 6d 73 65 74 28 70 42 75 66 2d 3e 70 2c 20 30  emset(pBuf->p, 0
1c0b0 2c 20 34 29 3b 0a 20 20 20 20 20 20 70 42 75 66  , 4);.      pBuf
1c0c0 2d 3e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 70  ->n = 4;.      p
1c0d0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
1c0e0 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70  s5HashScanInit(p
1c0f0 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Hash, 0, 0);.   
1c100 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70   }..    while( p
1c110 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1c120 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  && 0==sqlite3Fts
1c130 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61  5HashScanEof(pHa
1c140 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  sh) ){.      con
1c150 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 0a  st char *zTerm;.
1c160 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
1c170 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
1c180 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20  *pDoclist;.     
1c190 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 20   int nDoclist;. 
1c1a0 20 20 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78       int nSuffix
1c1b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c1c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
1c1d0 20 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20 20 20   suffix */..    
1c1e0 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1c1f0 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68  hScanEntry(pHash
1c200 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c  , &zTerm, &pDocl
1c210 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b  ist, &nDoclist);
1c220 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 3d 20 73  .      nTerm = s
1c230 74 72 6c 65 6e 28 7a 54 65 72 6d 29 3b 0a 0a 20  trlen(zTerm);.. 
1c240 20 20 20 20 20 2f 2a 20 44 65 63 69 64 65 20 69       /* Decide i
1c250 66 20 74 68 65 20 74 65 72 6d 20 77 69 6c 6c 20  f the term will 
1c260 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  fit on the curre
1c270 6e 74 20 6c 65 61 66 2e 20 49 66 20 69 74 20 77  nt leaf. If it w
1c280 69 6c 6c 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20  ill not, .      
1c290 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 6c 65 61  ** flush the lea
1c2a0 66 20 74 6f 20 64 69 73 6b 20 68 65 72 65 2e 20  f to disk here. 
1c2b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
1c2c0 42 75 66 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b  Buf->n + nTerm +
1c2d0 20 32 29 20 3e 20 70 67 73 7a 20 29 7b 0a 20 20   2) > pgsz ){.  
1c2e0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1c2f0 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69  lushLeaf(p, &wri
1c300 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 42  ter);.        pB
1c310 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72  uf = &writer.aWr
1c320 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20  iter[0].buf;.   
1c330 20 20 20 20 20 69 66 28 20 28 6e 54 65 72 6d 20       if( (nTerm 
1c340 2b 20 33 32 29 20 3e 20 70 42 75 66 2d 3e 6e 53  + 32) > pBuf->nS
1c350 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  pace ){.        
1c360 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77    fts5BufferGrow
1c370 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 6e  (&p->rc, pBuf, n
1c380 54 65 72 6d 20 2b 20 33 32 20 2d 20 70 42 75 66  Term + 32 - pBuf
1c390 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1c3a0 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61  if( p->rc ) brea
1c3b0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c3c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 57     }..      /* W
1c3d0 72 69 74 65 20 74 68 65 20 74 65 72 6d 20 74 6f  rite the term to
1c3e0 20 74 68 65 20 6c 65 61 66 2e 20 41 6e 64 20 70   the leaf. And p
1c3f0 75 73 68 20 69 74 20 75 70 20 69 6e 74 6f 20 74  ush it up into t
1c400 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
1c410 63 68 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  chy */.      if(
1c420 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 54 65   writer.bFirstTe
1c430 72 6d 49 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  rmInPage==0 ){. 
1c440 20 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20         int nPre 
1c450 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  = fts5PrefixComp
1c460 72 65 73 73 28 6e 54 65 72 6d 2c 20 7a 50 72 65  ress(nTerm, zPre
1c470 76 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73 74  v, nTerm, (const
1c480 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20   u8*)zTerm);.   
1c490 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20       pBuf->n += 
1c4a0 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74  sqlite3PutVarint
1c4b0 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
1c4c0 6e 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20 20 20  n], nPre);.     
1c4d0 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65     nSuffix = nTe
1c4e0 72 6d 20 2d 20 6e 50 72 65 3b 0a 20 20 20 20 20  rm - nPre;.     
1c4f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c500 66 74 73 35 50 75 74 55 31 36 28 26 70 42 75 66  fts5PutU16(&pBuf
1c510 2d 3e 70 5b 32 5d 2c 20 70 42 75 66 2d 3e 6e 29  ->p[2], pBuf->n)
1c520 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 72  ;.        writer
1c530 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  .bFirstTermInPag
1c540 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
1c550 66 28 20 77 72 69 74 65 72 2e 61 57 72 69 74 65  f( writer.aWrite
1c560 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a  r[0].pgno!=1 ){.
1c570 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50            int nP
1c580 72 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  re = fts5PrefixC
1c590 6f 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c 20 7a  ompress(nTerm, z
1c5a0 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28 63 6f  Prev, nTerm, (co
1c5b0 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a  nst u8*)zTerm);.
1c5c0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72            fts5Wr
1c5d0 69 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20  iteBtreeTerm(p, 
1c5e0 26 77 72 69 74 65 72 2c 20 6e 50 72 65 2b 31 2c  &writer, nPre+1,
1c5f0 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72   (const u8*)zTer
1c600 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  m);.          pB
1c610 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72  uf = &writer.aWr
1c620 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20  iter[0].buf;.   
1c630 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1c640 50 72 65 3c 6e 54 65 72 6d 20 29 3b 0a 20 20 20  Pre<nTerm );.   
1c650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
1c660 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a  Suffix = nTerm;.
1c670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 42        }.      pB
1c680 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  uf->n += sqlite3
1c690 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
1c6a0 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e 53 75  >p[pBuf->n], nSu
1c6b0 66 66 69 78 29 3b 0a 20 20 20 20 20 20 66 74 73  ffix);.      fts
1c6c0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1c6d0 64 42 6c 6f 62 28 70 42 75 66 2c 20 28 63 6f 6e  dBlob(pBuf, (con
1c6e0 73 74 20 75 38 2a 29 26 7a 54 65 72 6d 5b 6e 54  st u8*)&zTerm[nT
1c6f0 65 72 6d 2d 6e 53 75 66 66 69 78 5d 2c 20 6e 53  erm-nSuffix], nS
1c700 75 66 66 69 78 29 3b 0a 0a 20 20 20 20 20 20 69  uffix);..      i
1c710 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e  f( pgsz>=(pBuf->
1c720 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31  n + nDoclist + 1
1c730 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1c740 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  The entire docli
1c750 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  st will fit on t
1c760 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1c770 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
1c780 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1c790 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c  Blob(pBuf, pDocl
1c7a0 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ist, nDoclist);.
1c7b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c7c0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
1c7d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
1c7e0 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20   iDelta = 0;.   
1c7f0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
1c800 30 3b 0a 0a 20 20 20 20 20 20 20 20 77 72 69 74  0;..        writ
1c810 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
1c820 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Page = 0;..     
1c830 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
1c840 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f   doclist will no
1c850 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65  t fit on this le
1c860 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  af. The followin
1c870 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  g .        ** lo
1c880 6f 70 20 69 74 65 72 61 74 65 73 20 74 68 72 6f  op iterates thro
1c890 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74 73  ugh the poslists
1c8a0 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68   that make up th
1c8b0 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 20  e current .     
1c8c0 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20     ** doclist.  
1c8d0 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  */.        while
1c8e0 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20  ( iOff<nDoclist 
1c8f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1c900 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20   nPos;.         
1c910 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20   int nCopy;.    
1c920 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
1c930 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
1c940 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
1c950 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28  Doclist[iOff], (
1c960 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
1c970 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d           nCopy =
1c980 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
1c990 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  ize(&pDoclist[iO
1c9a0 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  ff], &nPos, &bDu
1c9b0 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mmy);.          
1c9c0 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20  nCopy += nPos;. 
1c9d0 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20           iRowid 
1c9e0 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
1c9f0 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
1ca00 69 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73  if( writer.bFirs
1ca10 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1ca30 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b  PutU16(&pBuf->p[
1ca40 30 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 20 20 20  0], pBuf->n);   
1ca50 2f 2a 20 66 69 72 73 74 20 64 6f 63 69 64 20 6f  /* first docid o
1ca60 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  n page */.      
1ca70 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
1ca80 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e   sqlite3PutVarin
1ca90 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  t(&pBuf->p[pBuf-
1caa0 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  >n], iRowid);.  
1cab0 20 20 20 20 20 20 20 20 20 20 77 72 69 74 65 72            writer
1cac0 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  .bFirstRowidInPa
1cad0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
1cae0 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
1caf0 64 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69  dxAppend(p, &wri
1cb00 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  ter, iRowid);.  
1cb10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1cb20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d             pBuf-
1cb30 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 50 75 74  >n += sqlite3Put
1cb40 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
1cb50 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61  pBuf->n], iDelta
1cb60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1cb70 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1cb80 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e   pBuf->n<=pBuf->
1cb90 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20 20 20 20  nSpace );..     
1cba0 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e       if( (pBuf->
1cbb0 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67  n + nCopy) <= pg
1cbc0 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
1cbd0 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20    /* The entire 
1cbe0 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74  poslist will fit
1cbf0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
1cc00 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20  leaf. So copy.  
1cc10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
1cc20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20  in one go. */.  
1cc30 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1cc40 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1cc50 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c 69  ob(pBuf, &pDocli
1cc60 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29  st[iOff], nCopy)
1cc70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1cc80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
1cc90 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73  * The entire pos
1cca0 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69  list will not fi
1ccb0 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20  t on this leaf. 
1ccc0 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20  So it needs.    
1ccd0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
1cce0 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63   broken into sec
1ccf0 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20  tions. The only 
1cd00 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62 65  qualification be
1cd10 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  ing.            
1cd20 2a 2a 20 74 68 61 74 20 65 61 63 68 20 76 61 72  ** that each var
1cd30 69 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72  int must be stor
1cd40 65 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e  ed contiguously.
1cd50 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
1cd60 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c   const u8 *pPosl
1cd70 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b  ist = &pDoclist[
1cd80 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20  iOff];.         
1cd90 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b     int iPos = 0;
1cda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69  .            whi
1cdb0 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20  le( 1 ){.       
1cdc0 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63         int nSpac
1cdd0 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d  e = pgsz - pBuf-
1cde0 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >n;.            
1cdf0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
1ce00 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1ce10 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e  nCopy - iPos)<=n
1ce20 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Space ){.       
1ce30 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f           n = nCo
1ce40 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20  py - iPos;.     
1ce50 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50  n = fts5PoslistP
1ce80 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b  refix(&pPoslist[
1ce90 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a  iPos], nSpace);.
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1cec0 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20  sert( n>0 );.   
1ced0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1cee0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1cef0 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c  lob(pBuf, &pPosl
1cf00 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20  ist[iPos], n);. 
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f               iPo
1cf20 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  s += n;.        
1cf30 20 20 20 20 20 20 69 66 28 20 70 42 75 66 2d 3e        if( pBuf->
1cf40 6e 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  n>=pgsz ){.     
1cf50 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57             fts5W
1cf60 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
1cf70 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20   &writer);.     
1cf80 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20             pBuf 
1cf90 3d 20 26 77 72 69 74 65 72 2e 61 57 72 69 74 65  = &writer.aWrite
1cfa0 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20  r[0].buf;.      
1cfb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cfc0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
1cfd0 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b  >=nCopy ) break;
1cfe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1cff0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d000 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f       iOff += nCo
1d010 70 79 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  py;.        }.  
1d020 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75      }..      pBu
1d030 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20  f->p[pBuf->n++] 
1d040 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 61 73  = '\0';.      as
1d050 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70  sert( pBuf->n<=p
1d060 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20  Buf->nSpace );. 
1d070 20 20 20 20 20 7a 50 72 65 76 20 3d 20 28 63 6f       zPrev = (co
1d080 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 3b 0a 20  nst u8*)zTerm;. 
1d090 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d0a0 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 48 61  HashScanNext(pHa
1d0b0 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sh);.    }.    s
1d0c0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 43 6c  qlite3Fts5HashCl
1d0d0 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20  ear(pHash);.    
1d0e0 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
1d0f0 70 2c 20 26 77 72 69 74 65 72 2c 20 26 6e 48 65  p, &writer, &nHe
1d100 69 67 68 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29  ight, &pgnoLast)
1d110 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
1d120 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75   the Fts5Structu
1d130 72 65 2e 20 49 74 20 69 73 20 77 72 69 74 74 65  re. It is writte
1d140 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61  n back to the da
1d150 74 61 62 61 73 65 20 62 79 20 74 68 65 0a 20 20  tabase by the.  
1d160 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75    ** fts5Structu
1d170 72 65 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c  reRelease() call
1d180 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
1d190 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  if( pStruct->nLe
1d1a0 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  vel==0 ){.      
1d1b0 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
1d1c0 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70  Level(&p->rc, &p
1d1d0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20  Struct);.    }. 
1d1e0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1d1f0 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
1d200 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20  rc, pStruct, 0, 
1d210 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
1d220 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1d230 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20  ){.      pSeg = 
1d240 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1d250 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63  [0].aSeg[ pStruc
1d260 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65  t->aLevel[0].nSe
1d270 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65  g++ ];.      pSe
1d280 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
1d290 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e  id;.      pSeg->
1d2a0 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
1d2b0 74 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  t;.      pSeg->p
1d2c0 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  gnoFirst = 1;.  
1d2d0 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61      pSeg->pgnoLa
1d2e0 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20  st = pgnoLast;. 
1d2f0 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53       pStruct->nS
1d300 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  egment++;.    }.
1d310 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1d320 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70  ePromote(p, 0, p
1d330 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 0a 20  Struct);.  }... 
1d340 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d   if( p->pConfig-
1d350 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 20  >nAutomerge>0 ) 
1d360 66 74 73 35 49 6e 64 65 78 57 6f 72 6b 28 70 2c  fts5IndexWork(p,
1d370 20 69 48 61 73 68 2c 20 26 70 53 74 72 75 63 74   iHash, &pStruct
1d380 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66  , pgnoLast);.  f
1d390 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 4d 65  ts5IndexCrisisMe
1d3a0 72 67 65 28 70 2c 20 69 48 61 73 68 2c 20 26 70  rge(p, iHash, &p
1d3b0 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53  Struct);.  fts5S
1d3c0 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
1d3d0 20 69 48 61 73 68 2c 20 70 53 74 72 75 63 74 29   iHash, pStruct)
1d3e0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
1d3f0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1d400 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  );.}../*.** Flus
1d410 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  h any data store
1d420 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
1d430 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74  ry hash tables t
1d440 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
1d450 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1d460 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74  ts5IndexFlush(Ft
1d470 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
1d480 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
1d490 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
1d4a0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4c0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
1d4d0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e  erate through in
1d4e0 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  dexes */.  int n
1d4f0 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20 20 20  Leaf = 0;       
1d500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d510 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 77  mber of leaves w
1d520 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ritten */..  /* 
1d530 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
1d540 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64 20  already occured 
1d550 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
1d560 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70  o-op. */.  if( p
1d570 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
1d580 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  || p->nPendingDa
1d590 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ta==0 ) return;.
1d5a0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 48    assert( p->apH
1d5b0 61 73 68 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c 75  ash );..  /* Flu
1d5c0 73 68 20 74 68 65 20 74 65 72 6d 73 20 61 6e 64  sh the terms and
1d5d0 20 65 61 63 68 20 70 72 65 66 69 78 20 69 6e 64   each prefix ind
1d5e0 65 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  ex to disk */.  
1d5f0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e  for(i=0; i<=pCon
1d600 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b  fig->nPrefix; i+
1d610 2b 29 7b 0a 20 20 20 20 66 74 73 35 46 6c 75 73  +){.    fts5Flus
1d620 68 4f 6e 65 48 61 73 68 28 70 2c 20 69 2c 20 26  hOneHash(p, i, &
1d630 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a 20 20 70 2d  nLeaf);.  }.  p-
1d640 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20  >nPendingData = 
1d650 30 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74  0;.}...int sqlit
1d660 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d  e3Fts5IndexOptim
1d670 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ize(Fts5Index *p
1d680 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
1d690 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
1d6a0 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  onfig;.  int i;.
1d6b0 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
1d6c0 68 28 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  h(p);.  for(i=0;
1d6d0 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72   i<=pConfig->nPr
1d6e0 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  efix; i++){.    
1d6f0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1d700 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1d710 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69 29  uctureRead(p, i)
1d720 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  ;.    Fts5Struct
1d730 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ure *pNew = 0;. 
1d740 20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b     int nSeg = 0;
1d750 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
1d760 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1d770 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
1d780 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
1d790 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
1d7a0 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
1d7b0 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74    nSeg = pStruct
1d7c0 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  ->nSegment;.    
1d7d0 20 20 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a    if( nSeg>1 ){.
1d7e0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
1d7f0 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 53  e = sizeof(Fts5S
1d800 74 72 75 63 74 75 72 65 29 3b 0a 20 20 20 20 20  tructure);.     
1d810 20 20 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74     nByte += (pSt
1d820 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20  ruct->nLevel+1) 
1d830 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1d840 75 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20  uctureLevel);.  
1d850 20 20 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74        pNew = (Ft
1d860 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c  s5Structure*)sql
1d870 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
1d880 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65  ro(&p->rc, nByte
1d890 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d8a0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
1d8b0 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
1d8c0 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b  tureLevel *pLvl;
1d8d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
1d8e0 20 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66   = nSeg * sizeof
1d8f0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
1d900 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 70 4e  gment);.      pN
1d910 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74  ew->nLevel = pSt
1d920 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a  ruct->nLevel+1;.
1d930 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69        pNew->nWri
1d940 74 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72  teCounter = pStr
1d950 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
1d960 65 72 3b 0a 20 20 20 20 20 20 70 4c 76 6c 20 3d  er;.      pLvl =
1d970 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70   &pNew->aLevel[p
1d980 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b  Struct->nLevel];
1d990 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65  .      pLvl->aSe
1d9a0 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  g = (Fts5Structu
1d9b0 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74  reSegment*)sqlit
1d9c0 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1d9d0 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
1d9e0 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
1d9f0 3e 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20  >aSeg ){.       
1da00 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b   int iLvl, iSeg;
1da10 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65  .        int iSe
1da20 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  gOut = 0;.      
1da30 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
1da40 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1da50 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1da60 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
1da70 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
1da80 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
1da90 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
1daa0 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61           pLvl->a
1dab0 53 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70  Seg[iSegOut] = p
1dac0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1dad0 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
1dae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 53 65  .            iSe
1daf0 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  gOut++;.        
1db00 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1db10 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67        pNew->nSeg
1db20 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  ment = pLvl->nSe
1db30 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20 20 20 20  g = nSeg;.      
1db40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1db50 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
1db60 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  );.        pNew 
1db70 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1db80 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77   }..    if( pNew
1db90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   ){.      int iL
1dba0 76 6c 20 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76 65  vl = pNew->nLeve
1dbb0 6c 2d 31 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  l-1;.      while
1dbc0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1dbd0 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c 65 76  OK && pNew->aLev
1dbe0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20  el[iLvl].nSeg>0 
1dbf0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
1dc00 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57  Rem = FTS5_OPT_W
1dc10 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20  ORK_UNIT;.      
1dc20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
1dc30 4c 65 76 65 6c 28 70 2c 20 69 2c 20 26 70 4e 65  Level(p, i, &pNe
1dc40 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  w, iLvl, &nRem);
1dc50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1dc60 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
1dc70 74 65 28 70 2c 20 69 2c 20 70 4e 65 77 29 3b 0a  te(p, i, pNew);.
1dc80 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
1dc90 75 72 65 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ureRelease(pNew)
1dca0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
1dcb0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1dcc0 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  e(pStruct);.  }.
1dcd0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
1dce0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d  dexReturn(p); .}
1dcf0 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74  ..../*.** Iterat
1dd00 6f 72 20 70 4d 75 6c 74 69 20 63 75 72 72 65 6e  or pMulti curren
1dd10 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  tly points to a 
1dd20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74  valid entry (not
1dd30 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66   EOF). This.** f
1dd40 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
1dd50 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f  a copy of the po
1dd60 73 69 74 69 6f 6e 2d 6c 69 73 74 20 6f 66 20 74  sition-list of t
1dd70 68 65 20 65 6e 74 72 79 20 70 4d 75 6c 74 69 20  he entry pMulti 
1dd80 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
1dd90 69 6e 74 73 20 74 6f 20 74 6f 20 62 75 66 66 65  ints to to buffe
1dda0 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66  r pBuf..**.** If
1ddb0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1ddc0 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
1ddd0 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63  is left in p->rc
1dde0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 0a  . It is assumed.
1ddf0 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20  ** no error has 
1de00 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
1de10 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1de20 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
1de30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1de40 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69  s5MultiIterPosli
1de50 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  st(.  Fts5Index 
1de60 2a 70 2c 0a 20 20 46 74 73 35 4d 75 6c 74 69 53  *p,.  Fts5MultiS
1de70 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a  egIter *pMulti,.
1de80 20 20 69 6e 74 20 62 53 7a 2c 0a 20 20 46 74 73    int bSz,.  Fts
1de90 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
1dea0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1deb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
1dec0 74 73 35 43 68 75 6e 6b 49 74 65 72 20 69 74 65  ts5ChunkIter ite
1ded0 72 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  r;.    Fts5SegIt
1dee0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c  er *pSeg = &pMul
1def0 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69  ti->aSeg[ pMulti
1df00 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1df10 73 74 20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  st ];.    assert
1df20 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
1df30 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30  of(p, pMulti)==0
1df40 20 29 3b 0a 20 20 20 20 73 74 61 74 69 63 20 69   );.    static i
1df50 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20  nt nCall = 0;.  
1df60 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a 20 20 20 20    nCall++;..    
1df70 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69  fts5ChunkIterIni
1df80 74 28 70 2c 20 70 53 65 67 2c 20 26 69 74 65 72  t(p, pSeg, &iter
1df90 29 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35  );..    if( fts5
1dfa0 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20  ChunkIterEof(p, 
1dfb0 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  &iter)==0 ){.   
1dfc0 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20     if( bSz ){.  
1dfd0 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
1dfe0 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
1dff0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1e000 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1e010 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e  rc, pBuf, iter.n
1e020 52 65 6d 20 2a 20 32 29 3b 0a 20 20 20 20 20 20  Rem * 2);.      
1e030 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 66  }.      while( f
1e040 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28  ts5ChunkIterEof(
1e050 70 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a  p, &iter)==0 ){.
1e060 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1e070 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1e080 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e  >rc, pBuf, iter.
1e090 6e 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20 20 20  n, iter.p);.    
1e0a0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
1e0b0 72 4e 65 78 74 28 70 2c 20 26 69 74 65 72 29 3b  rNext(p, &iter);
1e0c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e0d0 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1e0e0 52 65 6c 65 61 73 65 28 26 69 74 65 72 29 3b 0a  Release(&iter);.
1e0f0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1e100 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  id fts5DoclistIt
1e110 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69  erNext(Fts5Docli
1e120 73 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  stIter *pIter){.
1e130 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 3c 70    if( pIter->i<p
1e140 49 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  Iter->n ){.    i
1e150 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69  nt bDummy;.    i
1e160 66 28 20 70 49 74 65 72 2d 3e 69 20 29 7b 0a 20  f( pIter->i ){. 
1e170 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
1e180 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20  .      pIter->i 
1e190 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 49  += getVarint(&pI
1e1a0 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d  ter->a[pIter->i]
1e1b0 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
1e1c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
1e1d0 72 2d 3e 62 44 65 73 63 20 29 7b 0a 20 20 20 20  r->bDesc ){.    
1e1e0 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
1e1f0 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d -= iDelta;.   
1e200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e210 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
1e220 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
1e230 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1e240 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20      pIter->i += 
1e250 67 65 74 56 61 72 69 6e 74 28 26 70 49 74 65 72  getVarint(&pIter
1e260 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28  ->a[pIter->i], (
1e270 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
1e280 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
1e290 70 49 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73 35  pIter->i += fts5
1e2a0 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 0a  GetPoslistSize(.
1e2b0 20 20 20 20 20 20 20 20 26 70 49 74 65 72 2d 3e          &pIter->
1e2c0 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 26 70 49  a[pIter->i], &pI
1e2d0 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 2c 20 26  ter->nPoslist, &
1e2e0 62 44 75 6d 6d 79 0a 20 20 20 20 29 3b 0a 20 20  bDummy.    );.  
1e2f0 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73    pIter->aPoslis
1e300 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 5b 70 49  t = &pIter->a[pI
1e310 74 65 72 2d 3e 69 5d 3b 0a 20 20 20 20 70 49 74  ter->i];.    pIt
1e320 65 72 2d 3e 69 20 2b 3d 20 70 49 74 65 72 2d 3e  er->i += pIter->
1e330 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73  nPoslist;.  }els
1e340 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  e{.    pIter->aP
1e350 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a  oslist = 0;.  }.
1e360 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1e370 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
1e380 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  it(.  Fts5Buffer
1e390 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 62   *pBuf, .  int b
1e3a0 44 65 73 63 2c 20 0a 20 20 46 74 73 35 44 6f 63  Desc, .  Fts5Doc
1e3b0 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a  listIter *pIter.
1e3c0 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ){.  memset(pIte
1e3d0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
1e3e0 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
1e3f0 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70  a = pBuf->p;.  p
1e400 49 74 65 72 2d 3e 6e 20 3d 20 70 42 75 66 2d 3e  Iter->n = pBuf->
1e410 6e 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 65 73  n;.  pIter->bDes
1e420 63 20 3d 20 62 44 65 73 63 3b 0a 20 20 66 74 73  c = bDesc;.  fts
1e430 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
1e440 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pIter);.}../*.*
1e450 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69  * Append a docli
1e460 73 74 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  st to buffer pBu
1e470 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  f..*/.static voi
1e480 64 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e  d fts5MergeAppen
1e490 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20 2a 70  dDocid(.  int *p
1e4a0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
1e4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
1e4c0 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
1e4d0 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 0a  */.  int bDesc,.
1e4e0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1e4f0 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1e500 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77    /* Buffer to w
1e510 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
1e520 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20   *piLastRowid,  
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e540 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73  IN/OUT: Previous
1e550 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28   rowid written (
1e560 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34  if any) */.  i64
1e570 20 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20   iRowid         
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e590 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20  Rowid to append 
1e5a0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 42 75 66  */.){.  if( pBuf
1e5b0 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  ->n==0 ){.    ft
1e5c0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1e5d0 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20  rint(pRc, pBuf, 
1e5e0 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65  iRowid);.  }else
1e5f0 20 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20   if( bDesc ){.  
1e600 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1e610 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42  ndVarint(pRc, pB
1e620 75 66 2c 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  uf, *piLastRowid
1e630 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65   - iRowid);.  }e
1e640 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75 66  lse{.    fts5Buf
1e650 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1e660 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69  pRc, pBuf, iRowi
1e670 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  d - *piLastRowid
1e680 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61 73 74  );.  }.  *piLast
1e690 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1e6a0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73  }../*.** Buffers
1e6b0 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61   p1 and p2 conta
1e6c0 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69  in doclists. Thi
1e6d0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65  s function merge
1e6e0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  s the content.**
1e6f0 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c   of the two docl
1e700 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e  ists together an
1e710 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31  d sets buffer p1
1e720 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62   to the result b
1e730 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
1e740 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
1e750 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1e760 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
1e770 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66  eft in p->rc. If
1e780 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a   an error has.**
1e790 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1e7a0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1e7b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1e7c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1e7d0 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
1e7e0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1e7f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e800 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1e810 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1e820 69 6e 74 20 62 44 65 73 63 2c 0a 20 20 46 74 73  int bDesc,.  Fts
1e830 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20  5Buffer *p1,    
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e850 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65  First list to me
1e860 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  rge */.  Fts5Buf
1e870 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20  fer *p2         
1e880 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
1e890 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65  nd list to merge
1e8a0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d   */.){.  if( p2-
1e8b0 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c  >n ){.    i64 iL
1e8c0 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
1e8d0 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65    Fts5DoclistIte
1e8e0 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f  r i1;.    Fts5Do
1e8f0 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20  clistIter i2;.  
1e900 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74    Fts5Buffer out
1e910 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  ;.    Fts5Buffer
1e920 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74   tmp;.    memset
1e930 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66  (&out, 0, sizeof
1e940 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73  (out));.    mems
1e950 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65  et(&tmp, 0, size
1e960 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20 66  of(tmp));..    f
1e970 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
1e980 69 74 28 70 31 2c 20 62 44 65 73 63 2c 20 26 69  it(p1, bDesc, &i
1e990 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c  1);.    fts5Docl
1e9a0 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20  istIterInit(p2, 
1e9b0 62 44 65 73 63 2c 20 26 69 32 29 3b 0a 20 20 20  bDesc, &i2);.   
1e9c0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1e9d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 31 2e  QLITE_OK && (i1.
1e9e0 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69  aPoslist!=0 || i
1e9f0 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30 29 20 29  2.aPoslist!=0) )
1ea00 7b 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e 61  {.      if( i2.a
1ea10 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69  Poslist==0 || (i
1ea20 31 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20  1.aPoslist && . 
1ea30 20 20 20 20 20 20 20 20 20 20 28 20 28 62 44 65            ( (bDe
1ea40 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e  sc && i1.iRowid>
1ea50 69 32 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 21  i2.iRowid) || (!
1ea60 62 44 65 73 63 20 26 26 20 69 31 2e 69 52 6f 77  bDesc && i1.iRow
1ea70 69 64 3c 69 32 2e 69 52 6f 77 69 64 29 20 29 0a  id<i2.iRowid) ).
1ea80 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20        )){.      
1ea90 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20    /* Copy entry 
1eaa0 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20  from i1 */.     
1eab0 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
1eac0 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20  ndDocid(&p->rc, 
1ead0 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c  bDesc, &out, &iL
1eae0 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f  astRowid, i1.iRo
1eaf0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  wid);.        /*
1eb00 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a   WRITEPOSLISTSIZ
1eb10 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  E */.        fts
1eb20 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1eb30 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  int(&p->rc, &out
1eb40 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2a 20  , i1.nPoslist * 
1eb50 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  2);.        fts5
1eb60 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1eb70 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69  (&p->rc, &out, i
1eb80 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61  1.nPoslist, i1.a
1eb90 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Poslist);.      
1eba0 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
1ebb0 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20  rNext(&i1);.    
1ebc0 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69    }.      else i
1ebd0 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i1.aPoslist==
1ebe0 30 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d  0 || i2.iRowid!=
1ebf0 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  i1.iRowid ){.   
1ec00 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74       /* Copy ent
1ec10 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20  ry from i2 */.  
1ec20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
1ec30 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72  ppendDocid(&p->r
1ec40 63 2c 20 62 44 65 73 63 2c 20 26 6f 75 74 2c 20  c, bDesc, &out, 
1ec50 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e  &iLastRowid, i2.
1ec60 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1ec70 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54   /* WRITEPOSLIST
1ec80 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  SIZE */.        
1ec90 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1eca0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1ecb0 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  out, i2.nPoslist
1ecc0 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66   * 2);.        f
1ecd0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1ece0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  lob(&p->rc, &out
1ecf0 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69  , i2.nPoslist, i
1ed00 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  2.aPoslist);.   
1ed10 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
1ed20 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
1ed30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
1ed40 65 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  e{.        Fts5P
1ed50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72 31 3b  oslistReader r1;
1ed60 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73  .        Fts5Pos
1ed70 6c 69 73 74 52 65 61 64 65 72 20 72 32 3b 0a 20  listReader r2;. 
1ed80 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69         Fts5Posli
1ed90 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  stWriter writer;
1eda0 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ..        memset
1edb0 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
1edc0 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20  eof(writer));.. 
1edd0 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20         /* Merge 
1ede0 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e  the two position
1edf0 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20   lists. */ .    
1ee00 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
1ee10 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c  endDocid(&p->rc,
1ee20 20 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69   bDesc, &out, &i
1ee30 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
1ee40 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
1ee50 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74  ts5BufferZero(&t
1ee60 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  mp);.        sql
1ee70 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
1ee80 65 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31  eaderInit(-1, i1
1ee90 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50  .aPoslist, i1.nP
1eea0 6f 73 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20  oslist, &r1);.  
1eeb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1eec0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
1eed0 69 74 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69  it(-1, i2.aPosli
1eee0 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c  st, i2.nPoslist,
1eef0 20 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77   &r2);.        w
1ef00 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1ef10 49 54 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45  ITE_OK && (r1.bE
1ef20 6f 66 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66  of==0 || r2.bEof
1ef30 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
1ef40 20 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20    i64 iNew;.    
1ef50 20 20 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f        if( r2.bEo
1ef60 66 20 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30  f || (r1.bEof==0
1ef70 20 26 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69   && r1.iPos<r2.i
1ef80 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Pos) ){.        
1ef90 20 20 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50      iNew = r1.iP
1efa0 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
1efb0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1efc0 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31  stReaderNext(&r1
1efd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1efe0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1eff0 69 4e 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a  iNew = r2.iPos;.
1f000 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f010 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
1f020 61 64 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20  aderNext(&r2);. 
1f030 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1f040 31 2e 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20  1.iPos==r2.iPos 
1f050 29 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  ) sqlite3Fts5Pos
1f060 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26  listReaderNext(&
1f070 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  r1);.          }
1f080 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
1f090 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f   = sqlite3Fts5Po
1f0a0 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e  slistWriterAppen
1f0b0 64 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c  d(&tmp, &writer,
1f0c0 20 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   iNew);.        
1f0d0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52  }..        /* WR
1f0e0 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
1f0f0 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
1f100 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1f110 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74  (&p->rc, &out, t
1f120 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20  mp.n * 2);.     
1f130 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f140 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1f150 26 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70  &out, tmp.n, tmp
1f160 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .p);.        fts
1f170 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
1f180 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66  (&i1);.        f
1f190 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
1f1a0 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d  xt(&i2);.      }
1f1b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
1f1c0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1f1d0 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74  , p1, out.n, out
1f1e0 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .p);.    fts5Buf
1f1f0 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20  ferFree(&tmp);. 
1f200 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
1f210 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(&out);.  }.}..
1f220 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1f230 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42  BufferSwap(Fts5B
1f240 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42  uffer *p1, Fts5B
1f250 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74  uffer *p2){.  Ft
1f260 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a  s5Buffer tmp = *
1f270 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b  p1;.  *p1 = *p2;
1f280 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a  .  *p2 = tmp;.}.
1f290 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1f2a0 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72  5SetupPrefixIter
1f2b0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1f2c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f2d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
1f2e0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
1f2f0 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20  nt bDesc,       
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f310 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45  * True for "ORDE
1f320 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
1f330 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
1f340 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  pToken,         
1f350 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1f360 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69  containing prefi
1f370 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20  x to match */.  
1f380 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20  int nToken,     
1f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3a0 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
1f3b0 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65  r pToken in byte
1f3c0 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  s */.  Fts5Index
1f3d0 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
1f3e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61         /* Popula
1f3f0 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  te this object *
1f400 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
1f410 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
1f420 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75   Fts5Buffer *aBu
1f430 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  f;.  const int n
1f440 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75  Buf = 32;..  aBu
1f450 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a  f = (Fts5Buffer*
1f460 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
1f470 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1f480 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53  fer)*nBuf);.  pS
1f490 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
1f4a0 63 74 75 72 65 52 65 61 64 28 70 2c 20 30 29 3b  ctureRead(p, 0);
1f4b0 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20  ..  if( aBuf && 
1f4c0 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 46  pStruct ){.    F
1f4d0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a  ts5DoclistIter *
1f4e0 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e  pDoclist;.    in
1f4f0 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61  t i;.    i64 iLa
1f500 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
1f510 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
1f520 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f  r *p1 = 0;     /
1f530 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20  * Iterator used 
1f540 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66  to gather data f
1f550 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  rom index */.   
1f560 20 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c   Fts5Buffer docl
1f570 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  ist;..    memset
1f580 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69  (&doclist, 0, si
1f590 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a  zeof(doclist));.
1f5a0 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74      for(fts5Mult
1f5b0 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
1f5c0 75 63 74 2c 20 30 2c 20 31 2c 20 31 2c 20 70 54  uct, 0, 1, 1, pT
1f5d0 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31  oken, nToken, -1
1f5e0 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20  , 0, &p1);.     
1f5f0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1f600 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20  Eof(p, p1)==0;. 
1f610 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
1f620 49 74 65 72 4e 65 78 74 28 70 2c 20 70 31 2c 20  IterNext(p, p1, 
1f630 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  0, 0).    ){.   
1f640 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1f650 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1f660 69 64 28 70 31 29 3b 0a 20 20 20 20 20 20 69 6e  id(p1);.      in
1f670 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 63  t nTerm;.      c
1f680 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d  onst u8 *pTerm =
1f690 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65   fts5MultiIterTe
1f6a0 72 6d 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b 0a  rm(p1, &nTerm);.
1f6b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65        assert( me
1f6c0 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65  mcmp(pToken, pTe
1f6d0 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20  rm, MIN(nToken, 
1f6e0 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20  nTerm))<=0 );.  
1f6f0 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54      if( nTerm<nT
1f700 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  oken || memcmp(p
1f710 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54  Token, pTerm, nT
1f720 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 0a  oken) ) break;..
1f730 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73        if( doclis
1f740 74 2e 6e 3e 30 20 0a 20 20 20 20 20 20 20 26 26  t.n>0 .       &&
1f750 20 28 28 21 62 44 65 73 63 20 26 26 20 69 52 6f   ((!bDesc && iRo
1f760 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 29  wid<=iLastRowid)
1f770 20 7c 7c 20 28 62 44 65 73 63 20 26 26 20 69 52   || (bDesc && iR
1f780 6f 77 69 64 3e 3d 69 4c 61 73 74 52 6f 77 69 64  owid>=iLastRowid
1f790 29 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20  )).      ){..   
1f7a0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d       for(i=0; p-
1f7b0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1f7c0 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b  & doclist.n; i++
1f7d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
1f7e0 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20  ert( i<nBuf );. 
1f7f0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75           if( aBu
1f800 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  f[i].n==0 ){.   
1f810 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1f820 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74  ferSwap(&doclist
1f830 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
1f840 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1f850 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74  ferZero(&doclist
1f860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1f870 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1f880 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
1f890 69 73 74 73 28 70 2c 20 62 44 65 73 63 2c 20 26  ists(p, bDesc, &
1f8a0 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69  doclist, &aBuf[i
1f8b0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
1f8c0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
1f8d0 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
1f8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1f8f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1f900 28 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30 20 29  ( doclist.n==0 )
1f910 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
1f920 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1f930 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73  (&p->rc, &doclis
1f940 74 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  t, iRowid);.    
1f950 20 20 7d 65 6c 73 65 20 69 66 28 20 62 44 65 73    }else if( bDes
1f960 63 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  c ){.        fts
1f970 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1f980 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63  int(&p->rc, &doc
1f990 6c 69 73 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  list, iLastRowid
1f9a0 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20   - iRowid);.    
1f9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f9c0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1f9d0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1f9e0 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69 64  &doclist, iRowid
1f9f0 20 2d 20 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a   - iLastRowid);.
1fa00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c        }.      iL
1fa10 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69  astRowid = iRowi
1fa20 64 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  d;.      fts5Mul
1fa30 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c  tiIterPoslist(p,
1fa40 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69 73 74   p1, 1, &doclist
1fa50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  );.    }..    fo
1fa60 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69  r(i=0; i<nBuf; i
1fa70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  ++){.      fts5M
1fa80 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28  ergePrefixLists(
1fa90 70 2c 20 62 44 65 73 63 2c 20 26 64 6f 63 6c 69  p, bDesc, &docli
1faa0 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
1fab0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46       fts5BufferF
1fac0 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20  ree(&aBuf[i]);. 
1fad0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c     }.    fts5Mul
1fae0 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 31  tiIterFree(p, p1
1faf0 29 3b 0a 0a 20 20 20 20 70 44 6f 63 6c 69 73 74  );..    pDoclist
1fb00 20 3d 20 28 46 74 73 35 44 6f 63 6c 69 73 74 49   = (Fts5DoclistI
1fb10 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c  ter*)fts5IdxMall
1fb20 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
1fb30 35 44 6f 63 6c 69 73 74 49 74 65 72 29 29 3b 0a  5DoclistIter));.
1fb40 20 20 20 20 69 66 28 20 21 70 44 6f 63 6c 69 73      if( !pDoclis
1fb50 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42  t ){.      fts5B
1fb60 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69  ufferFree(&docli
1fb70 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
1fb80 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 44 6f        pIter->pDo
1fb90 63 6c 69 73 74 20 3d 20 70 44 6f 63 6c 69 73 74  clist = pDoclist
1fba0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c  ;.      fts5Docl
1fbb0 69 73 74 49 74 65 72 49 6e 69 74 28 26 64 6f 63  istIterInit(&doc
1fbc0 6c 69 73 74 2c 20 62 44 65 73 63 2c 20 70 49 74  list, bDesc, pIt
1fbd0 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20  er->pDoclist);. 
1fbe0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
1fbf0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
1fc00 28 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c  (pStruct);.  sql
1fc10 69 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b  ite3_free(aBuf);
1fc20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63  .}.../*.** Indic
1fc30 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62  ate that all sub
1fc40 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
1fc50 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
1fc60 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e  xWrite() pertain
1fc70 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d  .** to the docum
1fc80 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69  ent with rowid i
1fc90 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Rowid..*/.int sq
1fca0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65  lite3Fts5IndexBe
1fcb0 67 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e 64  ginWrite(Fts5Ind
1fcc0 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
1fcd0 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  d){.  assert( p-
1fce0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1fcf0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1fd00 20 68 61 73 68 20 74 61 62 6c 65 73 20 69 66 20   hash tables if 
1fd10 74 68 65 79 20 68 61 76 65 20 6e 6f 74 20 61 6c  they have not al
1fd20 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
1fd30 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
1fd40 3e 61 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  >apHash==0 ){.  
1fd50 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
1fd60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fd70 0a 20 20 20 20 69 6e 74 20 6e 48 61 73 68 20 3d  .    int nHash =
1fd80 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72   p->pConfig->nPr
1fd90 65 66 69 78 20 2b 20 31 3b 0a 20 20 20 20 46 74  efix + 1;.    Ft
1fda0 73 35 48 61 73 68 20 2a 2a 61 70 4e 65 77 3b 0a  s5Hash **apNew;.
1fdb0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 46 74  .    apNew = (Ft
1fdc0 73 35 48 61 73 68 2a 2a 29 73 71 6c 69 74 65 33  s5Hash**)sqlite3
1fdd0 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
1fde0 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 48  rc, sizeof(Fts5H
1fdf0 61 73 68 2a 29 2a 6e 48 61 73 68 29 3b 0a 20 20  ash*)*nHash);.  
1fe00 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
1fe10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 48  QLITE_OK && i<nH
1fe20 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ash; i++){.     
1fe30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
1fe40 35 48 61 73 68 4e 65 77 28 26 61 70 4e 65 77 5b  5HashNew(&apNew[
1fe50 69 5d 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67  i], &p->nPending
1fe60 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
1fe70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fe80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  OK ){.      p->a
1fe90 70 48 61 73 68 20 3d 20 61 70 4e 65 77 3b 0a 20  pHash = apNew;. 
1fea0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1feb0 69 66 28 20 61 70 4e 65 77 20 29 7b 0a 20 20 20  if( apNew ){.   
1fec0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1fed0 6e 48 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20  nHash; i++){.   
1fee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1fef0 73 35 48 61 73 68 46 72 65 65 28 61 70 4e 65 77  s5HashFree(apNew
1ff00 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
1ff10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1ff20 66 72 65 65 28 61 70 4e 65 77 29 3b 0a 20 20 20  free(apNew);.   
1ff30 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1ff40 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1ff50 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 3d 70  .  if( iRowid<=p
1ff60 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 7c 7c  ->iWriteRowid ||
1ff70 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74   (p->nPendingDat
1ff80 61 20 3e 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69  a > p->nMaxPendi
1ff90 6e 67 44 61 74 61 29 20 29 7b 0a 20 20 20 20 66  ngData) ){.    f
1ffa0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
1ffb0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 57 72 69 74  ;.  }.  p->iWrit
1ffc0 65 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  eRowid = iRowid;
1ffd0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
1ffe0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
1fff0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61  ./*.** Commit da
20000 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69  ta to disk..*/.i
20010 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
20020 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65  dexSync(Fts5Inde
20030 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69  x *p, int bCommi
20040 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  t){.  assert( p-
20050 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
20060 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ;.  fts5IndexFlu
20070 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f  sh(p);.  if( bCo
20080 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65  mmit ) fts5Close
20090 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74  Reader(p);.  ret
200a0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
200b0 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
200c0 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74   Discard any dat
200d0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
200e0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
200f0 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72  ables. Do not wr
20100 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65  ite it.** to the
20110 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
20120 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20  ionally, assume 
20130 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
20140 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a  s of the %_data.
20150 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76  ** table may hav
20160 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73  e changed on dis
20170 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d  k. So any in-mem
20180 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f  ory caches of %_
20190 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73  data .** records
201a0 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64   must be invalid
201b0 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
201c0 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c  ite3Fts5IndexRol
201d0 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20  lback(Fts5Index 
201e0 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65  *p){.  fts5Close
201f0 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73  Reader(p);.  fts
20200 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
20210 61 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  a(p);.  assert( 
20220 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
20230 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
20240 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20250 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   The %_data tabl
20260 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
20270 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73 20  empty when this 
20280 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20290 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ed. This.** func
202a0 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69  tion populates i
202b0 74 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69  t with the initi
202c0 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  al structure obj
202d0 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e  ects for each in
202e0 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  dex,.** and the 
202f0 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20  initial version 
20300 6f 66 20 74 68 65 20 22 61 76 65 72 61 67 65 73  of the "averages
20310 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f  " record (a zero
20320 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a  -byte blob)..*/.
20330 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
20340 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49  ndexReinit(Fts5I
20350 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ndex *p){.  int 
20360 69 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  i;.  Fts5Structu
20370 72 65 20 73 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  re s;..  memset(
20380 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  &s, 0, sizeof(Ft
20390 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20  s5Structure));. 
203a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
203b0 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 2b  Config->nPrefix+
203c0 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73  1; i++){.    fts
203d0 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
203e0 70 2c 20 69 2c 20 26 73 29 3b 0a 20 20 7d 0a 20  p, i, &s);.  }. 
203f0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
20400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
20410 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
20420 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
20430 28 70 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22  (p, (const u8*)"
20440 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ", 0);.  }..  re
20450 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
20460 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
20470 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73  * Open a new Fts
20480 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49  5Index handle. I
20490 66 20 74 68 65 20 62 43 72 65 61 74 65 20 61 72  f the bCreate ar
204a0 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
204b0 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e  create.** and in
204c0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64  itialize the und
204d0 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74  erlying %_data t
204e0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  able..**.** If s
204f0 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a  uccessful, set *
20500 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  pp to point to t
20510 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e  he new object an
20520 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
20530 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  OK..** Otherwise
20540 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c  , set *pp to NUL
20550 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  L and return an 
20560 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
20570 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
20580 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a  3Fts5IndexOpen(.
20590 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
205a0 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43  onfig, .  int bC
205b0 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e  reate, .  Fts5In
205c0 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72  dex **pp,.  char
205d0 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e   **pzErr.){.  in
205e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
205f0 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  ;.  Fts5Index *p
20600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20610 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
20620 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20  t */..  *pp = p 
20630 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71  = (Fts5Index*)sq
20640 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
20650 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b  eof(Fts5Index));
20660 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
20670 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
20680 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
20690 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65   sizeof(Fts5Inde
206a0 78 29 29 3b 0a 20 20 70 2d 3e 70 43 6f 6e 66 69  x));.  p->pConfi
206b0 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 70  g = pConfig;.  p
206c0 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54  ->nWorkUnit = FT
206d0 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20  S5_WORK_UNIT;.  
206e0 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
206f0 74 61 20 3d 20 31 30 32 34 2a 31 30 32 34 3b 0a  ta = 1024*1024;.
20700 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20    p->zDataTbl = 
20710 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
20720 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66  "%s_data", pConf
20730 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ig->zName);.  if
20740 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d 30  ( p->zDataTbl==0
20750 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
20760 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
20770 73 65 20 69 66 28 20 62 43 72 65 61 74 65 20 29  se if( bCreate )
20780 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
20790 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c  e3Fts5CreateTabl
207a0 65 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66  e(.        pConf
207b0 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20  ig, "data", "id 
207c0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
207d0 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22  KEY, block BLOB"
207e0 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 29  , 0, pzErr.    )
207f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
20800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20810 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
20820 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b  5IndexReinit(p);
20830 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
20840 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
20850 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 21 3d 53 51  ITE_OK || rc!=SQ
20860 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
20870 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
20880 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
20890 28 70 2c 20 30 29 3b 0a 20 20 20 20 2a 70 70 20  (p, 0);.    *pp 
208a0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
208b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
208c0 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70  lose a handle op
208d0 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
208e0 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
208f0 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
20900 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
20910 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
20920 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
20930 74 20 62 44 65 73 74 72 6f 79 29 7b 0a 20 20 69  t bDestroy){.  i
20940 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20950 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  K;.  if( p ){.  
20960 20 20 69 66 28 20 62 44 65 73 74 72 6f 79 20 29    if( bDestroy )
20970 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20980 69 74 65 33 46 74 73 35 44 72 6f 70 54 61 62 6c  ite3Fts5DropTabl
20990 65 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 22 64  e(p->pConfig, "d
209a0 61 74 61 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ata");.    }.   
209b0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
209c0 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  der==0 );.    sq
209d0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
209e0 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  ->pWriter);.    
209f0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
20a00 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
20a10 20 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68     if( p->apHash
20a20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
20a30 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
20a40 69 3c 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  i<=p->pConfig->n
20a50 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20  Prefix; i++){.  
20a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
20a70 35 48 61 73 68 46 72 65 65 28 70 2d 3e 61 70 48  5HashFree(p->apH
20a80 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ash[i]);.      }
20a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20aa0 72 65 65 28 70 2d 3e 61 70 48 61 73 68 29 3b 0a  ree(p->apHash);.
20ab0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20ac0 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54  3_free(p->zDataT
20ad0 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  bl);.    sqlite3
20ae0 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20  _free(p);.  }.  
20af0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20b00 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70  .** Argument p p
20b10 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65  oints to a buffe
20b20 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66  r containing utf
20b30 2d 38 20 74 65 78 74 20 74 68 61 74 20 69 73 20  -8 text that is 
20b40 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73  n bytes in .** s
20b50 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ize. Return the 
20b60 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
20b70 69 6e 20 74 68 65 20 6e 43 68 61 72 20 63 68 61  in the nChar cha
20b80 72 61 63 74 65 72 20 70 72 65 66 69 78 20 6f 66  racter prefix of
20b90 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c 20   the.** buffer, 
20ba0 6f 72 20 30 20 69 66 20 74 68 65 72 65 20 61 72  or 0 if there ar
20bb0 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 43 68 61  e less than nCha
20bc0 72 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  r characters in 
20bd0 74 6f 74 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  total..*/.static
20be0 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68   int fts5IndexCh
20bf0 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 63  arlenToBytelen(c
20c00 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 69 6e  onst char *p, in
20c10 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 6e 43 68  t nByte, int nCh
20c20 61 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  ar){.  int n = 0
20c30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
20c40 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69  (i=0; i<nChar; i
20c50 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  ++){.    if( n>=
20c60 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e 20 30  nByte ) return 0
20c70 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20  ;      /* Input 
20c80 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
20c90 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20  han nChar chars 
20ca0 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69  */.    if( (unsi
20cb0 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d  gned char)p[n++]
20cc0 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
20cd0 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30  while( (p[n] & 0
20ce0 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b  xc0)==0x80 ) n++
20cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
20d00 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
20d10 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20   pIn is a UTF-8 
20d20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20  encoded string, 
20d30 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  nIn bytes in siz
20d40 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  e. Return the nu
20d50 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f  mber of.** unico
20d60 64 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  de characters in
20d70 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a   the string..*/.
20d80 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61  int fts5IndexCha
20d90 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  rlen(const char 
20da0 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a  *pIn, int nIn){.
20db0 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b    int nChar = 0;
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69              .  i
20dd0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt i = 0;.  whil
20de0 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20  e( i<nIn ){.    
20df0 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68  if( (unsigned ch
20e00 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63  ar)pIn[i++]>=0xc
20e10 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  0 ){.      while
20e20 28 20 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b  ( i<nIn && (pIn[
20e30 69 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  i] & 0xc0)==0x80
20e40 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) i++;.    }.  
20e50 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20    nChar++;.  }. 
20e60 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d   return nChar;.}
20e70 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f  ../*.** Insert o
20e80 72 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f  r remove data to
20e90 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64   or from the ind
20ea0 65 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  ex. Each time a 
20eb0 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20  document is .** 
20ec0 61 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f  added to or remo
20ed0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64  ved from the ind
20ee0 65 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ex, this functio
20ef0 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20  n is called one 
20f00 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73  or more.** times
20f10 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69  ..**.** For an i
20f20 6e 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62  nsert, it must b
20f30 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
20f40 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20  r each token in 
20f50 74 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74  the new document
20f60 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72  ..** If the oper
20f70 61 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74  ation is a delet
20f80 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  e, it must be ca
20f90 6c 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29 20  lled (at least) 
20fa0 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  once for each.**
20fb0 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e   unique token in
20fc0 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
20fd0 74 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65  th an iCol value
20fe0 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e   less than zero.
20ff0 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67   The iPos.** arg
21000 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64  ument is ignored
21010 20 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a   for a delete..*
21020 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
21030 35 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46  5IndexWrite(.  F
21040 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21060 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65  * Index to write
21070 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   to */.  int iCo
21080 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
21090 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
210a0 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73  mn token appears
210b0 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65   in (-ve -> dele
210c0 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f  te) */.  int iPo
210d0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
210e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
210f0 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69  tion of token wi
21100 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  thin column */. 
21110 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
21120 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20  ken, int nToken 
21130 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64   /* Token to add
21140 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72   or remove to or
21150 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29   from index */.)
21160 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21180 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
21190 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69  terate through i
211a0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndexes */.  int 
211b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
211c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
211d0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
211e0 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
211f0 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
21200 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
21210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
21220 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e  ..  /* Add the n
21230 65 77 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20  ew token to the 
21240 6d 61 69 6e 20 74 65 72 6d 73 20 68 61 73 68 20  main terms hash 
21250 74 61 62 6c 65 2e 20 41 6e 64 20 74 6f 20 65 61  table. And to ea
21260 63 68 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 70  ch of the.  ** p
21270 72 65 66 69 78 20 68 61 73 68 20 74 61 62 6c 65  refix hash table
21280 73 20 74 68 61 74 20 69 74 20 69 73 20 6c 61 72  s that it is lar
21290 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 2e 20 2a  ge enough for. *
212a0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
212b0 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a 20  Fts5HashWrite(. 
212c0 20 20 20 20 20 70 2d 3e 61 70 48 61 73 68 5b 30       p->apHash[0
212d0 5d 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  ], p->iWriteRowi
212e0 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70  d, iCol, iPos, p
212f0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20  Token, nToken.  
21300 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
21310 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
21320 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
21330 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  K; i++){.    int
21340 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e 64   nByte = fts5Ind
21350 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c  exCharlenToBytel
21360 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  en(pToken, nToke
21370 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  n, pConfig->aPre
21380 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  fix[i]);.    if(
21390 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
213a0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
213b0 48 61 73 68 57 72 69 74 65 28 0a 20 20 20 20 20  HashWrite(.     
213c0 20 20 20 20 20 70 2d 3e 61 70 48 61 73 68 5b 69       p->apHash[i
213d0 2b 31 5d 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f  +1], p->iWriteRo
213e0 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
213f0 20 70 54 6f 6b 65 6e 2c 20 6e 42 79 74 65 0a 20   pToken, nByte. 
21400 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
21410 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
21420 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
21430 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20  new iterator to 
21440 69 74 65 72 61 74 65 20 74 68 6f 75 67 68 20 61  iterate though a
21450 6c 6c 20 64 6f 63 69 64 73 20 74 68 61 74 20 6d  ll docids that m
21460 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70 65  atch the .** spe
21470 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20  cified token or 
21480 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f  token prefix..*/
21490 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
214a0 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46 74  IndexQuery(.  Ft
214b0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
214d0 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71 75   FTS index to qu
214e0 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ery */.  const c
214f0 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74  har *pToken, int
21500 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65   nToken, /* Toke
21510 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20 74 6f  n (or prefix) to
21520 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20   query for */.  
21530 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
21540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21550 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49  /* Mask of FTS5I
21560 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c 61  NDEX_QUERY_X fla
21570 67 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  gs */.  Fts5Inde
21580 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20  xIter **ppIter  
21590 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
215a0 4e 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  New iterator obj
215b0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ect */.){.  Fts5
215c0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
215d0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
215e0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
215f0 52 65 74 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Ret;.  int iIdx 
21600 3d 20 30 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  = 0;..  if( flag
21610 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
21620 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20  ERY_PREFIX ){.  
21630 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
21640 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
21650 53 54 5f 4e 4f 49 44 58 20 29 7b 0a 20 20 20 20  ST_NOIDX ){.    
21660 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e 66    iIdx = 1+pConf
21670 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20 20  ig->nPrefix;.   
21680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
21690 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e  t nChar = fts5In
216a0 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65  dexCharlen(pToke
216b0 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
216c0 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49    for(iIdx=1; iI
216d0 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
216e0 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
216f0 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66         if( pConf
21700 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78  ig->aPrefix[iIdx
21710 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65  -1]==nChar ) bre
21720 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
21730 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20  }.  }..  pRet = 
21740 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29  (Fts5IndexIter*)
21750 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
21760 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 73 69  cZero(&p->rc, si
21770 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74  zeof(Fts5IndexIt
21780 65 72 29 29 3b 0a 20 20 69 66 28 20 70 52 65 74  er));.  if( pRet
21790 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
217a0 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Ret, 0, sizeof(F
217b0 74 73 35 49 6e 64 65 78 49 74 65 72 29 29 3b 0a  ts5IndexIter));.
217c0 0a 20 20 20 20 70 52 65 74 2d 3e 70 49 6e 64 65  .    pRet->pInde
217d0 78 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 69  x = p;.    if( i
217e0 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
217f0 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 70  refix ){.      p
21800 52 65 74 2d 3e 70 53 74 72 75 63 74 20 3d 20 66  Ret->pStruct = f
21810 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
21820 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 20  (p, iIdx);.     
21830 20 69 66 28 20 70 52 65 74 2d 3e 70 53 74 72 75   if( pRet->pStru
21840 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ct ){.        ft
21850 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
21860 2c 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74 2c  , pRet->pStruct,
21870 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49   .            iI
21880 64 78 2c 20 31 2c 20 66 6c 61 67 73 2c 20 28 63  dx, 1, flags, (c
21890 6f 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e 2c  onst u8*)pToken,
218a0 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20   nToken, -1, 0, 
218b0 26 70 52 65 74 2d 3e 70 4d 75 6c 74 69 0a 20 20  &pRet->pMulti.  
218c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
218d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
218e0 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20 28 66    int bDesc = (f
218f0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
21900 5f 51 55 45 52 59 5f 44 45 53 43 29 21 3d 30 3b  _QUERY_DESC)!=0;
21910 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75 70  .      fts5Setup
21920 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62 44  PrefixIter(p, bD
21930 65 73 63 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  esc, (const u8*)
21940 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20  pToken, nToken, 
21950 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pRet);.    }.  }
21960 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b  ..  if( p->rc ){
21970 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
21980 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74 29 3b  IterClose(pRet);
21990 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
219a0 20 7d 0a 20 20 2a 70 70 49 74 65 72 20 3d 20 70   }.  *ppIter = p
219b0 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  Ret;.  return ft
219c0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
219d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
219e0 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
219f0 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
21a00 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
21a10 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f  nt is at EOF..*/
21a20 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
21a30 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
21a40 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
21a50 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
21a60 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49  pIndex->rc==SQLI
21a70 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70  TE_OK );.  if( p
21a80 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29  Iter->pDoclist )
21a90 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49  { .    return pI
21aa0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61  ter->pDoclist->a
21ab0 50 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a 20 20 7d  Poslist==0; .  }
21ac0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
21ad0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
21ae0 66 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  f(pIter->pIndex,
21af0 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b   pIter->pMulti);
21b00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  .  }.}../*.** Mo
21b10 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  ve to the next m
21b20 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a  atching rowid. .
21b30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
21b40 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  s5IterNext(Fts5I
21b50 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
21b60 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
21b70 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
21b80 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
21b90 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  ( pIter->pDoclis
21ba0 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f 63  t ){.    fts5Doc
21bb0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49 74  listIterNext(pIt
21bc0 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20  er->pDoclist);. 
21bd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
21be0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
21bf0 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
21c00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
21c10 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  xt(pIter->pIndex
21c20 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c  , pIter->pMulti,
21c30 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
21c40 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
21c50 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
21c60 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ex);.}../*.** Mo
21c70 76 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  ve the doclist-i
21c80 74 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68  ter passed as th
21c90 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
21ca0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a   to the next .**
21cb0 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20   matching rowid 
21cc0 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f  that occurs at o
21cd0 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20  r after iMatch. 
21ce0 54 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  The definition o
21cf0 66 20 22 61 74 20 0a 2a 2a 20 6f 72 20 61 66 74  f "at .** or aft
21d00 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  er" depends on w
21d10 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72  hether this iter
21d20 61 74 6f 72 20 69 74 65 72 61 74 65 73 20 69 6e  ator iterates in
21d30 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 0a 2a   ascending or .*
21d40 2a 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  * descending row
21d50 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  id order..*/.sta
21d60 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63  tic void fts5Doc
21d70 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f 6d  listIterNextFrom
21d80 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72  (Fts5DoclistIter
21d90 20 2a 70 2c 20 69 36 34 20 69 4d 61 74 63 68 29   *p, i64 iMatch)
21da0 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20  {.  do{.    i64 
21db0 69 52 6f 77 69 64 20 3d 20 70 2d 3e 69 52 6f 77  iRowid = p->iRow
21dc0 69 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  id;.    if( p->b
21dd0 44 65 73 63 3d 3d 30 20 26 26 20 69 52 6f 77 69  Desc==0 && iRowi
21de0 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d>=iMatch ) brea
21df0 6b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 44  k;.    if( p->bD
21e00 65 73 63 21 3d 30 20 26 26 20 69 52 6f 77 69 64  esc!=0 && iRowid
21e10 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  <=iMatch ) break
21e20 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ;.    fts5Doclis
21e30 74 49 74 65 72 4e 65 78 74 28 70 29 3b 0a 20 20  tIterNext(p);.  
21e40 7d 77 68 69 6c 65 28 20 70 2d 3e 61 50 6f 73 6c  }while( p->aPosl
21e50 69 73 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ist );.}../*.** 
21e60 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
21e70 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20   matching rowid 
21e80 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f  that occurs at o
21e90 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20  r after iMatch. 
21ea0 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f  The.** definitio
21eb0 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65  n of "at or afte
21ec0 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  r" depends on wh
21ed0 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61  ether this itera
21ee0 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20  tor iterates.** 
21ef0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20  in ascending or 
21f00 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64  descending rowid
21f10 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   order..*/.int s
21f20 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
21f30 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78  xtFrom(Fts5Index
21f40 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 36 34  Iter *pIter, i64
21f50 20 69 4d 61 74 63 68 29 7b 0a 20 20 69 66 28 20   iMatch){.  if( 
21f60 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20  pIter->pDoclist 
21f70 29 7b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  ){.    fts5Docli
21f80 73 74 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  stIterNextFrom(p
21f90 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2c 20  Iter->pDoclist, 
21fa0 69 4d 61 74 63 68 29 3b 0a 20 20 7d 65 6c 73 65  iMatch);.  }else
21fb0 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  {.    fts5MultiI
21fc0 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65  terNextFrom(pIte
21fd0 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
21fe0 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61 74 63 68  ->pMulti, iMatch
21ff0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22000 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
22010 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
22020 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22030 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69  the current rowi
22040 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  d..*/.i64 sqlite
22050 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28 46  3Fts5IterRowid(F
22060 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
22070 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
22080 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20  r->pDoclist ){. 
22090 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d     return pIter-
220a0 3e 70 44 6f 63 6c 69 73 74 2d 3e 69 52 6f 77 69  >pDoclist->iRowi
220b0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
220c0 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69  return fts5Multi
220d0 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 2d  IterRowid(pIter-
220e0 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a  >pMulti);.  }.}.
220f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
22100 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
22110 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
22120 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f  a copy of the po
22130 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a  sition list for.
22140 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  ** the current e
22150 6e 74 72 79 2e 20 4f 75 74 70 75 74 20 76 61 72  ntry. Output var
22160 69 61 62 6c 65 20 2a 70 6e 20 69 73 20 73 65 74  iable *pn is set
22170 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
22180 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 69  the buffer .** i
22190 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 72  n bytes before r
221a0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
221b0 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 73  The returned pos
221c0 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20  ition list does 
221d0 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
221e0 22 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73  "number of bytes
221f0 22 20 76 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c  " varint.** fiel
22200 64 20 74 68 61 74 20 73 74 61 72 74 73 20 74 68  d that starts th
22210 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
22220 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  on disk..*/.int 
22230 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
22240 6f 73 6c 69 73 74 28 46 74 73 35 49 6e 64 65 78  oslist(Fts5Index
22250 49 74 65 72 20 2a 70 49 74 65 72 2c 20 63 6f 6e  Iter *pIter, con
22260 73 74 20 75 38 20 2a 2a 70 70 2c 20 69 6e 74 20  st u8 **pp, int 
22270 2a 70 6e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  *pn){.  assert( 
22280 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
22290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
222a0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
222b0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 6e  clist ){.    *pn
222c0 20 3d 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69   = pIter->pDocli
222d0 73 74 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20  st->nPoslist;.  
222e0 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e 70    *pp = pIter->p
222f0 44 6f 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73  Doclist->aPoslis
22300 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
22310 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70  Fts5Index *p = p
22320 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Iter->pIndex;.  
22330 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
22340 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
22350 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  );.    fts5Multi
22360 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70  IterPoslist(p, p
22370 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 30 2c  Iter->pMulti, 0,
22380 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
22390 29 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49 74  );.    *pn = pIt
223a0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20  er->poslist.n;. 
223b0 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e     *pp = pIter->
223c0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 20  poslist.p;.  }. 
223d0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
223e0 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
223f0 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
22400 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74   Close an iterat
22410 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  or opened by an 
22420 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
22430 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
22440 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Query()..*/.void
22450 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
22460 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49  Close(Fts5IndexI
22470 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
22480 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
22490 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
224a0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ist ){.      sql
224b0 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
224c0 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 29 3b 0a 20  >pDoclist->a);. 
224d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
224e0 65 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  e(pIter->pDoclis
224f0 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
22500 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
22510 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 49  erFree(pIter->pI
22520 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75  ndex, pIter->pMu
22530 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 74 73 35  lti);.      fts5
22540 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
22550 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29  (pIter->pStruct)
22560 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
22570 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70  erFree(&pIter->p
22580 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  oslist);.    }. 
22590 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
225a0 65 72 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  er(pIter->pIndex
225b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
225c0 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ree(pIter);.  }.
225d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  }../*.** Read th
225e0 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  e "averages" rec
225f0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ord into the buf
22600 66 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20  fer supplied as 
22610 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
22620 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
22630 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
22640 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
22650 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
22660 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72 20  .** if an error 
22670 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
22680 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 47  qlite3Fts5IndexG
22690 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
226a0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66  ndex *p, Fts5Buf
226b0 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  fer *pBuf){.  as
226c0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
226d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
226e0 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72  DataReadOrBuffer
226f0 28 70 2c 20 70 42 75 66 2c 20 46 54 53 35 5f 41  (p, pBuf, FTS5_A
22700 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a  VERAGES_ROWID);.
22710 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
22720 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
22730 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
22740 65 20 63 75 72 72 65 6e 74 20 22 61 76 65 72 61  e current "avera
22750 67 65 73 22 20 72 65 63 6f 72 64 20 77 69 74 68  ges" record with
22760 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22770 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20   the buffer .** 
22780 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20  supplied as the 
22790 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
227a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
227b0 74 73 35 49 6e 64 65 78 53 65 74 41 76 65 72 61  ts5IndexSetAvera
227c0 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ges(Fts5Index *p
227d0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74  , const u8 *pDat
227e0 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20  a, int nData){. 
227f0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
22800 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
22810 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
22820 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
22830 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  WID, pData, nDat
22840 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  a);.  return fts
22850 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
22860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22870 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
22880 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73  r of blocks this
22890 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64   module has read
228a0 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
228b0 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20  .** table since 
228c0 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  it was created..
228d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
228e0 73 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73  s5IndexReads(Fts
228f0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65  5Index *p){.  re
22900 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d  turn p->nRead;.}
22910 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
22920 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61  32-bit cookie va
22930 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  lue stored at th
22940 65 20 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73  e start of all s
22950 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63  tructure .** rec
22960 6f 72 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75  ords to the valu
22970 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
22980 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
22990 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
229a0 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
229b0 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
229c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
229d0 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
229e0 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
229f0 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
22a00 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78  Cookie(Fts5Index
22a10 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a   *p, int iNew){.
22a20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22a30 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 43 6f 6e 66  E_OK;.  Fts5Conf
22a40 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
22a50 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 75 38 20 61  >pConfig;.  u8 a
22a60 43 6f 6f 6b 69 65 5b 34 5d 3b 0a 20 20 69 6e 74  Cookie[4];.  int
22a70 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
22a80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22a90 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  );.  sqlite3Fts5
22aa0 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20 69  Put32(aCookie, i
22ab0 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  New);.  for(i=0;
22ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22ad0 26 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  & i<=pConfig->nP
22ae0 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  refix; i++){.   
22af0 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
22b00 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 20 20 69 36  Blob = 0;.    i6
22b10 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  4 iRowid = FTS5_
22b20 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28  STRUCTURE_ROWID(
22b30 69 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  i);.    rc = sql
22b40 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 0a  ite3_blob_open(.
22b50 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
22b60 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44  >db, pConfig->zD
22b70 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
22b80 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
22b90 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20 20 20 29   1, &pBlob.    )
22ba0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
22bb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22bc0 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
22bd0 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b  ite(pBlob, aCook
22be0 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 20  ie, 4, 0);.     
22bf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
22c00 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b  ob_close(pBlob);
22c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
22c20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
22c30 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
22c40 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49  LoadConfig(Fts5I
22c50 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
22c60 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
22c70 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  ct;.  pStruct = 
22c80 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
22c90 64 28 70 2c 20 30 29 3b 0a 20 20 66 74 73 35 53  d(p, 0);.  fts5S
22ca0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
22cb0 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75  pStruct);.  retu
22cc0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
22cd0 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  rn(p);.}.../****
22ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d20 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
22d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d70 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70  .** Below this p
22d80 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c  oint is the impl
22d90 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
22da0 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
22db0 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c  k .** functional
22dc0 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  ity..*/../*.** R
22dd0 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65 20 63  eturn a simple c
22de0 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 62 61  hecksum value ba
22df0 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67 75 6d  sed on the argum
22e00 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
22e10 75 36 34 20 66 74 73 35 49 6e 64 65 78 45 6e 74  u64 fts5IndexEnt
22e20 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34 20 69  ryCksum(.  i64 i
22e30 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20 69 43  Rowid, .  int iC
22e40 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c  ol, .  int iPos,
22e50 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
22e60 70 54 65 72 6d 2c 20 0a 20 20 69 6e 74 20 6e 54  pTerm, .  int nT
22e70 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erm.){.  int i;.
22e80 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77    u64 ret = iRow
22e90 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  id;.  ret += (re
22ea0 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20  t<<3) + iCol;.  
22eb0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
22ec0 2b 20 69 50 6f 73 3b 0a 20 20 66 6f 72 28 69 3d  + iPos;.  for(i=
22ed0 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29  0; i<nTerm; i++)
22ee0 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
22ef0 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72   + pTerm[i];.  r
22f00 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 73 74  eturn ret;.}..st
22f10 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74  atic void fts5Bt
22f20 72 65 65 49 74 65 72 49 6e 69 74 28 0a 20 20 46  reeIterInit(.  F
22f30 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
22f40 69 6e 74 20 69 49 64 78 2c 0a 20 20 46 74 73 35  int iIdx,.  Fts5
22f50 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
22f60 20 2a 70 53 65 67 2c 20 0a 20 20 46 74 73 35 42   *pSeg, .  Fts5B
22f70 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 0a  treeIter *pIter.
22f80 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
22f90 20 20 69 6e 74 20 69 3b 0a 20 20 6e 42 79 74 65    int i;.  nByte
22fa0 20 3d 20 73 69 7a 65 6f 66 28 70 49 74 65 72 2d   = sizeof(pIter-
22fb0 3e 61 4c 76 6c 5b 30 5d 29 20 2a 20 28 70 53 65  >aLvl[0]) * (pSe
22fc0 67 2d 3e 6e 48 65 69 67 68 74 2d 31 29 3b 0a 20  g->nHeight-1);. 
22fd0 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
22fe0 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29  , sizeof(*pIter)
22ff0 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 29  );.  if( nByte )
23000 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 4c 76  {.    pIter->aLv
23010 6c 20 3d 20 28 46 74 73 35 42 74 72 65 65 49 74  l = (Fts5BtreeIt
23020 65 72 4c 65 76 65 6c 2a 29 66 74 73 35 49 64 78  erLevel*)fts5Idx
23030 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29  Malloc(p, nByte)
23040 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72  ;.  }.  if( p->r
23050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23060 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20      pIter->nLvl 
23070 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d  = pSeg->nHeight-
23080 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 49  1;.    pIter->iI
23090 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 70  dx = iIdx;.    p
230a0 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a 20 20 20  Iter->p = p;.   
230b0 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
230c0 53 65 67 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  Seg;.  }.  for(i
230d0 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
230e0 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d  E_OK && i<pIter-
230f0 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
23100 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54   i64 iRowid = FT
23110 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
23120 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65  (iIdx, pSeg->iSe
23130 67 69 64 2c 20 69 2b 31 2c 20 31 29 3b 0a 20 20  gid, i+1, 1);.  
23140 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
23150 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 4c  a;.    pIter->aL
23160 76 6c 5b 69 5d 2e 70 44 61 74 61 20 3d 20 70 44  vl[i].pData = pD
23170 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
23180 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ad(p, iRowid);. 
23190 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
231a0 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74        fts5NodeIt
231b0 65 72 49 6e 69 74 28 70 44 61 74 61 2d 3e 70 2c  erInit(pData->p,
231c0 20 70 44 61 74 61 2d 3e 6e 2c 20 26 70 49 74 65   pData->n, &pIte
231d0 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 73 29 3b 0a 20  r->aLvl[i].s);. 
231e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
231f0 70 49 74 65 72 2d 3e 6e 4c 76 6c 3d 3d 30 20 7c  pIter->nLvl==0 |
23200 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70  | p->rc ){.    p
23210 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Iter->bEof = 1;.
23220 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
23230 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
23240 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
23250 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20  pIter->nEmpty = 
23260 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
23270 2e 6e 45 6d 70 74 79 3b 0a 20 20 20 20 70 49 74  .nEmpty;.    pIt
23280 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74 65  er->iLeaf = pIte
23290 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68  r->aLvl[0].s.iCh
232a0 69 6c 64 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ild;.    pIter->
232b0 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  bDlidx = pIter->
232c0 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64 78  aLvl[0].s.bDlidx
232d0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
232e0 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74  void fts5BtreeIt
232f0 65 72 4e 65 78 74 28 46 74 73 35 42 74 72 65 65  erNext(Fts5Btree
23300 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
23310 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70  Fts5Index *p = p
23320 49 74 65 72 2d 3e 70 3b 0a 20 20 69 6e 74 20 69  Iter->p;.  int i
23330 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
23340 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 70  er->bEof==0 && p
23350 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
23360 61 44 61 74 61 20 29 3b 0a 20 20 66 6f 72 28 69  aData );.  for(i
23370 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76  =0; i<pIter->nLv
23380 6c 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  l && p->rc==SQLI
23390 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
233a0 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65   Fts5BtreeIterLe
233b0 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  vel *pLvl = &pIt
233c0 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  er->aLvl[i];.   
233d0 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
233e0 74 28 26 70 2d 3e 72 63 2c 20 26 70 4c 76 6c 2d  t(&p->rc, &pLvl-
233f0 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76  >s);.    if( pLv
23400 6c 2d 3e 73 2e 61 44 61 74 61 20 29 7b 0a 20 20  l->s.aData ){.  
23410 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
23420 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
23430 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c 2d 3e 73 2e  ->term, pLvl->s.
23440 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c 2d 3e 73 2e  term.n, pLvl->s.
23450 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 62  term.p);.      b
23460 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
23470 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49  .      fts5NodeI
23480 74 65 72 46 72 65 65 28 26 70 4c 76 6c 2d 3e 73  terFree(&pLvl->s
23490 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  );.      fts5Dat
234a0 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70  aRelease(pLvl->p
234b0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 70 4c 76  Data);.      pLv
234c0 6c 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  l->pData = 0;.  
234d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d    }.  }.  if( i=
234e0 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 7c 7c 20  =pIter->nLvl || 
234f0 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70 49 74  p->rc ){.    pIt
23500 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  er->bEof = 1;.  
23510 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
23520 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70  Segid = pIter->p
23530 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
23540 20 66 6f 72 28 69 2d 2d 3b 20 69 3e 3d 30 3b 20   for(i--; i>=0; 
23550 69 2d 2d 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i--){.      Fts5
23560 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a  BtreeIterLevel *
23570 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
23580 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69 36  Lvl[i];.      i6
23590 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  4 iRowid = FTS5_
235a0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 49  SEGMENT_ROWID(pI
235b0 74 65 72 2d 3e 69 49 64 78 2c 69 53 65 67 69 64  ter->iIdx,iSegid
235c0 2c 69 2b 31 2c 70 4c 76 6c 5b 31 5d 2e 73 2e 69  ,i+1,pLvl[1].s.i
235d0 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 70 4c  Child);.      pL
235e0 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
235f0 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
23600 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
23610 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20  Lvl->pData ){.  
23620 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74        fts5NodeIt
23630 65 72 49 6e 69 74 28 70 4c 76 6c 2d 3e 70 44 61  erInit(pLvl->pDa
23640 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e 70 44 61  ta->p, pLvl->pDa
23650 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d 3e 73 29  ta->n, &pLvl->s)
23660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23670 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 6e 45    }..  pIter->nE
23680 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c  mpty = pIter->aL
23690 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a  vl[0].s.nEmpty;.
236a0 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20    pIter->bDlidx 
236b0 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  = pIter->aLvl[0]
236c0 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 70 49 74  .s.bDlidx;.  pIt
236d0 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74 65  er->iLeaf = pIte
236e0 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68  r->aLvl[0].s.iCh
236f0 69 6c 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ild;.}..static v
23700 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65  oid fts5BtreeIte
23710 72 46 72 65 65 28 46 74 73 35 42 74 72 65 65 49  rFree(Fts5BtreeI
23720 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
23730 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
23740 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
23750 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74  i++){.    Fts5Bt
23760 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c  reeIterLevel *pL
23770 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
23780 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f  l[i];.    fts5No
23790 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c  deIterFree(&pLvl
237a0 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ->s);.    if( pL
237b0 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20  vl->pData ){.   
237c0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
237d0 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b  se(pLvl->pData);
237e0 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61  .      pLvl->pDa
237f0 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ta = 0;.    }.  
23800 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
23810 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a 20  (pIter->aLvl);. 
23820 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
23830 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d  &pIter->term);.}
23840 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
23850 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20  ction is purely 
23860 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
23870 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
23880 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
23890 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
238a0 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
238b0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
238c0 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
238d0 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65  * Instead, it te
238e0 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d  sts that the sam
238f0 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f  e set of pgno/ro
23900 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  wid combinations
23910 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64   are .** visited
23920 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
23930 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69  hether the docli
23940 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66  st-index identif
23950 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
23960 73 0a 2a 2a 20 69 49 64 78 2f 69 53 65 67 69 64  s.** iIdx/iSegid
23970 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61 74  /iLeaf is iterat
23980 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f  ed in forwards o
23990 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  r reverse order.
239a0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
239b0 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 76  E_DEBUG.static v
239c0 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65  oid fts5DlidxIte
239d0 72 54 65 73 74 52 65 76 65 72 73 65 28 0a 20 20  rTestReverse(.  
239e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
239f0 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
23a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a10 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6c 6f 61   /* Index to loa
23a20 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  d doclist-index 
23a30 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  from */.  int iS
23a40 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  egid,           
23a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
23a60 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20  ment id to load 
23a70 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  from */.  int iL
23a80 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
23a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61            /* Loa
23aa0 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  d doclist-index 
23ab0 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
23ac0 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  .){.  Fts5DlidxI
23ad0 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b  ter *pDlidx = 0;
23ae0 0a 20 20 69 36 34 20 63 6b 73 75 6d 31 20 3d 20  .  i64 cksum1 = 
23af0 31 33 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d 32  13;.  i64 cksum2
23b00 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44   = 13;..  for(pD
23b10 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74  lidx=fts5DlidxIt
23b20 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64  erInit(p, 0, iId
23b30 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  x, iSegid, iLeaf
23b40 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  );.      fts5Dli
23b50 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
23b60 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  idx)==0;.      f
23b70 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
23b80 28 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20  (pDlidx).  ){.  
23b90 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
23ba0 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 69 4c 65 61  ->iLeafPgno>iLea
23bb0 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20  f );.    cksum1 
23bc0 3d 20 28 63 6b 73 75 6d 31 20 5e 20 28 20 28 69  = (cksum1 ^ ( (i
23bd0 36 34 29 28 70 44 6c 69 64 78 2d 3e 69 4c 65 61  64)(pDlidx->iLea
23be0 66 50 67 6e 6f 29 20 3c 3c 20 33 32 20 29 29 3b  fPgno) << 32 ));
23bf0 0a 20 20 20 20 63 6b 73 75 6d 31 20 3d 20 28 63  .    cksum1 = (c
23c00 6b 73 75 6d 31 20 5e 20 70 44 6c 69 64 78 2d 3e  ksum1 ^ pDlidx->
23c10 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 66  iRowid);.  }.  f
23c20 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
23c30 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69  (pDlidx);.  pDli
23c40 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70  dx = 0;..  for(p
23c50 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
23c60 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 49  terInit(p, 1, iI
23c70 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61  dx, iSegid, iLea
23c80 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  f);.      fts5Dl
23c90 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
23ca0 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
23cb0 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
23cc0 76 28 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  v(pDlidx).  ){. 
23cd0 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
23ce0 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 69 4c 65  x->iLeafPgno>iLe
23cf0 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32  af );.    cksum2
23d00 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20 28 20 28   = (cksum2 ^ ( (
23d10 69 36 34 29 28 70 44 6c 69 64 78 2d 3e 69 4c 65  i64)(pDlidx->iLe
23d20 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32 20 29 29  afPgno) << 32 ))
23d30 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 3d 20 28  ;.    cksum2 = (
23d40 63 6b 73 75 6d 32 20 5e 20 70 44 6c 69 64 78 2d  cksum2 ^ pDlidx-
23d50 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  >iRowid);.  }.  
23d60 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
23d70 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c  e(pDlidx);.  pDl
23d80 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  idx = 0;..  if( 
23d90 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
23da0 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73 75   && cksum1!=cksu
23db0 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  m2 ) p->rc = FTS
23dc0 35 5f 43 4f 52 52 55 50 54 3b 20 0a 7d 0a 23 65  5_CORRUPT; .}.#e
23dd0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73  lse.# define fts
23de0 35 44 6c 69 64 78 49 74 65 72 54 65 73 74 52 65  5DlidxIterTestRe
23df0 76 65 72 73 65 28 77 2c 78 2c 79 2c 7a 29 0a 23  verse(w,x,y,z).#
23e00 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 76 6f  endif..static vo
23e10 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65  id fts5IndexInte
23e20 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e  grityCheckSegmen
23e30 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
23e40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
23e50 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
23e60 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
23e70 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e90 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20 70   /* Index that p
23ea0 53 65 67 20 69 73 20 61 20 70 61 72 74 20 6f 66  Seg is a part of
23eb0 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
23ec0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
23ed0 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
23ee0 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e   to check intern
23ef0 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a  al consistency *
23f00 2f 0a 29 7b 0a 20 20 46 74 73 35 42 74 72 65 65  /.){.  Fts5Btree
23f10 49 74 65 72 20 69 74 65 72 3b 20 20 20 20 20 20  Iter iter;      
23f20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
23f30 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
23f40 68 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  h b-tree hierarc
23f50 68 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 65 72  hy */..  /* Iter
23f60 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
23f70 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
23f80 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35  .  */.  for(fts5
23f90 42 74 72 65 65 49 74 65 72 49 6e 69 74 28 70 2c  BtreeIterInit(p,
23fa0 20 69 49 64 78 2c 20 70 53 65 67 2c 20 26 69 74   iIdx, pSeg, &it
23fb0 65 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 72 63  er);.      p->rc
23fc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
23fd0 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20  ter.bEof==0;.   
23fe0 20 20 20 66 74 73 35 42 74 72 65 65 49 74 65 72     fts5BtreeIter
23ff0 4e 65 78 74 28 26 69 74 65 72 29 0a 20 20 29 7b  Next(&iter).  ){
24000 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20  .    i64 iRow;  
24010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24020 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
24030 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20  this leaf */.   
24040 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
24050 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
24060 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73 20  * Data for this 
24070 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20  leaf */.    int 
24080 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
24090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
240a0 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72  set of first ter
240b0 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20  m on leaf */.   
240c0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
240e0 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
240f0 65 20 74 68 72 6f 75 67 68 20 65 6d 70 74 79 20  e through empty 
24100 6c 65 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20 2f  leaves */..    /
24110 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e  * If the leaf in
24120 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c   question has al
24130 72 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d  ready been trimm
24140 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d  ed from the segm
24150 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e  ent, .    ** ign
24160 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65 65 20  ore this b-tree 
24170 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
24180 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d  , load it into m
24190 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66  emory. */.    if
241a0 28 20 69 74 65 72 2e 69 4c 65 61 66 3c 70 53 65  ( iter.iLeaf<pSe
241b0 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63  g->pgnoFirst ) c
241c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f  ontinue;.    iRo
241d0 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  w = FTS5_SEGMENT
241e0 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65  _ROWID(iIdx, pSe
241f0 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 69 74  g->iSegid, 0, it
24200 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 70  er.iLeaf);.    p
24210 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
24220 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20  ead(p, iRow);.  
24230 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
24240 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
24250 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  Check that the l
24260 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  eaf contains at 
24270 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20  least one term, 
24280 61 6e 64 20 74 68 61 74 20 69 74 20 69 73 20 65  and that it is e
24290 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f  qual.    ** to o
242a0 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  r larger than th
242b0 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 69  e split-key in i
242c0 74 65 72 2e 74 65 72 6d 2e 20 20 2a 2f 0a 20 20  ter.term.  */.  
242d0 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74    iOff = fts5Get
242e0 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d  U16(&pLeaf->p[2]
242f0 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3d  );.    if( iOff=
24300 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
24310 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
24320 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24330 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20     int nTerm;   
24340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24350 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f  * Size of term o
24360 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73 20  n leaf in bytes 
24370 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  */.      int res
24380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24390 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
243a0 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20 73  on of term and s
243b0 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 20 20 20 20  plit-key */.    
243c0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
243d0 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
243e0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d  ->p[iOff], nTerm
243f0 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d  );.      res = m
24400 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b  emcmp(&pLeaf->p[
24410 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72 6d  iOff], iter.term
24420 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 69  .p, MIN(nTerm, i
24430 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20 20  ter.term.n));.  
24440 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
24450 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 69   res = nTerm - i
24460 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20  ter.term.n;.    
24470 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
24480 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
24490 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
244a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
244b0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
244c0 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70  Leaf);.    if( p
244d0 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ->rc ) break;.. 
244e0 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20     /* Now check 
244f0 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45  that the iter.nE
24500 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c  mpty leaves foll
24510 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  owing the curren
24520 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61  t leaf.    ** (a
24530 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20  ) exist and (b) 
24540 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
24550 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31  . */.    for(i=1
24560 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
24570 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e 45  OK && i<=iter.nE
24580 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mpty; i++){.    
24590 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
245a0 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b 69  taRead(p, iRow+i
245b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
245c0 61 66 20 26 26 20 30 21 3d 66 74 73 35 47 65 74  af && 0!=fts5Get
245d0 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d  U16(&pLeaf->p[2]
245e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
245f0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
24600 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
24610 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
24620 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a  (pLeaf);.    }..
24630 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
24640 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
24650 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69  ex, check that i
24660 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a  t looks right. *
24670 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e 62  /.    if( iter.b
24680 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46  Dlidx ){.      F
24690 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
246a0 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f  lidx = 0;  /* Fo
246b0 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
246c0 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ugh doclist inde
246d0 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  x */.      int i
246e0 50 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72 2e  PrevLeaf = iter.
246f0 69 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74  iLeaf;.      int
24700 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e   iSegid = pSeg->
24710 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e  iSegid;.      in
24720 74 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36 34  t iPg;.      i64
24730 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f   iKey;..      fo
24740 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
24750 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c  dxIterInit(p, 0,
24760 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69   iIdx, iSegid, i
24770 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20  ter.iLeaf);.    
24780 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
24790 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
247a0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
247b0 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
247c0 74 28 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20  t(pDlidx).      
247d0 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  ){..        /* C
247e0 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c  heck any rowid-l
247f0 65 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f  ess pages that o
24800 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
24810 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f  current leaf. */
24820 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67  .        for(iPg
24830 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50  =iPrevLeaf+1; iP
24840 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50  g<pDlidx->iLeafP
24850 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  gno; iPg++){.   
24860 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
24870 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
24880 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30  (iIdx, iSegid, 0
24890 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20  , iPg);.        
248a0 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
248b0 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b  taRead(p, iKey);
248c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
248d0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
248e0 20 20 20 20 69 66 28 20 66 74 73 35 47 65 74 55      if( fts5GetU
248f0 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29  16(&pLeaf->p[0])
24900 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  !=0 ) p->rc = FT
24910 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
24920 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
24930 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
24940 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50      }.        iP
24960 72 65 76 4c 65 61 66 20 3d 20 70 44 6c 69 64 78  revLeaf = pDlidx
24970 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20  ->iLeafPgno;..  
24980 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
24990 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61 67  hat the leaf pag
249a0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
249b0 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 6c  he iterator real
249c0 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  ly does.        
249d0 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  ** contain the r
249e0 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20 62  owid suggested b
249f0 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20  y the same. */. 
24a00 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
24a10 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
24a20 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30  (iIdx, iSegid, 0
24a30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50  , pDlidx->iLeafP
24a40 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  gno);.        pL
24a50 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
24a60 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
24a70 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
24a80 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
24a90 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
24aa0 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20    int iRowidOff 
24ab0 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  = fts5GetU16(&pL
24ac0 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20 20  eaf->p[0]);.    
24ad0 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28        getVarint(
24ae0 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64  &pLeaf->p[iRowid
24af0 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  Off], (u64*)&iRo
24b00 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
24b10 69 66 28 20 69 52 6f 77 69 64 21 3d 70 44 6c 69  if( iRowid!=pDli
24b20 64 78 2d 3e 69 52 6f 77 69 64 20 29 20 70 2d 3e  dx->iRowid ) p->
24b30 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
24b40 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  T;.          fts
24b50 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
24b60 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  af);.        }..
24b70 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
24b80 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66  or(iPg=iPrevLeaf
24b90 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65 72 2e 69  +1; iPg<=(iter.i
24ba0 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e 45 6d 70  Leaf + iter.nEmp
24bb0 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  ty); iPg++){.   
24bc0 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35       iKey = FTS5
24bd0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
24be0 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c 20  Idx, iSegid, 0, 
24bf0 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  iPg);.        pL
24c00 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
24c10 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
24c20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
24c30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
24c40 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61  fts5GetU16(&pLea
24c50 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d  f->p[0])!=0 ) p-
24c60 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
24c70 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  PT;.          ft
24c80 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
24c90 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eaf);.        }.
24ca0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
24cb0 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
24cc0 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  (pDlidx);.      
24cd0 66 74 73 35 44 6c 69 64 78 49 74 65 72 54 65 73  fts5DlidxIterTes
24ce0 74 52 65 76 65 72 73 65 28 70 2c 20 69 49 64 78  tReverse(p, iIdx
24cf0 2c 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69  , iSegid, iter.i
24d00 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Leaf);.    }.  }
24d10 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 69 74  ..  /* Either it
24d20 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20 62 65  er.iLeaf must be
24d30 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c   the rightmost l
24d40 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20  eaf-page in the 
24d50 73 65 67 6d 65 6e 74 2c 20 6f 72 20 0a 20 20 2a  segment, or .  *
24d60 2a 20 65 6c 73 65 20 74 68 65 20 73 65 67 6d 65  * else the segme
24d70 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70  nt has been comp
24d80 6c 65 74 65 6c 79 20 65 6d 70 74 69 65 64 20 62  letely emptied b
24d90 79 20 61 6e 20 6f 6e 67 6f 69 6e 67 20 6d 65 72  y an ongoing mer
24da0 67 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  ge.  ** operatio
24db0 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  n. */.  if( p->r
24dc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
24dd0 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d   && iter.iLeaf!=
24de0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 0a  pSeg->pgnoLast .
24df0 20 20 20 26 26 20 28 70 53 65 67 2d 3e 70 67 6e     && (pSeg->pgn
24e00 6f 46 69 72 73 74 20 7c 7c 20 70 53 65 67 2d 3e  oFirst || pSeg->
24e10 70 67 6e 6f 4c 61 73 74 29 20 0a 20 20 29 7b 0a  pgnoLast) .  ){.
24e20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
24e30 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20  _CORRUPT;.  }.. 
24e40 20 66 74 73 35 42 74 72 65 65 49 74 65 72 46 72   fts5BtreeIterFr
24e50 65 65 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 0a 73  ee(&iter);.}...s
24e60 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51 75  tatic int fts5Qu
24e70 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73 35  eryCksum(.  Fts5
24e80 49 6e 64 65 78 20 2a 70 2c 0a 20 20 63 6f 6e 73  Index *p,.  cons
24e90 74 20 63 68 61 72 20 2a 7a 2c 0a 20 20 69 6e 74  t char *z,.  int
24ea0 20 6e 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   n,.  int flags,
24eb0 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29  .  u64 *pCksum.)
24ec0 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20  {.  u64 cksum = 
24ed0 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49  *pCksum;.  Fts5I
24ee0 6e 64 65 78 49 74 65 72 20 2a 70 49 64 78 49 74  ndexIter *pIdxIt
24ef0 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  er = 0;.  int rc
24f00 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
24f10 64 65 78 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e  dexQuery(p, z, n
24f20 2c 20 66 6c 61 67 73 2c 20 26 70 49 64 78 49 74  , flags, &pIdxIt
24f30 65 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72  er);..  while( r
24f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24f50 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74  0==sqlite3Fts5It
24f60 65 72 45 6f 66 28 70 49 64 78 49 74 65 72 29 20  erEof(pIdxIter) 
24f70 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20  ){.    const u8 
24f80 2a 70 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e  *pPos;.    int n
24f90 50 6f 73 3b 0a 20 20 20 20 69 36 34 20 72 6f 77  Pos;.    i64 row
24fa0 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  id = sqlite3Fts5
24fb0 49 74 65 72 52 6f 77 69 64 28 70 49 64 78 49 74  IterRowid(pIdxIt
24fc0 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  er);.    rc = sq
24fd0 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
24fe0 6c 69 73 74 28 70 49 64 78 49 74 65 72 2c 20 26  list(pIdxIter, &
24ff0 70 50 6f 73 2c 20 26 6e 50 6f 73 29 3b 0a 20 20  pPos, &nPos);.  
25000 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25010 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73  _OK ){.      Fts
25020 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 73  5PoslistReader s
25030 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 66 6f  Reader;.      fo
25040 72 28 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  r(sqlite3Fts5Pos
25050 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d  listReaderInit(-
25060 31 2c 20 70 50 6f 73 2c 20 6e 50 6f 73 2c 20 26  1, pPos, nPos, &
25070 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  sReader);.      
25080 20 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66      sReader.bEof
25090 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ==0;.          s
250a0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
250b0 74 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65  tReaderNext(&sRe
250c0 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20  ader).      ){. 
250d0 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
250e0 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  = FTS5_POS2COLUM
250f0 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b  N(sReader.iPos);
25100 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
25110 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  f = FTS5_POS2OFF
25120 53 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73  SET(sReader.iPos
25130 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
25140 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74   ^= fts5IndexEnt
25150 72 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69  ryCksum(rowid, i
25160 43 6f 6c 2c 20 69 4f 66 66 2c 20 7a 2c 20 6e 29  Col, iOff, z, n)
25170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25180 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
25190 49 74 65 72 4e 65 78 74 28 70 49 64 78 49 74 65  IterNext(pIdxIte
251a0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
251b0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
251c0 6c 6f 73 65 28 70 49 64 78 49 74 65 72 29 3b 0a  lose(pIdxIter);.
251d0 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73  .  *pCksum = cks
251e0 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  um;.  return rc;
251f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e  .}../*.** Run in
25200 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f  ternal checks to
25210 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
25220 20 46 54 53 20 69 6e 64 65 78 20 28 61 29 20 69   FTS index (a) i
25230 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a  s internally .**
25240 20 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20   consistent and 
25250 28 62 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74  (b) contains ent
25260 72 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 74  ries for which t
25270 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68  he XOR of the ch
25280 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61  ecksums.** as ca
25290 6c 63 75 6c 61 74 65 64 20 62 79 20 66 74 73 35  lculated by fts5
252a0 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
252b0 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a  ) is cksum..**.*
252c0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
252d0 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f  CORRUPT if any o
252e0 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  f the internal c
252f0 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69  hecks fail, or i
25300 66 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75  f the.** checksu
25310 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
25320 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
25330 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73  OK if all checks
25340 20 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a   pass without.**
25350 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20   error, or some 
25360 6f 74 68 65 72 20 53 51 4c 69 74 65 20 65 72 72  other SQLite err
25370 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68  or code if anoth
25380 65 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f  er error (e.g. O
25390 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  OM).** occurs..*
253a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
253b0 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
253c0 68 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a  heck(Fts5Index *
253d0 70 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20  p, u64 cksum){. 
253e0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
253f0 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
25400 67 3b 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20  g;.  int iIdx;  
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25420 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
25430 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
25440 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 75 36 34  indexes */.  u64
25450 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20   cksum2 = 0;    
25460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25470 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  Checksum based o
25480 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  n contents of in
25490 64 65 78 65 73 20 2a 2f 0a 20 20 75 36 34 20 63  dexes */.  u64 c
254a0 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20  ksum3 = 0;      
254b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
254c0 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20  ecksum based on 
254d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65  contents of inde
254e0 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  xes */.  Fts5Buf
254f0 66 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c  fer term = {0,0,
25500 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66  0};      /* Buff
25510 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  er used to hold 
25520 6d 6f 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d  most recent term
25530 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
25540 20 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c   poslist = {0,0,
25550 30 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65 72 20  0};   /* Buffer 
25560 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 70  used to hold a p
25570 6f 73 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a 20  oslist */..  /* 
25580 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  Check that the i
25590 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66  nternal nodes of
255a0 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61   each segment ma
255b0 74 63 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a  tch the leaves *
255c0 2f 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20  /.  for(iIdx=0; 
255d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
255e0 20 26 26 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69   && iIdx<=pConfi
255f0 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78  g->nPrefix; iIdx
25600 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  ++){.    Fts5Str
25610 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
25620 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
25630 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20 20  ead(p, iIdx);.  
25640 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
25650 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c  .      int iLvl,
25660 20 69 53 65 67 3b 0a 20 20 20 20 20 20 66 6f 72   iSeg;.      for
25670 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
25680 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
25690 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
256a0 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
256b0 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  <pStruct->aLevel
256c0 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65  [iLvl].nSeg; iSe
256d0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
256e0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
256f0 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53  ment *pSeg = &pS
25700 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
25710 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
25720 20 20 20 20 20 20 20 20 20 20 66 74 73 35 49 6e            fts5In
25730 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
25740 6b 53 65 67 6d 65 6e 74 28 70 2c 20 69 49 64 78  kSegment(p, iIdx
25750 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 20  , pSeg);.       
25760 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
25770 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
25780 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
25790 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  t);.  }..  /* Th
257a0 65 20 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74  e cksum argument
257b0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
257c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68  function is a ch
257d0 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65  ecksum calculate
257e0 64 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20  d.  ** based on 
257f0 61 6c 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74  all expected ent
25800 72 69 65 73 20 69 6e 20 74 68 65 20 46 54 53 20  ries in the FTS 
25810 69 6e 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67  index (including
25820 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20   prefix index.  
25830 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69  ** entries). Thi
25840 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74  s block checks t
25850 68 61 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63  hat a checksum c
25860 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65 64 20  alculated based 
25870 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  on the.  ** actu
25880 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46  al contents of F
25890 54 53 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e  TS index is iden
258a0 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  tical..  **.  **
258b0 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   Two versions of
258c0 20 74 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73   the same checks
258d0 75 6d 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  um are calculate
258e0 64 2e 20 54 68 65 20 66 69 72 73 74 20 28 73 74  d. The first (st
258f0 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  ack.  ** variabl
25900 65 20 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20  e cksum2) based 
25910 6f 6e 20 65 6e 74 72 69 65 73 20 65 78 74 72 61  on entries extra
25920 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75  cted from the fu
25930 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20  ll-text index.  
25940 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61  ** while doing a
25950 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20   linear scan of 
25960 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
25970 69 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a  index in turn. .
25980 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63    **.  ** As eac
25990 68 20 74 65 72 6d 20 76 69 73 69 74 65 64 20 62  h term visited b
259a0 79 20 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61  y the linear sca
259b0 6e 73 2c 20 61 20 73 65 70 61 72 61 74 65 20 71  ns, a separate q
259c0 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a  uery for the.  *
259d0 2a 20 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70  * same term is p
259e0 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33  erformed. cksum3
259f0 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62   is calculated b
25a00 61 73 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72  ased on the entr
25a10 69 65 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74  ies.  ** extract
25a20 65 64 20 62 79 20 74 68 65 73 65 20 71 75 65 72  ed by these quer
25a30 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ies..  */.  for(
25a40 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 3d 70 43  iIdx=0; iIdx<=pC
25a50 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
25a60 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73  iIdx++){.    Fts
25a70 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
25a80 49 74 65 72 3b 0a 20 20 20 20 46 74 73 35 53 74  Iter;.    Fts5St
25a90 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
25aa0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
25ab0 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20  Read(p, iIdx);. 
25ac0 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69     for(fts5Multi
25ad0 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75  IterNew(p, pStru
25ae0 63 74 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c 20  ct, iIdx, 0, 0, 
25af0 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49  0, 0, -1, 0, &pI
25b00 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ter);.        ft
25b10 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
25b20 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20  , pIter)==0;.   
25b30 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
25b40 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
25b50 20 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20 20   0, 0).    ){.  
25b60 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20      int n;      
25b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b80 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
25b90 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
25ba0 20 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20    i64 iPos = 0; 
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25bc0 20 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66   Position read f
25bd0 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20  rom poslist */. 
25be0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
25bf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
25c00 20 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69   /* Offset withi
25c10 6e 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20  n poslist */.   
25c20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
25c30 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
25c40 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  id(pIter);.     
25c50 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72   char *z = (char
25c60 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
25c70 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
25c80 0a 20 20 20 20 20 20 70 6f 73 6c 69 73 74 2e 6e  .      poslist.n
25c90 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74 73 35   = 0;.      fts5
25ca0 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74  MultiIterPoslist
25cb0 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 26 70  (p, pIter, 0, &p
25cc0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  oslist);.      w
25cd0 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33  hile( 0==sqlite3
25ce0 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
25cf0 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73  4(poslist.p, pos
25d00 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26  list.n, &iOff, &
25d10 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20  iPos) ){.       
25d20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35   int iCol = FTS5
25d30 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73  _POS2COLUMN(iPos
25d40 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
25d50 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f  TokOff = FTS5_PO
25d60 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a  S2OFFSET(iPos);.
25d70 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e          cksum2 ^
25d80 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  = fts5IndexEntry
25d90 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43  Cksum(iRowid, iC
25da0 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 7a 2c 20  ol, iTokOff, z, 
25db0 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  n);.      }..   
25dc0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
25dd0 20 61 20 6e 65 77 20 74 65 72 6d 2c 20 71 75 65   a new term, que
25de0 72 79 20 66 6f 72 20 69 74 2e 20 55 70 64 61 74  ry for it. Updat
25df0 65 20 63 6b 73 75 6d 33 20 77 69 74 68 20 74 68  e cksum3 with th
25e00 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20  e results. */.  
25e10 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
25e20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 74 65 72  QLITE_OK && (ter
25e30 6d 2e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70  m.n!=n || memcmp
25e40 28 74 65 72 6d 2e 70 2c 20 7a 2c 20 6e 29 29 20  (term.p, z, n)) 
25e50 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
25e60 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  c;.        int f
25e70 6c 61 67 73 20 3d 20 28 69 49 64 78 3d 3d 30 20  lags = (iIdx==0 
25e80 3f 20 30 20 3a 20 46 54 53 35 49 4e 44 45 58 5f  ? 0 : FTS5INDEX_
25e90 51 55 45 52 59 5f 50 52 45 46 49 58 29 3b 0a 20  QUERY_PREFIX);. 
25ea0 20 20 20 20 20 20 20 75 36 34 20 63 6b 31 20 3d         u64 ck1 =
25eb0 20 30 3b 0a 20 20 20 20 20 20 20 20 75 36 34 20   0;.        u64 
25ec0 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  ck2 = 0;..      
25ed0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
25ee0 74 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75  the results retu
25ef0 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64  rned for ASC and
25f00 20 44 45 53 43 20 71 75 65 72 69 65 73 20 61 72   DESC queries ar
25f10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  e.        ** the
25f20 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63   same. If not, c
25f30 61 6c 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74  all this corrupt
25f40 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ion.  */.       
25f50 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
25f60 6b 73 75 6d 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c  ksum(p, z, n, fl
25f70 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20 20 20  ags, &ck1);.    
25f80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25f90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25fa0 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
25fb0 79 43 6b 73 75 6d 28 70 2c 20 7a 2c 20 6e 2c 20  yCksum(p, z, n, 
25fc0 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
25fd0 51 55 45 52 59 5f 44 45 53 43 2c 20 26 63 6b 32  QUERY_DESC, &ck2
25fe0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
25ff0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
26000 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
26010 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
26020 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 20 20 20  ORRUPT;..       
26030 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
26040 20 70 72 65 66 69 78 20 71 75 65 72 79 2c 20 63   prefix query, c
26050 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65  heck that the re
26060 73 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69  sults returned i
26070 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
26080 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 64 69   the index is di
26090 73 61 62 6c 65 64 20 61 72 65 20 74 68 65 20 73  sabled are the s
260a0 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43  ame. In both ASC
260b0 20 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e   and DESC order.
260c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
260d0 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
260e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
260f0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
26100 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
26110 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20  RY_TEST_NOIDX;. 
26120 20 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30           ck2 = 0
26130 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
26140 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
26150 70 2c 20 7a 2c 20 6e 2c 20 66 2c 20 26 63 6b 32  p, z, n, f, &ck2
26160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26170 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26180 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
26190 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
261a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
261b0 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20    if( iIdx>0 && 
261c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
261d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66  .          int f
261e0 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44   = flags|FTS5IND
261f0 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  EX_QUERY_TEST_NO
26200 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51 55  IDX|FTS5INDEX_QU
26210 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20  ERY_DESC;.      
26220 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20      ck2 = 0;.   
26230 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
26240 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 7a 2c  QueryCksum(p, z,
26250 20 6e 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20   n, f, &ck2);.  
26260 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
26270 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
26280 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
26290 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
262a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 6b     }..        ck
262b0 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20  sum3 ^= ck1;.   
262c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
262d0 65 74 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  et(&rc, &term, n
262e0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b  , (const u8*)z);
262f0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
26300 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26310 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69   }.    fts5Multi
26320 49 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65  IterFree(p, pIte
26330 72 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75  r);.    fts5Stru
26340 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
26350 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ruct);.  }.  if(
26360 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
26370 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75  K && cksum!=cksu
26380 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  m2 ) p->rc = FTS
26390 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 69 66 28  5_CORRUPT;.  if(
263a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
263b0 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75  K && cksum!=cksu
263c0 6d 33 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  m3 ) p->rc = FTS
263d0 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74  5_CORRUPT;..  ft
263e0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
263f0 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  rm);.  fts5Buffe
26400 72 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b  rFree(&poslist);
26410 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
26420 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
26430 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74  ../*.** Calculat
26440 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
26450 68 65 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20  hecksum that is 
26460 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69  the XOR of the i
26470 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68  ndex entry.** ch
26480 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e  ecksum of all en
26490 74 72 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64  tries that would
264a0 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 62 79   be generated by
264b0 20 74 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69   the token speci
264c0 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66  fied.** by the f
264d0 69 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73  inal 5 arguments
264e0 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  ..*/.u64 sqlite3
264f0 46 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a  Fts5IndexCksum(.
26500 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
26510 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20  onfig,          
26520 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
26530 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  on object */.  i
26540 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
26550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26560 2a 20 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20  * Document term 
26570 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20  appears in */.  
26580 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265a0 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61  /* Column term a
265b0 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69  ppears in */.  i
265c0 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
265e0 2a 20 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20  * Position term 
265f0 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20  appears in */.  
26600 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72  const char *pTer
26610 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20  m, int nTerm    
26620 2f 2a 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20  /* Term at iPos 
26630 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20  */.){.  u64 ret 
26640 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
26650 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26660 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  n value */.  int
26670 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   iIdx;          
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26690 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
266a0 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f  rough indexes */
266b0 0a 0a 20 20 72 65 74 20 3d 20 66 74 73 35 49 6e  ..  ret = fts5In
266c0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52  dexEntryCksum(iR
266d0 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
266e0 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b  , pTerm, nTerm);
266f0 0a 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20  ..  for(iIdx=0; 
26700 69 49 64 78 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50  iIdx<pConfig->nP
26710 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
26720 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
26730 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
26740 54 6f 42 79 74 65 6c 65 6e 28 70 54 65 72 6d 2c  ToBytelen(pTerm,
26750 20 6e 54 65 72 6d 2c 20 70 43 6f 6e 66 69 67 2d   nTerm, pConfig-
26760 3e 61 50 72 65 66 69 78 5b 69 49 64 78 5d 29 3b  >aPrefix[iIdx]);
26770 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
26780 7b 0a 20 20 20 20 20 20 72 65 74 20 5e 3d 20 66  {.      ret ^= f
26790 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
267a0 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  um(iRowid, iCol,
267b0 20 69 50 6f 73 2c 20 70 54 65 72 6d 2c 20 6e 42   iPos, pTerm, nB
267c0 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  yte);.    }.  }.
267d0 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
267e0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
267f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
26830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26870 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
26880 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
26890 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
268a0 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  n of the fts5_de
268b0 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a  code() scalar.**
268c0 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a   function only..
268d0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  */../*.** Decode
268e0 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20   a segment-data 
268f0 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25  rowid from the %
26900 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69  _data table. Thi
26910 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  s function is.**
26920 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66   the opposite of
26930 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d   macro FTS5_SEGM
26940 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a  ENT_ROWID()..*/.
26950 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
26960 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69  DecodeRowid(.  i
26970 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
26980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26990 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64  * Rowid from %_d
269a0 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ata table */.  i
269b0 6e 74 20 2a 70 69 49 64 78 2c 20 20 20 20 20 20  nt *piIdx,      
269c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
269d0 2a 20 4f 55 54 3a 20 49 6e 64 65 78 20 2a 2f 0a  * OUT: Index */.
269e0 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20    int *piSegid, 
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e    /* OUT: Segmen
26a10 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  t id */.  int *p
26a20 69 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20  iHeight,        
26a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26a40 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e  : Height */.  in
26a50 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20  t *piPgno       
26a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a70 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65   OUT: Page numbe
26a80 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e  r */.){.  *piPgn
26a90 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  o = (int)(iRowid
26aa0 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
26ab0 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29  TS5_DATA_PAGE_B)
26ac0 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64   - 1));.  iRowid
26ad0 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50   >>= FTS5_DATA_P
26ae0 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69  AGE_B;..  *piHei
26af0 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  ght = (int)(iRow
26b00 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
26b10 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48   FTS5_DATA_HEIGH
26b20 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  T_B) - 1));.  iR
26b30 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
26b40 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20  TA_HEIGHT_B;..  
26b50 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29  *piSegid = (int)
26b60 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
26b70 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
26b80 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69  ID_B) - 1));.  i
26b90 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
26ba0 41 54 41 5f 49 44 5f 42 3b 0a 0a 20 20 2a 70 69  ATA_ID_B;..  *pi
26bb0 49 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  Idx = (int)(iRow
26bc0 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
26bd0 20 46 54 53 35 5f 44 41 54 41 5f 49 44 58 5f 42   FTS5_DATA_IDX_B
26be0 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74  ) - 1));.}..stat
26bf0 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
26c00 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c  gRowid(int *pRc,
26c10 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
26c20 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20  f, i64 iKey){.  
26c30 69 6e 74 20 69 49 64 78 2c 69 53 65 67 69 64 2c  int iIdx,iSegid,
26c40 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20  iHeight,iPgno;  
26c50 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65  /* Rowid compene
26c60 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63  nts */.  fts5Dec
26c70 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26  odeRowid(iKey, &
26c80 69 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20 26  iIdx, &iSegid, &
26c90 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
26ca0 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d  ;..  if( iSegid=
26cb0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b  =0 ){.    if( iK
26cc0 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45  ey==FTS5_AVERAGE
26cd0 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  S_ROWID ){.     
26ce0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
26cf0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
26d00 52 63 2c 20 70 42 75 66 2c 20 22 28 61 76 65 72  Rc, pBuf, "(aver
26d10 61 67 65 73 29 20 22 29 3b 0a 20 20 20 20 7d 65  ages) ");.    }e
26d20 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
26d30 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
26d40 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
26d50 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  uf, .          "
26d60 7b 73 74 72 75 63 74 75 72 65 20 69 64 78 3d 25  {structure idx=%
26d70 64 7d 22 2c 20 28 69 6e 74 29 28 69 4b 65 79 2d  d}", (int)(iKey-
26d80 31 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  10).      );.   
26d90 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66   }.  }.  else if
26da0 28 20 69 48 65 69 67 68 74 3d 3d 46 54 53 35 5f  ( iHeight==FTS5_
26db0 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47  SEGMENT_MAX_HEIG
26dc0 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  HT ){.    sqlite
26dd0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
26de0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
26df0 66 2c 20 22 28 64 6c 69 64 78 20 69 64 78 3d 25  f, "(dlidx idx=%
26e00 64 20 73 65 67 69 64 3d 25 64 20 70 67 6e 6f 3d  d segid=%d pgno=
26e10 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 69 49  %d)",.        iI
26e20 64 78 2c 20 69 53 65 67 69 64 2c 20 69 50 67 6e  dx, iSegid, iPgn
26e30 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65  o.    );.  }else
26e40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
26e50 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
26e60 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
26e70 28 69 64 78 3d 25 64 20 73 65 67 69 64 3d 25 64  (idx=%d segid=%d
26e80 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c   h=%d pgno=%d)",
26e90 0a 20 20 20 20 20 20 20 20 69 49 64 78 2c 20 69  .        iIdx, i
26ea0 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
26eb0 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d  iPgno.    );.  }
26ec0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
26ed0 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
26ee0 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  re(.  int *pRc, 
26ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f00 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
26f10 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
26f20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
26f30 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  f,.  Fts5Structu
26f40 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69  re *p.){.  int i
26f50 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20  Lvl, iSeg;      
26f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
26f70 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
26f80 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a  vels, segments *
26f90 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  /..  for(iLvl=0;
26fa0 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b   iLvl<p->nLevel;
26fb0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74   iLvl++){.    Ft
26fc0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
26fd0 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65   *pLvl = &p->aLe
26fe0 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73  vel[iLvl];.    s
26ff0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
27000 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
27010 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20  , pBuf, .       
27020 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67   " {lvl=%d nMerg
27030 65 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76  e=%d", iLvl, pLv
27040 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20 20 20 29 3b  l->nMerge.    );
27050 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b  .    for(iSeg=0;
27060 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67   iSeg<pLvl->nSeg
27070 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
27080 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
27090 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
270a0 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
270b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
270c0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
270d0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
270e0 0a 20 20 20 20 20 20 20 20 20 20 22 20 7b 69 64  .          " {id
270f0 3d 25 64 20 68 3d 25 64 20 6c 65 61 76 65 73 3d  =%d h=%d leaves=
27100 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67 2d 3e  %d..%d}", pSeg->
27110 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 6e 48  iSegid, pSeg->nH
27120 65 69 67 68 74 2c 20 0a 20 20 20 20 20 20 20 20  eight, .        
27130 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
27140 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  t, pSeg->pgnoLas
27150 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
27160 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
27170 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
27180 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d  tf(pRc, pBuf, "}
27190 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
271a0 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66   This is part of
271b0 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
271c0 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64  () debugging aid
271d0 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
271e0 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f  s pBlob/nBlob co
271f0 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a  ntain a serializ
27200 65 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ed Fts5Structure
27210 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a   object. This.**
27220 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
27230 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
27240 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
27250 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62  n of the same ob
27260 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62  ject.** to the b
27270 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20  uffer passed as 
27280 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
27290 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ent. .*/.static 
272a0 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53  void fts5DecodeS
272b0 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20  tructure(.  int 
272c0 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
272d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
272e0 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64  N/OUT: error cod
272f0 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
27300 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74  r *pBuf,.  const
27310 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20   u8 *pBlob, int 
27320 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72  nBlob.){.  int r
27330 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
27340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27350 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
27360 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20  ts5Structure *p 
27370 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
27380 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74  * Decoded struct
27390 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  ure object */.. 
273a0 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74   rc = fts5Struct
273b0 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c  ureDecode(pBlob,
273c0 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a   nBlob, 0, &p);.
273d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
273e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20  _OK ){.    *pRc 
273f0 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
27400 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62  ;.  }..  fts5Deb
27410 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c  ugStructure(pRc,
27420 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73   pBuf, p);.  fts
27430 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
27440 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  e(p);.}../*.** B
27450 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61  uffer (a/n) is a
27460 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
27470 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69  n a list of seri
27480 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20  alized varints. 
27490 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72  Read.** each var
274a0 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69  int and append i
274b0 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ts string repres
274c0 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66  entation to buff
274d0 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a  er pBuf. Return.
274e0 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20  ** after either 
274f0 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
27500 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72   is exhausted or
27510 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65   a 0 value is re
27520 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ad..**.** The re
27530 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
27540 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
27550 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
27560 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
27570 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
27580 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e  DecodePoslist(in
27590 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
275a0 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
275b0 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
275c0 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
275d0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
275e0 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a  {.    int iVal;.
275f0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
27600 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
27610 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  Off], iVal);.   
27620 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
27630 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
27640 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c  Rc, pBuf, " %d",
27650 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
27660 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
27670 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66  .** The start of
27680 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f   buffer (a/n) co
27690 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74  ntains the start
276a0 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   of a doclist. T
276b0 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61  he doclist.** ma
276c0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e  y or may not fin
276d0 69 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62  ish within the b
276e0 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
276f0 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74  tion appends a t
27700 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74  ext.** represent
27710 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
27720 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  t of the doclist
27730 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
27740 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   to buffer.** pB
27750 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  uf. .**.** The r
27760 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
27770 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
27780 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
27790 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
277a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
277b0 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69  5DecodeDoclist(i
277c0 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
277d0 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
277e0 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
277f0 20 20 69 36 34 20 69 44 6f 63 69 64 3b 0a 20 20    i64 iDocid;.  
27800 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
27810 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20   if( iOff<n ){. 
27820 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
27830 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  e3GetVarint(&a[i
27840 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 6f  Off], (u64*)&iDo
27850 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  cid);.    sqlite
27860 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
27870 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
27880 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22  f, " rowid=%lld"
27890 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20  , iDocid);.  }. 
278a0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
278b0 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  {.    int nPos;.
278c0 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
278d0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
278e0 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
278f0 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  a[iOff], &nPos, 
27900 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f  &bDummy);.    iO
27910 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65  ff += fts5Decode
27920 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75  Poslist(pRc, pBu
27930 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e  f, &a[iOff], MIN
27940 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b  (n-iOff, nPos));
27950 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20  .    if( iOff<n 
27960 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  ){.      i64 iDe
27970 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  lta;.      iOff 
27980 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
27990 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
279a0 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
279b0 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d      if( iDelta==
279c0 30 20 29 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  0 ) return iOff;
279d0 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d  .      iDocid +=
279e0 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73   iDelta;.      s
279f0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
27a00 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
27a10 2c 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64 3d  , pBuf, " rowid=
27a20 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a  %lld", iDocid);.
27a30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
27a40 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  urn iOff;.}../*.
27a50 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
27a60 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65  ation of user-de
27a70 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
27a80 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64  ction fts5_decod
27a90 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
27aa0 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46 75  oid fts5DecodeFu
27ab0 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
27ac0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
27ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
27ae0 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
27af0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
27b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27b10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27b20 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79  r of args (alway
27b30 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s 2) */.  sqlite
27b40 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
27b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
27b60 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
27b70 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77  */.){.  i64 iRow
27b80 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
27b90 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
27ba0 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e   for record bein
27bb0 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69  g decoded */.  i
27bc0 6e 74 20 69 49 64 78 2c 69 53 65 67 69 64 2c 69  nt iIdx,iSegid,i
27bd0 48 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f  Height,iPgno;  /
27be0 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e  * Rowid componen
27bf0 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ts */.  const u8
27c00 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20   *aBlob; int n; 
27c10 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72          /* Recor
27c20 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20  d to decode */. 
27c30 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74   u8 *a = 0;.  Ft
27c40 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20 20  s5Buffer s;     
27c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27c60 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20 74   Build up text t
27c70 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f  o return here */
27c80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27c90 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
27ca0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
27cb0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63  e */.  int nSpac
27cc0 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
27cd0 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d  ( nArg==2 );.  m
27ce0 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
27cf0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
27d00 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  ;.  iRowid = sql
27d10 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
27d20 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20  (apVal[0]);.  n 
27d30 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
27d40 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b  bytes(apVal[1]);
27d50 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  aBlob = sqlit
27d60 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70  e3_value_blob(ap
27d70 56 61 6c 5b 31 5d 29 3b 0a 0a 20 20 6e 53 70 61  Val[1]);..  nSpa
27d80 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41  ce = n + FTS5_DA
27d90 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b  TA_ZERO_PADDING;
27da0 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c 69  .  a = (u8*)sqli
27db0 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
27dc0 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a  o(&rc, nSpace);.
27dd0 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f 74    if( a==0 ) got
27de0 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20  o decode_out;.  
27df0 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c  memcpy(a, aBlob,
27e00 20 6e 29 3b 0a 20 20 66 74 73 35 44 65 63 6f 64   n);.  fts5Decod
27e10 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26  eRowid(iRowid, &
27e20 69 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20 26  iIdx, &iSegid, &
27e30 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
27e40 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f  ;..  fts5DebugRo
27e50 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f  wid(&rc, &s, iRo
27e60 77 69 64 29 3b 0a 20 20 69 66 28 20 69 48 65 69  wid);.  if( iHei
27e70 67 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e  ght==FTS5_SEGMEN
27e80 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 29 7b 0a  T_MAX_HEIGHT ){.
27e90 20 20 20 20 46 74 73 35 44 61 74 61 20 64 6c 69      Fts5Data dli
27ea0 64 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  dx;.    Fts5Dlid
27eb0 78 49 74 65 72 20 69 74 65 72 3b 0a 0a 20 20 20  xIter iter;..   
27ec0 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20   dlidx.p = a;.  
27ed0 20 20 64 6c 69 64 78 2e 6e 20 3d 20 6e 3b 0a 20    dlidx.n = n;. 
27ee0 20 20 20 64 6c 69 64 78 2e 6e 52 65 66 20 3d 20     dlidx.nRef = 
27ef0 32 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  2;..    memset(&
27f00 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  iter, 0, sizeof(
27f10 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b  Fts5DlidxIter));
27f20 0a 20 20 20 20 69 74 65 72 2e 70 44 61 74 61 20  .    iter.pData 
27f30 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 69 74  = &dlidx;.    it
27f40 65 72 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  er.iLeafPgno = i
27f50 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66  Pgno;..    for(f
27f60 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
27f70 74 28 26 69 74 65 72 29 3b 20 69 74 65 72 2e 62  t(&iter); iter.b
27f80 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64  Eof==0; fts5Dlid
27f90 78 49 74 65 72 4e 65 78 74 28 26 69 74 65 72 29  xIterNext(&iter)
27fa0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
27fb0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
27fc0 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20  Printf(&rc, &s, 
27fd0 0a 20 20 20 20 20 20 20 20 20 20 22 20 25 64 28  .          " %d(
27fe0 25 6c 6c 64 29 22 2c 20 69 74 65 72 2e 69 4c 65  %lld)", iter.iLe
27ff0 61 66 50 67 6e 6f 2c 20 69 74 65 72 2e 69 52 6f  afPgno, iter.iRo
28000 77 69 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  wid.      );.   
28010 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69   }.  }else if( i
28020 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
28030 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35  if( iRowid==FTS5
28040 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
28050 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f  ){.      /* todo
28060 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
28070 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53       fts5DecodeS
28080 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73  tructure(&rc, &s
28090 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , a, n);.    }. 
280a0 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 46 74 73   }else{..    Fts
280b0 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20  5Buffer term;.  
280c0 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
280d0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
280e0 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  ffer));..    if(
280f0 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20   iHeight==0 ){. 
28100 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66       int iTermOf
28110 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  f = 0;.      int
28120 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a   iRowidOff = 0;.
28130 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
28140 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20        int nKeep 
28150 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
28160 6e 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=4 ){.        
28170 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
28180 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20  GetU16(&a[0]);. 
28190 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20         iTermOff 
281a0 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
281b0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  2]);.      }else
281c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
281d0 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
281e0 72 63 2c 20 26 73 2c 20 38 2c 20 28 63 6f 6e 73  rc, &s, 8, (cons
281f0 74 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29  t u8*)"corrupt")
28200 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64  ;.        goto d
28210 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20 20  ecode_out;.     
28220 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 52   }..      if( iR
28230 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20  owidOff ){.     
28240 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69 64     iOff = iRowid
28250 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
28260 20 69 66 28 20 69 54 65 72 6d 4f 66 66 20 29 7b   if( iTermOff ){
28270 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20  .        iOff = 
28280 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20  iTermOff;.      
28290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
282a0 4f 66 66 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Off = n;.      }
282b0 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
282c0 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73  ePoslist(&rc, &s
282d0 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29  , &a[4], iOff-4)
282e0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
282f0 20 69 52 6f 77 69 64 4f 66 66 3d 3d 30 20 7c 7c   iRowidOff==0 ||
28300 20 69 4f 66 66 3d 3d 69 52 6f 77 69 64 4f 66 66   iOff==iRowidOff
28310 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52   );.      if( iR
28320 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20  owidOff ){.     
28330 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
28340 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
28350 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
28360 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d  n-iOff);.      }
28370 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
28380 69 54 65 72 6d 4f 66 66 3d 3d 30 20 7c 7c 20 69  iTermOff==0 || i
28390 4f 66 66 3d 3d 69 54 65 72 6d 4f 66 66 20 29 3b  Off==iTermOff );
283a0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f  .      while( iO
283b0 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
283c0 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  int nByte;.     
283d0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
283e0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
283f0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
28400 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65       term.n= nKe
28410 65 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ep;.        fts5
28420 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
28430 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79  (&rc, &term, nBy
28440 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  te, &a[iOff]);. 
28450 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
28460 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20 73  Byte;..        s
28470 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
28480 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20  AppendPrintf(.  
28490 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
284a0 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
284b0 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
284c0 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
284d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
284e0 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
284f0 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
28500 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69  s, &a[iOff], n-i
28510 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
28520 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
28530 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
28540 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
28550 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
28560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28570 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  }.      fts5Buff
28580 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
28590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
285a0 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b  Fts5NodeIter ss;
285b0 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73 35 4e  .      for(fts5N
285c0 6f 64 65 49 74 65 72 49 6e 69 74 28 61 2c 20 6e  odeIterInit(a, n
285d0 2c 20 26 73 73 29 3b 20 73 73 2e 61 44 61 74 61  , &ss); ss.aData
285e0 3b 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65  ; fts5NodeIterNe
285f0 78 74 28 26 72 63 2c 20 26 73 73 29 29 7b 0a 20  xt(&rc, &ss)){. 
28600 20 20 20 20 20 20 20 69 66 28 20 73 73 2e 74 65         if( ss.te
28610 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rm.n==0 ){.     
28620 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
28630 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
28640 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 6c 65  tf(&rc, &s, " le
28650 66 74 3d 25 64 22 2c 20 73 73 2e 69 43 68 69 6c  ft=%d", ss.iChil
28660 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
28670 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
28680 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
28690 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 26  pendPrintf(&rc,&
286a0 73 2c 20 22 20 5c 22 25 2e 2a 73 5c 22 22 2c 20  s, " \"%.*s\"", 
286b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
286c0 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72  s.term.n, ss.ter
286d0 6d 2e 70 0a 20 20 20 20 20 20 20 20 20 20 29 3b  m.p.          );
286e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
286f0 20 20 20 69 66 28 20 73 73 2e 6e 45 6d 70 74 79     if( ss.nEmpty
28700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
28710 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
28720 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
28730 20 26 73 2c 20 22 20 65 6d 70 74 79 3d 25 64 25   &s, " empty=%d%
28740 73 22 2c 20 73 73 2e 6e 45 6d 70 74 79 2c 0a 20  s", ss.nEmpty,. 
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 73 73 2e               ss.
28760 62 44 6c 69 64 78 20 3f 20 22 2a 22 20 3a 20 22  bDlidx ? "*" : "
28770 22 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ".          );. 
28780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28790 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49  .      fts5NodeI
287a0 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20 20  terFree(&ss);.  
287b0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f    }.  }.  . deco
287c0 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  de_out:.  sqlite
287d0 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28  3_free(a);.  if(
287e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
287f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
28800 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
28810 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70  (const char*)s.p
28820 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52  , s.n, SQLITE_TR
28830 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
28840 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
28850 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
28860 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a  (pCtx, rc);.  }.
28870 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
28880 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (&s);.}../*.** T
28890 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
288a0 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  n of user-define
288b0 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
288c0 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a  n fts5_rowid()..
288d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
288e0 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e  ts5RowidFunction
288f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
28900 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
28910 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
28920 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
28930 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28950 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
28960 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
28970 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
28980 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
28990 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
289a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
289b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
289c0 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d  rg;.  if( nArg==
289d0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
289e0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
289f0 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20  tx, "should be: 
28a00 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65  fts5_rowid(subje
28a10 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b  ct, ....)", -1);
28a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41  .  }else{.    zA
28a30 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rg = (const char
28a40 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
28a50 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
28a60 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
28a70 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
28a80 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20   "segment") ){. 
28a90 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b       i64 iRowid;
28aa0 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 2c 20  .      int idx, 
28ab0 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70  segid, height, p
28ac0 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  gno;.      if( n
28ad0 41 72 67 21 3d 35 20 29 7b 0a 20 20 20 20 20 20  Arg!=5 ){.      
28ae0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
28af0 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
28b00 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c            "shoul
28b10 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
28b20 28 27 73 65 67 6d 65 6e 74 27 2c 20 69 64 78 2c  ('segment', idx,
28b30 20 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20   segid, height, 
28b40 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20  pgno))", -1.    
28b50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c      );.      }el
28b60 73 65 7b 0a 20 20 20 20 20 20 20 20 69 64 78 20  se{.        idx 
28b70 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
28b80 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  int(apVal[1]);. 
28b90 20 20 20 20 20 20 20 73 65 67 69 64 20 3d 20 73         segid = s
28ba0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
28bb0 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20  (apVal[2]);.    
28bc0 20 20 20 20 68 65 69 67 68 74 20 3d 20 73 71 6c      height = sql
28bd0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
28be0 70 56 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 20 20  pVal[3]);.      
28bf0 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33    pgno = sqlite3
28c00 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
28c10 5b 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52  [4]);.        iR
28c20 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
28c30 45 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73  ENT_ROWID(idx, s
28c40 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67  egid, height, pg
28c50 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  no);.        sql
28c60 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
28c70 34 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b  4(pCtx, iRowid);
28c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28c90 73 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  se if( 0==sqlite
28ca0 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
28cb0 22 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78 22  "start-of-index"
28cc0 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  ) ){.      i64 i
28cd0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Rowid;.      int
28ce0 20 69 64 78 3b 0a 20 20 20 20 20 20 69 66 28 20   idx;.      if( 
28cf0 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20  nArg!=2 ){.     
28d00 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
28d10 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20  t_error(pCtx, . 
28d20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75             "shou
28d30 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69  ld be: fts5_rowi
28d40 64 28 27 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65  d('start-of-inde
28d50 78 27 2c 20 69 64 78 29 22 2c 20 2d 31 0a 20 20  x', idx)", -1.  
28d60 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
28d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 64  else{.        id
28d80 78 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  x = sqlite3_valu
28d90 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b  e_int(apVal[1]);
28da0 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20  .        iRowid 
28db0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
28dc0 4f 57 49 44 28 69 64 78 2c 20 31 2c 20 30 2c 20  OWID(idx, 1, 0, 
28dd0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
28de0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
28df0 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
28e00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
28e10 65 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e {.      sqlite
28e20 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
28e30 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66  Ctx, .        "f
28e40 69 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35  irst arg to fts5
28e50 5f 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65  _rowid() must be
28e60 20 27 73 65 67 6d 65 6e 74 27 20 22 0a 20 20 20   'segment' ".   
28e70 20 20 20 20 20 22 6f 72 20 27 73 74 61 72 74 2d       "or 'start-
28e80 6f 66 2d 69 6e 64 65 78 27 22 0a 20 20 20 20 20  of-index'".     
28e90 20 20 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b     , -1.      );
28ea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
28eb0 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
28ec0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ed as part of re
28ed0 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 46 54  gistering the FT
28ee0 53 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64  S5 module with d
28ef0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
28f00 63 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67  ction db. It reg
28f10 69 73 74 65 72 73 20 73 65 76 65 72 61 6c 20 75  isters several u
28f20 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
28f30 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  ar functions use
28f40 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35  ful.** with FTS5
28f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
28f60 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
28f70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
28f80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
28f90 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  , some other.** 
28fa0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
28fb0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  e is returned in
28fc0 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stead..*/.int sq
28fd0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
28fe0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
28ff0 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
29000 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
29010 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ion(.      db, "
29020 66 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c  fts5_decode", 2,
29030 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
29040 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
29050 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20  ion, 0, 0.  );. 
29060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
29070 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
29080 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
29090 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20  nction(.        
290a0 64 62 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22  db, "fts5_rowid"
290b0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
290c0 38 2c 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46  8, 0, fts5RowidF
290d0 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
290e0 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72    );.  }.  retur
290f0 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
29100 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
29110 5f 46 54 53 35 20 2a 2f 0a                       _FTS5 */.