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

Artifact 9556d405a12a38b3e1a323333a2620813b9f323a:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 23 69 66  s5Int.h..*/..#if
0280: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
0290: 45 5f 46 54 53 35 0a 0a 23 69 6e 63 6c 75 64 65  E_FTS5..#include
02a0: 20 22 66 74 73 35 49 6e 74 2e 68 22 0a 0a 2f 2a   "fts5Int.h"../*
02b0: 0a 2a 2a 20 4f 76 65 72 76 69 65 77 3a 0a 2a 2a  .** Overview:.**
02c0: 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74  .** The %_data t
02d0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c  able contains al
02e0: 6c 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 65  l the FTS indexe
02f0: 73 20 66 6f 72 20 61 6e 20 46 54 53 35 20 76 69  s for an FTS5 vi
0300: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 20  rtual table..** 
0310: 41 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 6d  As well as the m
0320: 61 69 6e 20 74 65 72 6d 20 69 6e 64 65 78 2c 20  ain term index, 
0330: 74 68 65 72 65 20 6d 61 79 20 62 65 20 75 70 20  there may be up 
0340: 74 6f 20 33 31 20 70 72 65 66 69 78 20 69 6e 64  to 31 prefix ind
0350: 65 78 65 73 2e 0a 2a 2a 20 54 68 65 20 66 6f 72  exes..** The for
0360: 6d 61 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74  mat is similar t
0370: 6f 20 46 54 53 33 2f 34 2c 20 65 78 63 65 70 74  o FTS3/4, except
0380: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   that:.**.**   *
0390: 20 61 6c 6c 20 73 65 67 6d 65 6e 74 20 62 2d 74   all segment b-t
03a0: 72 65 65 20 6c 65 61 66 20 64 61 74 61 20 69 73  ree leaf data is
03b0: 20 73 74 6f 72 65 64 20 69 6e 20 66 69 78 65 64   stored in fixed
03c0: 20 73 69 7a 65 20 70 61 67 65 20 72 65 63 6f 72   size page recor
03d0: 64 73 20 0a 2a 2a 20 20 20 20 20 28 65 2e 67 2e  ds .**     (e.g.
03e0: 20 31 30 30 30 20 62 79 74 65 73 29 2e 20 41 20   1000 bytes). A 
03f0: 73 69 6e 67 6c 65 20 64 6f 63 6c 69 73 74 20 6d  single doclist m
0400: 61 79 20 73 70 61 6e 20 6d 75 6c 74 69 70 6c 65  ay span multiple
0410: 20 70 61 67 65 73 2e 20 43 61 72 65 20 69 73 20   pages. Care is 
0420: 0a 2a 2a 20 20 20 20 20 74 61 6b 65 6e 20 74 6f  .**     taken to
0430: 20 65 6e 73 75 72 65 20 69 74 20 69 73 20 70 6f   ensure it is po
0440: 73 73 69 62 6c 65 20 74 6f 20 69 74 65 72 61 74  ssible to iterat
0450: 65 20 69 6e 20 65 69 74 68 65 72 20 64 69 72 65  e in either dire
0460: 63 74 69 6f 6e 20 74 68 72 6f 75 67 68 20 0a 2a  ction through .*
0470: 2a 20 20 20 20 20 74 68 65 20 65 6e 74 72 69 65  *     the entrie
0480: 73 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2c 20  s in a doclist, 
0490: 6f 72 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 20  or to seek to a 
04a0: 73 70 65 63 69 66 69 63 20 65 6e 74 72 79 20 77  specific entry w
04b0: 69 74 68 69 6e 20 61 20 0a 2a 2a 20 20 20 20 20  ithin a .**     
04c0: 64 6f 63 6c 69 73 74 2c 20 77 69 74 68 6f 75 74  doclist, without
04d0: 20 6c 6f 61 64 69 6e 67 20 69 74 20 69 6e 74 6f   loading it into
04e0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 20   memory..**.**  
04f0: 20 2a 20 6c 61 72 67 65 20 64 6f 63 6c 69 73 74   * large doclist
0500: 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
0510: 20 70 61 67 65 73 20 68 61 76 65 20 61 73 73 6f   pages have asso
0520: 63 69 61 74 65 64 20 22 64 6f 63 6c 69 73 74 20  ciated "doclist 
0530: 69 6e 64 65 78 22 0a 2a 2a 20 20 20 20 20 72 65  index".**     re
0540: 63 6f 72 64 73 20 74 68 61 74 20 63 6f 6e 74 61  cords that conta
0550: 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  in a copy of the
0560: 20 66 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20   first docid on 
0570: 65 61 63 68 20 70 61 67 65 20 73 70 61 6e 6e 65  each page spanne
0580: 64 20 62 79 0a 2a 2a 20 20 20 20 20 74 68 65 20  d by.**     the 
0590: 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 20 69 73  doclist. This is
05a0: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 75   used to speed u
05b0: 70 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  p seek operation
05c0: 73 2c 20 61 6e 64 20 6d 65 72 67 65 73 20 6f 66  s, and merges of
05d0: 0a 2a 2a 20 20 20 20 20 6c 61 72 67 65 20 64 6f  .**     large do
05e0: 63 6c 69 73 74 73 20 77 69 74 68 20 76 65 72 79  clists with very
05f0: 20 73 6d 61 6c 6c 20 64 6f 63 6c 69 73 74 73 2e   small doclists.
0600: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 65 78 74 72 61  .**.**   * extra
0610: 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65 20 22   fields in the "
0620: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
0630: 22 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  " record the sta
0640: 74 65 20 6f 66 20 6f 6e 67 6f 69 6e 67 0a 2a 2a  te of ongoing.**
0650: 20 20 20 20 20 69 6e 63 72 65 6d 65 6e 74 61 6c       incremental
0660: 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
0670: 73 2e 0a 2a 2a 0a 2a 2f 0a 0a 0a 23 64 65 66 69  s..**.*/...#defi
0680: 6e 65 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b  ne FTS5_OPT_WORK
0690: 5f 55 4e 49 54 20 20 31 30 30 30 20 20 2f 2a 20  _UNIT  1000  /* 
06a0: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
06b0: 61 67 65 73 20 70 65 72 20 6f 70 74 69 6d 69 7a  ages per optimiz
06c0: 65 20 73 74 65 70 20 2a 2f 0a 23 64 65 66 69 6e  e step */.#defin
06d0: 65 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54  e FTS5_WORK_UNIT
06e0: 20 20 20 20 20 20 36 34 20 20 20 20 2f 2a 20 4e        64    /* N
06f0: 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
0700: 67 65 73 20 69 6e 20 75 6e 69 74 20 6f 66 20 77  ges in unit of w
0710: 6f 72 6b 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ork */..#define 
0720: 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
0730: 49 5a 45 20 34 20 20 20 20 20 2f 2a 20 41 64 64  IZE 4     /* Add
0740: 20 64 6c 69 64 78 20 69 66 20 74 68 69 73 20 6d   dlidx if this m
0750: 61 6e 79 20 65 6d 70 74 79 20 70 61 67 65 73 20  any empty pages 
0760: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c  */../*.** Detail
0770: 73 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  s:.**.** The %_d
0780: 61 74 61 20 74 61 62 6c 65 20 6d 61 6e 61 67 65  ata table manage
0790: 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65  d by this module
07a0: 2c 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  ,.**.**     CREA
07b0: 54 45 20 54 41 42 4c 45 20 25 5f 64 61 74 61 28  TE TABLE %_data(
07c0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
07d0: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c  RY KEY, block BL
07e0: 4f 42 29 3b 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e  OB);.**.** , con
07f0: 74 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tains the follow
0800: 69 6e 67 20 35 20 74 79 70 65 73 20 6f 66 20 72  ing 5 types of r
0810: 65 63 6f 72 64 73 2e 20 53 65 65 20 74 68 65 20  ecords. See the 
0820: 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e  comments surroun
0830: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 46 54 53 35  ding.** the FTS5
0840: 5f 2a 5f 52 4f 57 49 44 20 6d 61 63 72 6f 73 20  _*_ROWID macros 
0850: 62 65 6c 6f 77 20 66 6f 72 20 61 20 64 65 73 63  below for a desc
0860: 72 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 25  ription of how %
0870: 5f 64 61 74 61 20 72 6f 77 69 64 73 20 61 72 65  _data rowids are
0880: 20 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20 74 6f   .** assigned to
0890: 20 65 61 63 68 20 66 6f 20 74 68 65 6d 2e 0a 2a   each fo them..*
08a0: 2a 0a 2a 2a 20 31 2e 20 53 74 72 75 63 74 75 72  *.** 1. Structur
08b0: 65 20 52 65 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a  e Records:.**.**
08c0: 20 20 20 54 68 65 20 73 65 74 20 6f 66 20 73 65     The set of se
08d0: 67 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 6b 65  gments that make
08e0: 20 75 70 20 61 6e 20 69 6e 64 65 78 20 2d 20 74   up an index - t
08f0: 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
0900: 72 65 20 2d 20 61 72 65 0a 2a 2a 20 20 20 72 65  re - are.**   re
0910: 63 6f 72 64 65 64 20 69 6e 20 61 20 73 69 6e 67  corded in a sing
0920: 6c 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e  le record within
0930: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
0940: 65 2e 20 54 68 65 20 72 65 63 6f 72 64 20 63 6f  e. The record co
0950: 6e 73 69 73 74 73 0a 2a 2a 20 20 20 6f 66 20 61  nsists.**   of a
0960: 20 73 69 6e 67 6c 65 20 33 32 2d 62 69 74 20 63   single 32-bit c
0970: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
0980: 6b 69 65 20 76 61 6c 75 65 20 66 6f 6c 6c 6f 77  kie value follow
0990: 65 64 20 62 79 20 61 20 6c 69 73 74 20 6f 66 20  ed by a list of 
09a0: 0a 2a 2a 20 20 20 53 51 4c 69 74 65 20 76 61 72  .**   SQLite var
09b0: 69 6e 74 73 2e 20 49 66 20 74 68 65 20 46 54 53  ints. If the FTS
09c0: 20 74 61 62 6c 65 20 66 65 61 74 75 72 65 73 20   table features 
09d0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 69 6e  more than one in
09e0: 64 65 78 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  dex (because.** 
09f0: 20 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20    there are one 
0a00: 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20 69  or more prefix i
0a10: 6e 64 65 78 65 73 29 2c 20 69 74 20 69 73 20 67  ndexes), it is g
0a20: 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 61  uaranteed that a
0a30: 6c 6c 20 73 68 61 72 65 0a 2a 2a 20 20 20 74 68  ll share.**   th
0a40: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
0a50: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d  lue..**.**   Imm
0a60: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
0a70: 6e 67 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  ng the configura
0a80: 74 69 6f 6e 20 63 6f 6f 6b 69 65 2c 20 74 68 65  tion cookie, the
0a90: 20 72 65 63 6f 72 64 20 62 65 67 69 6e 73 20 77   record begins w
0aa0: 69 74 68 0a 2a 2a 20 20 20 74 68 72 65 65 20 76  ith.**   three v
0ab0: 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  arints:.**.**   
0ac0: 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65    + number of le
0ad0: 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 74  vels,.**     + t
0ae0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
0af0: 65 67 6d 65 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c  egments on all l
0b00: 65 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20  evels,.**     + 
0b10: 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 20 63  value of write c
0b20: 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  ounter..**.**   
0b30: 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 6c  Then, for each l
0b40: 65 76 65 6c 20 66 72 6f 6d 20 30 20 74 6f 20 6e  evel from 0 to n
0b50: 4d 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b  Max:.**.**     +
0b60: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   number of input
0b70: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 6e 67   segments in ong
0b80: 6f 69 6e 67 20 6d 65 72 67 65 2e 0a 2a 2a 20 20  oing merge..**  
0b90: 20 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65     + total numbe
0ba0: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e  r of segments in
0bb0: 20 6c 65 76 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b   level..**     +
0bc0: 20 66 6f 72 20 65 61 63 68 20 73 65 67 6d 65 6e   for each segmen
0bd0: 74 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f  t from oldest to
0be0: 20 6e 65 77 65 73 74 3a 0a 2a 2a 20 20 20 20 20   newest:.**     
0bf0: 20 20 20 20 2b 20 73 65 67 6d 65 6e 74 20 69 64      + segment id
0c00: 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a   (always > 0).**
0c10: 20 20 20 20 20 20 20 20 20 2b 20 62 2d 74 72 65           + b-tre
0c20: 65 20 68 65 69 67 68 74 20 28 31 20 2d 3e 20 72  e height (1 -> r
0c30: 6f 6f 74 20 69 73 20 6c 65 61 66 2c 20 32 20 2d  oot is leaf, 2 -
0c40: 3e 20 72 6f 6f 74 20 69 73 20 70 61 72 65 6e 74  > root is parent
0c50: 20 6f 66 20 6c 65 61 66 20 65 74 63 2e 29 0a 2a   of leaf etc.).*
0c60: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 72 73  *         + firs
0c70: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
0c80: 65 72 20 28 6f 66 74 65 6e 20 31 2c 20 61 6c 77  er (often 1, alw
0c90: 61 79 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ays greater than
0ca0: 20 30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b   0).**         +
0cb0: 20 66 69 6e 61 6c 20 6c 65 61 66 20 70 61 67 65   final leaf page
0cc0: 20 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e   number.**.** 2.
0cd0: 20 54 68 65 20 41 76 65 72 61 67 65 73 20 52 65   The Averages Re
0ce0: 63 6f 72 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20  cord:.**.**   A 
0cf0: 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 69  single record wi
0d00: 74 68 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  thin the %_data 
0d10: 74 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 20  table. The data 
0d20: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72  is a list of var
0d30: 69 6e 74 73 2e 0a 2a 2a 20 20 20 54 68 65 20 66  ints..**   The f
0d40: 69 72 73 74 20 76 61 6c 75 65 20 69 73 20 74 68  irst value is th
0d50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
0d60: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54   in the index. T
0d70: 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 63 6f  hen, for each co
0d80: 6c 75 6d 6e 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c  lumn.**   from l
0d90: 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 74 68  eft to right, th
0da0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
0db0: 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20  f tokens in the 
0dc0: 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a  column for all .
0dd0: 2a 2a 20 20 20 72 6f 77 73 20 6f 66 20 74 68 65  **   rows of the
0de0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e   table..**.** 3.
0df0: 20 53 65 67 6d 65 6e 74 20 6c 65 61 76 65 73 3a   Segment leaves:
0e00: 0a 2a 2a 0a 2a 2a 20 20 20 54 45 52 4d 20 44 4f  .**.**   TERM DO
0e10: 43 4c 49 53 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a  CLIST FORMAT:.**
0e20: 0a 2a 2a 20 20 20 20 20 4d 6f 73 74 20 6f 66 20  .**     Most of 
0e30: 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61  each segment lea
0e40: 66 20 69 73 20 74 61 6b 65 6e 20 75 70 20 62 79  f is taken up by
0e50: 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61   term/doclist da
0e60: 74 61 2e 20 54 68 65 20 0a 2a 2a 20 20 20 20 20  ta. The .**     
0e70: 67 65 6e 65 72 61 6c 20 66 6f 72 6d 61 74 20 6f  general format o
0e80: 66 20 74 68 65 20 74 65 72 6d 2f 64 6f 63 6c 69  f the term/docli
0e90: 73 74 20 64 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a  st data is:.**.*
0ea0: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
0eb0: 20 3a 20 73 69 7a 65 20 6f 66 20 66 69 72 73 74   : size of first
0ec0: 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20   term.**        
0ed0: 20 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74 20   blob:    first 
0ee0: 74 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20  term data.**    
0ef0: 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 66 69       doclist: fi
0f00: 72 73 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20  rst doclist.**  
0f10: 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d         zero-or-m
0f20: 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ore {.**        
0f30: 20 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62     varint:  numb
0f40: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  er of bytes in c
0f50: 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65 76 69  ommon with previ
0f60: 6f 75 73 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20  ous term.**     
0f70: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 6e        varint:  n
0f80: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
0f90: 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 20  f new term data 
0fa0: 28 6e 4e 65 77 29 0a 2a 2a 20 20 20 20 20 20 20  (nNew).**       
0fb0: 20 20 20 20 62 6c 6f 62 3a 20 20 20 20 6e 4e 65      blob:    nNe
0fc0: 77 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74  w bytes of new t
0fd0: 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20  erm data.**     
0fe0: 20 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 6e        doclist: n
0ff0: 65 78 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20  ext doclist.**  
1000: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1010: 20 20 20 64 6f 63 6c 69 73 74 20 66 6f 72 6d 61     doclist forma
1020: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1030: 20 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74 20   varint:  first 
1040: 72 6f 77 69 64 0a 2a 2a 20 20 20 20 20 20 20 20  rowid.**        
1050: 20 70 6f 73 6c 69 73 74 3a 20 66 69 72 73 74 20   poslist: first 
1060: 70 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  poslist.**      
1070: 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20     zero-or-more 
1080: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76  {.**           v
1090: 61 72 69 6e 74 3a 20 20 72 6f 77 69 64 20 64 65  arint:  rowid de
10a0: 6c 74 61 20 28 61 6c 77 61 79 73 20 3e 20 30 29  lta (always > 0)
10b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 70 6f  .**           po
10c0: 73 6c 69 73 74 3a 20 6e 65 78 74 20 70 6f 73 6c  slist: next posl
10d0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
10e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30 30  .**         0x00
10f0: 20 62 79 74 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20   byte.**.**     
1100: 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a  poslist format:.
1110: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61  **.**         va
1120: 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66 20 70 6f  rint: size of po
1130: 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 6d  slist in bytes m
1140: 75 6c 74 69 70 6c 69 65 64 20 62 79 20 32 2c 20  ultiplied by 2, 
1150: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  not including.**
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1170: 20 74 68 69 73 20 66 69 65 6c 64 2e 20 50 6c 75   this field. Plu
1180: 73 20 31 20 69 66 20 74 68 69 73 20 65 6e 74 72  s 1 if this entr
1190: 79 20 63 61 72 72 69 65 73 20 74 68 65 20 22 64  y carries the "d
11a0: 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a 2a 2a 20  elete" flag..** 
11b0: 20 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a          collist:
11c0: 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c   collist for col
11d0: 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20 20 20 20  umn 0.**        
11e0: 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a   zero-or-more {.
11f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 30 78 30  **           0x0
1200: 31 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  1 byte.**       
1210: 20 20 20 20 76 61 72 69 6e 74 3a 20 63 6f 6c 75      varint: colu
1220: 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29 0a 2a 2a  mn number (I).**
1230: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69             colli
1240: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
1250: 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20 20 20 20  column I.**     
1260: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
1270: 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a  collist format:.
1280: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61  **.**         va
1290: 72 69 6e 74 3a 20 66 69 72 73 74 20 6f 66 66 73  rint: first offs
12a0: 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20 20 20 20  et + 2.**       
12b0: 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b    zero-or-more {
12c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
12d0: 72 69 6e 74 3a 20 6f 66 66 73 65 74 20 64 65 6c  rint: offset del
12e0: 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20 20 20 20  ta + 2.**       
12f0: 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 49    }.**.**   PAGI
1300: 4e 41 54 49 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20 20  NATION.**.**    
1310: 20 54 68 65 20 66 6f 72 6d 61 74 20 64 65 73 63   The format desc
1320: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 6f  ribed above is o
1330: 6e 6c 79 20 61 63 63 75 72 61 74 65 20 69 66 20  nly accurate if 
1340: 74 68 65 20 65 6e 74 69 72 65 20 74 65 72 6d 2f  the entire term/
1350: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 64  doclist.**     d
1360: 61 74 61 20 66 69 74 73 20 6f 6e 20 61 20 73 69  ata fits on a si
1370: 6e 67 6c 65 20 6c 65 61 66 20 70 61 67 65 2e 20  ngle leaf page. 
1380: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
1390: 68 65 20 63 61 73 65 2c 20 74 68 65 20 66 6f 72  he case, the for
13a0: 6d 61 74 0a 2a 2a 20 20 20 20 20 69 73 20 63 68  mat.**     is ch
13b0: 61 6e 67 65 64 20 69 6e 20 74 77 6f 20 77 61 79  anged in two way
13c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b  s:.**.**       +
13d0: 20 69 66 20 74 68 65 20 66 69 72 73 74 20 72 6f   if the first ro
13e0: 77 69 64 20 6f 6e 20 61 20 70 61 67 65 20 6f 63  wid on a page oc
13f0: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1400: 66 69 72 73 74 20 74 65 72 6d 2c 20 69 74 0a 2a  first term, it.*
1410: 2a 20 20 20 20 20 20 20 20 20 69 73 20 73 74 6f  *         is sto
1420: 72 65 64 20 61 73 20 61 20 6c 69 74 65 72 61 6c  red as a literal
1430: 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   value:.**.**   
1440: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
1450: 3a 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a  :  first rowid.*
1460: 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 74 68 65  *.**       + the
1470: 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 65   first term on e
1480: 61 63 68 20 70 61 67 65 20 69 73 20 73 74 6f 72  ach page is stor
1490: 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ed in the same w
14a0: 61 79 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 20  ay as the.**    
14b0: 20 20 20 20 20 76 65 72 79 20 66 69 72 73 74 20       very first 
14c0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 67 6d  term of the segm
14d0: 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ent:.**.**      
14e0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20         varint : 
14f0: 73 69 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65  size of first te
1500: 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  rm.**           
1510: 20 20 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74    blob:    first
1520: 20 74 65 72 6d 20 64 61 74 61 0a 2a 2a 0a 2a 2a   term data.**.**
1530: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1540: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 3a  age begins with:
1550: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32  .**.**       + 2
1560: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63  -byte unsigned c
1570: 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74  ontaining offset
1580: 20 74 6f 20 66 69 72 73 74 20 72 6f 77 69 64 20   to first rowid 
1590: 28 6f 72 20 30 29 2e 0a 2a 2a 20 20 20 20 20 20  (or 0)..**      
15a0: 20 2b 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   + 2-byte unsign
15b0: 65 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 66  ed containing of
15c0: 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 74 65  fset to first te
15d0: 72 6d 20 28 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a  rm (or 0)..**.**
15e0: 20 20 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 74     Followed by t
15f0: 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61  erm/doclist data
1600: 2e 0a 2a 2a 0a 2a 2a 20 34 2e 20 53 65 67 6d 65  ..**.** 4. Segme
1610: 6e 74 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  nt interior node
1620: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 69  s:.**.**   The i
1630: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 74 75  nterior nodes tu
1640: 72 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6c  rn the list of l
1650: 65 61 76 65 73 20 69 6e 74 6f 20 61 20 62 2b 74  eaves into a b+t
1660: 72 65 65 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 45 61  ree. .**.**   Ea
1670: 63 68 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  ch interior node
1680: 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20 76   begins with a v
1690: 61 72 69 6e 74 20 2d 20 74 68 65 20 70 61 67 65  arint - the page
16a0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
16b0: 65 66 74 0a 2a 2a 20 20 20 6d 6f 73 74 20 63 68  eft.**   most ch
16c0: 69 6c 64 20 6e 6f 64 65 2e 20 46 6f 6c 6c 6f 77  ild node. Follow
16d0: 69 6e 67 20 74 68 69 73 2c 20 66 6f 72 20 65 61  ing this, for ea
16e0: 63 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63  ch leaf page exc
16f0: 65 70 74 20 74 68 65 20 66 69 72 73 74 2c 0a 2a  ept the first,.*
1700: 2a 20 20 20 74 68 65 20 69 6e 74 65 72 69 6f 72  *   the interior
1710: 20 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e 3a 0a   nodes contain:.
1720: 2a 2a 0a 2a 2a 20 20 20 20 20 61 29 20 49 66 20  **.**     a) If 
1730: 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 63 6f  the leaf page co
1740: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
1750: 6f 6e 65 20 74 65 72 6d 2c 20 74 68 65 6e 20 61  one term, then a
1760: 20 74 65 72 6d 2d 70 72 65 66 69 78 20 74 68 61   term-prefix tha
1770: 74 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20 67  t.**        is g
1780: 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
1790: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 73 2c 20  previous terms, 
17a0: 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 6f 72  and less than or
17b0: 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a   equal to the.**
17c0: 20 20 20 20 20 20 20 20 66 69 72 73 74 20 74 65          first te
17d0: 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70  rm on the leaf p
17e0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62  age..**.**     b
17f0: 29 20 49 66 20 74 68 65 20 6c 65 61 66 20 70 61  ) If the leaf pa
1800: 67 65 20 6e 6f 20 74 65 72 6d 73 2c 20 61 20 72  ge no terms, a r
1810: 65 63 6f 72 64 20 69 6e 64 69 63 61 74 69 6e 67  ecord indicating
1820: 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6e 73 65 63   how many consec
1830: 75 74 69 76 65 0a 2a 2a 20 20 20 20 20 20 20 20  utive.**        
1840: 6c 65 61 76 65 73 20 63 6f 6e 74 61 69 6e 20 6e  leaves contain n
1850: 6f 20 74 65 72 6d 73 2c 20 61 6e 64 20 77 68 65  o terms, and whe
1860: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72  ther or not ther
1870: 65 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74  e is an associat
1880: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 62 79 2d  ed.**        by-
1890: 72 6f 77 69 64 20 69 6e 64 65 78 20 72 65 63 6f  rowid index reco
18a0: 72 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 42 79 20 64  rd..**.**   By d
18b0: 65 66 69 6e 69 74 69 6f 6e 2c 20 74 68 65 72 65  efinition, there
18c0: 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74   is never more t
18d0: 68 61 6e 20 6f 6e 65 20 74 79 70 65 20 28 62 29  han one type (b)
18e0: 20 72 65 63 6f 72 64 20 69 6e 20 61 20 72 6f 77   record in a row
18f0: 2e 0a 2a 2a 20 20 20 54 79 70 65 20 28 62 29 20  ..**   Type (b) 
1900: 72 65 63 6f 72 64 73 20 6f 6e 6c 79 20 65 76 65  records only eve
1910: 72 20 61 70 70 65 61 72 20 6f 6e 20 68 65 69 67  r appear on heig
1920: 68 74 3d 31 20 70 61 67 65 73 20 2d 20 69 6d 6d  ht=1 pages - imm
1930: 65 64 69 61 74 65 20 70 61 72 65 6e 74 73 0a 2a  ediate parents.*
1940: 2a 20 20 20 6f 66 20 6c 65 61 76 65 73 2e 20 4f  *   of leaves. O
1950: 6e 6c 79 20 74 79 70 65 20 28 61 29 20 72 65 63  nly type (a) rec
1960: 6f 72 64 73 20 61 72 65 20 70 75 73 68 65 64 20  ords are pushed 
1970: 74 6f 20 68 69 67 68 65 72 20 6c 65 76 65 6c 73  to higher levels
1980: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 65 72 6d 20 66  ..**.**   Term f
1990: 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ormat:.**.**    
19a0: 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74   * Number of byt
19b0: 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74  es in common wit
19c0: 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  h previous term 
19d0: 70 6c 75 73 20 32 2c 20 61 73 20 61 20 76 61 72  plus 2, as a var
19e0: 69 6e 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 4e 75  int..**     * Nu
19f0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1a00: 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2c 20   new term data, 
1a10: 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 20  as a varint..** 
1a20: 20 20 20 20 2a 20 6e 65 77 20 74 65 72 6d 20 64      * new term d
1a30: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d  ata..**.**   No-
1a40: 74 65 72 6d 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a  term format:.**.
1a50: 2a 2a 20 20 20 20 20 2a 20 65 69 74 68 65 72 20  **     * either 
1a60: 61 6e 20 30 78 30 30 20 6f 72 20 30 78 30 31 20  an 0x00 or 0x01 
1a70: 62 79 74 65 2e 20 49 66 20 74 68 65 20 76 61 6c  byte. If the val
1a80: 75 65 20 30 78 30 31 20 69 73 20 75 73 65 64 2c  ue 0x01 is used,
1a90: 20 74 68 65 6e 20 74 68 65 72 65 20 0a 2a 2a 20   then there .** 
1aa0: 20 20 20 20 20 20 69 73 20 61 6e 20 61 73 73 6f        is an asso
1ab0: 63 69 61 74 65 64 20 69 6e 64 65 78 2d 62 79 2d  ciated index-by-
1ac0: 72 6f 77 69 64 20 72 65 63 6f 72 64 2e 0a 2a 2a  rowid record..**
1ad0: 20 20 20 20 20 2a 20 74 68 65 20 6e 75 6d 62 65       * the numbe
1ae0: 72 20 6f 66 20 7a 65 72 6f 2d 74 65 72 6d 20 6c  r of zero-term l
1af0: 65 61 76 65 73 20 61 73 20 61 20 76 61 72 69 6e  eaves as a varin
1b00: 74 2e 0a 2a 2a 0a 2a 2a 20 35 2e 20 53 65 67 6d  t..**.** 5. Segm
1b10: 65 6e 74 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ent doclist inde
1b20: 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 6c  xes:.**.**   A l
1b30: 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e 20  ist of varints. 
1b40: 49 66 20 74 68 65 20 66 69 72 73 74 20 74 65 72  If the first ter
1b50: 6d 6c 65 73 73 20 70 61 67 65 20 63 6f 6e 74 61  mless page conta
1b60: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
1b70: 0a 2a 2a 20 20 20 64 6f 63 69 64 2c 20 74 68 65  .**   docid, the
1b80: 20 6c 69 73 74 20 62 65 67 69 6e 73 20 77 69 74   list begins wit
1b90: 68 20 74 68 61 74 20 64 6f 63 69 64 20 61 73 20  h that docid as 
1ba0: 61 20 76 61 72 69 6e 74 20 66 6f 6c 6c 6f 77 65  a varint followe
1bb0: 64 20 62 79 20 74 68 65 0a 2a 2a 20 20 20 76 61  d by the.**   va
1bc0: 6c 75 65 20 31 20 28 30 78 30 31 29 2e 20 4f 72  lue 1 (0x01). Or
1bd0: 2c 20 69 66 20 74 68 65 20 66 69 72 73 74 20 74  , if the first t
1be0: 65 72 6d 6c 65 73 73 20 70 61 67 65 20 63 6f 6e  ermless page con
1bf0: 74 61 69 6e 73 20 6e 6f 20 64 6f 63 69 64 73 2c  tains no docids,
1c00: 0a 2a 2a 20 20 20 61 20 76 61 72 69 6e 74 20 63  .**   a varint c
1c10: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61  ontaining the la
1c20: 73 74 20 64 6f 63 69 64 20 73 74 6f 72 65 64 20  st docid stored 
1c30: 6f 6e 20 74 68 65 20 74 65 72 6d 20 70 61 67 65  on the term page
1c40: 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 20 20 62   followed.**   b
1c50: 79 20 61 20 30 20 28 30 78 30 30 29 20 76 61 6c  y a 0 (0x00) val
1c60: 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72 20  ue..**.**   For 
1c70: 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20  each subsequent 
1c80: 70 61 67 65 20 69 6e 20 74 68 65 20 64 6f 63 6c  page in the docl
1c90: 69 73 74 2c 20 65 69 74 68 65 72 20 61 20 30 78  ist, either a 0x
1ca0: 30 30 20 62 79 74 65 20 69 66 20 74 68 65 0a 2a  00 byte if the.*
1cb0: 2a 20 20 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  *   page contain
1cc0: 73 20 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 20 61  s no terms, or a
1cd0: 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 64   delta-encoded d
1ce0: 6f 63 69 64 20 28 61 6c 77 61 79 73 20 2b 76 65  ocid (always +ve
1cf0: 29 20 0a 2a 2a 20 20 20 72 65 70 72 65 73 65 6e  ) .**   represen
1d00: 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 64  ting the first d
1d10: 6f 63 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  ocid on the page
1d20: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 0a   otherwise..*/..
1d30: 2f 2a 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72  /*.** Rowids for
1d40: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 61 6e   the averages an
1d50: 64 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  d structure reco
1d60: 72 64 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74  rds in the %_dat
1d70: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66  a table..*/.#def
1d80: 69 6e 65 20 46 54 53 35 5f 41 56 45 52 41 47 45  ine FTS5_AVERAGE
1d90: 53 5f 52 4f 57 49 44 20 20 20 20 20 31 20 20 20  S_ROWID     1   
1da0: 20 2f 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66   /* Rowid used f
1db0: 6f 72 20 74 68 65 20 61 76 65 72 61 67 65 73 20  or the averages 
1dc0: 72 65 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e  record */.#defin
1dd0: 65 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  e FTS5_STRUCTURE
1de0: 5f 52 4f 57 49 44 28 69 49 64 78 29 20 28 31 30  _ROWID(iIdx) (10
1df0: 20 2b 20 28 69 49 64 78 29 29 20 20 20 20 20 2f   + (iIdx))     /
1e00: 2a 20 46 6f 72 20 73 74 72 75 63 74 75 72 65 20  * For structure 
1e10: 72 65 63 6f 72 64 73 20 2a 2f 0a 0a 2f 2a 0a 2a  records */../*.*
1e20: 2a 20 4d 61 63 72 6f 73 20 64 65 74 65 72 6d 69  * Macros determi
1e30: 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 73 20  ning the rowids 
1e40: 75 73 65 64 20 62 79 20 73 65 67 6d 65 6e 74 20  used by segment 
1e50: 6e 6f 64 65 73 2e 20 41 6c 6c 20 6e 6f 64 65 73  nodes. All nodes
1e60: 20 69 6e 20 61 6c 6c 0a 2a 2a 20 73 65 67 6d 65   in all.** segme
1e70: 6e 74 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 65  nts for all inde
1e80: 78 65 73 20 28 74 68 65 20 72 65 67 75 6c 61 72  xes (the regular
1e90: 20 46 54 53 20 69 6e 64 65 78 20 61 6e 64 20 61   FTS index and a
1ea0: 6e 79 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  ny prefix indexe
1eb0: 73 29 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  s).** are stored
1ec0: 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74   in the %_data t
1ed0: 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67 65 20  able with large 
1ee0: 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 73 2e  positive rowids.
1ef0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74  .**.** The %_dat
1f00: 61 20 74 61 62 6c 65 20 6d 61 79 20 63 6f 6e 74  a table may cont
1f10: 61 69 6e 20 75 70 20 74 6f 20 28 31 3c 3c 46 54  ain up to (1<<FT
1f20: 53 35 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58  S5_SEGMENT_INDEX
1f30: 5f 42 49 54 53 29 20 0a 2a 2a 20 69 6e 64 65 78  _BITS) .** index
1f40: 65 73 20 2d 20 6f 6e 65 20 72 65 67 75 6c 61 72  es - one regular
1f50: 20 74 65 72 6d 20 69 6e 64 65 78 20 61 6e 64 20   term index and 
1f60: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 72 65  zero or more pre
1f70: 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a  fix indexes..**.
1f80: 2a 2a 20 45 61 63 68 20 73 65 67 6d 65 6e 74 20  ** Each segment 
1f90: 69 6e 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20  in an index has 
1fa0: 61 20 75 6e 69 71 75 65 20 69 64 20 67 72 65 61  a unique id grea
1fb0: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a  ter than zero..*
1fc0: 2a 0a 2a 2a 20 45 61 63 68 20 6e 6f 64 65 20 69  *.** Each node i
1fd0: 6e 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  n a segment b-tr
1fe0: 65 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61  ee is assigned a
1ff0: 20 22 70 61 67 65 20 6e 75 6d 62 65 72 22 20 74   "page number" t
2000: 68 61 74 20 69 73 20 75 6e 69 71 75 65 0a 2a 2a  hat is unique.**
2010: 20 77 69 74 68 69 6e 20 6e 6f 64 65 73 20 6f 66   within nodes of
2020: 20 69 74 73 20 68 65 69 67 68 74 20 77 69 74 68   its height with
2030: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 28  in the segment (
2040: 6c 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20  leaf nodes have 
2050: 61 20 68 65 69 67 68 74 20 0a 2a 2a 20 6f 66 20  a height .** of 
2060: 30 2c 20 70 61 72 65 6e 74 73 20 31 2c 20 65 74  0, parents 1, et
2070: 63 2e 29 2e 20 50 61 67 65 20 6e 75 6d 62 65 72  c.). Page number
2080: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
2090: 73 65 71 75 65 6e 74 69 61 6c 6c 79 20 73 6f 20  sequentially so 
20a0: 74 68 61 74 0a 2a 2a 20 61 20 6e 6f 64 65 73 20  that.** a nodes 
20b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 61  page number is a
20c0: 6c 77 61 79 73 20 6f 6e 65 20 6d 6f 72 65 20 74  lways one more t
20d0: 68 61 6e 20 69 74 73 20 6c 65 66 74 20 73 69 62  han its left sib
20e0: 6c 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ling..**.** The 
20f0: 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 64 65  rowid for a node
2100: 20 69 73 20 74 68 65 6e 20 66 6f 75 6e 64 20 75   is then found u
2110: 73 69 6e 67 20 74 68 65 20 46 54 53 35 5f 53 45  sing the FTS5_SE
2120: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 6d 61  GMENT_ROWID() ma
2130: 63 72 6f 0a 2a 2a 20 62 65 6c 6f 77 2e 20 54 68  cro.** below. Th
2140: 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 2a  e FTS5_SEGMENT_*
2150: 5f 42 49 54 53 20 6d 61 63 72 6f 73 20 64 65 66  _BITS macros def
2160: 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
2170: 66 20 62 69 74 73 20 75 73 65 64 0a 2a 2a 20 74  f bits used.** t
2180: 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 74 68 72  o encode the thr
2190: 65 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ee FTS5_SEGMENT_
21a0: 52 4f 57 49 44 28 29 20 61 72 67 75 6d 65 6e 74  ROWID() argument
21b0: 73 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 72  s. This module r
21c0: 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
21d0: 5f 46 55 4c 4c 20 61 6e 64 20 66 61 69 6c 73 20  _FULL and fails 
21e0: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65 72  the current oper
21f0: 61 74 69 6f 6e 20 69 66 20 74 68 65 79 20 65 76  ation if they ev
2200: 65 72 20 70 72 6f 76 65 20 74 6f 6f 20 73 6d 61  er prove too sma
2210: 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ll..*/.#define F
2220: 54 53 35 5f 44 41 54 41 5f 49 44 58 5f 42 20 20  TS5_DATA_IDX_B  
2230: 20 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78 20     5     /* Max 
2240: 6f 66 20 33 31 20 70 72 65 66 69 78 20 69 6e 64  of 31 prefix ind
2250: 65 78 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  exes */.#define 
2260: 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 20  FTS5_DATA_ID_B  
2270: 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61 78     16     /* Max
2280: 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20 36   seg id number 6
2290: 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20  5535 */.#define 
22a0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
22b0: 5f 42 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78  _B  5     /* Max
22c0: 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 20 6f   b-tree height o
22d0: 66 20 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20  f 32 */.#define 
22e0: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
22f0: 20 20 20 33 31 20 20 20 20 20 2f 2a 20 4d 61 78     31     /* Max
2300: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2310: 32 31 34 37 34 38 33 36 34 38 20 2a 2f 0a 0a 23  2147483648 */..#
2320: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
2330: 45 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73  ENT_ROWID(idx, s
2340: 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67  egid, height, pg
2350: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2370: 20 28 28 69 36 34 29 28 69 64 78 29 20 20 20 20   ((i64)(idx)    
2380: 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 49 44  << (FTS5_DATA_ID
2390: 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  _B + FTS5_DATA_P
23a0: 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54  AGE_B + FTS5_DAT
23b0: 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20 5c  A_HEIGHT_B)) + \
23c0: 0a 20 28 28 69 36 34 29 28 73 65 67 69 64 29 20  . ((i64)(segid) 
23d0: 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 50   << (FTS5_DATA_P
23e0: 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54  AGE_B + FTS5_DAT
23f0: 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20 20  A_HEIGHT_B)) +  
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 5c 0a 20 28 28 69 36 34 29 28 68 65 69 67 68 74  \. ((i64)(height
2420: 29 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f  ) << (FTS5_DATA_
2430: 50 41 47 45 5f 42 29 29 20 2b 20 20 20 20 20 20  PAGE_B)) +      
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 5c 0a 20 28 28 69 36 34 29 28 70 67 6e 6f 29   \. ((i64)(pgno)
2470: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 5c 0a 29 0a 0a 23 69 66 20 46 54 53 35 5f    \.)..#if FTS5_
24c0: 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58  MAX_PREFIX_INDEX
24d0: 45 53 20 3e 20 28 28 31 3c 3c 46 54 53 35 5f 44  ES > ((1<<FTS5_D
24e0: 41 54 41 5f 49 44 58 5f 42 29 2d 31 29 20 0a 23  ATA_IDX_B)-1) .#
24f0: 20 65 72 72 6f 72 20 22 46 54 53 35 5f 4d 41 58   error "FTS5_MAX
2500: 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20  _PREFIX_INDEXES 
2510: 69 73 20 74 6f 6f 20 6c 61 72 67 65 22 0a 23 65  is too large".#e
2520: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
2530: 68 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e  height of segmen
2540: 74 20 62 2d 74 72 65 65 73 20 69 73 20 61 63 74  t b-trees is act
2550: 75 61 6c 6c 79 20 6c 69 6d 69 74 65 64 20 74 6f  ually limited to
2560: 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20 0a   one less than .
2570: 2a 2a 20 28 31 3c 3c 48 45 49 47 48 54 5f 42 49  ** (1<<HEIGHT_BI
2580: 54 53 29 2e 20 54 68 69 73 20 69 73 20 62 65 63  TS). This is bec
2590: 61 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 61  ause the rowid a
25a0: 64 64 72 65 73 73 20 73 70 61 63 65 20 66 6f 72  ddress space for
25b0: 20 6e 6f 64 65 73 0a 2a 2a 20 77 69 74 68 20 73   nodes.** with s
25c0: 75 63 68 20 61 20 68 65 69 67 68 74 20 69 73 20  uch a height is 
25d0: 75 73 65 64 20 62 79 20 64 6f 63 6c 69 73 74 20  used by doclist 
25e0: 69 6e 64 65 78 65 73 2e 0a 2a 2f 0a 23 64 65 66  indexes..*/.#def
25f0: 69 6e 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  ine FTS5_SEGMENT
2600: 5f 4d 41 58 5f 48 45 49 47 48 54 20 28 28 31 20  _MAX_HEIGHT ((1 
2610: 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  << FTS5_DATA_HEI
2620: 47 48 54 5f 42 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a  GHT_B)-1)../*.**
2630: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
2640: 68 65 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  he doclist index
2650: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2660: 20 6c 65 61 66 20 70 61 67 65 20 70 67 6e 6f 20   leaf page pgno 
2670: 6f 66 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 73 65  of segment.** se
2680: 67 69 64 20 69 6e 20 69 6e 64 65 78 20 69 64 78  gid in index idx
2690: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  ..*/.#define FTS
26a0: 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f  5_DOCLIST_IDX_RO
26b0: 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20  WID(idx, segid, 
26c0: 70 67 6e 6f 29 20 5c 0a 20 20 20 20 20 20 20 20  pgno) \.        
26d0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
26e0: 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20 46  ID(idx, segid, F
26f0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f  TS5_SEGMENT_MAX_
2700: 48 45 49 47 48 54 2c 20 70 67 6e 6f 29 0a 0a 23  HEIGHT, pgno)..#
2710: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2720: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
2730: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
2740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2750: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2760: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2770: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2780: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2790: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
27a0: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
27b0: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
27c0: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
27d0: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
27e0: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
27f0: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
2800: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
2810: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
2820: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
2830: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
2840: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
2850: 44 49 4e 47 20 38 0a 0a 74 79 70 65 64 65 66 20  DING 8..typedef 
2860: 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65  struct Fts5Btree
2870: 49 74 65 72 20 46 74 73 35 42 74 72 65 65 49 74  Iter Fts5BtreeIt
2880: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2890: 63 74 20 46 74 73 35 42 74 72 65 65 49 74 65 72  ct Fts5BtreeIter
28a0: 4c 65 76 65 6c 20 46 74 73 35 42 74 72 65 65 49  Level Fts5BtreeI
28b0: 74 65 72 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  terLevel;.typede
28c0: 66 20 73 74 72 75 63 74 20 46 74 73 35 43 68 75  f struct Fts5Chu
28d0: 6e 6b 49 74 65 72 20 46 74 73 35 43 68 75 6e 6b  nkIter Fts5Chunk
28e0: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
28f0: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74  ruct Fts5Data Ft
2900: 73 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20  s5Data;.typedef 
2910: 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78  struct Fts5Dlidx
2920: 49 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74  Iter Fts5DlidxIt
2930: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2940: 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  ct Fts5MultiSegI
2950: 74 65 72 20 46 74 73 35 4d 75 6c 74 69 53 65 67  ter Fts5MultiSeg
2960: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
2970: 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65  ruct Fts5NodeIte
2980: 72 20 46 74 73 35 4e 6f 64 65 49 74 65 72 3b 0a  r Fts5NodeIter;.
2990: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
29a0: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74  ts5PageWriter Ft
29b0: 73 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79  s5PageWriter;.ty
29c0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
29d0: 35 50 6f 73 49 74 65 72 20 46 74 73 35 50 6f 73  5PosIter Fts5Pos
29e0: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
29f0: 72 75 63 74 20 46 74 73 35 53 65 67 49 74 65 72  ruct Fts5SegIter
2a00: 20 46 74 73 35 53 65 67 49 74 65 72 3b 0a 74 79   Fts5SegIter;.ty
2a10: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2a20: 35 44 6f 63 6c 69 73 74 49 74 65 72 20 46 74 73  5DoclistIter Fts
2a30: 35 44 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74 79  5DoclistIter;.ty
2a40: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2a50: 35 53 65 67 57 72 69 74 65 72 20 46 74 73 35 53  5SegWriter Fts5S
2a60: 65 67 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65  egWriter;.typede
2a70: 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74 72  f struct Fts5Str
2a80: 75 63 74 75 72 65 20 46 74 73 35 53 74 72 75 63  ucture Fts5Struc
2a90: 74 75 72 65 3b 0a 74 79 70 65 64 65 66 20 73 74  ture;.typedef st
2aa0: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
2ab0: 72 65 4c 65 76 65 6c 20 46 74 73 35 53 74 72 75  reLevel Fts5Stru
2ac0: 63 74 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65  ctureLevel;.type
2ad0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2ae0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
2af0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2b00: 6d 65 6e 74 3b 0a 0a 73 74 72 75 63 74 20 46 74  ment;..struct Ft
2b10: 73 35 44 61 74 61 20 7b 0a 20 20 75 38 20 2a 70  s5Data {.  u8 *p
2b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b40: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
2b50: 63 6f 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f 72  containing recor
2b60: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2b90: 66 20 72 65 63 6f 72 64 20 69 6e 20 62 79 74 65  f record in byte
2ba0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 20 20 20 20 2f 2a 20 52 65 66 20 63 6f         /* Ref co
2bd0: 75 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  unt */.};../*.**
2be0: 20 4f 6e 65 20 6f 62 6a 65 63 74 20 70 65 72 20   One object per 
2bf0: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f  %_data table..*/
2c00: 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e 64 65  .struct Fts5Inde
2c10: 78 20 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  x {.  Fts5Config
2c20: 20 2a 70 43 6f 6e 66 69 67 3b 20 20 20 20 20 20   *pConfig;      
2c30: 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c        /* Virtual
2c40: 20 74 61 62 6c 65 20 63 6f 6e 66 69 67 75 72 61   table configura
2c50: 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tion */.  char *
2c60: 7a 44 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20  zDataTbl;       
2c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2c80: 65 20 6f 66 20 25 5f 64 61 74 61 20 74 61 62 6c  e of %_data tabl
2c90: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b  e */.  int nWork
2ca0: 55 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Unit;           
2cb0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
2cc0: 61 67 65 73 20 69 6e 20 61 20 22 75 6e 69 74 22  ages in a "unit"
2cd0: 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f   of work */..  /
2ce0: 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 73  *.  ** Variables
2cf0: 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
2d00: 61 63 63 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20  accumulation of 
2d10: 74 6f 6b 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69  tokens and docli
2d20: 73 74 73 20 77 69 74 68 69 6e 20 74 68 65 0a 20  sts within the. 
2d30: 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61   ** in-memory ha
2d40: 73 68 20 74 61 62 6c 65 73 20 62 65 66 6f 72 65  sh tables before
2d50: 20 74 68 65 79 20 61 72 65 20 66 6c 75 73 68 65   they are flushe
2d60: 64 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  d to disk..  */.
2d70: 20 20 46 74 73 35 48 61 73 68 20 2a 2a 61 70 48    Fts5Hash **apH
2d80: 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
2d90: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 68 61    /* Array of ha
2da0: 73 68 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69  sh tables */.  i
2db0: 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  nt nMaxPendingDa
2dc0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ta;            /
2dd0: 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67 20 64 61  * Max pending da
2de0: 74 61 20 62 65 66 6f 72 65 20 66 6c 75 73 68 20  ta before flush 
2df0: 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74  to disk */.  int
2e00: 20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b 20 20   nPendingData;  
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e20: 43 75 72 72 65 6e 74 20 62 79 74 65 73 20 6f 66  Current bytes of
2e30: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f   pending data */
2e40: 0a 20 20 69 36 34 20 69 57 72 69 74 65 52 6f 77  .  i64 iWriteRow
2e50: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2e60: 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
2e70: 63 75 72 72 65 6e 74 20 64 6f 63 20 62 65 69 6e  current doc bein
2e80: 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20  g written */..  
2e90: 2f 2a 20 45 72 72 6f 72 20 73 74 61 74 65 2e 20  /* Error state. 
2ea0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2ed0: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
2ee0: 20 2f 2a 20 53 74 61 74 65 20 75 73 65 64 20 62   /* State used b
2ef0: 79 20 74 68 65 20 66 74 73 35 44 61 74 61 58 58  y the fts5DataXX
2f00: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a  X() functions. *
2f10: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
2f20: 20 2a 70 52 65 61 64 65 72 3b 20 20 20 20 20 20   *pReader;      
2f30: 20 20 20 20 2f 2a 20 52 4f 20 69 6e 63 72 2d 62      /* RO incr-b
2f40: 6c 6f 62 20 6f 70 65 6e 20 6f 6e 20 25 5f 64 61  lob open on %_da
2f50: 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ta table */.  sq
2f60: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72 69  lite3_stmt *pWri
2f70: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ter;          /*
2f80: 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 64   "INSERT ... %_d
2f90: 61 74 61 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22  ata VALUES(?,?)"
2fa0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2fb0: 6d 74 20 2a 70 44 65 6c 65 74 65 72 3b 20 20 20  mt *pDeleter;   
2fc0: 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45 54 45        /* "DELETE
2fd0: 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 2e 2e 2e   FROM %_data ...
2fe0: 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f   id>=? AND id<=?
2ff0: 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  " */.  int nRead
3000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3010: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
3020: 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73  number of blocks
3030: 20 72 65 61 64 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   read */.};..str
3040: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
3050: 74 65 72 20 7b 0a 20 20 69 6e 74 20 62 44 65 73  ter {.  int bDes
3060: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3070: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3080: 66 6f 72 20 44 45 53 43 20 6f 72 64 65 72 2c 20  for DESC order, 
3090: 66 61 6c 73 65 20 66 6f 72 20 41 53 43 20 2a 2f  false for ASC */
30a0: 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74 20  .  u8 *a;.  int 
30b0: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  n;.  int i;..  /
30c0: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
30d0: 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20  es. aPoslist==0 
30e0: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20  at EOF */.  i64 
30f0: 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50  iRowid;.  u8 *aP
3100: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50  oslist;.  int nP
3110: 6f 73 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  oslist;.};../*.*
3120: 2a 20 45 61 63 68 20 69 74 65 72 61 74 6f 72 20  * Each iterator 
3130: 75 73 65 64 20 62 79 20 65 78 74 65 72 6e 61 6c  used by external
3140: 20 6d 6f 64 75 6c 65 73 20 69 73 20 61 6e 20 69   modules is an i
3150: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
3160: 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  type..*/.struct 
3170: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b 0a  Fts5IndexIter {.
3180: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e    Fts5Index *pIn
3190: 64 65 78 3b 0a 20 20 46 74 73 35 53 74 72 75 63  dex;.  Fts5Struc
31a0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
31b0: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
31c0: 72 20 2a 70 4d 75 6c 74 69 3b 0a 20 20 46 74 73  r *pMulti;.  Fts
31d0: 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 44  5DoclistIter *pD
31e0: 6f 63 6c 69 73 74 3b 0a 20 20 46 74 73 35 42 75  oclist;.  Fts5Bu
31f0: 66 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20  ffer poslist;   
3200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3210: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
3220: 75 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a  urrent poslist *
3230: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  /.};../*.** The 
3240: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
3250: 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63 6f  "structure" reco
3260: 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  rd for each inde
3270: 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  x are represente
3280: 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46 74  d.** using an Ft
3290: 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63 6f  s5Structure reco
32a0: 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57 68  rd in memory. Wh
32b0: 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e 63  ich uses instanc
32c0: 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 74  es of the .** ot
32d0: 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75 72  her Fts5Structur
32e0: 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63 6f  eXXX types as co
32f0: 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72  mponents..*/.str
3300: 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72  uct Fts5Structur
3310: 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e 74  eSegment {.  int
3320: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3340: 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
3350: 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20  int nHeight;    
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3370: 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73 65 67  /* Height of seg
3380: 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20  ment b-tree */. 
3390: 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20   int pgnoFirst; 
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70   /* First leaf p
33c0: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
33d0: 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70  gment */.  int p
33e0: 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20  gnoLast;        
33f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
3400: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
3410: 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
3420: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
3430: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b  StructureLevel {
3440: 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20  .  int nMerge;  
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3460: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3470: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72  segments in incr
3480: 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20  -merge */.  int 
3490: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
34b0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
34c0: 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
34d0: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
34e0: 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67  ureSegment *aSeg
34f0: 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ;     /* Array o
3500: 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67  f segments. aSeg
3510: 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a  [0] is oldest. *
3520: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
3530: 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 75 36  Structure {.  u6
3540: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
3550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3560: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
3570: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
3580: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c   */.  int nLevel
3590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
35b0: 6f 66 20 6c 65 76 65 6c 73 20 69 6e 20 74 68 69  of levels in thi
35c0: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73  s index */.  Fts
35d0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
35e0: 61 4c 65 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20  aLevel[0];   /* 
35f0: 41 72 72 61 79 20 6f 66 20 6e 4c 65 76 65 6c 20  Array of nLevel 
3600: 6c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 2a 2f  level objects */
3610: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62  .};../*.** An ob
3620: 6a 65 63 74 20 6f 66 20 74 79 70 65 20 46 74 73  ject of type Fts
3630: 35 53 65 67 57 72 69 74 65 72 20 69 73 20 75 73  5SegWriter is us
3640: 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 73  ed to write to s
3650: 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75  egments..*/.stru
3660: 63 74 20 46 74 73 35 50 61 67 65 57 72 69 74 65  ct Fts5PageWrite
3670: 72 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20  r {.  int pgno; 
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3690: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
36a0: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
36b0: 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ge */.  Fts5Buff
36c0: 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20  er buf;         
36d0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
36e0: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61 67  r containing pag
36f0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73 35  e data */.  Fts5
3700: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
3710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3720: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3730: 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 6f   previous term o
3740: 6e 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74 72  n page */.};.str
3750: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
3760: 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78 3b 20  r {.  int iIdx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
3790: 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
37a0: 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20  int iSegid;     
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 2f 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69 74  /* Segid to writ
37d0: 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 57  e to */.  int nW
37e0: 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  riter;          
37f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3800: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3810: 6e 20 61 57 72 69 74 65 72 20 2a 2f 0a 20 20 46  n aWriter */.  F
3820: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 61  ts5PageWriter *a
3830: 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 2f  Writer;        /
3840: 2a 20 41 72 72 61 79 20 6f 66 20 50 61 67 65 57  * Array of PageW
3850: 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a 2f  riter objects */
3860: 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69  .  i64 iPrevRowi
3870: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3880: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 64     /* Previous d
3890: 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  ocid written to 
38a0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
38b0: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
38c0: 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  InDoclist;      
38d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
38e0: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
38f0: 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   in doclist */. 
3900: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3910: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
3920: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3930: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3940: 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  in page */.  u8 
3950: 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
3960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3970: 54 72 75 65 20 69 66 20 6e 65 78 74 20 74 65 72  True if next ter
3980: 6d 20 77 69 6c 6c 20 62 65 20 66 69 72 73 74 20  m will be first 
3990: 69 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74  in leaf */.  int
39a0: 20 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 20 20   nLeafWritten;  
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39c0: 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
39d0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ages written */.
39e0: 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20    int nEmpty;   
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
3a10: 6f 6e 74 69 67 75 6f 75 73 20 74 65 72 6d 2d 6c  ontiguous term-l
3a20: 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 46  ess nodes */.  F
3a30: 74 73 35 42 75 66 66 65 72 20 63 64 6c 69 64 78  ts5Buffer cdlidx
3a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3a50: 2f 2a 20 44 6f 63 6c 69 73 74 20 69 6e 64 65 78  /* Doclist index
3a60: 20 2a 2f 0a 20 20 69 36 34 20 69 44 6c 69 64 78   */.  i64 iDlidx
3a70: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
3a80: 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
3a90: 73 20 72 6f 77 69 64 20 61 70 70 65 6e 64 65 64  s rowid appended
3aa0: 20 74 6f 20 64 6c 69 64 78 20 2a 2f 0a 20 20 69   to dlidx */.  i
3ab0: 6e 74 20 62 44 6c 69 64 78 50 72 65 76 56 61 6c  nt bDlidxPrevVal
3ac0: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  id;            /
3ad0: 2a 20 54 72 75 65 20 69 66 20 69 44 6c 69 64 78  * True if iDlidx
3ae0: 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f  Prev is valid */
3af0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
3b00: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
3b10: 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67  through the merg
3b20: 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e  ed results of on
3b30: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
3b40: 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20  ts,.** visiting 
3b50: 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 20  each term/docid 
3b60: 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67  pair in the merg
3b70: 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e  ed data..**.** n
3b80: 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20  Seg is always a 
3b90: 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65  power of two gre
3ba0: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
3bb0: 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  al to the number
3bc0: 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20   of.** segments 
3bd0: 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74  that this object
3be0: 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61   is merging data
3bf0: 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20   from. Both the 
3c00: 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46  aSeg[] and.** aF
3c10: 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72  irst[] arrays ar
3c20: 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20  e sized at nSeg 
3c30: 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65  entries. The aSe
3c40: 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64  g[] array is pad
3c50: 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f  ded.** with zero
3c60: 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65  ed objects - the
3c70: 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61  se are handled a
3c80: 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69  s if they were i
3c90: 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a  terators opened.
3ca0: 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d  ** on empty segm
3cb0: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
3cc0: 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61  results of compa
3cd0: 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53  ring segments aS
3ce0: 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e  eg[N] and aSeg[N
3cf0: 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20  +1], where N is 
3d00: 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65  an.** even numbe
3d10: 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  r, is stored in 
3d20: 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f  aFirst[(nSeg+N)/
3d30: 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22  2]. The "result"
3d40: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70   of the .** comp
3d50: 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63  arison in this c
3d60: 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e  ontext is the in
3d70: 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61  dex of the itera
3d80: 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74  tor that current
3d90: 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ly.** points to 
3da0: 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d  the smaller term
3db0: 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
3dc0: 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74  on. Iterators at
3dd0: 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73   EOF are.** cons
3de0: 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65  idered to be gre
3df0: 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74  ater than all ot
3e00: 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a  her iterators..*
3e10: 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63  *.** aFirst[1] c
3e20: 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65  ontains the inde
3e30: 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74  x in aSeg[] of t
3e40: 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74  he iterator that
3e50: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
3e60: 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f  e smallest key o
3e70: 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30  verall. aFirst[0
3e80: 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f  ] is unused. .*/
3e90: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
3ea0: 20 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73   Fts5CResult Fts
3eb0: 35 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74  5CResult;.struct
3ec0: 20 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20   Fts5CResult {. 
3ed0: 20 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20   u16 iFirst;    
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78   /* aSeg[] index
3f00: 20 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65   of firstest ite
3f10: 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54  rator */.  u8 bT
3f20: 65 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20  ermEq;          
3f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3f40: 75 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20  ue if the terms 
3f50: 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a  are equal */.};.
3f60: 0a 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c 74  .struct Fts5Mult
3f70: 69 53 65 67 49 74 65 72 20 7b 0a 20 20 69 6e 74  iSegIter {.  int
3f80: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3fa0: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
3fb0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
3fc0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
3fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3fe0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
3ff0: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4000: 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74  .  int bSkipEmpt
4010: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
4020: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4030: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4040: 65 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  es */.  Fts5SegI
4050: 74 65 72 20 2a 61 53 65 67 3b 20 20 20 20 20 20  ter *aSeg;      
4060: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
4070: 20 6f 66 20 73 65 67 6d 65 6e 74 20 69 74 65 72   of segment iter
4080: 61 74 6f 72 73 20 2a 2f 0a 20 20 46 74 73 35 43  ators */.  Fts5C
4090: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
40a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
40b0: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
40c0: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
40d0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
40e0: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
40f0: 74 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c 65  through a single
4100: 20 73 65 67 6d 65 6e 74 2c 20 76 69 73 69 74 69   segment, visiti
4110: 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 64 6f 63  ng each term/doc
4120: 69 64 0a 2a 2a 20 70 61 69 72 20 69 6e 20 74 68  id.** pair in th
4130: 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  e segment..**.**
4140: 20 70 53 65 67 3a 0a 2a 2a 20 20 20 54 68 65 20   pSeg:.**   The 
4150: 73 65 67 6d 65 6e 74 20 74 6f 20 69 74 65 72 61  segment to itera
4160: 74 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a  te through..**.*
4170: 2a 20 69 4c 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20  * iLeafPgno:.** 
4180: 20 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 70    Current leaf p
4190: 61 67 65 20 6e 75 6d 62 65 72 20 77 69 74 68 69  age number withi
41a0: 6e 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  n segment..**.**
41b0: 20 69 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a   iLeafOffset:.**
41c0: 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20 77     Byte offset w
41d0: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
41e0: 74 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 74  t leaf that is t
41f0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
4200: 20 74 68 65 20 0a 2a 2a 20 20 20 70 6f 73 69 74   the .**   posit
4210: 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 28 6f  ion list data (o
4220: 6e 65 20 62 79 74 65 20 70 61 73 73 65 64 20 74  ne byte passed t
4230: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
4240: 20 73 69 7a 65 20 66 69 65 6c 64 29 2e 0a 2a 2a   size field)..**
4250: 20 20 20 72 6f 77 69 64 20 66 69 65 6c 64 20 6f     rowid field o
4260: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  f the current en
4270: 74 72 79 2e 20 55 73 75 61 6c 6c 79 20 74 68 69  try. Usually thi
4280: 73 20 69 73 20 74 68 65 20 73 69 7a 65 20 66 69  s is the size fi
4290: 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  eld of the.**   
42a0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61  position list da
42b0: 74 61 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  ta. The exceptio
42c0: 6e 20 69 73 20 69 66 20 74 68 65 20 72 6f 77 69  n is if the rowi
42d0: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
42e0: 74 20 65 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73  t entry .**   is
42f0: 20 74 68 65 20 6c 61 73 74 20 74 68 69 6e 67 20   the last thing 
4300: 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  on the leaf page
4310: 2e 0a 2a 2a 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a  ..**.** pLeaf:.*
4320: 2a 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61  *   Buffer conta
4330: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 6c 65  ining current le
4340: 61 66 20 70 61 67 65 20 64 61 74 61 2e 20 53 65  af page data. Se
4350: 74 20 74 6f 20 4e 55 4c 4c 20 61 74 20 45 4f 46  t to NULL at EOF
4360: 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72 6d 4c 65 61  ..**.** iTermLea
4370: 66 50 67 6e 6f 2c 20 69 54 65 72 6d 4c 65 61 66  fPgno, iTermLeaf
4380: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 4c 65 61  Offset:.**   Lea
4390: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 63 6f  f page number co
43a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73  ntaining the las
43b0: 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d  t term read from
43c0: 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 41 6e   the segment. An
43d0: 64 0a 2a 2a 20 20 20 74 68 65 20 6f 66 66 73 65  d.**   the offse
43e0: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
43f0: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 65 72 6d  llowing the term
4400: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61   data..**.** fla
4410: 67 73 3a 0a 2a 2a 20 20 20 4d 61 73 6b 20 6f 66  gs:.**   Mask of
4420: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 58 58   FTS5_SEGITER_XX
4430: 58 20 76 61 6c 75 65 73 2e 20 49 6e 74 65 72 70  X values. Interp
4440: 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
4450: 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53  :.**.**   FTS5_S
4460: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a  EGITER_ONETERM:.
4470: 2a 2a 20 20 20 20 20 49 66 20 73 65 74 2c 20 73  **     If set, s
4480: 65 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  et the iterator 
4490: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20  to point to EOF 
44a0: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
44b0: 74 20 64 6f 63 6c 69 73 74 20 0a 2a 2a 20 20 20  t doclist .**   
44c0: 20 20 68 61 73 20 62 65 65 6e 20 65 78 68 61 75    has been exhau
44d0: 73 74 65 64 2e 20 44 6f 20 6e 6f 74 20 70 72 6f  sted. Do not pro
44e0: 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ceed to the next
44f0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67   term in the seg
4500: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54  ment..**.**   FT
4510: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4520: 53 45 3a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  SE:.**     This 
4530: 66 6c 61 67 20 69 73 20 6f 6e 6c 79 20 65 76 65  flag is only eve
4540: 72 20 73 65 74 20 69 66 20 46 54 53 35 5f 53 45  r set if FTS5_SE
4550: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 69 73  GITER_ONETERM is
4560: 20 61 6c 73 6f 20 73 65 74 2e 20 49 66 0a 2a 2a   also set. If.**
4570: 20 20 20 20 20 69 74 20 69 73 20 73 65 74 2c 20       it is set, 
4580: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
4590: 64 6f 63 69 64 73 20 69 6e 20 64 65 73 63 65 6e  docids in descen
45a0: 64 69 6e 67 20 6f 72 64 65 72 20 69 6e 73 74 65  ding order inste
45b0: 61 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ad of the.**    
45c0: 20 64 65 66 61 75 6c 74 20 61 73 63 65 6e 64 69   default ascendi
45d0: 6e 67 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  ng order..**.** 
45e0: 69 52 6f 77 69 64 4f 66 66 73 65 74 2f 6e 52 6f  iRowidOffset/nRo
45f0: 77 69 64 4f 66 66 73 65 74 2f 61 52 6f 77 69 64  widOffset/aRowid
4600: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 20 20 54  Offset:.**     T
4610: 68 65 73 65 20 61 72 65 20 75 73 65 64 20 69 66  hese are used if
4620: 20 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45   the FTS5_SEGITE
4630: 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69  R_REVERSE flag i
4640: 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  s set..**.**    
4650: 20 46 6f 72 20 65 61 63 68 20 72 6f 77 69 64 20   For each rowid 
4660: 6f 6e 20 74 68 65 20 70 61 67 65 20 63 6f 72 72  on the page corr
4670: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
4680: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2c 20 74   current term, t
4690: 68 65 0a 2a 2a 20 20 20 20 20 63 6f 72 72 65 73  he.**     corres
46a0: 70 6f 6e 64 69 6e 67 20 61 52 6f 77 69 64 4f 66  ponding aRowidOf
46b0: 66 73 65 74 5b 5d 20 65 6e 74 72 79 20 69 73 20  fset[] entry is 
46c0: 73 65 74 20 74 6f 20 74 68 65 20 62 79 74 65 20  set to the byte 
46d0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a  offset of the.**
46e0: 20 20 20 20 20 73 74 61 72 74 20 6f 66 20 74 68       start of th
46f0: 65 20 22 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  e "position-list
4700: 2d 73 69 7a 65 22 20 66 69 65 6c 64 20 77 69 74  -size" field wit
4710: 68 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f  hin the page..*/
4720: 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67 49  .struct Fts5SegI
4730: 74 65 72 20 7b 0a 20 20 46 74 73 35 53 74 72 75  ter {.  Fts5Stru
4740: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
4750: 65 67 3b 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg;     /* Segme
4760: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
4770: 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 69  rough */.  int i
4780: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
47a0: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
47b0: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
47c0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
47f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
4800: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
4810: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
4820: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4830: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
4840: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4850: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4860: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4870: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4880: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4890: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
48a0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
48b0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
48c0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  leaf */..  /* Th
48d0: 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73 65  e page and offse
48e0: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65  t from which the
48f0: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77 61   current term wa
4900: 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66 73  s read. The offs
4910: 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  et .  ** is the 
4920: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66 69  offset of the fi
4930: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  rst rowid in the
4940: 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
4950: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  .  */.  int iTer
4960: 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  mLeafPgno;.  int
4970: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
4980: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
4990: 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75  owing are only u
49a0: 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f  sed if the FTS5_
49b0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
49c0: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a  flag is set. */.
49d0: 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73    int iRowidOffs
49e0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
49f0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e 74    /* Current ent
4a00: 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66 73  ry in aRowidOffs
4a10: 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  et[] */.  int nR
4a20: 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20  owidOffset;     
4a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
4a40: 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
4a50: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72  RowidOffset[] ar
4a60: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52  ray */.  int *aR
4a70: 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20  owidOffset;     
4a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
4a90: 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20 72  y of offset to r
4aa0: 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a 0a  owid fields */..
4ab0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
4ac0: 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20  *pDlidx;        
4ad0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
4ae0: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
4af0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62   */..  /* Variab
4b00: 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62 61  les populated ba
4b10: 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20 65  sed on current e
4b20: 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42  ntry. */.  Fts5B
4b30: 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
4b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4b50: 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  rrent term */.  
4b60: 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64  /* Current rowid
4b90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b 20   */.  int nPos; 
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4bc0: 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75 72 72  of bytes in curr
4bd0: 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ent position lis
4be0: 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 3b  t */.  int bDel;
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4c10: 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61  f the delete fla
4c20: 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a 0a  g is set */.};..
4c30: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47  #define FTS5_SEG
4c40: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78 30  ITER_ONETERM 0x0
4c50: 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  1.#define FTS5_S
4c60: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 30  EGITER_REVERSE 0
4c70: 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  x02.../*.** Obje
4c80: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
4c90: 20 74 68 72 6f 75 67 68 20 70 61 67 69 6e 61 74   through paginat
4ca0: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 72 75  ed data..*/.stru
4cb0: 63 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72  ct Fts5ChunkIter
4cc0: 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70   {.  Fts5Data *p
4cd0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
4ce0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4cf0: 6c 65 61 66 20 64 61 74 61 2e 20 4e 55 4c 4c 20  leaf data. NULL 
4d00: 2d 3e 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 36 34  -> EOF. */.  i64
4d10: 20 69 4c 65 61 66 52 6f 77 69 64 3b 20 20 20 20   iLeafRowid;    
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d30: 41 62 73 6f 6c 75 74 65 20 72 6f 77 69 64 20 6f  Absolute rowid o
4d40: 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a  f current leaf *
4d50: 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20  /.  int nRem;   
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67      /* Remaining
4d80: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 74   bytes of data t
4d90: 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 2f 2a 20  o read */..  /* 
4da0: 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  Output parameter
4db0: 73 20 2a 2f 0a 20 20 75 38 20 2a 70 3b 20 20 20  s */.  u8 *p;   
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4de0: 72 20 74 6f 20 63 68 75 6e 6b 20 6f 66 20 64 61  r to chunk of da
4df0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ta */.  int n;  
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
4e20: 6f 66 20 62 75 66 66 65 72 20 70 20 69 6e 20 62  of buffer p in b
4e30: 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ytes */.};../*.*
4e40: 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65  * Object for ite
4e50: 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
4e60: 20 73 69 6e 67 6c 65 20 70 6f 73 69 74 69 6f 6e   single position
4e70: 20 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a   list on disk..*
4e80: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f 73  /.struct Fts5Pos
4e90: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 43 68 75  Iter {.  Fts5Chu
4ea0: 6e 6b 49 74 65 72 20 63 68 75 6e 6b 3b 20 20 20  nkIter chunk;   
4eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4ec0: 65 6e 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74  ent chunk of dat
4ed0: 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b  a */.  int iOff;
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
4f00: 20 77 69 74 68 69 6e 20 63 68 75 6e 6b 20 64 61   within chunk da
4f10: 74 61 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43 6f  ta */..  int iCo
4f20: 6c 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a 7d  l;.  int iPos;.}
4f30: 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  ;../*.** Object 
4f40: 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  for iterating th
4f50: 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e 74  rough the conent
4f60: 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69 6e  s of a single in
4f70: 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 0a  ternal node in .
4f80: 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
4f90: 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65  ruct Fts5NodeIte
4fa0: 72 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e 61  r {.  /* Interna
4fb0: 6c 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61 67  l. Set and manag
4fc0: 65 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49 74  ed by fts5NodeIt
4fd0: 65 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  erXXX() function
4fe0: 73 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a 2a  s. Except, .  **
4ff0: 20 74 68 65 20 45 4f 46 20 74 65 73 74 20 66 6f   the EOF test fo
5000: 72 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  r the iterator i
5010: 73 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72 2e  s (Fts5NodeIter.
5020: 61 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a 20  aData==0).  */. 
5030: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
5040: 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20  ;.  int nData;. 
5050: 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f 2a   int iOff;..  /*
5060: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
5070: 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
5080: 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 45  r term;.  int nE
5090: 6d 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68 69  mpty;.  int iChi
50a0: 6c 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78  ld;.  int bDlidx
50b0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ;.};../*.** An i
50c0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
50d0: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73  ollowing type is
50e0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
50f0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e   through the con
5100: 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f  tents.** of a do
5110: 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f  clist-index reco
5120: 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a  rd..**.** pData:
5130: 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e  .**   Record con
5140: 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c  taining the docl
5150: 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a  ist-index data..
5160: 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20  **.** bEof:.**  
5170: 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63   Set to true onc
5180: 65 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72  e iterator has r
5190: 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a  eached EOF..**.*
51a0: 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74  * iOff:.**   Set
51b0: 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
51c0: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65  offset within re
51d0: 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73  cord pData..*/.s
51e0: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
51f0: 74 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61  ter {.  Fts5Data
5200: 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
5210: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
5220: 72 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 2c  r doclist index,
5230: 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
5240: 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
5250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
5260: 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 74  rrent offset int
5270: 6f 20 70 44 6c 69 64 78 20 2a 2f 0a 20 20 69 6e  o pDlidx */.  in
5280: 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20  t bEof;         
5290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
52a0: 74 20 45 4f 46 20 61 6c 72 65 61 64 79 20 2a 2f  t EOF already */
52b0: 0a 20 20 69 6e 74 20 69 46 69 72 73 74 4f 66 66  .  int iFirstOff
52c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
52d0: 20 2f 2a 20 55 73 65 64 20 62 79 20 72 65 76 65   /* Used by reve
52e0: 72 73 65 20 69 74 65 72 61 74 6f 72 73 20 6f 6e  rse iterators on
52f0: 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70  ly */..  /* Outp
5300: 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a  ut variables */.
5310: 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b    int iLeafPgno;
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
5340: 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  f current leaf p
5350: 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  age */.  i64 iRo
5360: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
5370: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
5380: 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c  rowid on leaf iL
5390: 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 0a  eafPgno */.};...
53a0: 2f 2a 0a 2a 2a 20 41 6e 20 46 74 73 35 42 74 72  /*.** An Fts5Btr
53b0: 65 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73  eeIter object is
53c0: 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
53d0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 6e 74   through all ent
53e0: 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 62  ries in the.** b
53f0: 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20  -tree hierarchy 
5400: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 73  belonging to a s
5410: 69 6e 67 6c 65 20 66 74 73 35 20 73 65 67 6d 65  ingle fts5 segme
5420: 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nt. In this case
5430: 20 74 68 65 0a 2a 2a 20 22 62 2d 74 72 65 65 20   the.** "b-tree 
5440: 68 69 65 72 61 72 63 68 79 22 20 69 73 20 61 6c  hierarchy" is al
5450: 6c 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 65  l b-tree nodes e
5460: 78 63 65 70 74 20 6c 65 61 76 65 73 2e 20 45 61  xcept leaves. Ea
5470: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a  ch entry in the.
5480: 2a 2a 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  ** b-tree hierar
5490: 63 68 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  chy consists of 
54a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
54b0: 2a 0a 2a 2a 20 20 20 69 4c 65 61 66 3a 20 20 54  *.**   iLeaf:  T
54c0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
54d0: 66 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  f the leaf page 
54e0: 74 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  the entry points
54f0: 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72   to..**.**   ter
5500: 6d 3a 20 20 20 41 20 73 70 6c 69 74 2d 6b 65 79  m:   A split-key
5510: 20 74 68 61 74 20 61 6c 6c 20 74 65 72 6d 73 20   that all terms 
5520: 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 24 69 4c  on leaf page $iL
5530: 65 61 66 20 6d 75 73 74 20 62 65 20 67 72 65 61  eaf must be grea
5540: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ter.**          
5550: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
5560: 6f 2e 20 54 68 65 20 22 74 65 72 6d 22 20 61 73  o. The "term" as
5570: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
5580: 65 20 66 69 72 73 74 20 62 2d 74 72 65 65 0a 2a  e first b-tree.*
5590: 2a 20 20 20 20 20 20 20 20 20 20 20 68 69 65 72  *           hier
55a0: 61 72 63 68 79 20 65 6e 74 72 79 20 28 74 68 65  archy entry (the
55b0: 20 6f 6e 65 20 74 68 61 74 20 70 6f 69 6e 74 73   one that points
55c0: 20 74 6f 20 6c 65 61 66 20 70 61 67 65 20 31 29   to leaf page 1)
55d0: 20 69 73 20 61 6c 77 61 79 73 20 0a 2a 2a 20 20   is always .**  
55e0: 20 20 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74           an empt
55f0: 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  y string..**.** 
5600: 20 20 6e 45 6d 70 74 79 3a 20 54 68 65 20 6e 75    nEmpty: The nu
5610: 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20 28 74  mber of empty (t
5620: 65 72 6d 6c 65 73 73 29 20 6c 65 61 66 20 70 61  ermless) leaf pa
5630: 67 65 73 20 74 68 61 74 20 69 6d 6d 65 64 69 61  ges that immedia
5640: 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  tely.**         
5650: 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65 61    following iLea
5660: 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  f..**.** The Fts
5670: 35 42 74 72 65 65 49 74 65 72 20 6f 62 6a 65 63  5BtreeIter objec
5680: 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  t is only used a
5690: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
56a0: 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63 6f  tegrity-check co
56b0: 64 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  de..*/.struct Ft
56c0: 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
56d0: 20 7b 0a 20 20 46 74 73 35 4e 6f 64 65 49 74 65   {.  Fts5NodeIte
56e0: 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  r s;            
56f0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
5700: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
5710: 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 44   node */.  Fts5D
5720: 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20  ata *pData;     
5730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5740: 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ta for the curre
5750: 6e 74 20 6e 6f 64 65 20 2a 2f 0a 7d 3b 0a 73 74  nt node */.};.st
5760: 72 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74  ruct Fts5BtreeIt
5770: 65 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  er {.  Fts5Index
5780: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
5790: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
57a0: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
57b0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
57c0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
57d0: 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
57e0: 72 6f 75 67 68 20 74 68 69 73 20 73 65 67 6d 65  rough this segme
57f0: 6e 74 27 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20  nt's b-tree */. 
5800: 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20   int iIdx;      
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 2f 2a 20 49 6e 64 65 78 20 70 53 65 67 20 62   /* Index pSeg b
5830: 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 69  elongs to */.  i
5840: 6e 74 20 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt nLvl;        
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5860: 2a 20 53 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d  * Size of aLvl[]
5870: 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35   array */.  Fts5
5880: 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a  BtreeIterLevel *
5890: 61 4c 76 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c  aLvl;       /* L
58a0: 65 76 65 6c 20 66 6f 72 20 65 61 63 68 20 74 69  evel for each ti
58b0: 65 72 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a  er of b-tree */.
58c0: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
58d0: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35  iables */.  Fts5
58e0: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5900: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
5910: 20 69 6e 74 20 69 4c 65 61 66 3b 20 20 20 20 20   int iLeaf;     
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5930: 20 2f 2a 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e   /* Leaf contain
5940: 69 6e 67 20 74 65 72 6d 73 20 3e 3d 20 63 75 72  ing terms >= cur
5950: 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69  rent term */.  i
5960: 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20  nt nEmpty;      
5970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5980: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22 65 6d 70  * Number of "emp
5990: 74 79 22 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  ty" leaves follo
59a0: 77 69 6e 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20  wing iLeaf */.  
59b0: 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20  int bEof;       
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 61  /* Set to true a
59e0: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62  t EOF */.  int b
59f0: 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  Dlidx;          
5a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
5a10: 75 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73  ue if there exis
5a20: 74 73 20 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b  ts a dlidx */.};
5a30: 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  ...static void f
5a40: 74 73 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f  ts5PutU16(u8 *aO
5a50: 75 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20  ut, u16 iVal){. 
5a60: 20 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c   aOut[0] = (iVal
5a70: 3e 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20  >>8);.  aOut[1] 
5a80: 3d 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d  = (iVal&0xFF);.}
5a90: 0a 0a 73 74 61 74 69 63 20 75 31 36 20 66 74 73  ..static u16 fts
5aa0: 35 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38  5GetU16(const u8
5ab0: 20 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e   *aIn){.  return
5ac0: 20 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c   ((u16)aIn[0] <<
5ad0: 20 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a   8) + aIn[1];.}.
5ae0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
5af0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 71 6c   copy of the sql
5b00: 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
5b10: 29 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  ) routine from t
5b20: 68 65 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a  he SQLite core..
5b30: 2a 2a 20 45 78 63 65 70 74 2c 20 74 68 69 73 20  ** Except, this 
5b40: 76 65 72 73 69 6f 6e 20 64 6f 65 73 20 68 61 6e  version does han
5b50: 64 6c 65 20 74 68 65 20 73 69 6e 67 6c 65 20 62  dle the single b
5b60: 79 74 65 20 63 61 73 65 20 74 68 61 74 20 74 68  yte case that th
5b70: 65 20 63 6f 72 65 0a 2a 2a 20 76 65 72 73 69 6f  e core.** versio
5b80: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 62 65 69  n depends on bei
5b90: 6e 67 20 68 61 6e 64 6c 65 64 20 62 65 66 6f 72  ng handled befor
5ba0: 65 20 69 74 73 20 66 75 6e 63 74 69 6f 6e 20 69  e its function i
5bb0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74  s called..*/.int
5bc0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
5bd0: 61 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e  arint32(const un
5be0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20  signed char *p, 
5bf0: 75 33 32 20 2a 76 29 7b 0a 20 20 75 33 32 20 61  u32 *v){.  u32 a
5c00: 2c 62 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 31 2d  ,b;..  /* The 1-
5c10: 62 79 74 65 20 63 61 73 65 2e 20 4f 76 65 72 77  byte case. Overw
5c20: 68 65 6c 6d 69 6e 67 6c 79 20 74 68 65 20 6d 6f  helmingly the mo
5c30: 73 74 20 63 6f 6d 6d 6f 6e 2e 20 2a 2f 0a 20 20  st common. */.  
5c40: 61 20 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20  a = *p;.  /* a: 
5c50: 70 30 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f  p0 (unmasked) */
5c60: 0a 20 20 69 66 20 28 21 28 61 26 30 78 38 30 29  .  if (!(a&0x80)
5c70: 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c  ).  {.    /* Val
5c80: 75 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ues between 0 an
5c90: 64 20 31 32 37 20 2a 2f 0a 20 20 20 20 2a 76 20  d 127 */.    *v 
5ca0: 3d 20 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = a;.    return 
5cb0: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  1;.  }..  /* The
5cc0: 20 32 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a   2-byte case */.
5cd0: 20 20 70 2b 2b 3b 0a 20 20 62 20 3d 20 2a 70 3b    p++;.  b = *p;
5ce0: 0a 20 20 2f 2a 20 62 3a 20 70 31 20 28 75 6e 6d  .  /* b: p1 (unm
5cf0: 61 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28  asked) */.  if (
5d00: 21 28 62 26 30 78 38 30 29 29 0a 20 20 7b 0a 20  !(b&0x80)).  {. 
5d10: 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74     /* Values bet
5d20: 77 65 65 6e 20 31 32 38 20 61 6e 64 20 31 36 33  ween 128 and 163
5d30: 38 33 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20 30  83 */.    a &= 0
5d40: 78 37 66 3b 0a 20 20 20 20 61 20 3d 20 61 3c 3c  x7f;.    a = a<<
5d50: 37 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20  7;.    *v = a | 
5d60: 62 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b  b;.    return 2;
5d70: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 33  .  }..  /* The 3
5d80: 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20  -byte case */.  
5d90: 70 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34  p++;.  a = a<<14
5da0: 3b 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f  ;.  a |= *p;.  /
5db0: 2a 20 61 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32  * a: p0<<14 | p2
5dc0: 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20   (unmasked) */. 
5dd0: 20 69 66 20 28 21 28 61 26 30 78 38 30 29 29 0a   if (!(a&0x80)).
5de0: 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65    {.    /* Value
5df0: 73 20 62 65 74 77 65 65 6e 20 31 36 33 38 34 20  s between 16384 
5e00: 61 6e 64 20 32 30 39 37 31 35 31 20 2a 2f 0a 20  and 2097151 */. 
5e10: 20 20 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31     a &= (0x7f<<1
5e20: 34 29 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 62  4)|(0x7f);.    b
5e30: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 62 20   &= 0x7f;.    b 
5e40: 3d 20 62 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d  = b<<7;.    *v =
5e50: 20 61 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75   a | b;.    retu
5e60: 72 6e 20 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 3;.  }..  /* 
5e70: 41 20 33 32 2d 62 69 74 20 76 61 72 69 6e 74 20  A 32-bit varint 
5e80: 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
5e90: 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f   size informatio
5ea0: 6e 20 69 6e 20 62 74 72 65 65 73 2e 0a 20 20 2a  n in btrees..  *
5eb0: 2a 20 4f 62 6a 65 63 74 73 20 61 72 65 20 72 61  * Objects are ra
5ec0: 72 65 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  rely larger than
5ed0: 20 32 4d 69 42 20 6c 69 6d 69 74 20 6f 66 20 61   2MiB limit of a
5ee0: 20 33 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a   3-byte varint..
5ef0: 20 20 2a 2a 20 41 20 33 2d 62 79 74 65 20 76 61    ** A 3-byte va
5f00: 72 69 6e 74 20 69 73 20 73 75 66 66 69 63 69 65  rint is sufficie
5f10: 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  nt, for example,
5f20: 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
5f30: 69 7a 65 0a 20 20 2a 2a 20 6f 66 20 61 20 31 30  ize.  ** of a 10
5f40: 34 38 35 36 39 2d 62 79 74 65 20 42 4c 4f 42 20  48569-byte BLOB 
5f50: 6f 72 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2a 0a  or string..  **.
5f60: 20 20 2a 2a 20 57 65 20 6f 6e 6c 79 20 75 6e 72    ** We only unr
5f70: 6f 6c 6c 20 74 68 65 20 66 69 72 73 74 20 31 2d  oll the first 1-
5f80: 2c 20 32 2d 2c 20 61 6e 64 20 33 2d 20 62 79 74  , 2-, and 3- byt
5f90: 65 20 63 61 73 65 73 2e 20 20 54 68 65 20 76 65  e cases.  The ve
5fa0: 72 79 0a 20 20 2a 2a 20 72 61 72 65 20 6c 61 72  ry.  ** rare lar
5fb0: 67 65 72 20 63 61 73 65 73 20 63 61 6e 20 62 65  ger cases can be
5fc0: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
5fd0: 73 6c 6f 77 65 72 20 36 34 2d 62 69 74 20 76 61  slower 64-bit va
5fe0: 72 69 6e 74 0a 20 20 2a 2a 20 72 6f 75 74 69 6e  rint.  ** routin
5ff0: 65 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20  e..  */.  {.    
6000: 75 36 34 20 76 36 34 3b 0a 20 20 20 20 75 38 20  u64 v64;.    u8 
6010: 6e 3b 0a 20 20 20 20 70 20 2d 3d 20 32 3b 0a 20  n;.    p -= 2;. 
6020: 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 47 65     n = sqlite3Ge
6030: 74 56 61 72 69 6e 74 28 70 2c 20 26 76 36 34 29  tVarint(p, &v64)
6040: 3b 0a 20 20 20 20 2a 76 20 3d 20 28 75 33 32 29  ;.    *v = (u32)
6050: 76 36 34 3b 0a 20 20 20 20 61 73 73 65 72 74 28  v64;.    assert(
6060: 20 6e 3e 33 20 26 26 20 6e 3c 3d 39 20 29 3b 0a   n>3 && n<=9 );.
6070: 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20      return n;.  
6080: 7d 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  }.}..int sqlite3
6090: 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e  Fts5GetVarintLen
60a0: 28 75 33 32 20 69 56 61 6c 29 7b 0a 20 20 69 66  (u32 iVal){.  if
60b0: 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 37 20 29  ( iVal<(1 << 7 )
60c0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
60d0: 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 31 34  f( iVal<(1 << 14
60e0: 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
60f0: 69 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32  if( iVal<(1 << 2
6100: 31 29 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  1) ) return 3;. 
6110: 20 69 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20   if( iVal<(1 << 
6120: 32 38 29 20 29 20 72 65 74 75 72 6e 20 34 3b 0a  28) ) return 4;.
6130: 20 20 72 65 74 75 72 6e 20 35 3b 0a 7d 0a 0a 2f    return 5;.}../
6140: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
6150: 64 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65  d return a buffe
6160: 72 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65  r at least nByte
6170: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
6180: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
6190: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
61a0: 65 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ered, return NUL
61b0: 4c 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72  L and set the er
61c0: 72 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74  ror code in.** t
61d0: 68 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  he Fts5Index han
61e0: 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
61f0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
6200: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6210: 20 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28   *fts5IdxMalloc(
6220: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
6230: 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64  t nByte){.  void
6240: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66   *pRet = 0;.  if
6250: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
6260: 4f 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  OK ){.    pRet =
6270: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
6280: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
6290: 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pRet==0 ){.     
62a0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
62b0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
62c0: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
62d0: 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a  Ret, 0, nByte);.
62e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
62f0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
6300: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  * Compare the co
6310: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c  ntents of the pL
6320: 65 66 74 20 62 75 66 66 65 72 20 77 69 74 68 20  eft buffer with 
6330: 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68  the pRight/nRigh
6340: 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65  t blob..**.** Re
6350: 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66  turn -ve if pLef
6360: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
6370: 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74  n pRight, 0 if t
6380: 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72  hey are equal or
6390: 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68  .** +ve if pRigh
63a0: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
63b0: 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65  n pLeft. In othe
63c0: 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  r words:.**.**  
63d0: 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20     res = *pLeft 
63e0: 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61  - *pRight.*/.sta
63f0: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
6400: 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20  erCompareBlob(. 
6410: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65   Fts5Buffer *pLe
6420: 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ft,             
6430: 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69   /* Left hand si
6440: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
6450: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
6460: 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67  pRight, int nRig
6470: 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68  ht    /* Right h
6480: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
6490: 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69  arison */.){.  i
64a0: 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c  nt nCmp = MIN(pL
64b0: 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b  eft->n, nRight);
64c0: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
64d0: 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52  cmp(pLeft->p, pR
64e0: 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  ight, nCmp);.  r
64f0: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
6500: 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67  (pLeft->n - nRig
6510: 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 2f  ht) : res);.}../
6520: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
6530: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
6540: 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69   two buffers usi
6550: 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20  ng memcmp(). If 
6560: 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73  one buffer.** is
6570: 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
6580: 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f   other, it is co
6590: 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73  nsidered the les
65a0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ser..**.** Retur
65b0: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
65c0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
65d0: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
65e0: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
65f0: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
6600: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
6610: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
6620: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
6630: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
6640: 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63  pRight.*/.static
6650: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
6660: 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65  ompare(Fts5Buffe
6670: 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75  r *pLeft, Fts5Bu
6680: 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  ffer *pRight){. 
6690: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
66a0: 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74  pLeft->n, pRight
66b0: 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ->n);.  int res 
66c0: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e  = memcmp(pLeft->
66d0: 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43  p, pRight->p, nC
66e0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
66f0: 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e  es==0 ? (pLeft->
6700: 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a  n - pRight->n) :
6710: 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   res);.}.../*.**
6720: 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d   Close the read-
6730: 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65  only blob handle
6740: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
6750: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6760: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
6770: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
6780: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20   if( p->pReader 
6790: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
67a0: 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20 70  lob *pReader = p
67b0: 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 70  ->pReader;.    p
67c0: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
67d0: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
67e0: 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b 0a  close(pReader);.
67f0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
6800: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
6810: 52 65 61 64 4f 72 42 75 66 66 65 72 28 0a 20 20  ReadOrBuffer(.  
6820: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
6830: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
6840: 66 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64  f, .  i64 iRowid
6850: 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  .){.  Fts5Data *
6860: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
6870: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
6880: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
6890: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
68a0: 20 30 0a 46 74 73 35 42 75 66 66 65 72 20 62 75   0.Fts5Buffer bu
68b0: 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 66 74 73  f = {0,0,0};.fts
68c0: 35 44 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c  5DebugRowid(&rc,
68d0: 20 26 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a   &buf, iRowid);.
68e0: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
68f0: 22 72 65 61 64 3a 20 25 73 5c 6e 22 2c 20 62 75  "read: %s\n", bu
6900: 66 2e 70 29 3b 0a 66 66 6c 75 73 68 28 73 74 64  f.p);.fflush(std
6910: 6f 75 74 29 3b 0a 73 71 6c 69 74 65 33 5f 66 72  out);.sqlite3_fr
6920: 65 65 28 62 75 66 2e 70 29 3b 0a 23 65 6e 64 69  ee(buf.p);.#endi
6930: 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65  f.    if( p->pRe
6940: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ader ){.      /*
6950: 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72   This call may r
6960: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
6970: 52 54 20 69 66 20 74 68 65 72 65 20 68 61 73 20  RT if there has 
6980: 62 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  been a savepoint
6990: 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
69a0: 63 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ck since it was 
69b0: 6c 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68  last used. In th
69c0: 69 73 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c  is case a new bl
69d0: 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20  ob handle.      
69e0: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ** is required. 
69f0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
6a00: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
6a10: 65 6e 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 69  en(p->pReader, i
6a20: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
6a30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  ( rc==SQLITE_ABO
6a40: 52 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  RT ){.        ft
6a50: 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29  s5CloseReader(p)
6a60: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
6a70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6a80: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
6a90: 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  If the blob hand
6aa0: 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  le is not yet op
6ab0: 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65 65  en, open and see
6ac0: 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  k it. Otherwise,
6ad0: 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   use.    ** the 
6ae0: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41 50  blob_reopen() AP
6af0: 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65 20  I to reseek the 
6b00: 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68 61  existing blob ha
6b10: 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ndle.  */.    if
6b20: 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
6b30: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e  ){.      Fts5Con
6b40: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
6b50: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20  ->pConfig;.     
6b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
6b70: 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d  ob_open(pConfig-
6b80: 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  >db, .          
6b90: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d  pConfig->zDb, p-
6ba0: 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63  >zDataTbl, "bloc
6bb0: 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26  k", iRowid, 0, &
6bc0: 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20  p->pReader.     
6bd0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
6be0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6bf0: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f   ){.      u8 *aO
6c00: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
6c10: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c        /* Read bl
6c20: 6f 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  ob data into thi
6c30: 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  s buffer */.    
6c40: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71    int nByte = sq
6c50: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
6c60: 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20  (p->pReader);.  
6c70: 20 20 20 20 69 66 28 20 70 42 75 66 20 29 7b 0a      if( pBuf ){.
6c80: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
6c90: 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20  erZero(pBuf);.  
6ca0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
6cb0: 47 72 6f 77 28 26 72 63 2c 20 70 42 75 66 2c 20  Grow(&rc, pBuf, 
6cc0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
6cd0: 61 4f 75 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a  aOut = pBuf->p;.
6ce0: 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
6cf0: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  = nByte;.      }
6d00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
6d10: 74 20 6e 53 70 61 63 65 20 3d 20 6e 42 79 74 65  t nSpace = nByte
6d20: 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52   + FTS5_DATA_ZER
6d30: 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20  O_PADDING;.     
6d40: 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 44     pRet = (Fts5D
6d50: 61 74 61 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ata*)sqlite3Fts5
6d60: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
6d70: 6e 53 70 61 63 65 2b 73 69 7a 65 6f 66 28 46 74  nSpace+sizeof(Ft
6d80: 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20  s5Data));.      
6d90: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
6da0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 20          pRet->n 
6db0: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  = nByte;.       
6dc0: 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e     aOut = pRet->
6dd0: 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31  p = (u8*)&pRet[1
6de0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  ];.          pRe
6df0: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
6e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
6e10: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6e20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6e30: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6e40: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65  blob_read(p->pRe
6e50: 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74  ader, aOut, nByt
6e60: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
6e70: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
6e80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6e90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ea0: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
6eb0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
6ec0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20      }.    p->rc 
6ed0: 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = rc;.    p->nRe
6ee0: 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ad++;.  }..  ret
6ef0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
6f00: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72 65  ** Retrieve a re
6f10: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  cord from the %_
6f20: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
6f30: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6f40: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
6f50: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
6f60: 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20  ror left in the 
6f70: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62  .** Fts5Index ob
6f80: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
6f90: 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61  Fts5Data *fts5Da
6fa0: 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  taRead(Fts5Index
6fb0: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29   *p, i64 iRowid)
6fc0: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52  {.  Fts5Data *pR
6fd0: 65 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  et = fts5DataRea
6fe0: 64 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c 20  dOrBuffer(p, 0, 
6ff0: 69 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72  iRowid);.  asser
7000: 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70  t( (pRet==0)==(p
7010: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc!=SQLITE_OK)
7020: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65   );.  return pRe
7030: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  t;.}../*.** Read
7040: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
7050: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
7060: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
7070: 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a  supplied as the.
7080: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
7090: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
70a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
70b0: 20 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69   error is left i
70c0: 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  n the Fts5Index 
70d0: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a  object. If an.**
70e0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
70f0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
7100: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
7110: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
7120: 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  a .** no-op..*/.
7130: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7140: 44 61 74 61 42 75 66 66 65 72 28 46 74 73 35 49  DataBuffer(Fts5I
7150: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66  ndex *p, Fts5Buf
7160: 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69  fer *pBuf, i64 i
7170: 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64 29  Rowid){.  (void)
7180: 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
7190: 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69 52  ffer(p, pBuf, iR
71a0: 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  owid);.}../*.** 
71b0: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
71c0: 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f  nce to data reco
71d0: 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  rd returned by a
71e0: 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
71f0: 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61  o.** fts5DataRea
7200: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
7210: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65  oid fts5DataRele
7220: 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44  ase(Fts5Data *pD
7230: 61 74 61 29 7b 0a 20 20 69 66 28 20 70 44 61 74  ata){.  if( pDat
7240: 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  a ){.    assert(
7250: 20 70 44 61 74 61 2d 3e 6e 52 65 66 3e 30 20 29   pData->nRef>0 )
7260: 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 52 65  ;.    pData->nRe
7270: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 61  f--;.    if( pDa
7280: 74 61 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71  ta->nRef==0 ) sq
7290: 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
72a0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
72b0: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
72c0: 66 65 72 65 6e 63 65 28 46 74 73 35 44 61 74 61  ference(Fts5Data
72d0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 70 44 61 74   *pData){.  pDat
72e0: 61 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a  a->nRef++;.}../*
72f0: 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45  .** INSERT OR RE
7300: 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20 69  PLACE a record i
7310: 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74  nto the %_data t
7320: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
7330: 76 6f 69 64 20 66 74 73 35 44 61 74 61 57 72 69  void fts5DataWri
7340: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
7350: 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e   i64 iRowid, con
7360: 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
7370: 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20  t nData){.  if( 
7380: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
7390: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
73a0: 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20  ( p->pWriter==0 
73b0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
73c0: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
73d0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
73e0: 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  fig;.    char *z
73f0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
7400: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
7410: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
7420: 27 2e 25 51 28 69 64 2c 20 62 6c 6f 63 6b 29 20  '.%Q(id, block) 
7430: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 70 43  VALUES(?,?)", pC
7440: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
7450: 44 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20  DataTbl.    );. 
7460: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
7470: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
7480: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
7490: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
74a0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
74b0: 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  _v2(pConfig->db,
74c0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70   zSql, -1, &p->p
74d0: 57 72 69 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Writer, 0);.    
74e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
74f0: 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
7500: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7510: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  K ){.      p->rc
7520: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
7530: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
7540: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
7550: 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c  nt64(p->pWriter,
7560: 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73   1, iRowid);.  s
7570: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
7580: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20  (p->pWriter, 2, 
7590: 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51  pData, nData, SQ
75a0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
75b0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
75c0: 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72  pWriter);.  p->r
75d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
75e0: 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d  t(p->pWriter);.}
75f0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
7600: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  the following SQ
7610: 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c  L:.**.**     DEL
7620: 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20  ETE FROM %_data 
7630: 57 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e  WHERE id BETWEEN
7640: 20 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c   $iFirst AND $iL
7650: 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ast.*/.static vo
7660: 69 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  id fts5DataDelet
7670: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
7680: 69 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20  i64 iFirst, i64 
7690: 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d  iLast){.  if( p-
76a0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
76b0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
76c0: 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29  p->pDeleter==0 )
76d0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
76e0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
76f0: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
7700: 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  ig;.    char *zS
7710: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
7720: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 44  intf(.        "D
7730: 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e  ELETE FROM '%q'.
7740: 25 51 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41  %Q WHERE id>=? A
7750: 4e 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66  ND id<=?", pConf
7760: 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74  ig->zDb, p->zDat
7770: 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  aTbl.    );.    
7780: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
7790: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
77a0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
77b0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
77c0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
77d0: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53  (pConfig->db, zS
77e0: 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c  ql, -1, &p->pDel
77f0: 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  eter, 0);.      
7800: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
7810: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
7820: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7830: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
7840: 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
7850: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
7860: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
7870: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
7880: 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71  1, iFirst);.  sq
7890: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
78a0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c  (p->pDeleter, 2,
78b0: 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74   iLast);.  sqlit
78c0: 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65  e3_step(p->pDele
78d0: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
78e0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
78f0: 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f  >pDeleter);.}../
7900: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 73  *.** Close the s
7910: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 68 61 6e 64  qlite3_blob hand
7920: 6c 65 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  le used to read 
7930: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
7940: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
7950: 2a 20 41 6e 64 20 64 69 73 63 61 72 64 20 61 6e  * And discard an
7960: 79 20 63 61 63 68 65 64 20 72 65 61 64 73 2e 20  y cached reads. 
7970: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
7980: 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 65   called at the e
7990: 6e 64 20 6f 66 0a 2a 2a 20 61 20 72 65 61 64 20  nd of.** a read 
79a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 77  transaction or w
79b0: 68 65 6e 20 61 6e 79 20 73 75 62 2d 74 72 61 6e  hen any sub-tran
79c0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
79d0: 64 20 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20 30  d back..*/.#if 0
79e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
79f0: 35 44 61 74 61 52 65 73 65 74 28 46 74 73 35 49  5DataReset(Fts5I
7a00: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20  ndex *p){.  if( 
7a10: 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20  p->pReader ){.  
7a20: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63    sqlite3_blob_c
7a30: 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64 65 72 29  lose(p->pReader)
7a40: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72  ;.    p->pReader
7a50: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
7a60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  if../*.** Remove
7a70: 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61 73 73   all records ass
7a80: 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 65 67  ociated with seg
7a90: 6d 65 6e 74 20 69 53 65 67 69 64 20 69 6e 20 69  ment iSegid in i
7aa0: 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2f 0a 73 74  ndex iIdx..*/.st
7ab0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
7ac0: 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
7ad0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
7ae0: 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65 67  t iIdx, int iSeg
7af0: 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73  id){.  i64 iFirs
7b00: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
7b10: 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65  _ROWID(iIdx, iSe
7b20: 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69 36  gid, 0, 0);.  i6
7b30: 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f 53  4 iLast = FTS5_S
7b40: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
7b50: 78 2c 20 69 53 65 67 69 64 2b 31 2c 20 30 2c 20  x, iSegid+1, 0, 
7b60: 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74 61  0)-1;.  fts5Data
7b70: 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73 74  Delete(p, iFirst
7b80: 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , iLast);.}../*.
7b90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
7ba0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73  erence to an Fts
7bb0: 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
7bc0: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  t returned by an
7bd0: 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c   earlier .** cal
7be0: 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75  l to fts5Structu
7bf0: 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35  reRead() or fts5
7c00: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7c10: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
7c20: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  d fts5StructureR
7c30: 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63  elease(Fts5Struc
7c40: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
7c50: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
7c60: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
7c70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75  for(i=0; i<pStru
7c80: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  ct->nLevel; i++)
7c90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7ca0: 66 72 65 65 28 70 53 74 72 75 63 74 2d 3e 61 4c  free(pStruct->aL
7cb0: 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a 20  evel[i].aSeg);. 
7cc0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7cd0: 5f 66 72 65 65 28 70 53 74 72 75 63 74 29 3b 0a  _free(pStruct);.
7ce0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
7cf0: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74  erialize and ret
7d00: 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  urn the structur
7d10: 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74  e record current
7d20: 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65 72  ly stored in ser
7d30: 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20  ialized.** form 
7d40: 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70 44  within buffer pD
7d50: 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a  ata/nData..**.**
7d60: 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75   The Fts5Structu
7d70: 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20  re.aLevel[] and 
7d80: 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75  each Fts5Structu
7d90: 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61  reLevel.aSeg[] a
7da0: 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72  rray.** are over
7db0: 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f 6e  -allocated by on
7dc0: 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c 6c  e slot. This all
7dd0: 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75 72  ows the structur
7de0: 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f  e contents.** to
7df0: 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20   be more easily 
7e00: 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  edited..**.** If
7e10: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7e20: 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20  , *ppOut is set 
7e30: 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53  to NULL and an S
7e40: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
7e50: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  .** returned. Ot
7e60: 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74 20  herwise, *ppOut 
7e70: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
7e80: 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
7e90: 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  t and.** SQLITE_
7ea0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
7eb0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
7ec0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 0a  tructureDecode(.
7ed0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74    const u8 *pDat
7ee0: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
7ef0: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
7f00: 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  aining serialize
7f10: 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  d structure */. 
7f20: 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20   int nData,     
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
7f50: 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74 65  er pData in byte
7f60: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  s */.  int *piCo
7f70: 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20 20  okie,           
7f80: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
7f90: 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 76  uration cookie v
7fa0: 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53 74  alue */.  Fts5St
7fb0: 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74 20  ructure **ppOut 
7fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
7fd0: 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20 6f  : Deserialized o
7fe0: 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bject */.){.  in
7ff0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8000: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  ;.  int i = 0;. 
8010: 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74   int iLvl;.  int
8020: 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69   nLevel = 0;.  i
8030: 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b  nt nSegment = 0;
8040: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
8070: 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
8080: 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46 74   at pRet */.  Ft
8090: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65  s5Structure *pRe
80a0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
80b0: 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   Structure objec
80c0: 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  t to return */..
80d0: 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63 6f    /* Grab the co
80e0: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
80f0: 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20 2a  if( piCookie ) *
8100: 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74  piCookie = sqlit
8110: 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61 74  e3Fts5Get32(pDat
8120: 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20 20  a);.  i = 4;..  
8130: 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61  /* Read the tota
8140: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  l number of leve
8150: 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20  ls and segments 
8160: 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
8170: 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63  f the.  ** struc
8180: 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f  ture record.  */
8190: 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56  .  i += fts5GetV
81a0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
81b0: 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20  ], nLevel);.  i 
81c0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
81d0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53  32(&pData[i], nS
81e0: 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65  egment);.  nByte
81f0: 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f   = (.      sizeo
8200: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
8210: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
8220: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
8230: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
8240: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8250: 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e  ctureLevel) * (n
8260: 4c 65 76 65 6c 29 20 20 20 20 20 20 2f 2a 20 61  Level)      /* a
8270: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
8280: 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28  .  );.  pRet = (
8290: 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73  Fts5Structure*)s
82a0: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
82b0: 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29  Zero(&rc, nByte)
82c0: 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  ;..  if( pRet ){
82d0: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65  .    pRet->nLeve
82e0: 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20  l = nLevel;.    
82f0: 69 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  i += sqlite3GetV
8300: 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c  arint(&pData[i],
8310: 20 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f   &pRet->nWriteCo
8320: 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72  unter);..    for
8330: 28 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c  (iLvl=0; rc==SQL
8340: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e  ITE_OK && iLvl<n
8350: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
8360: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
8370: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
8380: 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69   &pRet->aLevel[i
8390: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Lvl];.      int 
83a0: 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69 6e  nTotal;.      in
83b0: 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20 69  t iSeg;..      i
83c0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
83d0: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
83e0: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20  Lvl->nMerge);.  
83f0: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8400: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8410: 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20  i], nTotal);.   
8420: 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61     assert( nTota
8430: 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  l>=pLvl->nMerge 
8440: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61  );.      pLvl->a
8450: 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
8460: 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
8470: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
8480: 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  ro(&rc, .       
8490: 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65     nTotal * size
84a0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
84b0: 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 29  Segment).      )
84c0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
84d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
84e0: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67        pLvl->nSeg
84f0: 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20   = nTotal;.     
8500: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
8510: 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65 67  Seg<nTotal; iSeg
8520: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
8530: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
8540: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
8550: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8560: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20  iSegid);.       
8570: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
8580: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
8590: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
85a0: 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20  eg].nHeight);.  
85b0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
85c0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
85d0: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
85e0: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
85f0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  st);.          i
8600: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
8610: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
8620: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8630: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20  pgnoLast);.     
8640: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8650: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  {.        fts5St
8660: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
8670: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
8680: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
8690: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
86a0: 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65  Out = pRet;.  re
86b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
86c0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
86d0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64   fts5StructureAd
86e0: 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c  dLevel(int *pRc,
86f0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8700: 2a 70 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66  *ppStruct){.  if
8710: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
8720: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
8730: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
8740: 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
8750: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53   int nLevel = pS
8760: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  truct->nLevel;. 
8770: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
8780: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
8790: 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b  Fts5Structure) +
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87b0: 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74    /* Main struct
87c0: 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ure */.        s
87d0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
87e0: 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65  ureLevel) * (nLe
87f0: 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65  vel+1)  /* aLeve
8800: 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  l[] array */.   
8810: 20 29 3b 0a 0a 20 20 20 20 70 53 74 72 75 63 74   );..    pStruct
8820: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
8830: 6f 63 28 70 53 74 72 75 63 74 2c 20 6e 42 79 74  oc(pStruct, nByt
8840: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  e);.    if( pStr
8850: 75 63 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  uct ){.      mem
8860: 73 65 74 28 26 70 53 74 72 75 63 74 2d 3e 61 4c  set(&pStruct->aL
8870: 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c  evel[nLevel], 0,
8880: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8890: 63 74 75 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  ctureLevel));.  
88a0: 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65      pStruct->nLe
88b0: 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70  vel++;.      *pp
88c0: 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
88d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
88e0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
88f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
8900: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e  }.}../*.** Exten
8910: 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20  d level iLvl so 
8920: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 72 6f  that there is ro
8930: 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  om for at least 
8940: 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73  nExtra more.** s
8950: 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  egments..*/.stat
8960: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
8970: 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
8980: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
8990: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
89a0: 70 53 74 72 75 63 74 2c 20 0a 20 20 69 6e 74 20  pStruct, .  int 
89b0: 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78  iLvl, .  int nEx
89c0: 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73  tra, .  int bIns
89d0: 65 72 74 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52  ert.){.  if( *pR
89e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
89f0: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
8a00: 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
8a10: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8a20: 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53  iLvl];.    Fts5S
8a30: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
8a40: 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *aNew;.    int n
8a50: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65  Byte;..    nByte
8a60: 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b   = (pLvl->nSeg +
8a70: 20 6e 45 78 74 72 61 29 20 2a 20 73 69 7a 65 6f   nExtra) * sizeo
8a80: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8a90: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65  egment);.    aNe
8aa0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
8ab0: 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20  loc(pLvl->aSeg, 
8ac0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
8ad0: 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  aNew ){.      if
8ae0: 28 20 62 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a  ( bInsert==0 ){.
8af0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
8b00: 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d  aNew[pLvl->nSeg]
8b10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
8b20: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8b30: 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  ) * nExtra);.   
8b40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b50: 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c    int nMove = pL
8b60: 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f  vl->nSeg * sizeo
8b70: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8b80: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  egment);.       
8b90: 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e   memmove(&aNew[n
8ba0: 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d  Extra], aNew, nM
8bb0: 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ove);.        me
8bc0: 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20 73 69  mset(aNew, 0, si
8bd0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
8be0: 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78  reSegment) * nEx
8bf0: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra);.      }.  
8c00: 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
8c10: 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65   aNew;.    }else
8c20: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
8c30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8c40: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8c50: 52 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a  Read, deserializ
8c60: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
8c70: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
8c80: 64 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78  d for index iIdx
8c90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
8ca0: 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c  Structure.aLevel
8cb0: 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35  [] and each Fts5
8cc0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61  StructureLevel.a
8cd0: 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  Seg[] array.** a
8ce0: 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65  re over-allocate
8cf0: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66  d as described f
8d00: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  or function fts5
8d10: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
8d20: 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a  ) .** above..**.
8d30: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
8d40: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
8d50: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
8d60: 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69  rror code left i
8d70: 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64  n the.** Fts5Ind
8d80: 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e  ex handle. If an
8d90: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
8da0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
8db0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
8dc0: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  * is called, it 
8dd0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
8de0: 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74  tatic Fts5Struct
8df0: 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75  ure *fts5Structu
8e00: 72 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  reRead(Fts5Index
8e10: 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 29 7b 0a   *p, int iIdx){.
8e20: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
8e30: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
8e40: 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ig;.  Fts5Struct
8e50: 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20  ure *pRet = 0;  
8e60: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
8e70: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46  to return */.  F
8e80: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20  ts5Data *pData; 
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ea0: 2a 20 25 5f 64 61 74 61 20 65 6e 74 72 79 20 63  * %_data entry c
8eb0: 6f 6e 74 61 69 6e 69 6e 67 20 73 74 72 75 63 74  ontaining struct
8ec0: 75 72 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ure record */.  
8ed0: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ef0: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8f00: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 0a 20 20 61 73   cookie */..  as
8f10: 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43 6f 6e  sert( iIdx<=pCon
8f20: 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 3b 0a  fig->nPrefix );.
8f30: 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
8f40: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
8f50: 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69  TRUCTURE_ROWID(i
8f60: 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 70 44  Idx));.  if( !pD
8f70: 61 74 61 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ata ) return 0;.
8f80: 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74    p->rc = fts5St
8f90: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44  ructureDecode(pD
8fa0: 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e  ata->p, pData->n
8fb0: 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65  , &iCookie, &pRe
8fc0: 74 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  t);..  if( p->rc
8fd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
8fe0: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21  Config->iCookie!
8ff0: 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20  =iCookie ){.    
9000: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
9010: 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43  ts5ConfigLoad(pC
9020: 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b  onfig, iCookie);
9030: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
9040: 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
9050: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
9060: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
9070: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
9080: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52  se(pRet);.    pR
9090: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  et = 0;.  }.  re
90a0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
90b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
90c0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
90d0: 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78  egments in index
90e0: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
90f0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
9100: 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43  t fts5StructureC
9110: 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73  ountSegments(Fts
9120: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
9130: 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  uct){.  int nSeg
9140: 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ment = 0;       
9150: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
9160: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
9170: 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  nts */.  if( pSt
9180: 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
9190: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
91a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
91b0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
91c0: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
91d0: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
91e0: 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
91f0: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
9200: 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20      nSegment += 
9210: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9220: 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20  iLvl].nSeg;.    
9230: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9240: 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  nSegment;.}../*.
9250: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64  ** Serialize and
9260: 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75   store the "stru
9270: 63 74 75 72 65 22 20 72 65 63 6f 72 64 20 66 6f  cture" record fo
9280: 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2a  r index iIdx..**
9290: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
92a0: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
92b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74   error code in t
92c0: 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a  he Fts5Index obj
92d0: 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  ect. If an.** er
92e0: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
92f0: 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
9300: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
9310: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
9320: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
9330: 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20  Write(Fts5Index 
9340: 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74  *p, int iIdx, Ft
9350: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9360: 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  ruct){.  if( p->
9370: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9380: 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  .    int nSegmen
9390: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
93a0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
93b0: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
93c0: 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
93d0: 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
93e0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
93f0: 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72   serialize recor
9400: 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e  d into */.    in
9410: 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
9420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
9430: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
9440: 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
9450: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  .    int iCookie
9460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9470: 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c     /* Cookie val
9480: 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a  ue to store */..
9490: 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 3d 20 66      nSegment = f
94a0: 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
94b0: 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
94c0: 74 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  t);.    memset(&
94d0: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
94e0: 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
94f0: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
9500: 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72  current configur
9510: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
9520: 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d      iCookie = p-
9530: 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69  >pConfig->iCooki
9540: 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b  e;.    if( iCook
9550: 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d  ie<0 ) iCookie =
9560: 20 30 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66   0;.    fts5Buff
9570: 65 72 41 70 70 65 6e 64 33 32 28 26 70 2d 3e 72  erAppend32(&p->r
9580: 63 2c 20 26 62 75 66 2c 20 69 43 6f 6f 6b 69 65  c, &buf, iCookie
9590: 29 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66  );..    fts5Buff
95a0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
95b0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 74  p->rc, &buf, pSt
95c0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20  ruct->nLevel);. 
95d0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
95e0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
95f0: 2c 20 26 62 75 66 2c 20 6e 53 65 67 6d 65 6e 74  , &buf, nSegment
9600: 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
9610: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9620: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36 34  ->rc, &buf, (i64
9630: 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65  )pStruct->nWrite
9640: 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66  Counter);..    f
9650: 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
9660: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9670: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
9680: 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20  int iSeg;       
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
96a0: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
96b0: 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
96c0: 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53  s */.      Fts5S
96d0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
96e0: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
96f0: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
9700: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9710: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9720: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
9730: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74  Merge);.      ft
9740: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9750: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9760: 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a  f, pLvl->nSeg);.
9770: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
9780: 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c  vl->nMerge<=pLvl
9790: 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20  ->nSeg );..     
97a0: 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
97b0: 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
97c0: 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  eg++){.        f
97d0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
97e0: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
97f0: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
9800: 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  Seg].iSegid);.  
9810: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9820: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9830: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9840: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69  >aSeg[iSeg].nHei
9850: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ght);.        ft
9860: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9870: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9880: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
9890: 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg].pgnoFirst);.
98a0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
98b0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
98c0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
98d0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
98e0: 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d  noLast);.      }
98f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
9900: 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
9910: 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
9920: 44 28 69 49 64 78 29 2c 20 62 75 66 2e 70 2c 20  D(iIdx), buf.p, 
9930: 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35  buf.n);.    fts5
9940: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
9950: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73  ;.  }.}..#if 0.s
9960: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
9970: 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e  ebugStructure(in
9980: 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46  t*,Fts5Buffer*,F
9990: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a  ts5Structure*);.
99a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
99b0: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63  PrintStructure(c
99c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74  onst char *zCapt
99d0: 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75  ion, Fts5Structu
99e0: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
99f0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9a00: 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  OK;.  Fts5Buffer
9a10: 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
9a20: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  buf, 0, sizeof(b
9a30: 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75  uf));.  fts5Debu
9a40: 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20  gStructure(&rc, 
9a50: 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a  &buf, pStruct);.
9a60: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
9a70: 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43  , "%s: %s\n", zC
9a80: 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a  aption, buf.p);.
9a90: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
9aa0: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
9ab0: 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73  ee(&buf);.}.#els
9ac0: 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50  e.# define fts5P
9ad0: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c  rintStructure(x,
9ae0: 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  y).#endif..stati
9af0: 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e  c int fts5Segmen
9b00: 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74  tSize(Fts5Struct
9b10: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
9b20: 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20  ){.  return 1 + 
9b30: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
9b40: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
9b50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
9b60: 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65  n a copy of inde
9b70: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
9b80: 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f  uct. Except, pro
9b90: 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a  mote as many .**
9ba0: 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73   segments as pos
9bb0: 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69  sible to level i
9bc0: 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f  Promote. If an O
9bd0: 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  OM occurs, NULL 
9be0: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
9bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9c00: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9c10: 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e  moteTo(.  Fts5In
9c20: 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50  dex *p,.  int iP
9c30: 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a  romote,.  int sz
9c40: 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53  Promote,.  Fts5S
9c50: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
9c60: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69  t.){.  int il, i
9c70: 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  s;.  Fts5Structu
9c80: 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20  reLevel *pOut = 
9c90: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
9ca0: 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69  [iPromote];..  i
9cb0: 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d  f( pOut->nMerge=
9cc0: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c  =0 ){.    for(il
9cd0: 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c  =iPromote+1; il<
9ce0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9cf0: 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74   il++){.      Ft
9d00: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9d10: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
9d20: 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20  t->aLevel[il];. 
9d30: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
9d40: 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a  Merge ) return;.
9d50: 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76        for(is=pLv
9d60: 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30  l->nSeg-1; is>=0
9d70: 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20  ; is--){.       
9d80: 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65   int sz = fts5Se
9d90: 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d  gmentSize(&pLvl-
9da0: 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20  >aSeg[is]);.    
9db0: 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f      if( sz>szPro
9dc0: 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  mote ) return;. 
9dd0: 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
9de0: 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
9df0: 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
9e00: 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29   iPromote, 1, 1)
9e10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
9e20: 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
9e30: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
9e40: 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  t->aSeg, &pLvl->
9e50: 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66  aSeg[is], sizeof
9e60: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
9e70: 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20  gment));.       
9e80: 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20   pOut->nSeg++;. 
9e90: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
9ea0: 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  g--;.      }.   
9eb0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
9ec0: 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61  A new segment ha
9ed0: 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74  s just been writ
9ee0: 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76  ten to level iLv
9ef0: 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  l of index struc
9f00: 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e  ture.** pStruct.
9f10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
9f20: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79  etermines if any
9f30: 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64   segments should
9f40: 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20   be promoted.** 
9f50: 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67  as a result. Seg
9f60: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
9f70: 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ed in two scenar
9f80: 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20  ios:.**.**   a) 
9f90: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
9fa0: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73  ust written is s
9fb0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20  maller than one 
9fc0: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
9fd0: 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20  .**      within 
9fe0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70  the previous pop
9ff0: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74  ulated level, it
a000: 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20   is promoted to 
a010: 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20  the previous.** 
a020: 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c       populated l
a030: 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29  evel..**.**   b)
a040: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
a050: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
a060: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
a070: 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f  newest segment o
a080: 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65  n.**      the ne
a090: 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76  xt populated lev
a0a0: 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65  el, then that se
a0b0: 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f  gment, and any o
a0c0: 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a  ther adjacent.**
a0d0: 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74        segments t
a0e0: 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61  hat are also sma
a0f0: 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e  ller than the on
a100: 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20  e just written, 
a110: 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f  are .**      pro
a120: 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  moted. .**.** If
a130: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
a140: 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74  ments are promot
a150: 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72  ed, the structur
a160: 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61  e object is upda
a170: 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63  ted.** to reflec
a180: 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69  t this..*/.stati
a190: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
a1a0: 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46  turePromote(.  F
a1b0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a1d0: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
a1e0: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
a1f0: 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Lvl,            
a200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a210: 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75  dex level just u
a220: 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35  pdated */.  Fts5
a230: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
a240: 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ct          /* I
a250: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
a260: 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
a270: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a280: 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20     int iTst;.   
a290: 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20   int iPromote = 
a2a0: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72  -1;.    int szPr
a2b0: 6f 6d 6f 74 65 3b 20 20 20 20 20 20 20 20 20 20  omote;          
a2c0: 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65        /* Promote
a2d0: 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73   anything this s
a2e0: 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a  ize or smaller *
a2f0: 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  /.    Fts5Struct
a300: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
a310: 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a  ;   /* Segment j
a320: 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ust written */. 
a330: 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20     int szSeg;   
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d   /* Size of segm
a360: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
a370: 20 2a 2f 0a 0a 0a 20 20 20 20 70 53 65 67 20 3d   */...    pSeg =
a380: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
a390: 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74  l[iLvl].aSeg[pSt
a3a0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
a3b0: 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20  l].nSeg-1];.    
a3c0: 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65  szSeg = (1 + pSe
a3d0: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53  g->pgnoLast - pS
a3e0: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg->pgnoFirst);.
a3f0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
a400: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  r condition (a) 
a410: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d  */.    for(iTst=
a420: 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20  iLvl-1; iTst>=0 
a430: 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
a440: 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30  el[iTst].nSeg==0
a450: 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69  ; iTst--);.    i
a460: 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20  f( iTst>=0 ){.  
a470: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
a480: 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a   int szMax = 0;.
a490: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
a4a0: 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d  ureLevel *pTst =
a4b0: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
a4c0: 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 61  l[iTst];.      a
a4d0: 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65  ssert( pTst->nMe
a4e0: 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rge==0 );.      
a4f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d  for(i=0; i<pTst-
a500: 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
a510: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 54       int sz = pT
a520: 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f  st->aSeg[i].pgno
a530: 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61 53 65  Last - pTst->aSe
a540: 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b  g[i].pgnoFirst +
a550: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
a560: 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78  sz>szMax ) szMax
a570: 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20   = sz;.      }. 
a580: 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d       if( szMax>=
a590: 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20  szSeg ){.       
a5a0: 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61   /* Condition (a
a5b0: 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f  ) is true. Promo
a5c0: 74 65 20 74 68 65 20 6e 65 77 65 73 74 20 73 65  te the newest se
a5d0: 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a  gment on level .
a5e0: 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20          ** iLvl 
a5f0: 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e 20 20  to level iTst.  
a600: 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72 6f 6d  */.        iProm
a610: 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20 20 20  ote = iTst;.    
a620: 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20      szPromote = 
a630: 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20  szMax;.      }. 
a640: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a650: 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  condition (a) is
a660: 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d 65   not met, assume
a670: 20 28 62 29 20 69 73 20 74 72 75 65 2e 20 53 74   (b) is true. St
a680: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
a690: 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 6e  ().    ** is a n
a6a0: 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20 6e 6f  o-op if it is no
a6b0: 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  t.  */.    if( i
a6c0: 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20  Promote<0 ){.   
a6d0: 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c     iPromote = iL
a6e0: 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d  vl;.      szProm
a6f0: 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20  ote = szSeg;.   
a700: 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
a710: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c  turePromoteTo(p,
a720: 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f   iPromote, szPro
a730: 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a  mote, pStruct);.
a740: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66    }.}.../*.** If
a750: 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f 66 66   the pIter->iOff
a760: 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c   offset currentl
a770: 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  y points to an e
a780: 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e 67 20  ntry indicating 
a790: 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 74  one.** or more t
a7a0: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 2c 20  erm-less nodes, 
a7b0: 61 64 76 61 6e 63 65 20 70 61 73 74 20 69 74 20  advance past it 
a7c0: 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d 3e 6e  and set pIter->n
a7d0: 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68 65 20  Empty to.** the 
a7e0: 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20  number of empty 
a7f0: 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f 0a  child nodes..*/.
a800: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
a810: 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e 45  NodeIterGobbleNE
a820: 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49 74 65  mpty(Fts5NodeIte
a830: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
a840: 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 49 74   pIter->iOff<pIt
a850: 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30 3d 3d  er->nData && 0==
a860: 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49  (pIter->aData[pI
a870: 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78 66  ter->iOff] & 0xf
a880: 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  e) ){.    pIter-
a890: 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
a8a0: 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f  >aData[pIter->iO
a8b0: 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20 20 20  ff] & 0x01;.    
a8c0: 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20  pIter->iOff++;. 
a8d0: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
a8e0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
a8f0: 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  2(&pIter->aData[
a900: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 70 49  pIter->iOff], pI
a910: 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20  ter->nEmpty);.  
a920: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
a930: 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20  ->nEmpty = 0;.  
a940: 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20    pIter->bDlidx 
a950: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
a960: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
a970: 20 6e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   next entry with
a980: 69 6e 20 74 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a  in the node..*/.
a990: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
a9a0: 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 69 6e 74  NodeIterNext(int
a9b0: 20 2a 70 52 63 2c 20 46 74 73 35 4e 6f 64 65 49   *pRc, Fts5NodeI
a9c0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
a9d0: 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3e 3d  f( pIter->iOff>=
a9e0: 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 29 7b 0a  pIter->nData ){.
a9f0: 20 20 20 20 70 49 74 65 72 2d 3e 61 44 61 74 61      pIter->aData
aa00: 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d   = 0;.    pIter-
aa10: 3e 69 43 68 69 6c 64 20 2b 3d 20 70 49 74 65 72  >iChild += pIter
aa20: 2d 3e 6e 45 6d 70 74 79 3b 0a 20 20 7d 65 6c 73  ->nEmpty;.  }els
aa30: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 50 72 65 2c  e{.    int nPre,
aa40: 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72   nNew;.    pIter
aa50: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
aa60: 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72  tVarint32(&pIter
aa70: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
aa80: 4f 66 66 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20  Off], nPre);.   
aa90: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20   pIter->iOff += 
aaa0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
aab0: 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49  &pIter->aData[pI
aac0: 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 4e 65 77  ter->iOff], nNew
aad0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 74 65  );.    pIter->te
aae0: 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d 32 3b 0a 20  rm.n = nPre-2;. 
aaf0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
ab00: 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 26 70 49  endBlob(pRc, &pI
ab10: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
ab20: 20 70 49 74 65 72 2d 3e 61 44 61 74 61 2b 70 49   pIter->aData+pI
ab30: 74 65 72 2d 3e 69 4f 66 66 29 3b 0a 20 20 20 20  ter->iOff);.    
ab40: 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 6e  pIter->iOff += n
ab50: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
ab60: 69 43 68 69 6c 64 20 2b 3d 20 28 31 20 2b 20 70  iChild += (1 + p
ab70: 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20  Iter->nEmpty);. 
ab80: 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47     fts5NodeIterG
ab90: 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65  obbleNEmpty(pIte
aba0: 72 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63  r);.    if( *pRc
abb0: 20 29 20 70 49 74 65 72 2d 3e 61 44 61 74 61 20   ) pIter->aData 
abc0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  = 0;.  }.}.../*.
abd0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
abe0: 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
abf0: 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61  t pIter to itera
ac00: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  te through the i
ac10: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73 65 67 6d 65  nternal.** segme
ac20: 6e 74 20 6e 6f 64 65 20 69 6e 20 70 44 61 74 61  nt node in pData
ac30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ac40: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69   fts5NodeIterIni
ac50: 74 28 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  t(const u8 *aDat
ac60: 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 46 74  a, int nData, Ft
ac70: 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65  s5NodeIter *pIte
ac80: 72 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  r){.  memset(pIt
ac90: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
aca0: 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
acb0: 3e 61 44 61 74 61 20 3d 20 61 44 61 74 61 3b 0a  >aData = aData;.
acc0: 20 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 3d    pIter->nData =
acd0: 20 6e 44 61 74 61 3b 0a 20 20 70 49 74 65 72 2d   nData;.  pIter-
ace0: 3e 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 56  >iOff = fts5GetV
acf0: 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c 20 70  arint32(aData, p
ad00: 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b 0a 20  Iter->iChild);. 
ad10: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62   fts5NodeIterGob
ad20: 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29  bleNEmpty(pIter)
ad30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
ad40: 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  any memory alloc
ad50: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
ad60: 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ator object..*/.
ad70: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ad80: 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46 74 73  NodeIterFree(Fts
ad90: 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72  5NodeIter *pIter
ada0: 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  ){.  fts5BufferF
adb0: 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  ree(&pIter->term
adc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
add0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
ade0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
adf0: 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f  ument has the fo
ae00: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73  llowing fields s
ae10: 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  et.** as follows
ae20: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
ae30: 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73 74  sets up the rest
ae40: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
ae50: 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70   so that it.** p
ae60: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
ae70: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
ae80: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
ae90: 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 20 70 6f  *.**   pData: po
aea0: 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
aeb0: 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a  -index record, .
aec0: 2a 2a 20 20 20 69 4c 65 61 66 50 67 6e 6f 3a 20  **   iLeafPgno: 
aed0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
aee0: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2d 69 6e   this doclist-in
aef0: 64 65 78 20 69 73 20 61 73 73 6f 63 69 61 74 65  dex is associate
af00: 64 20 77 69 74 68 2e 0a 2a 2a 0a 2a 2a 20 57 68  d with..**.** Wh
af10: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
af20: 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65 72   is called pIter
af30: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20 74  ->iLeafPgno is t
af40: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
af50: 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73  he.** doclist is
af60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
af70: 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75 72   (the one featur
af80: 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a  ing the term)..*
af90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
afa0: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
afb0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
afc0: 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 61 74  Iter){.  Fts5Dat
afd0: 61 20 2a 70 44 61 74 61 20 3d 20 70 49 74 65 72  a *pData = pIter
afe0: 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  ->pData;.  int i
aff0: 3b 0a 20 20 69 6e 74 20 62 50 72 65 73 65 6e 74  ;.  int bPresent
b000: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
b010: 65 72 2d 3e 70 44 61 74 61 20 29 3b 0a 20 20 61  er->pData );.  a
b020: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c  ssert( pIter->iL
b030: 65 61 66 50 67 6e 6f 3e 30 20 29 3b 0a 0a 20 20  eafPgno>0 );..  
b040: 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  /* Read the firs
b050: 74 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 41  t rowid value. A
b060: 6e 64 20 74 68 65 20 22 70 72 65 73 65 6e 74 22  nd the "present"
b070: 20 66 6c 61 67 20 74 68 61 74 20 66 6f 6c 6c 6f   flag that follo
b080: 77 73 20 69 74 2e 20 2a 2f 0a 20 20 70 49 74 65  ws it. */.  pIte
b090: 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61  r->iOff += getVa
b0a0: 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 30  rint(&pData->p[0
b0b0: 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
b0c0: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 62 50 72 65  >iRowid);.  bPre
b0d0: 73 65 6e 74 20 3d 20 70 44 61 74 61 2d 3e 70 5b  sent = pData->p[
b0e0: 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 5d 3b 0a  pIter->iOff++];.
b0f0: 20 20 69 66 28 20 62 50 72 65 73 65 6e 74 20 29    if( bPresent )
b100: 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  {.    i = 0;.  }
b110: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 75  else{.    /* Cou
b120: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
b130: 20 6c 65 61 64 69 6e 67 20 30 78 30 30 20 62 79   leading 0x00 by
b140: 74 65 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  tes. */.    for(
b150: 69 3d 31 3b 20 70 49 74 65 72 2d 3e 69 4f 66 66  i=1; pIter->iOff
b160: 3c 70 44 61 74 61 2d 3e 6e 3b 20 69 2b 2b 29 7b  <pData->n; i++){
b170: 20 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74   .      if( pDat
b180: 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66  a->p[pIter->iOff
b190: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
b1a0: 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a   pIter->iOff++;.
b1b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
b1c0: 6c 65 73 73 20 77 65 20 61 72 65 20 61 6c 72 65  less we are alre
b1d0: 61 64 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ady at the end o
b1e0: 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  f the doclist-in
b1f0: 64 65 78 2c 20 6c 6f 61 64 20 74 68 65 20 66 69  dex, load the fi
b200: 72 73 74 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  rst.    ** rowid
b210: 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 20 20   value.  */.    
b220: 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c  if( pIter->iOff<
b230: 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20  pData->n ){.    
b240: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
b250: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
b260: 20 67 65 74 56 61 72 69 6e 74 28 26 70 44 61 74   getVarint(&pDat
b270: 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66  a->p[pIter->iOff
b280: 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b  ], (u64*)&iVal);
b290: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52  .      pIter->iR
b2a0: 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
b2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
b2c0: 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Iter->bEof = 1;.
b2d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
b2e0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20  r->iLeafPgno += 
b2f0: 28 69 2b 31 29 3b 0a 0a 20 20 70 49 74 65 72 2d  (i+1);..  pIter-
b300: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 49 74  >iFirstOff = pIt
b310: 65 72 2d 3e 69 4f 66 66 3b 0a 20 20 72 65 74 75  er->iOff;.  retu
b320: 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a  rn pIter->bEof;.
b330: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
b340: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
b350: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
b360: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
b370: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b380: 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 44  dxIterNext(Fts5D
b390: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b3a0: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  {.  Fts5Data *pD
b3b0: 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61  ata = pIter->pDa
b3c0: 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ta;.  int iOff;.
b3d0: 0a 20 20 66 6f 72 28 69 4f 66 66 3d 70 49 74 65  .  for(iOff=pIte
b3e0: 72 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  r->iOff; iOff<pD
b3f0: 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b  ata->n; iOff++){
b400: 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
b410: 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b  p[iOff] ) break;
b420: 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66   .  }..  if( iOf
b430: 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20  f<pData->n ){.  
b440: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
b450: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
b460: 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 49 74 65   += (iOff - pIte
b470: 72 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20  r->iOff) + 1;.  
b480: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
b490: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
b4a0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
b4b0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
b4c0: 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
b4d0: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20    pIter->iOff = 
b4e0: 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iOff;.  }else{. 
b4f0: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
b500: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
b510: 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d  n pIter->bEof;.}
b520: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
b530: 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74  5DlidxIterEof(Ft
b540: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
b550: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  ){.  return (p->
b570: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
b580: 20 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d   pIter->bEof);.}
b590: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
b5a0: 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28  s5DlidxIterLast(
b5b0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b5c0: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 66 74 73  Iter){.  if( fts
b5d0: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
b5e0: 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  pIter)==0 ){.   
b5f0: 20 77 68 69 6c 65 28 20 30 3d 3d 66 74 73 35 44   while( 0==fts5D
b600: 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 49 74  lidxIterNext(pIt
b610: 65 72 29 20 29 3b 0a 20 20 20 20 70 49 74 65 72  er) );.    pIter
b620: 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 7d 0a  ->bEof = 0;.  }.
b630: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
b640: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
b650: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b660: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 4f 66  Iter){.  int iOf
b670: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4f 66 66 3b  f = pIter->iOff;
b680: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
b690: 72 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  r->bEof==0 );.  
b6a0: 69 66 28 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d  if( iOff<=pIter-
b6b0: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
b6c0: 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
b6d0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b6e0: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
b6f0: 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34  Data->p;.    i64
b700: 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69   iVal;.    int i
b710: 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 43  Limit;..    /* C
b720: 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f  urrently iOff po
b730: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
b740: 74 20 62 79 74 65 20 6f 66 20 61 20 76 61 72 69  t byte of a vari
b750: 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a  nt. This block .
b760: 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74      ** decrement
b770: 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74 20  s iOff until it 
b780: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
b790: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
b7a0: 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a  previous .    **
b7b0: 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20   varint. Taking 
b7c0: 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64  care not to read
b7d0: 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61   any memory loca
b7e0: 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72  tions that occur
b7f0: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  .    ** before t
b800: 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d  he buffer in mem
b810: 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69  ory.  */.    iLi
b820: 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20  mit = (iOff>9 ? 
b830: 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20  iOff-9 : 0);.   
b840: 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66   for(iOff--; iOf
b850: 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d  f>iLimit; iOff--
b860: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 5b  ){.      if( (a[
b870: 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29 3d  iOff-1] & 0x80)=
b880: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
b890: 7d 0a 0a 20 20 20 20 67 65 74 56 61 72 69 6e 74  }..    getVarint
b8a0: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
b8b0: 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 49 74  )&iVal);.    pIt
b8c0: 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56  er->iRowid -= iV
b8d0: 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  al;.    pIter->i
b8e0: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20  LeafPgno--;..   
b8f0: 20 77 68 69 6c 65 28 20 69 4f 66 66 3e 70 49 74   while( iOff>pIt
b900: 65 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 0a 20  er->iFirstOff . 
b910: 20 20 20 20 20 20 20 26 26 20 61 5b 69 4f 66 66         && a[iOff
b920: 2d 31 5d 3d 3d 30 78 30 30 20 26 26 20 28 61 5b  -1]==0x00 && (a[
b930: 69 4f 66 66 2d 32 5d 20 26 20 30 78 38 30 29 3d  iOff-2] & 0x80)=
b940: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
b950: 20 69 4f 66 66 2d 2d 3b 0a 20 20 20 20 20 20 70   iOff--;.      p
b960: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
b970: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  -;.    }.    pIt
b980: 65 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b  er->iOff = iOff;
b990: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
b9a0: 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73  Iter->bEof;.}..s
b9b0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
b9c0: 6c 69 64 78 49 74 65 72 49 6e 69 74 46 72 6f 6d  lidxIterInitFrom
b9d0: 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65  Data(.  Fts5Inde
b9e0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
b9f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20          /* Fts5 
ba00: 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  Backend to itera
ba10: 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
ba20: 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba40: 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52  * True for ORDER
ba50: 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74   BY ASC */.  int
ba60: 20 69 4c 65 61 66 50 67 6e 6f 2c 20 20 20 20 20   iLeafPgno,     
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba80: 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  Leaf page number
ba90: 20 64 6c 69 64 78 20 69 73 20 66 6f 72 20 2a 2f   dlidx is for */
baa0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 6c  .  Fts5Data *pDl
bab0: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
bac0: 20 20 20 2f 2a 20 4c 65 61 66 20 69 6e 64 65 78     /* Leaf index
bad0: 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73 35 44   data */.  Fts5D
bae0: 6c 69 64 78 49 74 65 72 20 2a 2a 70 70 49 74 65  lidxIter **ppIte
baf0: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
bb00: 54 3a 20 50 6f 70 75 6c 61 74 65 64 20 69 74 65  T: Populated ite
bb10: 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74  rator */.){.  Ft
bb20: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bb30: 65 72 20 3d 20 2a 70 70 49 74 65 72 3b 0a 0a 20  er = *ppIter;.. 
bb40: 20 69 66 28 20 70 49 74 65 72 3d 3d 30 20 29 7b   if( pIter==0 ){
bb50: 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70  .    *ppIter = p
bb60: 49 74 65 72 20 3d 20 28 46 74 73 35 44 6c 69 64  Iter = (Fts5Dlid
bb70: 78 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61  xIter*)fts5IdxMa
bb80: 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
bb90: 74 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b 0a  ts5DlidxIter));.
bba0: 20 20 20 20 69 66 28 20 70 49 74 65 72 3d 3d 30      if( pIter==0
bbb0: 20 29 7b 20 0a 20 20 20 20 20 20 66 74 73 35 44   ){ .      fts5D
bbc0: 61 74 61 52 65 6c 65 61 73 65 28 70 44 6c 69 64  ataRelease(pDlid
bbd0: 78 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  x);.      return
bbe0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
bbf0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
bc00: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
bc10: 35 44 6c 69 64 78 49 74 65 72 29 29 3b 0a 20 20  5DlidxIter));.  
bc20: 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 61 74  }..  pIter->pDat
bc30: 61 20 3d 20 70 44 6c 69 64 78 3b 0a 20 20 70 49  a = pDlidx;.  pI
bc40: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
bc50: 20 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 66   iLeafPgno;.  if
bc60: 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
bc70: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69   fts5DlidxIterFi
bc80: 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20 7d 65  rst(pIter);.  }e
bc90: 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44 6c 69  lse{.    fts5Dli
bca0: 64 78 49 74 65 72 4c 61 73 74 28 70 49 74 65 72  dxIterLast(pIter
bcb0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
bcc0: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
bcd0: 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
bce0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
bcf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
bd00: 73 35 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74  s5 Backend to it
bd10: 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
bd20: 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52    /* True for OR
bd50: 44 45 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20  DER BY ASC */.  
bd60: 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53  int iIdx, int iS
bd70: 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  egid,           
bd80: 2f 2a 20 53 65 67 6d 65 6e 74 20 69 53 65 67 69  /* Segment iSegi
bd90: 64 20 77 69 74 68 69 6e 20 69 6e 64 65 78 20 69  d within index i
bda0: 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  Idx */.  int iLe
bdb0: 61 66 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  afPgno,         
bdc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66           /* Leaf
bdd0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
bde0: 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a  load dlidx for *
bdf0: 2f 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  /.  Fts5DlidxIte
be00: 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20  r **ppIter      
be10: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 70 75      /* OUT: Popu
be20: 6c 61 74 65 64 20 69 74 65 72 61 74 6f 72 20 2a  lated iterator *
be30: 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  /.){.  Fts5Data 
be40: 2a 70 44 6c 69 64 78 3b 0a 20 20 70 44 6c 69 64  *pDlidx;.  pDlid
be50: 78 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  x = fts5DataRead
be60: 28 70 2c 20 46 54 53 35 5f 44 4f 43 4c 49 53 54  (p, FTS5_DOCLIST
be70: 5f 49 44 58 5f 52 4f 57 49 44 28 69 49 64 78 2c  _IDX_ROWID(iIdx,
be80: 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 50 67   iSegid, iLeafPg
be90: 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 44 6c 69  no));.  if( pDli
bea0: 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  dx==0 ) return;.
beb0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49    fts5DlidxIterI
bec0: 6e 69 74 46 72 6f 6d 44 61 74 61 28 70 2c 20 62  nitFromData(p, b
bed0: 52 65 76 2c 20 69 4c 65 61 66 50 67 6e 6f 2c 20  Rev, iLeafPgno, 
bee0: 70 44 6c 69 64 78 2c 20 70 70 49 74 65 72 29 3b  pDlidx, ppIter);
bef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
bf00: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
bf10: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61  terator object a
bf20: 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35  llocated by fts5
bf30: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e  DlidxIterInit().
bf40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bf50: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
bf60: 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  e(Fts5DlidxIter 
bf70: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
bf80: 49 74 65 72 20 29 7b 0a 20 20 20 20 66 74 73 35  Iter ){.    fts5
bf90: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
bfa0: 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73  r->pData);.    s
bfb0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
bfc0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
bfd0: 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66 48  c void fts5LeafH
bfe0: 65 61 64 65 72 28 46 74 73 35 44 61 74 61 20 2a  eader(Fts5Data *
bff0: 70 4c 65 61 66 2c 20 69 6e 74 20 2a 70 69 52 6f  pLeaf, int *piRo
c000: 77 69 64 2c 20 69 6e 74 20 2a 70 69 54 65 72 6d  wid, int *piTerm
c010: 29 7b 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d 20  ){.  *piRowid = 
c020: 28 69 6e 74 29 66 74 73 35 47 65 74 55 31 36 28  (int)fts5GetU16(
c030: 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
c040: 20 2a 70 69 54 65 72 6d 20 3d 20 28 69 6e 74 29   *piTerm = (int)
c050: 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61  fts5GetU16(&pLea
c060: 66 2d 3e 70 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a  f->p[2]);.}../*.
c070: 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74  ** Load the next
c080: 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20   leaf page into 
c090: 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72  the segment iter
c0a0: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
c0b0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
c0c0: 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73 35  NextPage(.  Fts5
c0d0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
c0f0: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
c100: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
c110: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
c120: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
c130: 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74  tor to advance t
c140: 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29  o next page */.)
c150: 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
c160: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
c170: 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20   pIter->pSeg;.  
c180: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
c190: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
c1a0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
c1b0: 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72  o++;.  if( pIter
c1c0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65  ->iLeafPgno<=pSe
c1d0: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
c1e0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
c1f0: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
c200: 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f  , .        FTS5_
c210: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 49  SEGMENT_ROWID(pI
c220: 74 65 72 2d 3e 69 49 64 78 2c 20 70 53 65 67 2d  ter->iIdx, pSeg-
c230: 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65  >iSegid, 0, pIte
c240: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  r->iLeafPgno).  
c250: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
c260: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
c270: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
c280: 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e   Argument p poin
c290: 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
c2a0: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69  ontaining a vari
c2b0: 6e 74 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72  nt to be interpr
c2c0: 65 74 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73  eted as a.** pos
c2d0: 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20  ition list size 
c2e0: 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20  field. Read the 
c2f0: 76 61 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72  varint and retur
c300: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
c310: 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42  bytes.** read. B
c320: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
c330: 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68   set *pnSz to th
c340: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
c350: 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f  s in the positio
c360: 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a  n.** list, and *
c370: 70 62 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66  pbDel to true if
c380: 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67   the delete flag
c390: 20 69 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73   is set, or fals
c3a0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
c3b0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 47  static int fts5G
c3c0: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f  etPoslistSize(co
c3d0: 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a  nst u8 *p, int *
c3e0: 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c  pnSz, int *pbDel
c3f0: 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20  ){.  int nSz;.  
c400: 69 6e 74 20 6e 20 3d 20 66 74 73 35 47 65 74 56  int n = fts5GetV
c410: 61 72 69 6e 74 33 32 28 70 2c 20 6e 53 7a 29 3b  arint32(p, nSz);
c420: 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32  .  *pnSz = nSz/2
c430: 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a  ;.  *pbDel = nSz
c440: 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74   & 0x0001;.  ret
c450: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
c460: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
c470: 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c  fOffset currentl
c480: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
c490: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a  first byte of a.
c4a0: 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
c4b0: 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61   size field. Rea
c4c0: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  d the value of t
c4d0: 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f  he field and sto
c4e0: 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20  re it.** in the 
c4f0: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
c500: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  les:.**.**   Fts
c510: 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a  5SegIter.nPos.**
c520: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62     Fts5SegIter.b
c530: 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20  Del.**.** Leave 
c540: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
c550: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67  fOffset pointing
c560: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
c570: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f  te of the .** po
c580: 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
c590: 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f  ent (if any)..*/
c5a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c5b0: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
c5c0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
c5d0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
c5e0: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
c5f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c600: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
c610: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
c620: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
c630: 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 69 66  ead at */.    if
c640: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  ( iOff>=pIter->p
c650: 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Leaf->n ){.     
c660: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
c670: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
c680: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
c690: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
c6a0: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  er->pLeaf==0 ){.
c6b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
c6c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
c6d0: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
c6e0: 55 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74  UPT;.        ret
c6f0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
c700: 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20     iOff = 4;.   
c710: 20 7d 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66   }.    iOff += f
c720: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
c730: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  e(pIter->pLeaf->
c740: 70 2b 69 4f 66 66 2c 20 26 70 49 74 65 72 2d 3e  p+iOff, &pIter->
c750: 6e 50 6f 73 2c 26 70 49 74 65 72 2d 3e 62 44 65  nPos,&pIter->bDe
c760: 6c 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  l);.    pIter->i
c770: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
c780: 66 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f;.  }.}../*.** 
c790: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
c7a0: 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c  fOffset currentl
c7b0: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
c7c0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
c7d0: 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78 22 20  e .** "nSuffix" 
c7e0: 66 69 65 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e  field of a term.
c7f0: 20 46 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   Function parame
c800: 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69  ter nKeep contai
c810: 6e 73 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  ns the value.** 
c820: 6f 66 20 74 68 65 20 22 6e 50 72 65 66 69 78 22  of the "nPrefix"
c830: 20 66 69 65 6c 64 20 28 69 66 20 74 68 65 72 65   field (if there
c840: 20 77 61 73 20 6f 6e 65 20 2d 20 69 74 20 69 73   was one - it is
c850: 20 70 61 73 73 65 64 20 30 20 69 66 20 74 68 69   passed 0 if thi
c860: 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  s is.** the firs
c870: 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65  t term in the se
c880: 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  gment)..**.** Th
c890: 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75  is function popu
c8a0: 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46  lates:.**.**   F
c8b0: 74 73 35 53 65 67 49 74 65 72 2e 74 65 72 6d 0a  ts5SegIter.term.
c8c0: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
c8d0: 2e 72 6f 77 69 64 0a 2a 2a 20 20 20 46 74 73 35  .rowid.**   Fts5
c8e0: 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20  SegIter.nPos.** 
c8f0: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62 44    Fts5SegIter.bD
c900: 65 6c 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69  el.**.** accordi
c910: 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20  ngly and leaves 
c920: 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65  (Fts5SegIter.iLe
c930: 61 66 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f  afOffset) set to
c940: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
c950: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f 73  ** the first pos
c960: 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20  ition list. The 
c970: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65  position list be
c980: 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d  longing to docum
c990: 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67  ent .** (Fts5Seg
c9a0: 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f  Iter.iRowid)..*/
c9b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c9c0: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
c9d0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
c9e0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
c9f0: 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20  r, int nKeep){. 
ca00: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
ca10: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
ca20: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
ca30: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
ca40: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
ca50: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
ca60: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
ca70: 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20  ead at */.  int 
ca80: 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
caa0: 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61  ytes of new data
cab0: 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66   */..  iOff += f
cac0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
cad0: 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  a[iOff], nNew);.
cae0: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
caf0: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
cb00: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
cb10: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
cb20: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
cb30: 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  Off]);.  iOff +=
cb40: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
cb50: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
cb60: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
cb70: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
cb80: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
cb90: 6f 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  o;.  if( iOff>=p
cba0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29  Iter->pLeaf->n )
cbb0: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
cbc0: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
cbd0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
cbe0: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  er->pLeaf==0 ){.
cbf0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
cc00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
cc10: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
cc20: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  T;.      return;
cc30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20  .    }.    iOff 
cc40: 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74  = 4;.    a = pIt
cc50: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
cc60: 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69  }.  iOff += sqli
cc70: 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b  te3GetVarint(&a[
cc80: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
cc90: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
cca0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ccb0: 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  et = iOff;.}../*
ccc0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
ccd0: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
cce0: 63 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72  ct pIter to iter
ccf0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
cd00: 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65  entries in.** se
cd10: 67 6d 65 6e 74 20 70 53 65 67 20 77 69 74 68 69  gment pSeg withi
cd20: 6e 20 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68  n index iIdx. Th
cd30: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
cd40: 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
cd50: 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 65 6e 74  he .** first ent
cd60: 72 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ry when this fun
cd70: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
cd80: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
cd90: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
cda0: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
cdb0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
cdc0: 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
cdd0: 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
cde0: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
cdf0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
ce00: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
ce10: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
ce20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ce30: 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46  SegIterInit(.  F
ce40: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
ce50: 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 49 64        .  int iId
ce60: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
ce70: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
ce80: 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78  ig.aHash[] index
ce90: 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f   of FTS index */
cea0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
ceb0: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
cec0: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
ced0: 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  n of segment */.
cee0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
cef0: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
cf00: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70    /* Object to p
cf10: 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
cf20: 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
cf30: 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rst==0 ){.    /*
cf40: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66   This happens if
cf50: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20   the segment is 
cf60: 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e  being used as an
cf70: 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63   input to an inc
cf80: 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20  remental.    ** 
cf90: 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61  merge and all da
cfa0: 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ta has already b
cfb0: 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53  een "trimmed". S
cfc0: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
cfd0: 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  ** fts5TrimSegme
cfe0: 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nts() for detail
cff0: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
d000: 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74  leave the iterat
d010: 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a  or empty..    **
d020: 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
d030: 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d   see the (pIter-
d040: 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61  >pLeaf==0) and a
d050: 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74  ssume the iterat
d060: 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20  or is.    ** at 
d070: 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a  EOF already. */.
d080: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
d090: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  r->pLeaf==0 );. 
d0a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
d0b0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
d0c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65  ITE_OK ){.    me
d0d0: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
d0e0: 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a  izeof(*pIter));.
d0f0: 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20      pIter->pSeg 
d100: 3d 20 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65  = pSeg;.    pIte
d110: 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
d120: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d130: 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Pgno = pSeg->pgn
d140: 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74  oFirst-1;.    ft
d150: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
d160: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
d170: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
d180: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d190: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
d1a0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74  Leaf->p;.    pIt
d1b0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d1c0: 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
d1d0: 32 5d 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67  2]);.    fts5Seg
d1e0: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20  IterLoadTerm(p, 
d1f0: 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66  pIter, 0);.    f
d200: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
d210: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
d220: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
d230: 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  function is only
d240: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20   ever called on 
d250: 69 74 65 72 61 74 6f 72 73 20 63 72 65 61 74 65  iterators create
d260: 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  d by calls to.**
d270: 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28   Fts5IndexQuery(
d280: 29 20 77 69 74 68 20 74 68 65 20 46 54 53 35 49  ) with the FTS5I
d290: 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20  NDEX_QUERY_DESC 
d2a0: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
d2b0: 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  The iterator is 
d2c0: 69 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74  in an unusual st
d2d0: 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
d2e0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d2f0: 3a 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67  : the.** Fts5Seg
d300: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
d310: 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74   variable is set
d320: 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f   to the offset o
d330: 66 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  f the start of.*
d340: 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  * the position-l
d350: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66  ist size field f
d360: 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 6c  or the first rel
d370: 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74  evant rowid on t
d380: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35  he page..** Fts5
d390: 53 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73  SegIter.rowid is
d3a0: 20 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61   set, but nPos a
d3b0: 6e 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e  nd bDel are not.
d3c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
d3d0: 74 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68  tion advances th
d3e0: 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68  e iterator so th
d3f0: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
d400: 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c  the last .** rel
d410: 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74  evant rowid on t
d420: 68 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20  he page and, if 
d430: 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69  necessary, initi
d440: 61 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61  alizes the .** a
d450: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e  RowidOffset[] an
d460: 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76  d iRowidOffset v
d470: 61 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69  ariables. At thi
d480: 73 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72  s point the iter
d490: 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74  ator.** is in it
d4a0: 73 20 72 65 67 75 6c 61 72 20 73 74 61 74 65 20  s regular state 
d4b0: 2d 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  - Fts5SegIter.iL
d4c0: 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73  eafOffset points
d4d0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   to the first.**
d4e0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73   byte of the pos
d4f0: 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65  ition list conte
d500: 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
d510: 74 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a  th said rowid..*
d520: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
d530: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
d540: 49 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e 64  InitPage(Fts5Ind
d550: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
d560: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
d570: 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  t n = pIter->pLe
d580: 61 66 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20 3d  af->n;.  int i =
d590: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d5a0: 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70  set;.  u8 *a = p
d5b0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
d5c0: 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73    int iRowidOffs
d5d0: 65 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  et = 0;..  while
d5e0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d5f0: 4f 4b 20 26 26 20 69 3c 6e 20 29 7b 0a 20 20 20  OK && i<n ){.   
d600: 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b   i64 iDelta = 0;
d610: 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20  .    int nPos;. 
d620: 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 0a     int bDummy;..
d630: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
d640: 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69  PoslistSize(&a[i
d650: 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d  ], &nPos, &bDumm
d660: 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50 6f  y);.    i += nPo
d670: 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20  s;.    if( i>=n 
d680: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b  ) break;.    i +
d690: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69  = getVarint(&a[i
d6a0: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
d6b0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c 74  );.    if( iDelt
d6c0: 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  a==0 ) break;.  
d6d0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
d6e0: 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  += iDelta;..    
d6f0: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74  if( iRowidOffset
d700: 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  >=pIter->nRowidO
d710: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
d720: 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d  nt nNew = pIter-
d730: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20  >nRowidOffset + 
d740: 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e  8;.      int *aN
d750: 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ew = (int*)sqlit
d760: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72  e3_realloc(pIter
d770: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20  ->aRowidOffset, 
d780: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29  nNew*sizeof(int)
d790: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
d7a0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
d7b0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
d7c0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72  OMEM;.        br
d7d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
d7e0: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
d7f0: 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20  Offset = aNew;. 
d800: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77       pIter->nRow
d810: 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b  idOffset = nNew;
d820: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65  .    }..    pIte
d830: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
d840: 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20  iRowidOffset++] 
d850: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
d860: 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  fset;.    pIter-
d870: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
d880: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69  ;.  }.  pIter->i
d890: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52  RowidOffset = iR
d8a0: 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74  owidOffset;.  ft
d8b0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
d8c0: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a  s(p, pIter);.}..
d8d0: 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
d8e0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d8f0: 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 46  ReverseNewPage(F
d900: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
d910: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
d920: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
d930: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
d940: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
d950: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
d960: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
d970: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
d980: 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52   );..  fts5DataR
d990: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
d9a0: 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
d9b0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c  Leaf = 0;.  whil
d9c0: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
d9d0: 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c  _OK && pIter->iL
d9e0: 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
d9f0: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  TermLeafPgno ){.
da00: 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e      Fts5Data *pN
da10: 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ew;.    pIter->i
da20: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20  LeafPgno--;.    
da30: 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
da40: 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
da50: 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20  ENT_ROWID(.     
da60: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 49 64 78       pIter->iIdx
da70: 2c 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69  , pIter->pSeg->i
da80: 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d  Segid, 0, pIter-
da90: 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29  >iLeafPgno.    )
daa0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
dab0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
dac0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70  er->iLeafPgno==p
dad0: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
dae0: 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69  gno ){.        i
daf0: 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  f( pIter->iTermL
db00: 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e  eafOffset<pNew->
db10: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  n ){.          p
db20: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
db30: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
db40: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
db50: 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c   = pIter->iTermL
db60: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  eafOffset;.     
db70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
db80: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  {.        int iR
db90: 6f 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a  owidOff, dummy;.
dba0: 20 20 20 20 20 20 20 20 66 74 73 35 4c 65 61 66          fts5Leaf
dbb0: 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52  Header(pNew, &iR
dbc0: 6f 77 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79 29  owidOff, &dummy)
dbd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52  ;.        if( iR
dbe0: 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20  owidOff ){.     
dbf0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
dc00: 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  f = pNew;.      
dc10: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
dc20: 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f  Offset = iRowidO
dc30: 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ff;.        }.  
dc40: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
dc50: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
dc60: 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d  .        u8 *a =
dc70: 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e   &pIter->pLeaf->
dc80: 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  p[pIter->iLeafOf
dc90: 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70  fset];.        p
dca0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
dcb0: 74 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 61  t += getVarint(a
dcc0: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
dcd0: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
dce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
dcf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
dd00: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65  5DataRelease(pNe
dd10: 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  w);.      }.    
dd20: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74  }.  }..  if( pIt
dd30: 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
dd40: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
dd50: 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
dd60: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Iter);.  }.}../*
dd70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
dd80: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
dd90: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
dda0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75  cond argument cu
ddb0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
ddc0: 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20 6d 61  s to a delete ma
ddd0: 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65 20 6d  rker. A delete m
dde0: 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e 74 72  arker is an entr
ddf0: 79 20 77 69 74 68 20 61 20 30 20 62 79 74 65 0a  y with a 0 byte.
de00: 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
de10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
de20: 66 74 73 35 53 65 67 49 74 65 72 49 73 44 65 6c  fts5SegIterIsDel
de30: 65 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ete(.  Fts5Index
de40: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
de50: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
de60: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
de70: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
de80: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
de90: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
dea0: 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a  o advance */.){.
deb0: 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30 3b 0a    int bRet = 0;.
dec0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
ded0: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
dee0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
def0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 65 61  QLITE_OK && pLea
df00: 66 20 29 7b 0a 20 20 20 20 62 52 65 74 20 3d 20  f ){.    bRet = 
df10: 70 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 3b 0a  pIter->nPos==0;.
df20: 20 20 20 20 2f 2a 20 62 52 65 74 20 3d 20 70 49      /* bRet = pI
df30: 74 65 72 2d 3e 62 44 65 6c 3b 20 2a 2f 0a 23 69  ter->bDel; */.#i
df40: 66 20 30 0a 20 20 20 20 69 66 28 20 70 49 74 65  f 0.    if( pIte
df50: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3c 70  r->iLeafOffset<p
df60: 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Leaf->n ){.     
df70: 20 62 52 65 74 20 3d 20 28 28 70 4c 65 61 66 2d   bRet = ((pLeaf-
df80: 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  >p[pIter->iLeafO
df90: 66 66 73 65 74 5d 20 26 20 30 78 46 45 29 3d 3d  ffset] & 0xFE)==
dfa0: 30 78 30 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0x00);.    }else
dfb0: 7b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61  {.      Fts5Data
dfc0: 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74   *pNew = fts5Dat
dfd0: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
dfe0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20  GMENT_ROWID(.   
dff0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e000: 69 49 64 78 2c 20 70 49 74 65 72 2d 3e 70 53 65  iIdx, pIter->pSe
e010: 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49  g->iSegid, 0, pI
e020: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31  ter->iLeafPgno+1
e030: 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20  .      ));.     
e040: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
e050: 20 20 20 20 20 62 52 65 74 20 3d 20 28 28 70 4e       bRet = ((pN
e060: 65 77 2d 3e 70 5b 34 5d 20 26 20 30 78 46 45 29  ew->p[4] & 0xFE)
e070: 3d 3d 30 78 30 30 29 3b 0a 20 20 20 20 20 20 20  ==0x00);.       
e080: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
e090: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a  (pNew);.      }.
e0a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
e0b0: 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 3b 0a  .  return bRet;.
e0c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
e0d0: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
e0e0: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
e0f0: 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  y. .**.** If an 
e100: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
e110: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
e120: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
e130: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
e140: 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  It .** is not co
e150: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
e160: 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
e170: 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49  r reaches EOF. I
e180: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
e190: 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
e1a0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
e1b0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
e1c0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
e1d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e1e0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
e1f0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e210: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
e220: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
e230: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
e240: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
e250: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
e260: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  vance */.  int *
e270: 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20  pbNewTerm       
e280: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
e290: 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74  T: Set for new t
e2a0: 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  erm */.){.  asse
e2b0: 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30  rt( pbNewTerm==0
e2c0: 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d   || *pbNewTerm==
e2d0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  0 );.  if( p->rc
e2e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e2f0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c     if( pIter->fl
e300: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e310: 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 0a 20  ER_REVERSE ){.. 
e320: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
e330: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
e340: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20  {.        u8 *a 
e350: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
e360: 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  p;.        int i
e370: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Off;.        int
e380: 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69   nPos;.        i
e390: 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20  nt bDummy;.     
e3a0: 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a     i64 iDelta;..
e3b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
e3c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e3d0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e3e0: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b  >iRowidOffset--;
e3f0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e400: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
e410: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52  iOff = pIter->aR
e420: 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72  owidOffset[pIter
e430: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b  ->iRowidOffset];
e440: 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
e450: 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
e460: 74 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20  tSize(&a[iOff], 
e470: 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b  &nPos, &bDummy);
e480: 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
e490: 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  += nPos;.       
e4a0: 20 20 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b     getVarint(&a[
e4b0: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
e4c0: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  elta);.         
e4d0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d   pIter->iRowid -
e4e0: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
e4f0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
e500: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
e510: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e520: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e530: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
e540: 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
e550: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
e560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e570: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20  Fts5Data *pLeaf 
e580: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a  = pIter->pLeaf;.
e590: 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
e5a0: 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65        int bNewTe
e5b0: 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  rm = 0;.      in
e5c0: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20  t nKeep = 0;..  
e5d0: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
e5e0: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
e5f0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77   position list w
e600: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
e610: 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  t page. */.     
e620: 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e   u8 *a = pLeaf->
e630: 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  p;.      int n =
e640: 20 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20   pLeaf->n;..    
e650: 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
e660: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49  iLeafOffset + pI
e670: 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 20 20  ter->nPos;..    
e680: 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
e690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
e6a0: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20  ext entry is on 
e6b0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
e6c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 36 34 20   */.        u64 
e6d0: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
e6e0: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
e6f0: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
e700: 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  ], &iDelta);.   
e710: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e720: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
e730: 20 20 20 20 20 20 20 20 69 66 28 20 69 44 65 6c          if( iDel
e740: 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ta==0 ){.       
e750: 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b     bNewTerm = 1;
e760: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
e770: 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Off>=n ){.      
e780: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
e790: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
e7a0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
e7b0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e7c0: 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 20 20 20  set = 4;.       
e7d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 4f 66     }else if( iOf
e7e0: 66 21 3d 66 74 73 35 47 65 74 55 31 36 28 26 61  f!=fts5GetU16(&a
e7f0: 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [2]) ){.        
e800: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e810: 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65  Offset += fts5Ge
e820: 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
e830: 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
e840: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
e860: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
e870: 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
e880: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
e890: 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d  if( pIter->pSeg=
e8a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
e8b0: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
e8c0: 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  0;.        const
e8d0: 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 0a 20 20   char *zTerm;.  
e8e0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b        int nList;
e8f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
e900: 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
e910: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
e920: 54 45 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 20  TERM) ){.       
e930: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
e940: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 61 70  shScanNext(p->ap
e950: 48 61 73 68 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Hash[0]);.      
e960: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
e970: 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e  ashScanEntry(p->
e980: 61 70 48 61 73 68 5b 30 5d 2c 20 26 7a 54 65 72  apHash[0], &zTer
e990: 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  m, &pList, &nLis
e9a0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
e9b0: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d        if( pList=
e9c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
e9d0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
e9e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
e9f0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ea00: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  pLeaf = 0;.     
ea10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ea20: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
ea30: 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74  ->p = (u8*)pList
ea40: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
ea50: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 3d 20 6e 4c  r->pLeaf->n = nL
ea60: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ist;.          s
ea70: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
ea80: 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
ea90: 65 72 2d 3e 74 65 72 6d 2c 20 73 74 72 6c 65 6e  er->term, strlen
eaa0: 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54  (zTerm), (u8*)zT
eab0: 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  erm);.          
eac0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ead0: 65 74 20 3d 20 67 65 74 56 61 72 69 6e 74 28 70  et = getVarint(p
eae0: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
eaf0: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
eb00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
eb10: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  se{.        iOff
eb20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a   = 0;.        /*
eb30: 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e   Next entry is n
eb40: 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ot on the curren
eb50: 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  t page */.      
eb60: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30    while( iOff==0
eb70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
eb80: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
eb90: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
eba0: 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70         pLeaf = p
ebb0: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20  Iter->pLeaf;.   
ebc0: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
ebd0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ebe0: 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66         if( (iOff
ebf0: 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
ec00: 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20 29 7b 0a  Leaf->p[0])) ){.
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
ec20: 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61   += sqlite3GetVa
ec30: 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
ec40: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
ec50: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
ec60: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
ec70: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
ec80: 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ff;.          }.
ec90: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69            else i
eca0: 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35 47  f( (iOff = fts5G
ecb0: 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
ecc0: 32 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  2])) ){.        
ecd0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ece0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
ecf0: 20 20 20 20 20 20 20 20 20 20 20 62 4e 65 77 54             bNewT
ed00: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
ed10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
ed20: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
ed30: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 74   Check if the it
ed40: 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74  erator is now at
ed50: 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74   EOF. If so, ret
ed60: 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20  urn early. */.  
ed70: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
ed80: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
ed90: 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a  if( bNewTerm ){.
eda0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
edb0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
edc0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
edd0: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  M ){.           
ede0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
edf0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
ee10: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
ee20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ee30: 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
ee40: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
ee50: 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b  , pIter, nKeep);
ee60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
ee70: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
ee80: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
ee90: 20 20 20 20 20 20 20 20 69 66 28 20 70 62 4e 65          if( pbNe
eea0: 77 54 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65  wTerm ) *pbNewTe
eeb0: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
eec0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
eed0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  e{.          fts
eee0: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
eef0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
ef00: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ef10: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69    }.  }.}..#defi
ef20: 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61 2c  ne SWAPVAL(T, a,
ef30: 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d 70   b) { T tmp; tmp
ef40: 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b 20  =a; a=b; b=tmp; 
ef50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
ef60: 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
ef70: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
ef80: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61  first rowid in a
ef90: 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a   doclist. This.*
efa0: 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  * function sets 
efb0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 75 70 20  the iterator up 
efc0: 73 6f 20 74 68 61 74 20 69 74 65 72 61 74 65 73  so that iterates
efd0: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
efe0: 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65  r through.** the
eff0: 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61   doclist..*/.sta
f000: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
f010: 49 74 65 72 52 65 76 65 72 73 65 28 46 74 73 35  IterReverse(Fts5
f020: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49  Index *p, int iI
f030: 64 78 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  dx, Fts5SegIter 
f040: 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44  *pIter){.  Fts5D
f050: 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a  ata *pLast = 0;.
f060: 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d    int pgnoLast =
f070: 20 30 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72   0;..  if( pIter
f080: 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ->pDlidx ){.    
f090: 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74  int iSegid = pIt
f0a0: 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
f0b0: 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d  ;.    pgnoLast =
f0c0: 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 2d 3e   pIter->pDlidx->
f0d0: 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 70  iLeafPgno;.    p
f0e0: 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52  Last = fts5DataR
f0f0: 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
f100: 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20  ENT_ROWID(iIdx, 
f110: 69 53 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f 4c  iSegid, 0, pgnoL
f120: 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ast));.  }else{.
f130: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20      int iOff;   
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
f160: 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69  yte offset withi
f170: 6e 20 70 4c 65 61 66 20 2a 2f 0a 20 20 20 20 46  n pLeaf */.    F
f180: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
f190: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20   pIter->pLeaf;  
f1a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
f1b0: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a  t leaf data */..
f1c0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79      /* Currently
f1d0: 2c 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  , Fts5SegIter.iL
f1e0: 65 61 66 4f 66 66 73 65 74 20 28 61 6e 64 20 69  eafOffset (and i
f1f0: 4f 66 66 29 20 70 6f 69 6e 74 73 20 74 6f 20 74  Off) points to t
f200: 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a  he first .    **
f210: 20 62 79 74 65 20 6f 66 20 70 6f 73 69 74 69 6f   byte of positio
f220: 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 66  n-list content f
f230: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
f240: 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75 70  owid. Back it up
f250: 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  .    ** so that 
f260: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
f270: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 6f   start of the po
f280: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
f290: 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 70   field. */.    p
f2a0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
f2b0: 74 20 2d 3d 20 73 71 6c 69 74 65 33 46 74 73 35  t -= sqlite3Fts5
f2c0: 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 70 49 74  GetVarintLen(pIt
f2d0: 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 49 74  er->nPos*2 + pIt
f2e0: 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20 20 20 69  er->bDel);.    i
f2f0: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  Off = pIter->iLe
f300: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 61 73  afOffset;.    as
f310: 73 65 72 74 28 20 69 4f 66 66 3e 3d 34 20 29 3b  sert( iOff>=4 );
f320: 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  ..    /* Search 
f330: 66 6f 72 20 61 20 6e 65 77 20 74 65 72 6d 20 77  for a new term w
f340: 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ithin the curren
f350: 74 20 6c 65 61 66 2e 20 49 66 20 6f 6e 65 20 63  t leaf. If one c
f360: 61 6e 20 62 65 20 66 6f 75 6e 64 2c 0a 20 20 20  an be found,.   
f370: 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 70 61   ** then this pa
f380: 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ge contains the 
f390: 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f  largest rowid fo
f3a0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  r the current te
f3b0: 72 6d 2e 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  rm. */.    while
f3c0: 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20  ( iOff<pLeaf->n 
f3d0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  ){.      int nPo
f3e0: 73 3b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  s;.      i64 iDe
f3f0: 6c 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  lta;.      int b
f400: 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 20 20 2f 2a  Dummy;..      /*
f410: 20 52 65 61 64 20 74 68 65 20 70 6f 73 69 74 69   Read the positi
f420: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
f430: 6c 64 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66  ld */.      iOff
f440: 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
f450: 73 74 53 69 7a 65 28 26 70 4c 65 61 66 2d 3e 70  stSize(&pLeaf->p
f460: 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
f470: 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69  bDummy);.      i
f480: 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  Off += nPos;.   
f490: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
f4a0: 61 66 2d 3e 6e 20 29 20 62 72 65 61 6b 3b 0a 0a  af->n ) break;..
f4b0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 64        /* Rowid d
f4c0: 65 6c 74 61 2e 20 4f 72 2c 20 69 66 20 30 78 30  elta. Or, if 0x0
f4d0: 30 2c 20 74 68 65 20 65 6e 64 20 6f 66 20 64 6f  0, the end of do
f4e0: 63 6c 69 73 74 20 6d 61 72 6b 65 72 2e 20 2a 2f  clist marker. */
f4f0: 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 67 65  .      nPos = ge
f500: 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
f510: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
f520: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69  iDelta);.      i
f530: 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62  f( iDelta==0 ) b
f540: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 4f 66 66  reak;.      iOff
f550: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a   += nPos;.    }.
f560: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f570: 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75  condition is tru
f580: 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65  e then the large
f590: 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  st rowid for the
f5a0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
f5b0: 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20  term may not be 
f5c0: 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75  stored on the cu
f5d0: 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73  rrent page. So s
f5e0: 65 61 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f  earch forward to
f5f0: 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72  .    ** see wher
f600: 65 20 73 61 69 64 20 72 6f 77 69 64 20 72 65 61  e said rowid rea
f610: 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20  lly is.  */.    
f620: 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d  if( iOff>=pLeaf-
f630: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >n ){.      int 
f640: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73 35  pgno;.      Fts5
f650: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
f660: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
f670: 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  pSeg;..      /* 
f680: 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69  The last rowid i
f690: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61  n the doclist ma
f6a0: 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20  y not be on the 
f6b0: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65  current page. Se
f6c0: 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f  arch.      ** fo
f6d0: 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68  rward to find th
f6e0: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  e page containin
f6f0: 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  g the last rowid
f700: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  .  */.      for(
f710: 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61  pgno=pIter->iLea
f720: 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20  fPgno+1; !p->rc 
f730: 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  && pgno<=pSeg->p
f740: 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29  gnoLast; pgno++)
f750: 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 41  {.        i64 iA
f760: 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  bs = FTS5_SEGMEN
f770: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53  T_ROWID(iIdx, pS
f780: 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  eg->iSegid, 0, p
f790: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46 74  gno);.        Ft
f7a0: 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66  s5Data *pNew = f
f7b0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
f7c0: 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Abs);.        if
f7d0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
f7e0: 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20      int iRowid, 
f7f0: 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  iTerm;.         
f800: 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28   fts5LeafHeader(
f810: 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 2c 20 26  pNew, &iRowid, &
f820: 69 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iTerm);.        
f830: 20 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a    if( iRowid ){.
f840: 20 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50              SWAP
f850: 56 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70  VAL(Fts5Data*, p
f860: 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20  New, pLast);.   
f870: 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73           pgnoLas
f880: 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  t = pgno;.      
f890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f8a0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
f8b0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
f8c0: 20 69 66 28 20 69 54 65 72 6d 20 29 20 62 72 65   if( iTerm ) bre
f8d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
f8e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
f8f0: 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69  .  /* If pLast i
f900: 73 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70  s NULL at this p
f910: 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c  oint, then the l
f920: 61 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68  ast rowid for th
f930: 69 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20  is doclist.  ** 
f940: 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
f950: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63   currently indic
f960: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
f970: 61 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ator. In this ca
f980: 73 65 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e  se .  ** pIter->
f990: 69 4c 65 61 66 4f 66 66 73 65 74 20 69 73 20 61  iLeafOffset is a
f9a0: 6c 72 65 61 64 79 20 73 65 74 20 74 6f 20 70 6f  lready set to po
f9b0: 69 6e 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74  int to the posit
f9c0: 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20  ion-list size.  
f9d0: 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f 63 69 61  ** field associa
f9e0: 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
f9f0: 73 74 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69  st relevant rowi
fa00: 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 20  d on the page.. 
fa10: 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20   **.  ** Or, if 
fa20: 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  pLast is non-NUL
fa30: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  L, then it is th
fa40: 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
fa50: 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20  ains the last.  
fa60: 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20 74 68 69  ** rowid. In thi
fa70: 73 20 63 61 73 65 20 63 6f 6e 66 69 67 75 72 65  s case configure
fa80: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
fa90: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
faa0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  to the.  ** firs
fab0: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 69 73 20  t rowid on this 
fac0: 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
fad0: 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e   pLast ){.    in
fae0: 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 69 6e 74  t dummy;.    int
faf0: 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44   iOff;.    fts5D
fb00: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
fb10: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49  ->pLeaf);.    pI
fb20: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61  ter->pLeaf = pLa
fb30: 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  st;.    pIter->i
fb40: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c  LeafPgno = pgnoL
fb50: 61 73 74 3b 0a 20 20 20 20 66 74 73 35 4c 65 61  ast;.    fts5Lea
fb60: 66 48 65 61 64 65 72 28 70 4c 61 73 74 2c 20 26  fHeader(pLast, &
fb70: 69 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  iOff, &dummy);. 
fb80: 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
fb90: 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69  rint(&pLast->p[i
fba0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
fbb0: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
fbc0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
fbd0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a  set = iOff;.  }.
fbe0: 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65  .  fts5SegIterRe
fbf0: 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
fc00: 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pIter);.}../*.*
fc10: 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
fc20: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
fc30: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
fc40: 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73  owid of a doclis
fc50: 74 20 77 69 74 68 69 6e 0a 2a 2a 20 69 6e 64 65  t within.** inde
fc60: 78 20 69 49 64 78 2e 20 54 68 65 72 65 20 69 73  x iIdx. There is
fc70: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
fc80: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
fc90: 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20   the final term 
fca0: 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  on.** the curren
fcb0: 74 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 63  t page. If the c
fcc0: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74  urrent term is t
fcd0: 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20  he last term on 
fce0: 74 68 65 20 70 61 67 65 2c 20 0a 2a 2a 20 6c 6f  the page, .** lo
fcf0: 61 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  ad the doclist-i
fd00: 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61  ndex from disk a
fd10: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e  nd initialize an
fd20: 20 69 74 65 72 61 74 6f 72 20 61 74 20 0a 2a 2a   iterator at .**
fd30: 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29   (pIter->pDlidx)
fd40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fd50: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
fd60: 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20  Dlidx(Fts5Index 
fd70: 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74  *p, int iIdx, Ft
fd80: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
fd90: 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20  ){.  int iSeg = 
fda0: 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
fdb0: 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20  gid;.  int bRev 
fdc0: 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  = (pIter->flags 
fdd0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
fde0: 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44  EVERSE);.  Fts5D
fdf0: 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
fe00: 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75  er->pLeaf; /* Cu
fe10: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
fe20: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  */..  assert( pI
fe30: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
fe40: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
fe50: 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
fe60: 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20  Iter->pDlidx==0 
fe70: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
fe80: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  f the current do
fe90: 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68  clist ends on th
fea0: 69 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64  is page. If it d
feb0: 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a  oes, return.  **
fec0: 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c   early without l
fed0: 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  oading the docli
fee0: 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20  st-index (as it 
fef0: 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66  belongs to a dif
ff00: 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d  ferent.  ** term
ff10: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72  . */.  if( pIter
ff20: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d  ->iTermLeafPgno=
ff30: 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
ff40: 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  o ){.    int iOf
ff50: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
ff60: 4f 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e  Offset + pIter->
ff70: 6e 50 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65 28  nPos;.    while(
ff80: 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29   iOff<pLeaf->n )
ff90: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  {.      i64 iDel
ffa0: 74 61 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 4f  ta;..      /* iO
ffb0: 66 66 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ff is currently 
ffc0: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
ffd0: 65 20 73 74 61 72 74 20 6f 66 20 70 6f 73 69 74  e start of posit
ffe0: 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 2a 2f  ion list data */
fff0: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
10000 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
10010 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
10020 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
10030 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20  if( iDelta==0 ) 
10040 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 20 20 69  return;..      i
10050 66 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e  f( iOff<pLeaf->n
10060 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
10070 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20  bDummy;.        
10080 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
10090 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
100a0 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 4c  tPoslistSize(&pL
100b0 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26 6e  eaf->p[iOff], &n
100c0 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
100d0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
100e0 50 6f 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pos;.      }.   
100f0 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 6c   }.  }..  fts5Dl
10100 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62  idxIterInit(p, b
10110 52 65 76 2c 20 69 49 64 78 2c 20 69 53 65 67 2c  Rev, iIdx, iSeg,
10120 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
10130 66 50 67 6e 6f 2c 20 26 70 49 74 65 72 2d 3e 70  fPgno, &pIter->p
10140 44 6c 69 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Dlidx);.}../*.**
10150 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
10160 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20  object pIter to 
10170 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54  point to term pT
10180 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e  erm/nTerm within
10190 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67   segment.** pSeg
101a0 2c 20 69 6e 64 65 78 20 69 49 64 78 2e 20 49 66  , index iIdx. If
101b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63   there is no suc
101c0 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e  h term in the in
101d0 64 65 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f  dex, the iterato
101e0 72 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 45  r.** is set to E
101f0 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  OF..**.** If an 
10200 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
10210 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
10220 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
10230 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
10240 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
10250 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
10260 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
10270 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
10280 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
10290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
102a0 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b   fts5SegIterSeek
102b0 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
102c0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
102d0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
102e0 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  backend */.  int
102f0 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20   iIdx,          
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10310 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69  Config.aHash[] i
10320 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65  ndex of FTS inde
10330 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  x */.  const u8 
10340 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
10350 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m,     /* Term t
10360 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69  o seek to */.  i
10370 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10390 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e  * Mask of FTS5IN
103a0 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  DEX_XXX flags */
103b0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
103c0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
103d0 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
103e0 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  n of segment */.
103f0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
10400 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
10410 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70    /* Object to p
10420 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
10430 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20 20 69  int iPg = 1;.  i
10440 6e 74 20 68 3b 0a 20 20 69 6e 74 20 62 47 65 20  nt h;.  int bGe 
10450 3d 20 28 28 66 6c 61 67 73 20 26 20 46 54 53 35  = ((flags & FTS5
10460 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
10470 49 58 29 20 26 26 20 69 49 64 78 3d 3d 30 29 3b  IX) && iIdx==0);
10480 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20  .  int bDlidx = 
10490 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
104a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
104b0 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
104c0 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73  -index */..  ass
104d0 65 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28  ert( bGe==0 || (
104e0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
104f0 58 5f 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30  X_QUERY_DESC)==0
10500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
10510 65 72 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a  erm && nTerm );.
10520 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
10530 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
10540 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65  ));.  pIter->pSe
10550 67 20 3d 20 70 53 65 67 3b 0a 20 20 70 49 74 65  g = pSeg;.  pIte
10560 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
10570 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
10580 20 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69   sets stack vari
10590 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20  able iPg to the 
105a0 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
105b0 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63   that may.  ** c
105c0 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65  ontain term (pTe
105d0 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74  rm/nTerm), if it
105e0 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74   is present in t
105f0 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20  he segment. */. 
10600 20 66 6f 72 28 68 3d 70 53 65 67 2d 3e 6e 48 65   for(h=pSeg->nHe
10610 69 67 68 74 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d  ight-1; h>0; h--
10620 29 7b 0a 20 20 20 20 46 74 73 35 4e 6f 64 65 49  ){.    Fts5NodeI
10630 74 65 72 20 6e 6f 64 65 3b 20 20 20 20 20 20 20  ter node;       
10640 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74         /* For it
10650 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
10660 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 2a  internal nodes *
10670 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
10680 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
10690 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67  ROWID(iIdx, pSeg
106a0 2d 3e 69 53 65 67 69 64 2c 20 68 2c 20 69 50 67  ->iSegid, h, iPg
106b0 29 3b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  );.    Fts5Data 
106c0 2a 70 4e 6f 64 65 20 3d 20 66 74 73 35 44 61 74  *pNode = fts5Dat
106d0 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29  aRead(p, iRowid)
106e0 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f 64 65 3d  ;.    if( pNode=
106f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
10700 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69   fts5NodeIterIni
10710 74 28 70 4e 6f 64 65 2d 3e 70 2c 20 70 4e 6f 64  t(pNode->p, pNod
10720 65 2d 3e 6e 2c 20 26 6e 6f 64 65 29 3b 0a 20 20  e->n, &node);.  
10730 20 20 61 73 73 65 72 74 28 20 6e 6f 64 65 2e 74    assert( node.t
10740 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 20  erm.n==0 );..   
10750 20 69 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69   iPg = node.iChi
10760 6c 64 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d  ld;.    bDlidx =
10770 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20   node.bDlidx;.  
10780 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65 49 74    for(fts5NodeIt
10790 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26  erNext(&p->rc, &
107a0 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  node);.        n
107b0 6f 64 65 2e 61 44 61 74 61 20 26 26 20 66 74 73  ode.aData && fts
107c0 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
107d0 6f 62 28 26 6e 6f 64 65 2e 74 65 72 6d 2c 20 70  ob(&node.term, p
107e0 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3c 3d 30 3b  Term, nTerm)<=0;
107f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64  .        fts5Nod
10800 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
10810 2c 20 26 6e 6f 64 65 29 0a 20 20 20 20 29 7b 0a  , &node).    ){.
10820 20 20 20 20 20 20 69 50 67 20 3d 20 6e 6f 64 65        iPg = node
10830 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 62  .iChild;.      b
10840 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44 6c  Dlidx = node.bDl
10850 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  idx;.    }.    f
10860 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
10870 26 6e 6f 64 65 29 3b 0a 20 20 20 20 66 74 73 35  &node);.    fts5
10880 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 6f 64  DataRelease(pNod
10890 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  e);.  }..  if( i
108a0 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  Pg<pSeg->pgnoFir
108b0 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d 20  st ){.    iPg = 
108c0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b  pSeg->pgnoFirst;
108d0 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30 3b  .    bDlidx = 0;
108e0 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 69  .  }..  pIter->i
108f0 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20 2d  LeafPgno = iPg -
10900 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65   1;.  fts5SegIte
10910 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
10920 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65  er);..  if( pIte
10930 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
10940 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 70 49 74  int res;.    pIt
10950 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
10960 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70 49  = fts5GetU16(&pI
10970 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 32 5d  ter->pLeaf->p[2]
10980 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  );.    fts5SegIt
10990 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
109a0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73  ter, 0);.    fts
109b0 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
109c0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
109d0 64 6f 20 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  do {.      res =
109e0 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
109f0 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74  reBlob(&pIter->t
10a00 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
10a10 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  m);.      if( re
10a20 73 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s>=0 ) break;.  
10a30 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
10a40 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29  ext(p, pIter, 0)
10a50 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49  ;.    }while( pI
10a60 74 65 72 2d 3e 70 4c 65 61 66 20 26 26 20 70 2d  ter->pLeaf && p-
10a70 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
10a80 3b 0a 0a 20 20 20 20 69 66 28 20 62 47 65 3d 3d  ;..    if( bGe==
10a90 30 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  0 && res ){.    
10aa0 20 20 2f 2a 20 53 65 74 20 69 74 65 72 61 74 6f    /* Set iterato
10ab0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f  r to point to EO
10ac0 46 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44  F */.      fts5D
10ad0 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
10ae0 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
10af0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
10b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
10b10 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
10b20 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29 7b  _OK && bGe==0 ){
10b30 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
10b40 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
10b50 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
10b60 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
10b70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
10b80 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
10b90 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
10ba0 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
10bb0 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
10bc0 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
10bd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44 6c   }.      if( bDl
10be0 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66  idx ){.        f
10bf0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c  ts5SegIterLoadDl
10c00 69 64 78 28 70 2c 20 69 49 64 78 2c 20 70 49 74  idx(p, iIdx, pIt
10c10 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
10c20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
10c30 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
10c40 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ESC ){.        f
10c50 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
10c60 65 28 70 2c 20 69 49 64 78 2c 20 70 49 74 65 72  e(p, iIdx, pIter
10c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10c80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
10c90 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a  itialize the obj
10ca0 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ect pIter to poi
10cb0 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d  nt to term pTerm
10cc0 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68  /nTerm within th
10cd0 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68  e.** in-memory h
10ce0 61 73 68 20 74 61 62 6c 65 20 69 49 64 78 2e 20  ash table iIdx. 
10cf0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
10d00 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
10d10 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69  table, the .** i
10d20 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  terator is set t
10d30 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  o EOF..**.** If 
10d40 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10d50 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73   Fts5Index.rc is
10d60 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f   set to an appro
10d70 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
10d80 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  e. If .** an err
10d90 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
10da0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
10db0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
10dc0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
10dd0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
10de0 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 48  oid fts5SegIterH
10df0 61 73 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49  ashInit(.  Fts5I
10e00 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
10e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
10e20 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20  S5 backend */.  
10e30 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b  /* Config.aHash[
10e60 5d 20 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69  ] index of FTS i
10e70 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
10e80 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
10e90 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
10ea0 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a  m to seek to */.
10eb0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
10ee0 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73  5INDEX_XXX flags
10ef0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
10f00 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
10f10 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
10f20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29  to populate */.)
10f30 7b 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70 48  {.  Fts5Hash *pH
10f40 61 73 68 20 3d 20 70 2d 3e 61 70 48 61 73 68 5b  ash = p->apHash[
10f50 69 49 64 78 5d 3b 0a 20 20 63 6f 6e 73 74 20 75  iIdx];.  const u
10f60 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
10f70 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20  int nList = 0;. 
10f80 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30   const u8 *z = 0
10f90 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a  ;.  int n = 0;..
10fa0 20 20 61 73 73 65 72 74 28 20 70 48 61 73 68 20    assert( pHash 
10fb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
10fc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
10fd0 0a 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30  ..  if( pTerm==0
10fe0 20 7c 7c 20 28 69 49 64 78 3d 3d 30 20 26 26 20   || (iIdx==0 && 
10ff0 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
11000 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29  EX_QUERY_PREFIX)
11010 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
11020 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
11030 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20  ScanInit(pHash, 
11040 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65  (const char*)pTe
11050 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  rm, nTerm);.    
11060 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
11070 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20  canEntry(pHash, 
11080 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a  (const char**)&z
11090 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
110a0 29 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20  );.    n = (z ? 
110b0 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68  strlen((const ch
110c0 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d  ar*)z) : 0);.  }
110d0 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
110e0 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
110f0 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
11100 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
11110 61 73 68 51 75 65 72 79 28 70 48 61 73 68 2c 20  ashQuery(pHash, 
11120 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65  (const char*)pTe
11130 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73  rm, nTerm, &pLis
11140 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
11150 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e  z = pTerm;.    n
11160 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20   = nTerm;.  }.. 
11170 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
11180 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
11190 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  f;.    sqlite3Ft
111a0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
111b0 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
111c0 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65  , n, z);.    pLe
111d0 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  af = fts5IdxMall
111e0 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
111f0 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28  5Data));.    if(
11200 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75   pLeaf==0 ) retu
11210 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e  rn;.    pLeaf->n
11220 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 65  Ref = 1;.    pLe
11230 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
11240 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e  st;.    pLeaf->n
11250 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49   = nList;.    pI
11260 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65  ter->pLeaf = pLe
11270 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  af;.    pIter->i
11280 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 67 65 74  LeafOffset = get
11290 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c  Varint(pLeaf->p,
112a0 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
112b0 52 6f 77 69 64 29 3b 0a 0a 20 20 20 20 69 66 28  Rowid);..    if(
112c0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
112d0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
112e0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  .      pIter->fl
112f0 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
11300 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  TER_REVERSE;.   
11310 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
11320 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
11330 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c   pIter);.    }el
11340 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  se{.      fts5Se
11350 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
11360 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
11370 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f   }.}../*.** Zero
11380 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
11390 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
113a0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
113b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
113c0 67 49 74 65 72 43 6c 65 61 72 28 46 74 73 35 53  gIterClear(Fts5S
113d0 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
113e0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
113f0 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
11400 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
11410 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
11420 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
11430 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69  Free(pIter->pDli
11440 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  dx);.  sqlite3_f
11450 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69  ree(pIter->aRowi
11460 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73  dOffset);.  mems
11470 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
11480 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29  eof(Fts5SegIter)
11490 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
114a0 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a  ITE_DEBUG../*.**
114b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
114c0 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
114d0 66 20 74 68 65 20 62 69 67 20 61 73 73 65 72 74  f the big assert
114e0 28 29 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70  () procedure imp
114f0 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66  lemented by.** f
11500 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
11510 65 72 53 65 74 75 70 28 29 2e 20 49 74 20 65 6e  erSetup(). It en
11520 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 72  sures that the r
11530 65 73 75 6c 74 20 63 75 72 72 65 6e 74 6c 79 20  esult currently 
11540 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52  stored.** in *pR
11550 65 73 20 69 73 20 74 68 65 20 63 6f 72 72 65 63  es is the correc
11560 74 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  t result of comp
11570 61 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aring the curren
11580 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74  t positions of t
11590 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61 74  he.** two iterat
115a0 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
115b0 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 43 6f  oid fts5AssertCo
115c0 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a  mparisonResult(.
115d0 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
115e0 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74  er *pIter, .  Ft
115f0 73 35 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20  s5SegIter *p1,. 
11600 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
11610 2c 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  ,.  Fts5CResult 
11620 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69  *pRes.){.  int i
11630 31 20 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e  1 = p1 - pIter->
11640 61 53 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d  aSeg;.  int i2 =
11650 20 70 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65   p2 - pIter->aSe
11660 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c  g;..  if( p1->pL
11670 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66  eaf || p2->pLeaf
11680 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e   ){.    if( p1->
11690 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
116a0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
116b0 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20  iFirst==i2 );.  
116c0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e    }else if( p2->
116d0 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeaf==0 ){.    
116e0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
116f0 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20  iFirst==i1 );.  
11700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
11710 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31  nt nMin = MIN(p1
11720 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65  ->term.n, p2->te
11730 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74  rm.n);.      int
11740 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31   res = memcmp(p1
11750 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65  ->term.p, p2->te
11760 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  rm.p, nMin);.   
11770 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
11780 72 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e  res = p1->term.n
11790 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a   - p2->term.n;..
117a0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
117b0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
117c0 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45  rt( pRes->bTermE
117d0 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  q==1 );.        
117e0 61 73 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77  assert( p1->iRow
117f0 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id!=p2->iRowid )
11800 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
11810 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70  ((p1->iRowid > p
11820 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  2->iRowid)==pIte
11830 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20  r->bRev) ? -1 : 
11840 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
11850 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11860 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30  pRes->bTermEq==0
11870 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
11880 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
11890 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
118a0 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31  pRes->iFirst==i1
118b0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
118c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
118d0 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69   pRes->iFirst==i
118e0 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 );.      }.   
118f0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11900 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
11910 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
11920 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
11930 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69  defined when thi
11940 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63  s module.** is c
11950 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74  ompiled. In that
11960 20 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63   case, this func
11970 74 69 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61  tion is essentia
11980 6c 6c 79 20 61 6e 20 61 73 73 65 72 74 28 29 20  lly an assert() 
11990 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73  .** statement us
119a0 65 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  ed to verify tha
119b0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
119c0 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69  f the pIter->aFi
119d0 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  rst[] array.** a
119e0 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73  re correct..*/.s
119f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41  tatic void fts5A
11a00 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
11a10 74 75 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70  tup(Fts5Index *p
11a20 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  , Fts5MultiSegIt
11a30 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
11a40 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11a50 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  OK ){.    int i;
11a60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11a70 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d  pIter->nSeg; i+=
11a80 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
11a90 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
11aa0 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
11ab0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
11ac0 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p2 = &pIter->aSe
11ad0 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74  g[i+1];.      Ft
11ae0 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20  s5CResult *pRes 
11af0 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74  = &pIter->aFirst
11b00 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20  [(pIter->nSeg + 
11b10 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66  i) / 2];.      f
11b20 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
11b30 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
11b40 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
11b50 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
11b60 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53  =1; i<(pIter->nS
11b70 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a  eg / 2); i+=2){.
11b80 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c        Fts5CResul
11b90 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72  t *pRes = &pIter
11ba0 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 20 20 20  ->aFirst[i];.   
11bb0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
11bc0 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
11bd0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
11be0 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  [i*2].iFirst ];.
11bf0 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
11c00 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e  r *p2 = &pIter->
11c10 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
11c20 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73  rst[i*2+1].iFirs
11c30 74 20 5d 3b 0a 0a 20 20 20 20 20 20 66 74 73 35  t ];..      fts5
11c40 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
11c50 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
11c60 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
11c70 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
11c80 20 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65   define fts5Asse
11c90 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
11ca0 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x,y).#endif../*
11cb0 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61  .** Do the compa
11cc0 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20  rison necessary 
11cd0 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65  to populate pIte
11ce0 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e  r->aFirst[iOut].
11cf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
11d00 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
11d10 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
11d20 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  t is the index o
11d30 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e  f an entry.** in
11d40 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67   the pIter->aSeg
11d50 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73  [] array that is
11d60 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c   (a) not at EOF,
11d70 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e   and (b) pointin
11d80 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68  g.** to a key th
11d90 61 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  at is a duplicat
11da0 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69  e of another, hi
11db0 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a  gher priority, .
11dc0 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61  ** segment-itera
11dd0 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d  tor in the pSeg-
11de0 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aSeg[] array..*
11df0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
11e00 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
11e10 61 72 65 28 46 74 73 35 4d 75 6c 74 69 53 65 67  are(Fts5MultiSeg
11e20 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
11e30 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31   iOut){.  int i1
11e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
11e60 65 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  ex of left-hand 
11e70 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
11e80 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20   int i2;        
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ea0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
11eb0 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ht-hand Fts5SegI
11ec0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ter */.  int iRe
11ed0 73 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  s;.  Fts5SegIter
11ee0 20 2a 70 31 3b 20 20 20 20 20 20 20 20 20 20 20   *p1;           
11ef0 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e       /* Left-han
11f00 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
11f10 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
11f20 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
11f30 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64     /* Right-hand
11f40 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
11f50 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
11f60 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
11f70 69 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61  irst[iOut];..  a
11f80 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49 74 65  ssert( iOut<pIte
11f90 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75 74 3e  r->nSeg && iOut>
11fa0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
11fb0 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c  Iter->bRev==0 ||
11fc0 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20   pIter->bRev==1 
11fd0 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d  );..  if( iOut>=
11fe0 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20  (pIter->nSeg/2) 
11ff0 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75  ){.    i1 = (iOu
12000 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f  t - pIter->nSeg/
12010 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d  2) * 2;.    i2 =
12020 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65   i1 + 1;.  }else
12030 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74 65 72  {.    i1 = pIter
12040 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d  ->aFirst[iOut*2]
12050 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69 32 20  .iFirst;.    i2 
12060 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
12070 69 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74  iOut*2+1].iFirst
12080 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49  ;.  }.  p1 = &pI
12090 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20  ter->aSeg[i1];. 
120a0 20 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   p2 = &pIter->aS
120b0 65 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d  eg[i2];..  pRes-
120c0 3e 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20  >bTermEq = 0;.  
120d0 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30  if( p1->pLeaf==0
120e0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   ){           /*
120f0 20 49 66 20 70 31 20 69 73 20 61 74 20 45 4f 46   If p1 is at EOF
12100 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
12110 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
12120 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  2->pLeaf==0 ){  
12130 20 20 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61     /* If p2 is a
12140 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65  t EOF */.    iRe
12150 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b  s = i1;.  }else{
12160 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66  .    int res = f
12170 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
12180 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d  (&p1->term, &p2-
12190 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  >term);.    if( 
121a0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
121b0 61 73 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b  assert( i2>i1 );
121c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
121d0 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52  2!=0 );.      pR
121e0 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b  es->bTermEq = 1;
121f0 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69  .      if( p1->i
12200 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69  Rowid==p2->iRowi
12210 64 20 29 20 72 65 74 75 72 6e 20 69 32 3b 0a 20  d ) return i2;. 
12220 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
12230 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52  >iRowid > p2->iR
12240 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
12250 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20  ev) ? -1 : +1;. 
12260 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
12270 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69   res!=0 );.    i
12280 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
12290 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20    iRes = i1;.   
122a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
122b0 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20  es = i2;.    }. 
122c0 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46 69 72   }..  pRes->iFir
122d0 73 74 20 3d 20 69 52 65 73 3b 0a 20 20 72 65 74  st = iRes;.  ret
122e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
122f0 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65  Move the seg-ite
12300 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
12310 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
12320 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid on page i
12330 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20  LeafPgno..** It 
12340 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c  is an error if l
12350 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 63 6f  eaf iLeafPgno co
12360 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 2e  ntains no rowid.
12370 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12380 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50  fts5SegIterGotoP
12390 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  age(.  Fts5Index
123a0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
123b0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
123c0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
123d0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
123e0 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
123f0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
12400 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
12410 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a  nt iLeafPgno.){.
12420 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50    assert( iLeafP
12430 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
12440 50 67 6e 6f 20 29 3b 0a 20 20 69 66 28 20 70 2d  Pgno );.  if( p-
12450 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
12460 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  {.    pIter->iLe
12470 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
12480 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65  no-1;.    fts5Se
12490 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
124a0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73   pIter);.    ass
124b0 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
124c0 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  TE_OK || pIter->
124d0 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66  iLeafPgno==iLeaf
124e0 50 67 6e 6f 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  Pgno );.  }..  i
124f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12500 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
12510 4f 66 66 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d  Off;.    u8 *a =
12520 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
12530 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49  ;.    int n = pI
12540 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 0a  ter->pLeaf->n;..
12550 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47      iOff = fts5G
12560 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20  etU16(&a[0]);.  
12570 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
12580 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  iOff>=n ){.     
12590 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
125a0 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
125b0 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  {.      iOff += 
125c0 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  getVarint(&a[iOf
125d0 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
125e0 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
125f0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
12600 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
12610 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
12620 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
12630 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12640 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
12650 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
12660 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
12670 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20  gument until it 
12680 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73  is at or .** pas
12690 74 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52  t rowid iFrom. R
126a0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
126b0 20 76 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c   value of iFrom,
126c0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
126d0 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64 76 61 6e  .** always advan
126e0 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ced at least onc
126f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
12700 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
12710 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
12720 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
12730 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
12740 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
12750 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
12760 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
12770 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
12780 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
12790 20 69 36 34 20 69 4d 61 74 63 68 20 20 20 20 20   i64 iMatch     
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72   /* Advance iter
127c0 61 74 6f 72 20 61 74 20 6c 65 61 73 74 20 74 68  ator at least th
127d0 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69  is far */.){.  i
127e0 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72  nt bRev = (pIter
127f0 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
12800 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b  EGITER_REVERSE);
12810 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
12820 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72   *pDlidx = pIter
12830 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20  ->pDlidx;.  int 
12840 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  iLeafPgno = pIte
12850 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  r->iLeafPgno;.  
12860 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a  int bMove = 1;..
12870 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
12880 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
12890 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b  GITER_ONETERM );
128a0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
128b0 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73  ->pDlidx );.  as
128c0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65  sert( pIter->pLe
128d0 61 66 20 29 3b 0a 0a 20 20 69 66 28 20 62 52 65  af );..  if( bRe
128e0 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  v==0 ){.    whil
128f0 65 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  e( fts5DlidxIter
12900 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
12910 30 20 26 26 20 69 4d 61 74 63 68 3e 70 44 6c 69  0 && iMatch>pDli
12920 64 78 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  dx->iRowid ){.  
12930 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20      iLeafPgno = 
12940 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e  pDlidx->iLeafPgn
12950 6f 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  o;.      fts5Dli
12960 64 78 49 74 65 72 4e 65 78 74 28 70 44 6c 69 64  dxIterNext(pDlid
12970 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  x);.    }.    as
12980 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e  sert( iLeafPgno>
12990 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
129a0 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20  o || p->rc );.  
129b0 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e    if( iLeafPgno>
129c0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
129d0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
129e0 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c  gIterGotoPage(p,
129f0 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e   pIter, iLeafPgn
12a00 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20  o);.      bMove 
12a10 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
12a20 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
12a30 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52  iMatch<pIter->iR
12a40 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c  owid );.    whil
12a50 65 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  e( fts5DlidxIter
12a60 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
12a70 30 20 26 26 20 69 4d 61 74 63 68 3c 70 44 6c 69  0 && iMatch<pDli
12a80 64 78 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20  dx->iRowid ){.  
12a90 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
12aa0 72 50 72 65 76 28 70 44 6c 69 64 78 29 3b 0a 20  rPrev(pDlidx);. 
12ab0 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67     }.    iLeafPg
12ac0 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65  no = pDlidx->iLe
12ad0 61 66 50 67 6e 6f 3b 0a 0a 20 20 20 20 61 73 73  afPgno;..    ass
12ae0 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74  ert( fts5DlidxIt
12af0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
12b00 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70   || iLeafPgno<=p
12b10 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
12b20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c 65 61  );..    if( iLea
12b30 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65  fPgno<pIter->iLe
12b40 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
12b50 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12b60 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a   = iLeafPgno+1;.
12b70 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12b80 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
12b90 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
12ba0 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20   bMove = 0;.    
12bb0 7d 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  }.  }..  while( 
12bc0 31 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f  1 ){.    if( bMo
12bd0 76 65 20 29 20 66 74 73 35 53 65 67 49 74 65 72  ve ) fts5SegIter
12be0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
12bf0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
12c00 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ->pLeaf==0 ) bre
12c10 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  ak;.    if( bRev
12c20 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52  ==0 && pIter->iR
12c30 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62  owid>=iMatch ) b
12c40 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52  reak;.    if( bR
12c50 65 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  ev!=0 && pIter->
12c60 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29  iRowid<=iMatch )
12c70 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76   break;.    bMov
12c80 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  e = 1;.  }.}.../
12c90 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74  *.** Free the it
12ca0 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
12cb0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
12cc0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
12cd0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
12ce0 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74  MultiIterFree(Ft
12cf0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
12d00 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
12d10 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
12d20 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
12d30 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12d40 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  Iter->nSeg; i++)
12d50 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
12d60 74 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d  terClear(&pIter-
12d70 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d  >aSeg[i]);.    }
12d80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12d90 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  e(pIter);.  }.}.
12da0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
12db0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
12dc0 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ed(.  Fts5Index 
12dd0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
12de0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
12df0 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
12e00 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
12e10 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
12e20 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Iter,        /* 
12e30 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61  Iterator to upda
12e40 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  te aFirst[] arra
12e50 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  y for */.  int i
12e60 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20  Changed,        
12e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12e80 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61  dex of sub-itera
12e90 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65  tor just advance
12ea0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73  d */.  int iMins
12eb0 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
12ec0 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75         /* Minimu
12ed0 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73  m entry in aFirs
12ee0 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b  t[] to set */.){
12ef0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
12f00 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69  i=(pIter->nSeg+i
12f10 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69  Changed)/2; i>=i
12f20 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d  Minset && p->rc=
12f30 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f  =SQLITE_OK; i=i/
12f40 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b  2){.    int iEq;
12f50 0a 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20  .    if( (iEq = 
12f60 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
12f70 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29  ompare(pIter, i)
12f80 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  ) ){.      fts5S
12f90 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70  egIterNext(p, &p
12fa0 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 2c  Iter->aSeg[iEq],
12fb0 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70   0);.      i = p
12fc0 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71  Iter->nSeg + iEq
12fd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
12fe0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
12ff0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
13000 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
13010 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13020 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
13030 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
13040 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
13050 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
13060 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f 2a  pIter,        /*
13070 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64   Iterator to upd
13080 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72  ate aFirst[] arr
13090 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ay for */.  int 
130a0 69 43 68 61 6e 67 65 64 20 20 20 20 20 20 20 20  iChanged        
130b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
130c0 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72  ndex of sub-iter
130d0 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63  ator just advanc
130e0 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ed */.){.  int i
130f0 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ;.  Fts5SegIter 
13100 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e  *pNew = &pIter->
13110 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a  aSeg[iChanged];.
13120 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
13130 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  Other = &pIter->
13140 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20  aSeg[iChanged ^ 
13150 30 78 30 30 30 31 5d 3b 0a 0a 20 20 66 6f 72 28  0x0001];..  for(
13160 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69  i=(pIter->nSeg+i
13170 43 68 61 6e 67 65 64 29 2f 32 3b 20 70 2d 3e 72  Changed)/2; p->r
13180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d  c==SQLITE_OK; i=
13190 69 2f 32 29 7b 0a 20 20 20 20 46 74 73 35 43 52  i/2){.    Fts5CR
131a0 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
131b0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b  Iter->aFirst[i];
131c0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ..    assert( pN
131d0 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20  ew->pLeaf );.   
131e0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
131f0 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74  TermEq==0 || pOt
13200 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20  her->pLeaf );.  
13210 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 73 2d    .    if( pRes-
13220 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20  >bTermEq ){.    
13230 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77    if( pNew->iRow
13240 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77  id==pOther->iRow
13250 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  id ){.        re
13260 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
13270 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
13280 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52  >iRowid>pNew->iR
13290 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
132a0 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  ev ){.        pN
132b0 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20  ew = pOther;.   
132c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
132d0 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 70  Res->iFirst = (p
132e0 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65  New - pIter->aSe
132f0 67 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 31  g);.    if( i==1
13300 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70   ) break;..    p
13310 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e  Other = &pIter->
13320 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
13330 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e  rst[i ^ 0x0001].
13340 69 46 69 72 73 74 20 5d 3b 0a 20 20 7d 0a 0a 20  iFirst ];.  }.. 
13350 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
13360 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
13370 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  rator to the nex
13380 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
13390 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
133a0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
133b0 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73  e is left in Fts
133c0 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73  5Index.rc. It is
133d0 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65   not .** conside
133e0 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
133f0 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
13400 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20  ches EOF, or if 
13410 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  it is already at
13420 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68   .** EOF when th
13430 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13440 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
13450 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
13460 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49  terNext(.  Fts5I
13470 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
13480 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
13490 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d  ter,.  int bFrom
134a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
134b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
134c0 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d  f argument iFrom
134d0 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69   is valid */.  i
134e0 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20  64 iFrom        
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13500 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61  * Advance at lea
13510 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68 69  st as far as thi
13520 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  s */.){.  if( p-
13530 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13540 7b 0a 20 20 20 20 69 6e 74 20 62 55 73 65 46 72  {.    int bUseFr
13550 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 20 20  om = bFrom;.    
13560 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  do {.      int i
13570 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61  First = pIter->a
13580 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b  First[1].iFirst;
13590 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
135a0 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 46  erm = 0;.      F
135b0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
135c0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
135d0 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69  iFirst];.      i
135e0 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70  f( bUseFrom && p
135f0 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20  Seg->pDlidx ){. 
13600 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
13610 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53  erNextFrom(p, pS
13620 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20  eg, iFrom);.    
13630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13640 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
13650 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54  (p, pSeg, &bNewT
13660 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  erm);.      }.. 
13670 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
13680 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54  Leaf==0 || bNewT
13690 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66  erm .       || f
136a0 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
136b0 6e 63 65 52 6f 77 69 64 28 70 2c 20 70 49 74 65  nceRowid(p, pIte
136c0 72 2c 20 69 46 69 72 73 74 29 0a 20 20 20 20 20  r, iFirst).     
136d0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
136e0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
136f0 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
13700 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  st, 1);.      }.
13710 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
13720 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70  MultiIterSetup(p
13730 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20 20  , pIter);..     
13740 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20   bUseFrom = 0;. 
13750 20 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65 72     }while( pIter
13760 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 0a 20 20  ->bSkipEmpty .  
13770 20 20 20 20 20 20 20 26 26 20 66 74 73 35 53 65         && fts5Se
13780 67 49 74 65 72 49 73 44 65 6c 65 74 65 28 70 2c  gIterIsDelete(p,
13790 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49   &pIter->aSeg[pI
137a0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
137b0 46 69 72 73 74 5d 29 0a 20 20 20 20 29 3b 0a 20  First]).    );. 
137c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
137d0 63 61 74 65 20 61 20 6e 65 77 20 46 74 73 35 4d  cate a new Fts5M
137e0 75 6c 74 69 53 65 67 49 74 65 72 20 6f 62 6a 65  ultiSegIter obje
137f0 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ct..**.** The ne
13800 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  w object will be
13810 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
13820 20 74 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e   through data in
13830 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
13840 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c  ct..** If iLevel
13850 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c   is -ve, then al
13860 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65  l data in all se
13870 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64  gments is merged
13880 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a  . Or, if iLevel.
13890 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72  ** is zero or gr
138a0 65 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d  eater, data from
138b0 20 74 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d   the first nSegm
138c0 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20  ent segments on 
138d0 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20  level iLevel.** 
138e0 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a  is merged..**.**
138f0 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e   The iterator in
13900 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  itially points t
13910 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  o the first term
13920 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20  /rowid entry in 
13930 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64  the .** iterated
13940 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
13950 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
13960 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e  terNew(.  Fts5In
13970 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
13980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
13990 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
139a0 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
139b0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
139c0 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20  pStruct,        
139d0 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66   /* Structure of
139e0 20 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20   specific index 
139f0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a10 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61       /* Config.a
13a20 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20  Hash[] index of 
13a30 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  FTS index */.  i
13a40 6e 74 20 62 53 6b 69 70 45 6d 70 74 79 2c 20 20  nt bSkipEmpty,  
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a60 2a 20 54 72 75 65 20 74 6f 20 69 67 6e 6f 72 65  * True to ignore
13a70 20 64 65 6c 65 74 65 2d 6b 65 79 73 20 2a 2f 0a   delete-keys */.
13a80 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f 51    /* FTS5INDEX_Q
13ab0 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20 2a  UERY_XXX flags *
13ac0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
13ad0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
13ae0 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
13af0 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f  eek to (or NULL/
13b00 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  0) */.  int iLev
13b10 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
13b20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
13b30 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d 31 20   to iterate (-1 
13b40 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e  for all) */.  in
13b50 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20  t nSegment,     
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13b70 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
13b80 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28 69 4c  nts to merge (iL
13b90 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46 74  evel>=0) */.  Ft
13ba0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
13bb0 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 2f 2a  *ppOut        /*
13bc0 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29   New object */.)
13bd0 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20  {.  int nSeg;   
13be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bf0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13c00 20 73 65 67 6d 65 6e 74 73 20 6d 65 72 67 65 64   segments merged
13c10 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b   */.  int nSlot;
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c30 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20 6f        /* Power o
13c40 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f  f two >= nSeg */
13c50 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30  .  int iIter = 0
13c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13c70 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69     /* */.  int i
13c80 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
13c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
13ca0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
13cb0 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a  rough segments *
13cc0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
13cd0 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20  eLevel *pLvl;.  
13ce0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
13cf0 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72   *pNew;..  asser
13d00 74 28 20 28 70 54 65 72 6d 3d 3d 30 20 26 26 20  t( (pTerm==0 && 
13d10 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65  nTerm==0) || iLe
13d20 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  vel<0 );..  /* A
13d30 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
13d40 72 20 74 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d  r the new multi-
13d50 73 65 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f  seg-iterator. */
13d60 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20  .  if( iLevel<0 
13d70 29 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 66 74  ){.    nSeg = ft
13d80 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
13d90 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74  Segments(pStruct
13da0 29 3b 0a 20 20 20 20 6e 53 65 67 20 2b 3d 20 28  );.    nSeg += (
13db0 70 2d 3e 61 70 48 61 73 68 20 3f 20 31 20 3a 20  p->apHash ? 1 : 
13dc0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
13dd0 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72   nSeg = MIN(pStr
13de0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
13df0 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65  el].nSeg, nSegme
13e00 6e 74 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e  nt);.  }.  for(n
13e10 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53  Slot=2; nSlot<nS
13e20 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a  eg; nSlot=nSlot*
13e30 32 29 3b 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70  2);.  *ppOut = p
13e40 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  New = fts5IdxMal
13e50 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73 69  loc(p, .      si
13e60 7a 65 6f 66 28 46 74 73 35 4d 75 6c 74 69 53 65  zeof(Fts5MultiSe
13e70 67 49 74 65 72 29 20 2b 20 20 20 20 20 20 20 20  gIter) +        
13e80 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20    /* pNew */.   
13e90 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65     sizeof(Fts5Se
13ea0 67 49 74 65 72 29 20 2a 20 6e 53 6c 6f 74 20 2b  gIter) * nSlot +
13eb0 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e         /* pNew->
13ec0 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20  aSeg[] */.      
13ed0 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65 73 75  sizeof(Fts5CResu
13ee0 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20  lt) * nSlot     
13ef0 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69      /* pNew->aFi
13f00 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20  rst[] */.  );.  
13f10 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
13f20 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  turn;.  pNew->nS
13f30 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 70 4e  eg = nSlot;.  pN
13f40 65 77 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  ew->aSeg = (Fts5
13f50 53 65 67 49 74 65 72 2a 29 26 70 4e 65 77 5b 31  SegIter*)&pNew[1
13f60 5d 3b 0a 20 20 70 4e 65 77 2d 3e 61 46 69 72 73  ];.  pNew->aFirs
13f70 74 20 3d 20 28 46 74 73 35 43 52 65 73 75 6c 74  t = (Fts5CResult
13f80 2a 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53  *)&pNew->aSeg[nS
13f90 6c 6f 74 5d 3b 0a 20 20 70 4e 65 77 2d 3e 62 52  lot];.  pNew->bR
13fa0 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20  ev = (0!=(flags 
13fb0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
13fc0 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77  Y_DESC));.  pNew
13fd0 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 62  ->bSkipEmpty = b
13fe0 53 6b 69 70 45 6d 70 74 79 3b 0a 0a 20 20 2f 2a  SkipEmpty;..  /*
13ff0 20 49 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68   Initialize each
14000 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e   of the componen
14010 74 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  t segment iterat
14020 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c  ors. */.  if( iL
14030 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 46 74  evel<0 ){.    Ft
14040 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
14050 20 2a 70 45 6e 64 20 3d 20 26 70 53 74 72 75 63   *pEnd = &pStruc
14060 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63  t->aLevel[pStruc
14070 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  t->nLevel];.    
14080 69 66 28 20 70 2d 3e 61 70 48 61 73 68 20 29 7b  if( p->apHash ){
14090 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20  .      /* Add a 
140a0 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
140b0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
140c0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
140d0 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a   hash table. */.
140e0 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
140f0 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77  r *pIter = &pNew
14100 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b  ->aSeg[iIter++];
14110 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
14120 65 72 48 61 73 68 49 6e 69 74 28 70 2c 20 69 49  erHashInit(p, iI
14130 64 78 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, pTerm, nTerm
14140 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72 29 3b  , flags, pIter);
14150 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
14160 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c  Lvl=&pStruct->aL
14170 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45  evel[0]; pLvl<pE
14180 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20  nd; pLvl++){.   
14190 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c     for(iSeg=pLvl
141a0 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  ->nSeg-1; iSeg>=
141b0 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
141c0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
141d0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
141e0 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
141f0 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  g];.        Fts5
14200 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
14210 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
14220 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 69  er++];.        i
14230 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
14240 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
14250 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78  IterInit(p, iIdx
14260 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
14270 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14280 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
14290 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20  IterSeekInit(p, 
142a0 69 49 64 78 2c 20 70 54 65 72 6d 2c 20 6e 54 65  iIdx, pTerm, nTe
142b0 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c  rm, flags, pSeg,
142c0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
142d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
142e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
142f0 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
14300 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20  Level[iLevel];. 
14310 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67     for(iSeg=nSeg
14320 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65  -1; iSeg>=0; iSe
14330 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73 35  g--){.      fts5
14340 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 69  SegIterInit(p, i
14350 49 64 78 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Idx, &pLvl->aSeg
14360 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61  [iSeg], &pNew->a
14370 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20  Seg[iIter++]);. 
14380 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
14390 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29  t( iIter==nSeg )
143a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  ;..  /* If the a
143b0 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73  bove was success
143c0 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  ful, each compon
143d0 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f  ent iterators no
143e0 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74  w points .  ** t
143f0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
14400 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74  y in its segment
14410 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
14420 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20  nitialize the . 
14430 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72   ** aFirst[] arr
14440 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  ay. Or, if an er
14450 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
14460 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61  , free the itera
14470 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20  tor.  ** object 
14480 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70  and set the outp
14490 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e  ut variable to N
144a0 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ULL.  */.  if( p
144b0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
144c0 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72  ){.    for(iIter
144d0 3d 6e 53 6c 6f 74 2d 31 3b 20 69 49 74 65 72 3e  =nSlot-1; iIter>
144e0 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20  0; iIter--){.   
144f0 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20     int iEq;.    
14500 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73    if( (iEq = fts
14510 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
14520 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29  are(pNew, iIter)
14530 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ) ){.        fts
14540 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20  5SegIterNext(p, 
14550 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d  &pNew->aSeg[iEq]
14560 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74  , 0);.        ft
14570 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
14580 63 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71  ced(p, pNew, iEq
14590 2c 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , iIter);.      
145a0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  }.    }.    fts5
145b0 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
145c0 65 74 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a  etup(p, pNew);..
145d0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53      if( pNew->bS
145e0 6b 69 70 45 6d 70 74 79 20 0a 20 20 20 20 20 26  kipEmpty .     &
145f0 26 20 66 74 73 35 53 65 67 49 74 65 72 49 73 44  & fts5SegIterIsD
14600 65 6c 65 74 65 28 70 2c 20 26 70 4e 65 77 2d 3e  elete(p, &pNew->
14610 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69 72 73  aSeg[pNew->aFirs
14620 74 5b 31 5d 2e 69 46 69 72 73 74 5d 29 20 0a 20  t[1].iFirst]) . 
14630 20 20 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35     ){.      fts5
14640 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
14650 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20   pNew, 0, 0);.  
14660 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
14670 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
14680 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ee(p, pNew);.   
14690 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d   *ppOut = 0;.  }
146a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
146b0 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
146c0 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46 20  rator is at EOF 
146d0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  or if an error h
146e0 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a  as occurred. .**
146f0 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   False otherwise
14700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14710 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
14720 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
14730 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
14740 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
14750 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65  n (p->rc || pIte
14760 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
14770 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
14780 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a   ].pLeaf==0);.}.
14790 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
147a0 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65  e rowid of the e
147b0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
147c0 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
147d0 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49   points.** to. I
147e0 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
147f0 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65  oints to EOF whe
14800 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
14810 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a  is called the.**
14820 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64   results are und
14830 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
14840 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49  c i64 fts5MultiI
14850 74 65 72 52 6f 77 69 64 28 46 74 73 35 4d 75 6c  terRowid(Fts5Mul
14860 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
14870 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
14880 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
14890 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
148a0 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72  t ].pLeaf );.  r
148b0 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65  eturn pIter->aSe
148c0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
148d0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f  [1].iFirst ].iRo
148e0 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  wid;.}../*.** Mo
148f0 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
14900 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
14910 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  y at or followin
14920 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61  g iMatch..*/.sta
14930 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
14940 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a  tiIterNextFrom(.
14950 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
14960 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
14970 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69  ter *pIter, .  i
14980 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77  64 iMatch.){.  w
14990 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
149a0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66  64 iRowid;.    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 49 74 65 72 2c 20 31 2c 20 69 4d  (p, pIter, 1, iM
149d0 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66  atch);.    if( f
149e0 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
149f0 70 2c 20 70 49 74 65 72 29 20 29 20 62 72 65 61  p, pIter) ) brea
14a00 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20  k;.    iRowid = 
14a10 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
14a20 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69  id(pIter);.    i
14a30 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  f( pIter->bRev==
14a40 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61  0 && iRowid>=iMa
14a50 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
14a60 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76   if( pIter->bRev
14a70 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69  !=0 && iRowid<=i
14a80 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
14a90 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
14aa0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
14ab0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
14ac0 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73 73  ing the term ass
14ad0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
14ae0 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20   .** entry that 
14af0 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72  the iterator cur
14b00 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
14b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
14b20 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49  t u8 *fts5MultiI
14b30 74 65 72 54 65 72 6d 28 46 74 73 35 4d 75 6c 74  terTerm(Fts5Mult
14b40 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
14b50 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73   int *pn){.  Fts
14b60 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70  5SegIter *p = &p
14b70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
14b80 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
14b90 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70  rst ];.  *pn = p
14ba0 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75  ->term.n;.  retu
14bb0 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a  rn p->term.p;.}.
14bc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
14bd0 75 65 20 69 66 20 74 68 65 20 63 68 75 6e 6b 20  ue if the chunk 
14be0 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
14bf0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14c00 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 61 74 20  gument is.** at 
14c10 45 4f 46 2e 20 4f 72 20 69 66 20 61 6e 20 65 72  EOF. Or if an er
14c20 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
14c30 6f 63 63 75 72 72 65 64 2e 20 4f 74 68 65 72 77  occurred. Otherw
14c40 69 73 65 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ise, return fals
14c50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14c60 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f   fts5ChunkIterEo
14c70 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  f(Fts5Index *p, 
14c80 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70  Fts5ChunkIter *p
14c90 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
14ca0 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
14cb0 3e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f  >pLeaf==0);.}../
14cc0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
14cd0 20 63 68 75 6e 6b 2d 69 74 65 72 61 74 6f 72 20   chunk-iterator 
14ce0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
14cf0 6b 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65 61  k of data to rea
14d00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
14d10 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e  d fts5ChunkIterN
14d20 65 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ext(Fts5Index *p
14d30 2c 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20  , Fts5ChunkIter 
14d40 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
14d50 74 28 20 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 3d  t( pIter->nRem>=
14d60 70 49 74 65 72 2d 3e 6e 20 29 3b 0a 20 20 70 49  pIter->n );.  pI
14d70 74 65 72 2d 3e 6e 52 65 6d 20 2d 3d 20 70 49 74  ter->nRem -= pIt
14d80 65 72 2d 3e 6e 3b 0a 20 20 66 74 73 35 44 61 74  er->n;.  fts5Dat
14d90 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
14da0 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d  pLeaf);.  pIter-
14db0 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 70 49  >pLeaf = 0;.  pI
14dc0 74 65 72 2d 3e 70 20 3d 20 30 3b 0a 20 20 69 66  ter->p = 0;.  if
14dd0 28 20 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 30 20  ( pIter->nRem>0 
14de0 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
14df0 2a 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65  *pLeaf;.    pIte
14e00 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 2b 2b 3b  r->iLeafRowid++;
14e10 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74  .    pLeaf = pIt
14e20 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35  er->pLeaf = fts5
14e30 44 61 74 61 52 65 61 64 28 70 2c 20 70 49 74 65  DataRead(p, pIte
14e40 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  r->iLeafRowid);.
14e50 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
14e60 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 20  .      pIter->n 
14e70 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e 6e 52 65  = MIN(pIter->nRe
14e80 6d 2c 20 70 4c 65 61 66 2d 3e 6e 2d 34 29 3b 0a  m, pLeaf->n-4);.
14e90 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 20 3d        pIter->p =
14ea0 20 70 4c 65 61 66 2d 3e 70 2b 34 3b 0a 20 20 20   pLeaf->p+4;.   
14eb0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
14ec0 49 6e 74 69 61 6c 69 7a 65 20 74 68 65 20 63 68  Intialize the ch
14ed0 75 6e 6b 20 69 74 65 72 61 74 6f 72 20 74 6f 20  unk iterator to 
14ee0 72 65 61 64 20 74 68 65 20 70 6f 73 69 74 69 6f  read the positio
14ef0 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20  n list data for 
14f00 77 68 69 63 68 20 0a 2a 2a 20 74 68 65 20 73 69  which .** the si
14f10 7a 65 20 66 69 65 6c 64 20 69 73 20 61 74 20 6f  ze field is at o
14f20 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20 6c 65  ffset iOff of le
14f30 61 66 20 70 4c 65 61 66 2e 20 0a 2a 2f 0a 73 74  af pLeaf. .*/.st
14f40 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68  atic void fts5Ch
14f50 75 6e 6b 49 74 65 72 49 6e 69 74 28 0a 20 20 46  unkIterInit(.  F
14f60 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f80 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
14f90 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
14fa0 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20 20 20  egIter *pSeg,   
14fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
14fc0 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 74  gment iterator t
14fd0 6f 20 72 65 61 64 20 70 6f 73 6c 69 73 74 20 66  o read poslist f
14fe0 72 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 43 68 75  rom */.  Fts5Chu
14ff0 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  nkIter *pIter   
15000 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
15010 69 61 6c 69 7a 65 20 74 68 69 73 20 6f 62 6a 65  ialize this obje
15020 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  ct */.){.  Fts5D
15030 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 53 65  ata *pLeaf = pSe
15040 67 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20  g->pLeaf;.  int 
15050 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 4c 65  iOff = pSeg->iLe
15060 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 6d 65 6d  afOffset;..  mem
15070 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
15080 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
15090 20 2f 2a 20 49 66 20 46 74 73 35 53 65 67 49 74   /* If Fts5SegIt
150a0 65 72 2e 70 53 65 67 20 69 73 20 4e 55 4c 4c 2c  er.pSeg is NULL,
150b0 20 74 68 65 6e 20 74 68 69 73 20 69 74 65 72 61   then this itera
150c0 74 6f 72 20 69 74 65 72 61 74 65 73 20 74 68 72  tor iterates thr
150d0 6f 75 67 68 20 64 61 74 61 0a 20 20 2a 2a 20 63  ough data.  ** c
150e0 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
150f0 69 6e 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e  in a hash table.
15100 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
15110 65 72 65 20 69 73 20 6e 6f 20 6c 65 61 66 2d 72  ere is no leaf-r
15120 6f 77 69 64 0a 20 20 2a 2a 20 74 6f 20 63 61 6c  owid.  ** to cal
15130 63 75 6c 61 74 65 2e 20 20 2a 2f 0a 20 20 69 66  culate.  */.  if
15140 28 20 70 53 65 67 2d 3e 70 53 65 67 20 29 7b 0a  ( pSeg->pSeg ){.
15150 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53      int iId = pS
15160 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  eg->pSeg->iSegid
15170 3b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20  ;.    i64 rowid 
15180 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
15190 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c  OWID(pSeg->iIdx,
151a0 20 69 49 64 2c 20 30 2c 20 70 53 65 67 2d 3e 69   iId, 0, pSeg->i
151b0 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70  LeafPgno);.    p
151c0 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64  Iter->iLeafRowid
151d0 20 3d 20 72 6f 77 69 64 3b 0a 20 20 7d 0a 0a 20   = rowid;.  }.. 
151e0 20 66 74 73 35 44 61 74 61 52 65 66 65 72 65 6e   fts5DataReferen
151f0 63 65 28 70 4c 65 61 66 29 3b 0a 20 20 70 49 74  ce(pLeaf);.  pIt
15200 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61  er->pLeaf = pLea
15210 66 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d  f;.  pIter->nRem
15220 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20   = pSeg->nPos;. 
15230 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28   pIter->n = MIN(
15240 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f 66 66 2c  pLeaf->n - iOff,
15250 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b 0a 20   pIter->nRem);. 
15260 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 4c 65 61   pIter->p = pLea
15270 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a 20 20 69  f->p + iOff;.  i
15280 66 28 20 70 49 74 65 72 2d 3e 6e 3d 3d 30 20 29  f( pIter->n==0 )
15290 7b 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49  {.    fts5ChunkI
152a0 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
152b0 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
152c0 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49   void fts5ChunkI
152d0 74 65 72 52 65 6c 65 61 73 65 28 46 74 73 35 43  terRelease(Fts5C
152e0 68 75 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 29  hunkIter *pIter)
152f0 7b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  {.  fts5DataRele
15300 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
15310 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
15320 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = 0;.}../*.** 
15330 52 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 20  Read and return 
15340 74 68 65 20 6e 65 78 74 20 33 32 2d 62 69 74 20  the next 32-bit 
15350 76 61 72 69 6e 74 20 66 72 6f 6d 20 74 68 65 20  varint from the 
15360 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 74  position-list it
15370 65 72 61 74 6f 72 20 0a 2a 2a 20 70 61 73 73 65  erator .** passe
15380 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
15390 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
153a0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
153b0 72 73 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75  rs, zero is retu
153c0 72 6e 65 64 20 61 6e 20 61 6e 20 65 72 72 6f 72  rned an an error
153d0 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 0a 2a   code left in .*
153e0 2a 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  * Fts5Index.rc. 
153f0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
15400 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
15410 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
15420 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ion is.** called
15430 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
15440 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
15450 74 73 35 50 6f 73 49 74 65 72 52 65 61 64 56 61  ts5PosIterReadVa
15460 72 69 6e 74 28 46 74 73 35 49 6e 64 65 78 20 2a  rint(Fts5Index *
15470 70 2c 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a  p, Fts5PosIter *
15480 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 56  pIter){.  int iV
15490 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  al = 0;.  if( p-
154a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
154b0 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
154c0 3e 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 63 68  >iOff>=pIter->ch
154d0 75 6e 6b 2e 6e 20 29 7b 0a 20 20 20 20 20 20 66  unk.n ){.      f
154e0 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74  ts5ChunkIterNext
154f0 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e  (p, &pIter->chun
15500 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  k);.      if( ft
15510 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70  s5ChunkIterEof(p
15520 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29  , &pIter->chunk)
15530 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
15540 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d     pIter->iOff =
15550 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49   0;.    }.    pI
15560 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  ter->iOff += fts
15570 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49  5GetVarint32(&pI
15580 74 65 72 2d 3e 63 68 75 6e 6b 2e 70 5b 70 49 74  ter->chunk.p[pIt
15590 65 72 2d 3e 69 4f 66 66 5d 2c 20 69 56 61 6c 29  er->iOff], iVal)
155a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
155b0 56 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  Val;.}../*.** Ad
155c0 76 61 6e 63 65 20 74 68 65 20 70 6f 73 69 74 69  vance the positi
155d0 6f 6e 20 6c 69 73 74 20 69 74 65 72 61 74 6f 72  on list iterator
155e0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
155f0 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
15600 69 64 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65  id fts5PosIterNe
15610 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
15620 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49   Fts5PosIter *pI
15630 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c  ter){.  int iVal
15640 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74 73 35  ;.  assert( fts5
15650 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20  ChunkIterEof(p, 
15660 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d  &pIter->chunk)==
15670 30 20 29 3b 0a 20 20 69 56 61 6c 20 3d 20 66 74  0 );.  iVal = ft
15680 73 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72  s5PosIterReadVar
15690 69 6e 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  int(p, pIter);. 
156a0 20 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74   if( fts5ChunkIt
156b0 65 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d  erEof(p, &pIter-
156c0 3e 63 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20  >chunk)==0 ){.  
156d0 20 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b    if( iVal==1 ){
156e0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 43  .      pIter->iC
156f0 6f 6c 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72  ol = fts5PosIter
15700 52 65 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49  ReadVarint(p, pI
15710 74 65 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65  ter);.      pIte
15720 72 2d 3e 69 50 6f 73 20 3d 20 66 74 73 35 50 6f  r->iPos = fts5Po
15730 73 49 74 65 72 52 65 61 64 56 61 72 69 6e 74 28  sIterReadVarint(
15740 70 2c 20 70 49 74 65 72 29 20 2d 20 32 3b 0a 20  p, pIter) - 2;. 
15750 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15760 70 49 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28  pIter->iPos += (
15770 69 56 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 7d  iVal - 2);.    }
15780 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
15790 69 74 69 61 6c 69 7a 65 20 74 68 65 20 46 74 73  itialize the Fts
157a0 35 50 6f 73 49 74 65 72 20 6f 62 6a 65 63 74 20  5PosIter object 
157b0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
157c0 6e 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  nal argument to 
157d0 69 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75  iterate.** throu
157e0 67 68 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  gh the position-
157f0 6c 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 20  list associated 
15800 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 65  with the index e
15810 6e 74 72 79 20 74 68 61 74 20 69 74 65 72 61 74  ntry that iterat
15820 6f 72 20 0a 2a 2a 20 70 4d 75 6c 74 69 20 63 75  or .** pMulti cu
15830 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
15840 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
15850 64 20 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69  d fts5PosIterIni
15860 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
15870 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
15880 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
15890 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
158a0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
158b0 72 20 2a 70 4d 75 6c 74 69 2c 20 20 20 20 20 20  r *pMulti,      
158c0 20 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 20 69 74   /* Multi-seg it
158d0 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70  erator to read p
158e0 6f 73 2d 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a  os-list from */.
158f0 20 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70    Fts5PosIter *p
15900 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
15910 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
15920 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  this object */.)
15930 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
15940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15950 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
15960 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65  g = &pMulti->aSe
15970 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73  g[ pMulti->aFirs
15980 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
15990 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c     memset(pIter,
159a0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
159b0 72 29 29 3b 0a 20 20 20 20 66 74 73 35 43 68 75  r));.    fts5Chu
159c0 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53  nkIterInit(p, pS
159d0 65 67 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e  eg, &pIter->chun
159e0 6b 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35  k);.    if( fts5
159f0 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20  ChunkIterEof(p, 
15a00 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d  &pIter->chunk)==
15a10 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50  0 ){.      fts5P
15a20 6f 73 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  osIterNext(p, pI
15a30 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
15a40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15a50 74 72 75 65 20 69 66 20 74 68 65 20 70 6f 73 69  true if the posi
15a60 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 20 70 61  tion iterator pa
15a70 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
15a80 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a  nd argument is.*
15a90 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20  * at EOF. Or if 
15aa0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
15ab0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f  eady occurred. O
15ac0 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
15ad0 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   false..*/.stati
15ae0 63 20 69 6e 74 20 66 74 73 35 50 6f 73 49 74 65  c int fts5PosIte
15af0 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
15b00 70 2c 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a  p, Fts5PosIter *
15b10 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
15b20 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72   (p->rc || pIter
15b30 2d 3e 63 68 75 6e 6b 2e 70 4c 65 61 66 3d 3d 30  ->chunk.pLeaf==0
15b40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
15b50 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  cate a new segme
15b60 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73 74  nt-id for the st
15b70 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
15b80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
15b90 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
15ba0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
15bb0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
15bc0 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75  p. 0 is .** retu
15bd0 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  rned in this cas
15be0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
15bf0 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
15c00 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  id(Fts5Index *p,
15c10 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
15c20 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
15c30 69 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  i;.  if( p->rc!=
15c40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
15c50 72 6e 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  rn 0;..  for(i=0
15c60 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20  ; i<100; i++){. 
15c70 20 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20     int iSegid;. 
15c80 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
15c90 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e 74  mness(sizeof(int
15ca0 29 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69  ), (void*)&iSegi
15cb0 64 29 3b 0a 20 20 20 20 69 53 65 67 69 64 20 3d  d);.    iSegid =
15cc0 20 69 53 65 67 69 64 20 26 20 28 28 31 20 3c 3c   iSegid & ((1 <<
15cd0 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29   FTS5_DATA_ID_B)
15ce0 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65  -1);.    if( iSe
15cf0 67 69 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  gid ){.      int
15d00 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
15d10 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
15d20 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
15d30 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
15d40 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
15d50 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
15d60 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
15d70 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
15d80 20 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64        if( iSegid
15d90 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ==pStruct->aLeve
15da0 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
15db0 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20  g].iSegid ){.   
15dc0 20 20 20 20 20 20 20 20 20 69 53 65 67 69 64 20           iSegid 
15dd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
15de0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15df0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
15e00 20 69 53 65 67 69 64 20 29 20 72 65 74 75 72 6e   iSegid ) return
15e10 20 69 53 65 67 69 64 3b 0a 20 20 7d 0a 0a 20 20   iSegid;.  }..  
15e20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  p->rc = SQLITE_E
15e30 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 30  RROR;.  return 0
15e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
15e50 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72  rd all data curr
15e60 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20  ently cached in 
15e70 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e  the hash-tables.
15e80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15e90 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
15ea0 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a  Data(Fts5Index *
15eb0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
15ec0 3e 61 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50  >apHash || p->nP
15ed0 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b  endingData==0 );
15ee0 0a 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68  .  if( p->apHash
15ef0 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
15f00 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
15f10 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69 6e  >pConfig;.    in
15f20 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
15f30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  ; i<=pConfig->nP
15f40 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  refix; i++){.   
15f50 20 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68     if( p->apHash
15f60 5b 69 5d 20 29 20 73 71 6c 69 74 65 33 46 74 73  [i] ) sqlite3Fts
15f70 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 61 70  5HashClear(p->ap
15f80 48 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Hash[i]);.    }.
15f90 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
15fa0 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ata = 0;.  }.}..
15fb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
15fc0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65   size of the pre
15fd0 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74  fix, in bytes, t
15fe0 68 61 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77  hat buffer (nNew
15ff0 2f 70 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a  /pNew) shares.**
16000 20 77 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f   with buffer (nO
16010 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61  ld/pOld)..*/.sta
16020 74 69 63 20 69 6e 74 20 66 74 73 35 50 72 65 66  tic int fts5Pref
16030 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e  ixCompress(.  in
16040 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38  t nOld, const u8
16050 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e   *pOld,.  int nN
16060 65 77 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e  ew, const u8 *pN
16070 65 77 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ew.){.  int i;. 
16080 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
16090 20 26 26 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29   && i<nOld; i++)
160a0 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69  {.    if( pOld[i
160b0 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65  ]!=pNew[i] ) bre
160c0 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
160d0 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   i;.}../*.** If 
160e0 61 6e 20 22 6e 45 6d 70 74 79 22 20 72 65 63 6f  an "nEmpty" reco
160f0 72 64 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  rd must be writt
16100 65 6e 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65  en to the b-tree
16110 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74   before the next
16120 0a 2a 2a 20 74 65 72 6d 2c 20 77 72 69 74 65 20  .** term, write 
16130 69 74 20 6e 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  it now..*/.stati
16140 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
16150 42 74 72 65 65 4e 45 6d 70 74 79 28 46 74 73 35  BtreeNEmpty(Fts5
16160 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
16170 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
16180 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ){.  if( pWriter
16190 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20  ->nEmpty ){.    
161a0 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20  int bFlag = 0;. 
161b0 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
161c0 72 20 2a 70 50 67 3b 0a 20 20 20 20 70 50 67 20  r *pPg;.    pPg 
161d0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
161e0 74 65 72 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20  ter[1];.    if( 
161f0 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e  pWriter->nEmpty>
16200 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f  =FTS5_MIN_DLIDX_
16210 53 49 5a 45 20 26 26 20 70 57 72 69 74 65 72 2d  SIZE && pWriter-
16220 3e 63 64 6c 69 64 78 2e 6e 20 29 7b 0a 20 20 20  >cdlidx.n ){.   
16230 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20 46 54     i64 iKey = FT
16240 53 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52  S5_DOCLIST_IDX_R
16250 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20  OWID(.          
16260 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70  pWriter->iIdx, p
16270 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
16280 0a 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74  .          pWrit
16290 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70  er->aWriter[0].p
162a0 67 6e 6f 20 2d 20 31 20 2d 20 70 57 72 69 74 65  gno - 1 - pWrite
162b0 72 2d 3e 6e 45 6d 70 74 79 0a 20 20 20 20 20 20  r->nEmpty.      
162c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
162d0 20 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78   pWriter->cdlidx
162e0 2e 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 74  .n>0 );.      ft
162f0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69  s5DataWrite(p, i
16300 4b 65 79 2c 20 70 57 72 69 74 65 72 2d 3e 63 64  Key, pWriter->cd
16310 6c 69 64 78 2e 70 2c 20 70 57 72 69 74 65 72 2d  lidx.p, pWriter-
16320 3e 63 64 6c 69 64 78 2e 6e 29 3b 0a 20 20 20 20  >cdlidx.n);.    
16330 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20    bFlag = 1;.   
16340 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
16350 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
16360 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c  ->rc, &pPg->buf,
16370 20 62 46 6c 61 67 29 3b 0a 20 20 20 20 66 74 73   bFlag);.    fts
16380 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
16390 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67  int(&p->rc, &pPg
163a0 2d 3e 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e  ->buf, pWriter->
163b0 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 70 57 72  nEmpty);.    pWr
163c0 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30  iter->nEmpty = 0
163d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 74  ;.  }..  /* Whet
163e0 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 77 61  her or not it wa
163f0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  s written to dis
16400 6b 2c 20 7a 65 72 6f 20 74 68 65 20 64 6f 63 6c  k, zero the docl
16410 69 73 74 20 69 6e 64 65 78 20 61 74 20 74 68 69  ist index at thi
16420 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 20 2a 2f 0a  s.  ** point */.
16430 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
16440 66 65 72 5a 65 72 6f 28 26 70 57 72 69 74 65 72  ferZero(&pWriter
16450 2d 3e 63 64 6c 69 64 78 29 3b 0a 20 20 70 57 72  ->cdlidx);.  pWr
16460 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76  iter->bDlidxPrev
16470 56 61 6c 69 64 20 3d 20 30 3b 0a 7d 0a 0a 73 74  Valid = 0;.}..st
16480 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
16490 69 74 65 42 74 72 65 65 47 72 6f 77 28 46 74 73  iteBtreeGrow(Fts
164a0 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
164b0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
164c0 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
164d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
164e0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
164f0 20 2a 61 4e 65 77 3b 0a 20 20 20 20 46 74 73 35   *aNew;.    Fts5
16500 50 61 67 65 57 72 69 74 65 72 20 2a 70 4e 65 77  PageWriter *pNew
16510 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d  ;.    int nNew =
16520 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65   sizeof(Fts5Page
16530 57 72 69 74 65 72 29 20 2a 20 28 70 57 72 69 74  Writer) * (pWrit
16540 65 72 2d 3e 6e 57 72 69 74 65 72 2b 31 29 3b 0a  er->nWriter+1);.
16550 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 46 74 73  .    aNew = (Fts
16560 35 50 61 67 65 57 72 69 74 65 72 2a 29 73 71 6c  5PageWriter*)sql
16570 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72  ite3_realloc(pWr
16580 69 74 65 72 2d 3e 61 57 72 69 74 65 72 2c 20 6e  iter->aWriter, n
16590 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  New);.    if( aN
165a0 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
165b0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
165c0 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  MEM;.      retur
165d0 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e  n;.    }..    pN
165e0 65 77 20 3d 20 26 61 4e 65 77 5b 70 57 72 69 74  ew = &aNew[pWrit
165f0 65 72 2d 3e 6e 57 72 69 74 65 72 5d 3b 0a 20 20  er->nWriter];.  
16600 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
16610 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67  , sizeof(Fts5Pag
16620 65 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 70  eWriter));.    p
16630 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  New->pgno = 1;. 
16640 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
16650 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
16660 2c 20 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29  , &pNew->buf, 1)
16670 3b 0a 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  ;..    pWriter->
16680 6e 57 72 69 74 65 72 2b 2b 3b 0a 20 20 20 20 70  nWriter++;.    p
16690 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20  Writer->aWriter 
166a0 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = aNew;.  }.}../
166b0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
166c0 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
166d0 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65  h leaf page exce
166e0 70 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61  pt the first tha
166f0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74  t contains.** at
16700 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
16710 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d   Argument (nTerm
16720 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73  /pTerm) is the s
16730 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72  plit-key - a ter
16740 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  m that.** is lar
16750 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72  ger than all ter
16760 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61  ms written to ea
16770 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e  rlier leaves, an
16780 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a  d equal to or.**
16790 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
167a0 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
167b0 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a  the new leaf..**
167c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
167d0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
167e0 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
167f0 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
16800 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61  f an error.** ha
16810 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
16820 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
16830 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
16840 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
16850 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
16860 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72  ts5WriteBtreeTer
16870 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
16880 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
16890 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
168a0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
168b0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
168c0 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
168d0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
168e0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  t */.  int nTerm
168f0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
16900 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  m      /* First 
16910 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65  term on new page
16920 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65   */.){.  int iHe
16930 69 67 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69  ight;.  for(iHei
16940 67 68 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68  ght=1; 1; iHeigh
16950 74 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61  t++){.    Fts5Pa
16960 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b  geWriter *pPage;
16970 0a 0a 20 20 20 20 69 66 28 20 69 48 65 69 67 68  ..    if( iHeigh
16980 74 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69  t>=pWriter->nWri
16990 74 65 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ter ){.      fts
169a0 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28  5WriteBtreeGrow(
169b0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
169c0 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
169d0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
169e0 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
169f0 72 2d 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67  r->aWriter[iHeig
16a00 68 74 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  ht];..    fts5Wr
16a10 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70  iteBtreeNEmpty(p
16a20 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20  , pWriter);..   
16a30 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
16a40 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
16a50 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  gsz ){.      /* 
16a60 70 50 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72  pPage will be wr
16a70 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54  itten to disk. T
16a80 68 65 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20  he term will be 
16a90 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
16aa0 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74  .      ** parent
16ab0 20 6f 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20   of pPage.  */. 
16ac0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
16ad0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
16ae0 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20  OWID(.          
16af0 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70  pWriter->iIdx, p
16b00 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
16b10 69 48 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e  iHeight, pPage->
16b20 70 67 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20  pgno.      );.  
16b30 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
16b40 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61  e(p, iRowid, pPa
16b50 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65  ge->buf.p, pPage
16b60 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  ->buf.n);.      
16b70 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
16b80 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20  pPage->buf);.   
16b90 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
16ba0 6f 28 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b  o(&pPage->term);
16bb0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
16bc0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
16bd0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
16be0 66 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e  f, pPage[-1].pgn
16bf0 6f 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  o);.      pPage-
16c00 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >pgno++;.    }el
16c10 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50  se{.      int nP
16c20 72 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  re = fts5PrefixC
16c30 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74  ompress(pPage->t
16c40 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65  erm.n, pPage->te
16c50 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65  rm.p, nTerm, pTe
16c60 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  rm);.      fts5B
16c70 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
16c80 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
16c90 2d 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a  ->buf, nPre+2);.
16ca0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
16cb0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
16cc0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
16cd0 2c 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20  , nTerm-nPre);. 
16ce0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
16cf0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
16d00 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
16d10 54 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d  Term-nPre, pTerm
16d20 2b 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74  +nPre);.      ft
16d30 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
16d40 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d  rc, &pPage->term
16d50 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
16d60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16d70 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
16d80 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
16d90 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46  BtreeNoTerm(.  F
16da0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
16db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16dc0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
16dd0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
16de0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
16df0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r          /* Wr
16e00 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  iter object */.)
16e10 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  {.  if( pWriter-
16e20 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
16e30 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  ge ){.    /* No 
16e40 72 6f 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70  rowids on this p
16e50 61 67 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30  age. Append an 0
16e60 78 30 30 20 62 79 74 65 20 74 6f 20 74 68 65 20  x00 byte to the 
16e70 63 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20  current .    ** 
16e80 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f  doclist-index */
16e90 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
16ea0 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69  ->bDlidxPrevVali
16eb0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 36  d==0 ){.      i6
16ec0 34 20 69 52 6f 77 69 64 20 3d 20 70 57 72 69 74  4 iRowid = pWrit
16ed0 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 3b 0a  er->iPrevRowid;.
16ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
16ef0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
16f00 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  int(&p->rc, &pWr
16f10 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c 20 69 52  iter->cdlidx, iR
16f20 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 57 72  owid);.      pWr
16f30 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76  iter->bDlidxPrev
16f40 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
16f50 20 70 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78   pWriter->iDlidx
16f60 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20  Prev = iRowid;. 
16f70 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16f80 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
16f90 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
16fa0 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c  pWriter->cdlidx,
16fb0 20 30 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74   0);.  }.  pWrit
16fc0 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a  er->nEmpty++;.}.
16fd0 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f  ./*.** Rowid iRo
16fe0 77 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65  wid has just bee
16ff0 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
17000 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
17010 61 67 65 2e 20 41 73 20 69 74 20 69 73 0a 2a 2a  age. As it is.**
17020 20 74 68 65 20 66 69 72 73 74 20 6f 6e 20 69 74   the first on it
17030 73 20 70 61 67 65 2c 20 61 70 70 65 6e 64 20 61  s page, append a
17040 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63  n entry to the c
17050 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69  urrent doclist-i
17060 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
17070 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c  void fts5WriteDl
17080 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73  idxAppend(.  Fts
17090 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
170a0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
170b0 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f  iter, .  i64 iRo
170c0 77 69 64 0a 29 7b 0a 20 20 69 36 34 20 69 56 61  wid.){.  i64 iVa
170d0 6c 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  l;.  if( pWriter
170e0 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69  ->bDlidxPrevVali
170f0 64 20 29 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20  d ){.    iVal = 
17100 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72  iRowid - pWriter
17110 2d 3e 69 44 6c 69 64 78 50 72 65 76 3b 0a 20 20  ->iDlidxPrev;.  
17120 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
17130 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
17140 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
17150 20 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64   &pWriter->cdlid
17160 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  x, iRowid);.    
17170 69 56 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  iVal = 1;.  }.  
17180 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
17190 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
171a0 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e  ->rc, &pWriter->
171b0 63 64 6c 69 64 78 2c 20 69 56 61 6c 29 3b 0a 20  cdlidx, iVal);. 
171c0 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78   pWriter->bDlidx
171d0 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
171e0 20 70 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78   pWriter->iDlidx
171f0 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 7d  Prev = iRowid;.}
17200 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
17210 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
17220 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
17230 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
17240 72 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63  riter){.  static
17250 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d   const u8 zero[]
17260 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c   = { 0x00, 0x00,
17270 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20   0x00, 0x00 };. 
17280 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
17290 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
172a0 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20  r->aWriter[0];. 
172b0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20   i64 iRowid;..  
172c0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
172d0 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
172e0 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20  .    /* No term 
172f0 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  was written to t
17300 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  his page. */.   
17310 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35   assert( 0==fts5
17320 47 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  GetU16(&pPage->b
17330 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20  uf.p[2]) );.    
17340 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f  fts5WriteBtreeNo
17350 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29  Term(p, pWriter)
17360 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
17370 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
17380 67 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f  ge to the db. */
17390 0a 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  .  iRowid = FTS5
173a0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
173b0 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
173c0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30  riter->iSegid, 0
173d0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
173e0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
173f0 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
17400 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
17410 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e  buf.n);..  /* In
17420 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78  itialize the nex
17430 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  t page. */.  fts
17440 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
17450 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35  ge->buf);.  fts5
17460 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
17470 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
17480 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a  >buf, 4, zero);.
17490 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b    pPage->pgno++;
174a0 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20  ..  /* Increase 
174b0 74 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74  the leaves writt
174c0 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  en counter */.  
174d0 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72  pWriter->nLeafWr
174e0 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54  itten++;..  /* T
174f0 68 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64  he new leaf hold
17500 73 20 6e 6f 20 74 65 72 6d 73 20 2a 2f 0a 20 20  s no terms */.  
17510 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
17520 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d  ermInPage = 1;.}
17530 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
17540 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
17550 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
17560 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20  eing written by 
17570 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65  the writer passe
17580 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f  d.** as the seco
17590 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
175a0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
175b0 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
175c0 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
175d0 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
175e0 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
175f0 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
17600 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
17610 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
17620 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
17630 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74  AppendTerm(.  Ft
17640 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
17650 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
17660 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65  riter,.  int nTe
17670 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  rm, const u8 *pT
17680 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  erm .){.  int nP
17690 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
176a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
176b0 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
176c0 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72  pression for ter
176d0 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  m */.  Fts5PageW
176e0 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
176f0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
17700 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  [0];..  assert( 
17710 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pPage==0 || pPag
17720 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70  e->buf.n==0 || p
17730 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b  Page->buf.n>4 );
17740 0a 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20  .  if( pPage && 
17750 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20  pPage->buf.n==0 
17760 29 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74  ){.    /* Zero t
17770 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 61 6e  he first term an
17780 64 20 66 69 72 73 74 20 64 6f 63 69 64 20 66 69  d first docid fi
17790 65 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74 61 74  elds */.    stat
177a0 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
177b0 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30  [] = { 0x00, 0x0
177c0 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b  0, 0x00, 0x00 };
177d0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
177e0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
177f0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34  , &pPage->buf, 4
17800 2c 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61 73 73  , zero);.    ass
17810 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 62 46  ert( pWriter->bF
17820 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
17830 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72  ;.  }.  if( p->r
17840 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20  c ) return;.  . 
17850 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
17860 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
17870 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  {.    /* Update 
17880 74 68 65 20 22 66 69 72 73 74 20 74 65 72 6d 22  the "first term"
17890 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
178a0 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  ge header. */.  
178b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
178c0 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20  >buf.p[2]==0 && 
178d0 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d  pPage->buf.p[3]=
178e0 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 50 75  =0 );.    fts5Pu
178f0 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
17900 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75  .p[2], pPage->bu
17910 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65 66 69  f.n);.    nPrefi
17920 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
17930 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  Page->pgno!=1 ){
17940 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
17950 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
17960 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20   on a leaf that 
17970 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d  is not the leftm
17980 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20  ost leaf in.    
17990 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74    ** the segment
179a0 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73   b-tree. In this
179b0 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65   case it is nece
179c0 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74  ssary to add a t
179d0 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  erm to.      ** 
179e0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
179f0 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29  rchy that is (a)
17a00 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
17a10 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20   largest term . 
17a20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
17a30 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
17a40 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73  egment and (b) s
17a50 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65  maller than or e
17a60 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  qual to.      **
17a70 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f   this term. In o
17a80 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72  ther words, a pr
17a90 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e  efix of (pTerm/n
17aa0 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e  Term) that is on
17ab0 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
17ac0 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
17ad0 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28  longest prefix (
17ae0 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61  pTerm/nTerm) sha
17af0 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  res with the.   
17b00 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74     ** previous t
17b10 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  erm. .      **. 
17b20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c       ** Usually,
17b30 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
17b40 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  rm is available 
17b50 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20  in pPage->term. 
17b60 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  The exception.  
17b70 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69      ** is if thi
17b80 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
17b90 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61  erm written in a
17ba0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
17bb0 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20  rge step..      
17bc0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
17bd0 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
17be0 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  m is not availab
17bf0 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74  le, so just writ
17c00 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
17c10 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  y of (pTerm/nTer
17c20 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  m) into the pare
17c30 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  nt node. This is
17c40 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
17c50 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20  ** inefficient, 
17c60 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63  but still correc
17c70 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  t.  */.      int
17c80 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
17c90 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
17ca0 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  m.n ){.        n
17cb0 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69   = 1 + fts5Prefi
17cc0 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
17cd0 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
17ce0 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
17cf0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Term);.      }. 
17d00 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
17d10 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74  reeTerm(p, pWrit
17d20 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20  er, n, pTerm);. 
17d30 20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57       pPage = &pW
17d40 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
17d50 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
17d60 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  {.    nPrefix = 
17d70 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
17d80 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  ss(pPage->term.n
17d90 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c  , pPage->term.p,
17da0 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
17db0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
17dc0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
17dd0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
17de0 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20  nPrefix);.  }.. 
17df0 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e   /* Append the n
17e00 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
17e10 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e  f new data, then
17e20 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69   the term data i
17e30 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68  tself.  ** to th
17e40 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  e page. */.  fts
17e50 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
17e60 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
17e70 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d  ge->buf, nTerm -
17e80 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73   nPrefix);.  fts
17e90 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
17ea0 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
17eb0 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
17ec0 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e  Prefix, &pTerm[n
17ed0 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20  Prefix]);..  /* 
17ee0 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50  Update the Fts5P
17ef0 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66  ageWriter.term f
17f00 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42  ield. */.  fts5B
17f10 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
17f20 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e   &pPage->term, n
17f30 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
17f40 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
17f50 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a  ermInPage = 0;..
17f60 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
17f70 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
17f80 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
17f90 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
17fa0 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 1;..  /* If 
17fb0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
17fc0 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66   page is full, f
17fd0 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e  lush it to disk.
17fe0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
17ff0 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
18000 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
18010 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
18020 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
18030 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
18040 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
18050 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
18060 20 41 70 70 65 6e 64 20 61 20 64 6f 63 69 64 20   Append a docid 
18070 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  and position-lis
18080 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20  t size field to 
18090 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74 70  the writers outp
180a0 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ut. .*/.static v
180b0 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
180c0 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35  endRowid(.  Fts5
180d0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
180e0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
180f0 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69  ter,.  i64 iRowi
18100 64 2c 0a 20 20 69 6e 74 20 6e 50 6f 73 0a 29 7b  d,.  int nPos.){
18110 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
18120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
18130 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
18140 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
18150 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20  >aWriter[0];..  
18160 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
18170 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
18180 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
18190 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
181a0 68 65 20 0a 20 20 20 20 2a 2a 20 64 6f 63 69 64  he .    ** docid
181b0 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
181c0 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
181d0 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
181e0 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
181f0 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20    ** buffer, in 
18200 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  case a doclist-i
18210 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64  ndex is required
18220 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  .  */.    if( pW
18230 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
18240 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
18250 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61    fts5PutU16(pPa
18260 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65  ge->buf.p, pPage
18270 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  ->buf.n);.      
18280 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
18290 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c  pend(p, pWriter,
182a0 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a   iRowid);.    }.
182b0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
182c0 65 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 20 20  e docid. */.    
182d0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
182e0 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
182f0 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  t || pWriter->bF
18300 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
18310 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
18320 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
18330 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
18340 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  buf, iRowid);.  
18350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
18360 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
18370 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e  iRowid>pWriter->
18380 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20  iPrevRowid );.  
18390 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
183a0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
183b0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
183c0 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72  iRowid - pWriter
183d0 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20  ->iPrevRowid);. 
183e0 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72     }.    pWriter
183f0 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69  ->iPrevRowid = i
18400 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74  Rowid;.    pWrit
18410 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
18420 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20  nDoclist = 0;.  
18430 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
18440 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
18450 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ;..    fts5Buffe
18460 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
18470 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
18480 66 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 69  f, nPos);..    i
18490 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
184a0 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
184b0 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  z ){.      fts5W
184c0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
184d0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
184e0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
184f0 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
18500 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
18510 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
18520 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
18530 49 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  Int(.  Fts5Index
18540 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
18550 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
18560 20 20 69 6e 74 20 69 56 61 6c 0a 29 7b 0a 20 20    int iVal.){.  
18570 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
18580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
18590 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
185a0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  e = &pWriter->aW
185b0 72 69 74 65 72 5b 30 5d 3b 0a 20 20 20 20 66 74  riter[0];.    ft
185c0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
185d0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
185e0 61 67 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b  age->buf, iVal);
185f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
18600 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69  buf.n>=p->pConfi
18610 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  g->pgsz ){.     
18620 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
18630 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
18640 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
18650 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
18660 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
18670 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
18680 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50  fts5WriteAppendP
18690 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74  oslistData(.  Ft
186a0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
186b0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
186c0 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20  riter, .  const 
186d0 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e  u8 *aData, .  in
186e0 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73  t nData.){.  Fts
186f0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
18700 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  ge = &pWriter->a
18710 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 63 6f 6e  Writer[0];.  con
18720 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61  st u8 *a = aData
18730 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74  ;.  int n = nDat
18740 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  a;.  .  assert( 
18750 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
18760 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  >0 );.  while( p
18770 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
18780 26 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e  && (pPage->buf.n
18790 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69   + n)>=p->pConfi
187a0 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69  g->pgsz ){.    i
187b0 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f  nt nReq = p->pCo
187c0 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61  nfig->pgsz - pPa
187d0 67 65 2d 3e 62 75 66 2e 6e 3b 0a 20 20 20 20 69  ge->buf.n;.    i
187e0 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20  nt nCopy = 0;.  
187f0 20 20 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e    while( nCopy<n
18800 52 65 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34  Req ){.      i64
18810 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43   dummy;.      nC
18820 6f 70 79 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  opy += getVarint
18830 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34  (&a[nCopy], (u64
18840 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d  *)&dummy);.    }
18850 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
18860 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
18870 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
18880 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20  Copy, a);.    a 
18890 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20  += nCopy;.    n 
188a0 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74  -= nCopy;.    ft
188b0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
188c0 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
188d0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
188e0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31  tRowidInPage = 1
188f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20  ;.  }.  if( n>0 
18900 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
18910 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
18920 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
18930 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   n, a);.  }.}..s
18940 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
18950 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79  riteAppendZeroby
18960 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
18970 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
18980 70 57 72 69 74 65 72 29 7b 0a 20 20 66 74 73 35  pWriter){.  fts5
18990 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
189a0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  nt(&p->rc, &pWri
189b0 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e  ter->aWriter[0].
189c0 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  buf, 0);.}../*.*
189d0 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61  * Flush any data
189e0 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77   cached by the w
189f0 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20  riter object to 
18a00 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72  the database. Fr
18a10 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ee any.** alloca
18a20 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
18a30 20 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72   with the writer
18a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18a50 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
18a60 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
18a70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
18a80 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
18a90 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
18aa0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  bject */.  int *
18ab0 70 6e 48 65 69 67 68 74 2c 20 20 20 20 20 20 20  pnHeight,       
18ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
18ad0 54 3a 20 48 65 69 67 68 74 20 6f 66 20 74 68 65  T: Height of the
18ae0 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
18af0 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20   *pnLeaf        
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18b10 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c  OUT: Number of l
18b20 65 61 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74  eaf pages in b-t
18b30 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ree */.){.  int 
18b40 69 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  i;.  if( p->rc==
18b50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18b60 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
18b70 2a 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65  *pLeaf = &pWrite
18b80 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20  r->aWriter[0];. 
18b90 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67     if( pLeaf->pg
18ba0 6e 6f 3d 3d 31 20 26 26 20 70 4c 65 61 66 2d 3e  no==1 && pLeaf->
18bb0 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  buf.n==0 ){.    
18bc0 20 20 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20    *pnLeaf = 0;. 
18bd0 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
18be0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
18bf0 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e       if( pLeaf->
18c00 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20  buf.n>4 ){.     
18c10 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
18c20 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
18c30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18c40 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66   *pnLeaf = pLeaf
18c50 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 20 20  ->pgno-1;.      
18c60 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 57 72  if( pWriter->nWr
18c70 69 74 65 72 3d 3d 31 20 26 26 20 70 57 72 69 74  iter==1 && pWrit
18c80 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35  er->nEmpty>=FTS5
18c90 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
18ca0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57  ){.        fts5W
18cb0 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c  riteBtreeGrow(p,
18cc0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
18cd0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57 72   }.      if( pWr
18ce0 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3e 31 20  iter->nWriter>1 
18cf0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57  ){.        fts5W
18d00 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28  riteBtreeNEmpty(
18d10 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
18d20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 48 65     }.      *pnHe
18d30 69 67 68 74 20 3d 20 70 57 72 69 74 65 72 2d 3e  ight = pWriter->
18d40 6e 57 72 69 74 65 72 3b 0a 0a 20 20 20 20 20 20  nWriter;..      
18d50 66 6f 72 28 69 3d 31 3b 20 69 3c 70 57 72 69 74  for(i=1; i<pWrit
18d60 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b  er->nWriter; i++
18d70 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  ){.        Fts5P
18d80 61 67 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d  ageWriter *pPg =
18d90 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
18da0 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 66  er[i];.        f
18db0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
18dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53  .            FTS
18dd0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
18de0 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70  pWriter->iIdx, p
18df0 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
18e00 69 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 2c 20 0a  i, pPg->pgno), .
18e10 20 20 20 20 20 20 20 20 20 20 20 20 70 50 67 2d              pPg-
18e20 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66  >buf.p, pPg->buf
18e30 2e 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .n.        );.  
18e40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18e50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72    for(i=0; i<pWr
18e60 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69  iter->nWriter; i
18e70 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  ++){.    Fts5Pag
18e80 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26  eWriter *pPg = &
18e90 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
18ea0 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
18eb0 20 70 50 67 20 7c 7c 20 70 2d 3e 72 63 21 3d 53   pPg || p->rc!=S
18ec0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
18ed0 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
18ee0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
18ef0 26 70 50 67 2d 3e 74 65 72 6d 29 3b 0a 20 20 20  &pPg->term);.   
18f00 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
18f10 65 28 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20 20  e(&pPg->buf);.  
18f20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
18f30 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e  3_free(pWriter->
18f40 61 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69  aWriter);.  sqli
18f50 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
18f60 65 28 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69  e(&pWriter->cdli
18f70 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  dx);.}..static v
18f80 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69  oid fts5WriteIni
18f90 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
18fa0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
18fb0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20  ter *pWriter, . 
18fc0 20 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69   int iIdx, int i
18fd0 53 65 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73 65  Segid.){.  memse
18fe0 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69  t(pWriter, 0, si
18ff0 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74  zeof(Fts5SegWrit
19000 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  er));.  pWriter-
19010 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20  >iIdx = iIdx;.  
19020 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20  pWriter->iSegid 
19030 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 70 57 72  = iSegid;..  pWr
19040 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20  iter->aWriter = 
19050 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a  (Fts5PageWriter*
19060 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
19070 2c 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65  ,sizeof(Fts5Page
19080 57 72 69 74 65 72 29 29 3b 0a 20 20 69 66 28 20  Writer));.  if( 
19090 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
190a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
190b0 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
190c0 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
190d0 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f  >aWriter[0].pgno
190e0 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
190f0 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
19100 65 20 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63  e = 1;.}..static
19110 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49   void fts5WriteI
19120 6e 69 74 46 6f 72 41 70 70 65 6e 64 28 0a 20 20  nitForAppend(.  
19130 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
19140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19150 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
19160 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
19170 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
19180 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er,         /* W
19190 72 69 74 65 72 20 74 6f 20 69 6e 69 74 69 61 6c  riter to initial
191a0 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ize */.  int iId
191b0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
191c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
191d0 78 20 73 65 67 6d 65 6e 74 20 69 73 20 61 20 70  x segment is a p
191e0 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35  art of */.  Fts5
191f0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
19200 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53   *pSeg      /* S
19210 65 67 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f  egment object to
19220 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b   append to */.){
19230 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70  .  int nByte = p
19240 53 65 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73  Seg->nHeight * s
19250 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72  izeof(Fts5PageWr
19260 69 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  iter);.  memset(
19270 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  pWriter, 0, size
19280 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
19290 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  ));.  pWriter->i
192a0 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57  Idx = iIdx;.  pW
192b0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  riter->iSegid = 
192c0 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
192d0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
192e0 20 3d 20 28 46 74 73 35 50 61 67 65 57 72 69 74   = (Fts5PageWrit
192f0 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
19300 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70  c(p, nByte);.  p
19310 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20  Writer->nWriter 
19320 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3b  = pSeg->nHeight;
19330 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
19340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19350 69 6e 74 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  int pgno = 1;.  
19360 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 57 72    int i;.    pWr
19370 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
19380 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67  .pgno = pSeg->pg
19390 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 66 6f  noLast+1;.    fo
193a0 72 28 69 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68  r(i=pSeg->nHeigh
193b0 74 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  t-1; i>0; i--){.
193c0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
193d0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
193e0 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
193f0 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  Idx, pWriter->iS
19400 65 67 69 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a  egid, i, pgno);.
19410 20 20 20 20 20 20 46 74 73 35 50 61 67 65 57 72        Fts5PageWr
19420 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72  iter *pPg = &pWr
19430 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d  iter->aWriter[i]
19440 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  ;.      pPg->pgn
19450 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  o = pgno;.      
19460 66 74 73 35 44 61 74 61 42 75 66 66 65 72 28 70  fts5DataBuffer(p
19470 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f  , &pPg->buf, iRo
19480 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
19490 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
194a0 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
194b0 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20  NodeIter ss;.   
194c0 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65       fts5NodeIte
194d0 72 49 6e 69 74 28 70 50 67 2d 3e 62 75 66 2e 70  rInit(pPg->buf.p
194e0 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73  , pPg->buf.n, &s
194f0 73 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  s);.        whil
19500 65 28 20 73 73 2e 61 44 61 74 61 20 29 20 66 74  e( ss.aData ) ft
19510 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
19520 70 2d 3e 72 63 2c 20 26 73 73 29 3b 0a 20 20 20  p->rc, &ss);.   
19530 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
19540 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d  et(&p->rc, &pPg-
19550 3e 74 65 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e  >term, ss.term.n
19560 2c 20 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20  , ss.term.p);.  
19570 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e        pgno = ss.
19580 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20  iChild;.        
19590 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65  fts5NodeIterFree
195a0 28 26 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (&ss);.      }. 
195b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 65     }.    if( pSe
195c0 67 2d 3e 6e 48 65 69 67 68 74 3d 3d 31 20 29 7b  g->nHeight==1 ){
195d0 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
195e0 6e 45 6d 70 74 79 20 3d 20 70 53 65 67 2d 3e 70  nEmpty = pSeg->p
195f0 67 6e 6f 4c 61 73 74 2d 31 3b 0a 20 20 20 20 7d  gnoLast-1;.    }
19600 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 67  .    assert( (pg
19610 6e 6f 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  no+pWriter->nEmp
19620 74 79 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  ty)==pSeg->pgnoL
19630 61 73 74 20 29 3b 0a 20 20 20 20 70 57 72 69 74  ast );.    pWrit
19640 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
19650 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 61 73  Page = 1;.    as
19660 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 61  sert( pWriter->a
19670 57 72 69 74 65 72 5b 30 5d 2e 74 65 72 6d 2e 6e  Writer[0].term.n
19680 3d 3d 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ==0 );.  }.}../*
19690 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
196a0 65 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69  er was used to i
196b0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
196c0 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
196d0 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e  s of on an.** in
196e0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
196f0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
19700 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
19710 65 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d  ed if the increm
19720 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73  ental.** merge s
19730 74 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64  tep has finished
19740 20 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68   but the input h
19750 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70  as not been comp
19760 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64  letely exhausted
19770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19780 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
19790 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
197a0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
197b0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
197c0 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i;.  Fts5Buffer 
197d0 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
197e0 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
197f0 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f  s5Buffer));.  fo
19800 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
19810 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
19820 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
19830 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
19840 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65  [i];.    if( pSe
19850 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20  g->pSeg==0 ){.  
19860 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
19870 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
19880 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  eg->pLeaf==0 ){.
19890 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
198a0 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a  ->pgnoLast = 0;.
198b0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
198c0 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b  ->pgnoFirst = 0;
198d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
198e0 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65    int iOff = pSe
198f0 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  g->iTermLeafOffs
19900 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  et;     /* Offse
19910 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c  t on new first l
19920 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
19930 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64    i64 iLeafRowid
19940 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61  ;.      Fts5Data
19950 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69   *pData;.      i
19960 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70  nt iId = pSeg->p
19970 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
19980 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20     u8 aHdr[4] = 
19990 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30  {0x00, 0x00, 0x0
199a0 30 2c 20 30 78 30 34 7d 3b 0a 0a 20 20 20 20 20  0, 0x04};..     
199b0 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54   iLeafRowid = FT
199c0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
199d0 28 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64  (pSeg->iIdx, iId
199e0 2c 20 30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d  , 0, pSeg->iTerm
199f0 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
19a00 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
19a10 61 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f  aRead(p, iLeafRo
19a20 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
19a30 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
19a40 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
19a50 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66  &buf);.        f
19a60 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
19a70 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
19a80 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20  , sizeof(aHdr), 
19a90 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66  aHdr);.        f
19aa0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
19ab0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
19ac0 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
19ad0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
19ae0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
19af0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
19b00 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67  eg->term.n, pSeg
19b10 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20  ->term.p);.     
19b20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
19b30 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
19b40 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 20 2d  &buf, pData->n -
19b50 20 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70   iOff, &pData->p
19b60 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20  [iOff]);.       
19b70 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
19b80 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  (pData);.       
19b90 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
19ba0 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69  oFirst = pSeg->i
19bb0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  TermLeafPgno;.  
19bc0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65        fts5DataDe
19bd0 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47  lete(p, FTS5_SEG
19be0 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
19bf0 3e 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 31  >iIdx, iId, 0, 1
19c00 29 2c 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  ),iLeafRowid);. 
19c10 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57         fts5DataW
19c20 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77  rite(p, iLeafRow
19c30 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e  id, buf.p, buf.n
19c40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19c50 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
19c60 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a  rFree(&buf);.}..
19c70 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
19c80 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65  void fts5IndexMe
19c90 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35  rgeLevel(.  Fts5
19ca0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19cc0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
19cd0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
19ce0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19cf0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19d00 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20   to work on */. 
19d10 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
19d20 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
19d30 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63   /* IN/OUT: Stuc
19d40 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 69 49  ture of index iI
19d50 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  dx */.  int iLvl
19d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19d70 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
19d80 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66   to read input f
19d90 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rom */.  int *pn
19da0 52 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Rem             
19db0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
19dc0 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e  e up to this man
19dd0 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20  y output leaves 
19de0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
19df0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
19e00 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74   *ppStruct;.  Ft
19e10 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
19e20 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
19e30 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
19e40 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
19e50 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a  Level *pLvlOut;.
19e60 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
19e70 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20  er *pIter = 0;  
19e80 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
19e90 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61   read input data
19ea0 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d   */.  int nRem =
19eb0 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20   pnRem ? *pnRem 
19ec0 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20  : 0;  /* Output 
19ed0 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20  leaf pages left 
19ee0 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e  to write */.  in
19ef0 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20  t nInput;       
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19f10 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
19f20 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
19f30 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
19f40 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
19f50 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
19f60 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
19f70 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
19f80 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73       /* Output s
19f90 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
19fa0 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69  Buffer term;.  i
19fb0 6e 74 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69  nt bRequireDocli
19fc0 73 74 54 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f  stTerm = 0;    /
19fd0 2a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e  * Doclist termin
19fe0 61 74 6f 72 20 28 30 78 30 30 29 20 72 65 71 75  ator (0x00) requ
19ff0 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  ired */.  int bO
1a000 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  ldest;          
1a010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1a020 65 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  e if the output 
1a030 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f  segment is the o
1a040 6c 64 65 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ldest */..  asse
1a050 72 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  rt( iLvl<pStruct
1a060 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73  ->nLevel );.  as
1a070 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72  sert( pLvl->nMer
1a080 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29  ge<=pLvl->nSeg )
1a090 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69  ;..  memset(&wri
1a0a0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
1a0b0 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a  ts5SegWriter));.
1a0c0 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
1a0d0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
1a0e0 66 66 65 72 29 29 3b 0a 20 20 77 72 69 74 65 72  ffer));.  writer
1a0f0 2e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20  .iIdx = iIdx;.  
1a100 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
1a110 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20   ){.    pLvlOut 
1a120 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1a130 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20  el[iLvl+1];.    
1a140 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d  assert( pLvlOut-
1a150 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e  >nSeg>0 );.    n
1a160 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d  Input = pLvl->nM
1a170 65 72 67 65 3b 0a 20 20 20 20 66 74 73 35 57 72  erge;.    fts5Wr
1a180 69 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64  iteInitForAppend
1a190 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64  (p, &writer, iId
1a1a0 78 2c 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65  x, &pLvlOut->aSe
1a1b0 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d  g[pLvlOut->nSeg-
1a1c0 31 5d 29 3b 0a 20 20 20 20 70 53 65 67 20 3d 20  1]);.    pSeg = 
1a1d0 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
1a1e0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b  LvlOut->nSeg-1];
1a1f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1a200 74 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41  t iSegid = fts5A
1a210 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20  llocateSegid(p, 
1a220 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f  pStruct);..    /
1a230 2a 20 45 78 74 65 6e 64 20 74 68 65 20 46 74 73  * Extend the Fts
1a240 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
1a250 74 20 61 73 20 72 65 71 75 69 72 65 64 20 74 6f  t as required to
1a260 20 65 6e 73 75 72 65 20 74 68 65 20 6f 75 74 70   ensure the outp
1a270 75 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  ut.    ** segmen
1a280 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20  t exists. */.   
1a290 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75   if( iLvl==pStru
1a2a0 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a  ct->nLevel-1 ){.
1a2b0 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
1a2c0 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e  ureAddLevel(&p->
1a2d0 72 63 2c 20 70 70 53 74 72 75 63 74 29 3b 0a 20  rc, ppStruct);. 
1a2e0 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 2a       pStruct = *
1a2f0 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a  ppStruct;.    }.
1a300 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1a310 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d  eExtendLevel(&p-
1a320 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 4c  >rc, pStruct, iL
1a330 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20  vl+1, 1, 0);.   
1a340 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
1a350 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20  urn;.    pLvl = 
1a360 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1a370 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c  [iLvl];.    pLvl
1a380 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Out = &pStruct->
1a390 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a  aLevel[iLvl+1];.
1a3a0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e  .    fts5WriteIn
1a3b0 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69  it(p, &writer, i
1a3c0 49 64 78 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  Idx, iSegid);.. 
1a3d0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
1a3e0 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65  w segment to the
1a3f0 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f   output level */
1a400 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 2b 31 3d  .    if( iLvl+1=
1a410 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
1a420 20 29 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   ) pStruct->nLev
1a430 65 6c 2b 2b 3b 0a 20 20 20 20 70 53 65 67 20 3d  el++;.    pSeg =
1a440 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
1a450 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a  pLvlOut->nSeg];.
1a460 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65      pLvlOut->nSe
1a470 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70  g++;.    pSeg->p
1a480 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  gnoFirst = 1;.  
1a490 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d    pSeg->iSegid =
1a4a0 20 69 53 65 67 69 64 3b 0a 0a 20 20 20 20 2f 2a   iSegid;..    /*
1a4b0 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   Read input from
1a4c0 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e   all segments in
1a4d0 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
1a4e0 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d   */.    nInput =
1a4f0 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d   pLvl->nSeg;.  }
1a500 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c  .  bOldest = (pL
1a510 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26  vlOut->nSeg==1 &
1a520 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  & pStruct->nLeve
1a530 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 23 69 66  l==iLvl+2);..#if
1a540 20 30 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75   0.fprintf(stdou
1a550 74 2c 20 22 6d 65 72 67 69 6e 67 20 25 64 20 73  t, "merging %d s
1a560 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 6c 65 76  egments from lev
1a570 65 6c 20 25 64 21 22 2c 20 6e 49 6e 70 75 74 2c  el %d!", nInput,
1a580 20 69 4c 76 6c 29 3b 0a 66 66 6c 75 73 68 28 73   iLvl);.fflush(s
1a590 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  tdout);.#endif..
1a5a0 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d    assert( iLvl>=
1a5b0 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d  0 );.  for(fts5M
1a5c0 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
1a5d0 53 74 72 75 63 74 2c 20 69 49 64 78 2c 20 30 2c  Struct, iIdx, 0,
1a5e0 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20   0, 0, 0, iLvl, 
1a5f0 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b  nInput, &pIter);
1a600 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
1a610 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
1a620 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
1a630 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
1a640 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20   pIter, 0, 0).  
1a650 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
1a660 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
1a670 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
1a680 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
1a690 20 5d 3b 0a 20 20 20 20 46 74 73 35 43 68 75 6e   ];.    Fts5Chun
1a6a0 6b 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20  kIter sPos;     
1a6b0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1a6c0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1a6d0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   position list *
1a6e0 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  /..    /* If the
1a6f0 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77   segment being w
1a700 72 69 74 74 65 6e 20 69 73 20 74 68 65 20 6f 6c  ritten is the ol
1a710 64 65 73 74 20 69 6e 20 74 68 65 20 65 6e 74 69  dest in the enti
1a720 72 65 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 20  re index and.   
1a730 20 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   ** the position
1a740 20 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 28   list is empty (
1a750 69 2e 65 2e 20 74 68 65 20 65 6e 74 72 79 20 69  i.e. the entry i
1a760 73 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65  s a delete marke
1a770 72 29 2c 20 6e 6f 0a 20 20 20 20 2a 2a 20 65 6e  r), no.    ** en
1a780 74 72 79 20 6e 65 65 64 20 62 65 20 77 72 69 74  try need be writ
1a790 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
1a7a0 74 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 43  t.  */.    fts5C
1a7b0 68 75 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c 20  hunkIterInit(p, 
1a7c0 70 53 65 67 2c 20 26 73 50 6f 73 29 3b 0a 20 20  pSeg, &sPos);.  
1a7d0 20 20 69 66 28 20 62 4f 6c 64 65 73 74 3d 3d 30    if( bOldest==0
1a7e0 20 7c 7c 20 73 50 6f 73 2e 6e 52 65 6d 3e 30 20   || sPos.nRem>0 
1a7f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65  ){.      int nTe
1a800 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  rm;.      const 
1a810 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35  u8 *pTerm = fts5
1a820 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
1a830 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20  ter, &nTerm);.  
1a840 20 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74      if( nTerm!=t
1a850 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  erm.n || memcmp(
1a860 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e  pTerm, term.p, n
1a870 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  Term) ){.       
1a880 20 69 66 28 20 70 6e 52 65 6d 20 26 26 20 77 72   if( pnRem && wr
1a890 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65  iter.nLeafWritte
1a8a0 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20  n>nRem ){.      
1a8b0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
1a8c0 72 52 65 6c 65 61 73 65 28 26 73 50 6f 73 29 3b  rRelease(&sPos);
1a8d0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1a8e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1a8f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
1a900 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65  a new term. Appe
1a910 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  nd a term to the
1a920 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
1a930 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1a940 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54  bRequireDoclistT
1a950 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  erm ){.         
1a960 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
1a970 5a 65 72 6f 62 79 74 65 28 70 2c 20 26 77 72 69  Zerobyte(p, &wri
1a980 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
1a990 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
1a9a0 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26  eAppendTerm(p, &
1a9b0 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70  writer, nTerm, p
1a9c0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 66  Term);.        f
1a9d0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
1a9e0 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72  >rc, &term, nTer
1a9f0 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
1aa00 20 20 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69     bRequireDocli
1aa10 73 74 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  stTerm = 1;.    
1aa20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 70    }..      /* Ap
1aa30 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74  pend the rowid t
1aa40 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
1aa50 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
1aa60 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
1aa70 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
1aa80 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74  ndRowid(p, &writ
1aa90 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  er, fts5MultiIte
1aaa0 72 52 6f 77 69 64 28 70 49 74 65 72 29 2c 20 73  rRowid(pIter), s
1aab0 50 6f 73 2e 6e 52 65 6d 2a 32 29 3b 0a 0a 20 20  Pos.nRem*2);..  
1aac0 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 6f 70 20      for(/* noop 
1aad0 2a 2f 3b 20 21 66 74 73 35 43 68 75 6e 6b 49 74  */; !fts5ChunkIt
1aae0 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73 29 3b  erEof(p, &sPos);
1aaf0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65   fts5ChunkIterNe
1ab00 78 74 28 70 2c 20 26 73 50 6f 73 29 29 7b 0a 20  xt(p, &sPos)){. 
1ab10 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1ab20 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74  AppendPoslistDat
1ab30 61 28 70 2c 20 26 77 72 69 74 65 72 2c 20 73 50  a(p, &writer, sP
1ab40 6f 73 2e 70 2c 20 73 50 6f 73 2e 6e 29 3b 0a 20  os.p, sPos.n);. 
1ab50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ab60 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52    fts5ChunkIterR
1ab70 65 6c 65 61 73 65 28 26 73 50 6f 73 29 3b 0a 20  elease(&sPos);. 
1ab80 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74   }..  /* Flush t
1ab90 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  he last leaf pag
1aba0 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74  e to disk. Set t
1abb0 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1abc0 74 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a  t b-tree height.
1abd0 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65    ** and last le
1abe0 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  af page number a
1abf0 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
1ac00 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65    */.  fts5Write
1ac10 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65  Finish(p, &write
1ac20 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65 69 67 68  r, &pSeg->nHeigh
1ac30 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  t, &pSeg->pgnoLa
1ac40 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35  st);..  if( fts5
1ac50 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
1ac60 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e  pIter) ){.    in
1ac70 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  t i;..    /* Rem
1ac80 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e  ove the redundan
1ac90 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  t segments from 
1aca0 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
1acb0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1acc0 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b   i<nInput; i++){
1acd0 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
1ace0 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20  emoveSegment(p, 
1acf0 69 49 64 78 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  iIdx, pLvl->aSeg
1ad00 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  [i].iSegid);.   
1ad10 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76   }..    /* Remov
1ad20 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
1ad30 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
1ad40 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f  e input level */
1ad50 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e  .    if( pLvl->n
1ad60 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20  Seg!=nInput ){. 
1ad70 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d       int nMove =
1ad80 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e   (pLvl->nSeg - n
1ad90 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28  Input) * sizeof(
1ada0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1adb0 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ment);.      mem
1adc0 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c  move(pLvl->aSeg,
1add0 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e   &pLvl->aSeg[nIn
1ade0 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20  put], nMove);.  
1adf0 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53    }.    pLvl->nS
1ae00 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  eg -= nInput;.  
1ae10 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d    pLvl->nMerge =
1ae20 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67   0;.    if( pSeg
1ae30 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b  ->pgnoLast==0 ){
1ae40 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e  .      pLvlOut->
1ae50 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nSeg--;.    }.  
1ae60 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1ae70 74 28 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  t( pSeg->nHeight
1ae80 3e 30 20 26 26 20 70 53 65 67 2d 3e 70 67 6e 6f  >0 && pSeg->pgno
1ae90 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74  Last>0 );.    ft
1aea0 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70  s5TrimSegments(p
1aeb0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c  , pIter);.    pL
1aec0 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e  vl->nMerge = nIn
1aed0 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  put;.  }..  fts5
1aee0 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c  MultiIterFree(p,
1aef0 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42   pIter);.  fts5B
1af00 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29  ufferFree(&term)
1af10 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20  ;.  if( pnRem ) 
1af20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72  *pnRem -= writer
1af30 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d  .nLeafWritten;.}
1af40 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ../*.** A total 
1af50 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61  of nLeaf leaf pa
1af60 67 65 73 20 6f 66 20 64 61 74 61 20 68 61 73 20  ges of data has 
1af70 6a 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65  just been flushe
1af80 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a  d to a level-0.*
1af90 2a 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  * segments in in
1afa0 64 65 78 20 69 49 64 78 20 77 69 74 68 20 73 74  dex iIdx with st
1afb0 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
1afc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   This function u
1afd0 70 64 61 74 65 73 20 74 68 65 0a 2a 2a 20 77 72  pdates the.** wr
1afe0 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f  ite-counter acco
1aff0 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 20  rdingly and, if 
1b000 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f  necessary, perfo
1b010 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  rms incremental 
1b020 6d 65 72 67 65 0a 2a 2a 20 77 6f 72 6b 2e 0a 2a  merge.** work..*
1b030 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1b040 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
1b050 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
1b060 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
1b070 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
1b080 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
1b090 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1b0a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1b0b0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
1b0c0 65 78 57 6f 72 6b 28 0a 20 20 46 74 73 35 49 6e  exWork(.  Fts5In
1b0d0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1b0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1b0f0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1b100 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b120 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1b130 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46  o work on */.  F
1b140 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1b150 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
1b160 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
1b170 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
1b180 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ndex */.  int nL
1b190 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
1b1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b1b0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65  ber of output le
1b1c0 61 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65  aves just writte
1b1d0 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  n */.){.  if( p-
1b1e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1b1f0 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
1b200 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
1b210 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 36  ppStruct;.    i6
1b220 34 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  4 nWrite;       
1b230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b240 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
1b250 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  write-counter */
1b260 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20  .    int nWork; 
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b280 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b290 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70  work-quanta to p
1b2a0 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e  erform */.    in
1b2b0 74 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20  t nRem;         
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b2d0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
1b2e0 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74  ges left to writ
1b2f0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64  e */..    /* Upd
1b300 61 74 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f  ate the write-co
1b310 75 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69  unter. While doi
1b320 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b  ng so, set nWork
1b330 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65 20  . */.    nWrite 
1b340 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  = pStruct->nWrit
1b350 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57  eCounter;.    nW
1b360 6f 72 6b 20 3d 20 28 28 6e 57 72 69 74 65 20 2b  ork = ((nWrite +
1b370 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f   nLeaf) / p->nWo
1b380 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74  rkUnit) - (nWrit
1b390 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  e / p->nWorkUnit
1b3a0 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e  );.    pStruct->
1b3b0 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d  nWriteCounter +=
1b3c0 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d   nLeaf;.    nRem
1b3d0 20 3d 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20   = p->nWorkUnit 
1b3e0 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63  * nWork * pStruc
1b3f0 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 0a 20 20 20 20  t->nLevel;..    
1b400 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b  while( nRem>0 ){
1b410 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  .      int iLvl;
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65     /* To iterate
1b440 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
1b450 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 65  */.      int iBe
1b460 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20  stLvl = 0;      
1b470 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66       /* Level of
1b480 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20  fering the most 
1b490 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
1b4a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 65 73  /.      int nBes
1b4b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
1b4c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b4d0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1b4e0 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f  on best level */
1b4f0 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69  ..      /* Set i
1b500 42 65 73 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c  BestLvl to the l
1b510 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70  evel to read inp
1b520 75 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  ut segments from
1b530 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1b540 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  t( pStruct->nLev
1b550 65 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  el>0 );.      fo
1b560 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1b570 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1b580 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1b590 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
1b5a0 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
1b5b0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b5c0 6c 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l];.        if( 
1b5d0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
1b5e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
1b5f0 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74  vl->nMerge>nBest
1b600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b610 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
1b620 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 65  .            nBe
1b630 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  st = pLvl->nMerg
1b640 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1b650 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b670 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
1b680 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20  >nBest ){.      
1b690 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c      nBest = pLvl
1b6a0 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20  ->nSeg;.        
1b6b0 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76    iBestLvl = iLv
1b6c0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
1b6d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1b6e0 66 20 6e 42 65 73 74 20 69 73 20 73 74 69 6c 6c  f nBest is still
1b6f0 20 30 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 64   0, then the ind
1b700 65 78 20 6d 75 73 74 20 62 65 20 65 6d 70 74 79  ex must be empty
1b710 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
1b720 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66  TE_DEBUG.      f
1b730 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74  or(iLvl=0; nBest
1b740 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72  ==0 && iLvl<pStr
1b750 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
1b760 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  l++){.        as
1b770 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61  sert( pStruct->a
1b780 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1b790 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ==0 );.      }.#
1b7a0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
1b7b0 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66 69   nBest<p->pConfi
1b7c0 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a 20  g->nAutomerge . 
1b7d0 20 20 20 20 20 20 26 26 20 70 53 74 72 75 63 74        && pStruct
1b7e0 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76  ->aLevel[iBestLv
1b7f0 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20  l].nMerge==0 .  
1b800 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62      ){.        b
1b810 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1b820 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
1b830 67 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78 2c  geLevel(p, iIdx,
1b840 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74   &pStruct, iBest
1b850 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
1b860 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 6d 3d     assert( nRem=
1b870 3d 30 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  =0 || p->rc==SQL
1b880 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
1b890 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1b8a0 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d  E_OK && pStruct-
1b8b0 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c  >aLevel[iBestLvl
1b8c0 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ].nMerge==0 ){. 
1b8d0 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
1b8e0 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
1b8f0 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75  BestLvl+1, pStru
1b900 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
1b910 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70     *ppStruct = p
1b920 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 0a 20  Struct;.    }.. 
1b930 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1b940 64 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69  d fts5IndexCrisi
1b950 73 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  sMerge(.  Fts5In
1b960 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1b970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1b980 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1b990 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9b0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1b9c0 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46  o work on */.  F
1b9d0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1b9e0 70 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f  pStruct        /
1b9f0 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
1ba00 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
1ba10 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ndex */.){.  Fts
1ba20 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1ba30 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
1ba40 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b  .  int iLvl = 0;
1ba50 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
1ba60 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20  =SQLITE_OK .    
1ba70 20 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75 63    && iLvl<pStruc
1ba80 74 2d 3e 6e 4c 65 76 65 6c 0a 20 20 20 20 20 20  t->nLevel.      
1ba90 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
1baa0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 70  el[iLvl].nSeg>=p
1bab0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73  ->pConfig->nCris
1bac0 69 73 4d 65 72 67 65 20 0a 20 20 29 7b 0a 20 20  isMerge .  ){.  
1bad0 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
1bae0 4c 65 76 65 6c 28 70 2c 20 69 49 64 78 2c 20 26  Level(p, iIdx, &
1baf0 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30  pStruct, iLvl, 0
1bb00 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
1bb10 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69  turePromote(p, i
1bb20 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b  Lvl+1, pStruct);
1bb30 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d  .    iLvl++;.  }
1bb40 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70  .  *ppStruct = p
1bb50 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69  Struct;.}..stati
1bb60 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52  c int fts5IndexR
1bb70 65 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20  eturn(Fts5Index 
1bb80 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
1bb90 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d  p->rc;.  p->rc =
1bba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65   SQLITE_OK;.  re
1bbb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65  turn rc;.}..type
1bbc0 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46  def struct Fts5F
1bbd0 6c 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73  lushCtx Fts5Flus
1bbe0 68 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73  hCtx;.struct Fts
1bbf0 35 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74  5FlushCtx {.  Ft
1bc00 73 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20  s5Index *pIdx;. 
1bc10 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
1bc20 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a  riter; .};../*.*
1bc30 2a 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20  * Buffer aBuf[] 
1bc40 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20  contains a list 
1bc50 6f 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20  of varints, all 
1bc60 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20  small enough to 
1bc70 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62  fit.** in a 32-b
1bc80 69 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75  it integer. Retu
1bc90 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
1bca0 68 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69  he largest prefi
1bcb0 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69  x of this .** li
1bcc0 73 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72  st nMax bytes or
1bcd0 20 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a   less in size..*
1bce0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1bcf0 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63  5PoslistPrefix(c
1bd00 6f 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69  onst u8 *aBuf, i
1bd10 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20  nt nMax){.  int 
1bd20 72 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79  ret;.  u32 dummy
1bd30 3b 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65  ;.  ret = fts5Ge
1bd40 74 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20  tVarint32(aBuf, 
1bd50 64 75 6d 6d 79 29 3b 0a 20 20 77 68 69 6c 65 28  dummy);.  while(
1bd60 20 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20   1 ){.    int i 
1bd70 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
1bd80 32 28 26 61 42 75 66 5b 72 65 74 5d 2c 20 64 75  2(&aBuf[ret], du
1bd90 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 28 72  mmy);.    if( (r
1bda0 65 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29  et + i) > nMax )
1bdb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 65 74 20   break;.    ret 
1bdc0 2b 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75  += i;.  }.  retu
1bdd0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 64 65 66 69  rn ret;.}..#defi
1bde0 6e 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66  ne fts5BufferSaf
1bdf0 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
1be00 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20  , pBlob, nBlob) 
1be10 7b 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 42  { \.  assert( pB
1be20 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75  uf->nSpace>=(pBu
1be30 66 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20  f->n+nBlob) );  
1be40 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d             \.  m
1be50 65 6d 63 70 79 28 26 70 42 75 66 2d 3e 70 5b 70  emcpy(&pBuf->p[p
1be60 42 75 66 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20  Buf->n], pBlob, 
1be70 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20  nBlob);         
1be80 20 20 20 20 5c 0a 20 20 70 42 75 66 2d 3e 6e 20      \.  pBuf->n 
1be90 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  += nBlob;       
1bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
1bec0 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68  ../*.** Flush th
1bed0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  e contents of in
1bee0 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
1bef0 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65  le iHash to a ne
1bf00 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65  w level-0 .** se
1bf10 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41  gment on disk. A
1bf20 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63  lso update the c
1bf30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72  orresponding str
1bf40 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a  ucture record..*
1bf50 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1bf60 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
1bf70 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
1bf80 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
1bf90 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
1bfa0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
1bfb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1bfc0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1bfd0 74 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75  tic void fts5Flu
1bfe0 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e  shOneHash(Fts5In
1bff0 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 48 61 73  dex *p, int iHas
1c000 68 2c 20 69 6e 74 20 2a 70 6e 4c 65 61 66 29 7b  h, int *pnLeaf){
1c010 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70 48 61  .  Fts5Hash *pHa
1c020 73 68 20 3d 20 70 2d 3e 61 70 48 61 73 68 5b 69  sh = p->apHash[i
1c030 48 61 73 68 5d 3b 0a 20 20 46 74 73 35 53 74 72  Hash];.  Fts5Str
1c040 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
1c050 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20  .  int iSegid;. 
1c060 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20   int pgnoLast = 
1c070 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1c080 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20     /* Last leaf 
1c090 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
1c0a0 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  egment */..  /* 
1c0b0 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  Obtain a referen
1c0c0 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  ce to the index 
1c0d0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c  structure and al
1c0e0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67  locate a new seg
1c0f0 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72  ment-id.  ** for
1c100 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30   the new level-0
1c110 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20   segment.  */.  
1c120 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
1c130 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69  ructureRead(p, i
1c140 48 61 73 68 29 3b 0a 20 20 69 53 65 67 69 64 20  Hash);.  iSegid 
1c150 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  = fts5AllocateSe
1c160 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b  gid(p, pStruct);
1c170 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 20 29  ..  if( iSegid )
1c180 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  {.    const int 
1c190 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  pgsz = p->pConfi
1c1a0 67 2d 3e 70 67 73 7a 3b 0a 0a 20 20 20 20 46 74  g->pgsz;..    Ft
1c1b0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1c1c0 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e  nt *pSeg;   /* N
1c1d0 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69  ew segment withi
1c1e0 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20  n pStruct */.   
1c1f0 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20   int nHeight;   
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c210 2a 20 48 65 69 67 68 74 20 6f 66 20 6e 65 77 20  * Height of new 
1c220 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a  segment b-tree *
1c230 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
1c240 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20   *pBuf;         
1c250 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
1c260 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
1c270 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  le leaf page */.
1c280 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50      const u8 *zP
1c290 72 65 76 20 3d 20 30 3b 0a 0a 20 20 20 20 46 74  rev = 0;..    Ft
1c2a0 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
1c2b0 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  er;.    fts5Writ
1c2c0 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
1c2d0 2c 20 69 48 61 73 68 2c 20 69 53 65 67 69 64 29  , iHash, iSegid)
1c2e0 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c  ;..    /* Pre-al
1c2f0 6c 6f 63 61 74 65 20 74 68 65 20 62 75 66 66 65  locate the buffe
1c300 72 20 75 73 65 64 20 74 6f 20 61 73 73 65 6d 62  r used to assemb
1c310 6c 65 20 6c 65 61 66 20 70 61 67 65 73 20 74 6f  le leaf pages to
1c320 20 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20   the target.    
1c330 2a 2a 20 70 61 67 65 20 73 69 7a 65 2e 20 20 2a  ** page size.  *
1c340 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  /.    assert( pg
1c350 73 7a 3e 30 20 29 3b 0a 20 20 20 20 70 42 75 66  sz>0 );.    pBuf
1c360 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72 69 74   = &writer.aWrit
1c370 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 66  er[0].buf;.    f
1c380 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
1c390 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 67 73 7a  ->rc, pBuf, pgsz
1c3a0 20 2b 20 32 30 29 3b 0a 0a 20 20 20 20 2f 2a 20   + 20);..    /* 
1c3b0 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74  Begin scanning t
1c3c0 68 72 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c  hrough hash tabl
1c3d0 65 20 65 6e 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e entries. */.  
1c3e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1c3f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c400 6d 65 6d 73 65 74 28 70 42 75 66 2d 3e 70 2c 20  memset(pBuf->p, 
1c410 30 2c 20 34 29 3b 0a 20 20 20 20 20 20 70 42 75  0, 4);.      pBu
1c420 66 2d 3e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20  f->n = 4;.      
1c430 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
1c440 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28  ts5HashScanInit(
1c450 70 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20  pHash, 0, 0);.  
1c460 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20    }..    while( 
1c470 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c480 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74   && 0==sqlite3Ft
1c490 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70 48  s5HashScanEof(pH
1c4a0 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  ash) ){.      co
1c4b0 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b  nst char *zTerm;
1c4c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
1c4d0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  ;.      const u8
1c4e0 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20   *pDoclist;.    
1c4f0 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a    int nDoclist;.
1c500 20 20 20 20 20 20 69 6e 74 20 6e 53 75 66 66 69        int nSuffi
1c510 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1c520 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
1c530 6d 20 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20 20  m suffix */..   
1c540 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
1c550 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73  shScanEntry(pHas
1c560 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63  h, &zTerm, &pDoc
1c570 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29  list, &nDoclist)
1c580 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 3d 20  ;.      nTerm = 
1c590 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 3b 0a 0a  strlen(zTerm);..
1c5a0 20 20 20 20 20 20 2f 2a 20 44 65 63 69 64 65 20        /* Decide 
1c5b0 69 66 20 74 68 65 20 74 65 72 6d 20 77 69 6c 6c  if the term will
1c5c0 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72   fit on the curr
1c5d0 65 6e 74 20 6c 65 61 66 2e 20 49 66 20 69 74 20  ent leaf. If it 
1c5e0 77 69 6c 6c 20 6e 6f 74 2c 20 0a 20 20 20 20 20  will not, .     
1c5f0 20 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 6c 65   ** flush the le
1c600 61 66 20 74 6f 20 64 69 73 6b 20 68 65 72 65 2e  af to disk here.
1c610 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28    */.      if( (
1c620 70 42 75 66 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20  pBuf->n + nTerm 
1c630 2b 20 32 29 20 3e 20 70 67 73 7a 20 29 7b 0a 20  + 2) > pgsz ){. 
1c640 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1c650 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72  FlushLeaf(p, &wr
1c660 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  iter);.        p
1c670 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57  Buf = &writer.aW
1c680 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20  riter[0].buf;.  
1c690 20 20 20 20 20 20 69 66 28 20 28 6e 54 65 72 6d        if( (nTerm
1c6a0 20 2b 20 33 32 29 20 3e 20 70 42 75 66 2d 3e 6e   + 32) > pBuf->n
1c6b0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Space ){.       
1c6c0 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f     fts5BufferGro
1c6d0 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  w(&p->rc, pBuf, 
1c6e0 6e 54 65 72 6d 20 2b 20 33 32 20 2d 20 70 42 75  nTerm + 32 - pBu
1c6f0 66 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  f->n);.         
1c700 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
1c710 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1c720 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1c730 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20 74  Write the term t
1c740 6f 20 74 68 65 20 6c 65 61 66 2e 20 41 6e 64 20  o the leaf. And 
1c750 70 75 73 68 20 69 74 20 75 70 20 69 6e 74 6f 20  push it up into 
1c760 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
1c770 72 63 68 79 20 2a 2f 0a 20 20 20 20 20 20 69 66  rchy */.      if
1c780 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 54  ( writer.bFirstT
1c790 65 72 6d 49 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  ermInPage==0 ){.
1c7a0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65          int nPre
1c7b0 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
1c7c0 70 72 65 73 73 28 6e 54 65 72 6d 2c 20 7a 50 72  press(nTerm, zPr
1c7d0 65 76 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73  ev, nTerm, (cons
1c7e0 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20  t u8*)zTerm);.  
1c7f0 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
1c800 20 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e   sqlite3PutVarin
1c810 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d  t(&pBuf->p[pBuf-
1c820 3e 6e 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20 20  >n], nPre);.    
1c830 20 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54      nSuffix = nT
1c840 65 72 6d 20 2d 20 6e 50 72 65 3b 0a 20 20 20 20  erm - nPre;.    
1c850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c860 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42 75   fts5PutU16(&pBu
1c870 66 2d 3e 70 5b 32 5d 2c 20 70 42 75 66 2d 3e 6e  f->p[2], pBuf->n
1c880 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65  );.        write
1c890 72 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  r.bFirstTermInPa
1c8a0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
1c8b0 69 66 28 20 77 72 69 74 65 72 2e 61 57 72 69 74  if( writer.aWrit
1c8c0 65 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b  er[0].pgno!=1 ){
1c8d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1c8e0 50 72 65 20 3d 20 66 74 73 35 50 72 65 66 69 78  Pre = fts5Prefix
1c8f0 43 6f 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c 20  Compress(nTerm, 
1c900 7a 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28 63  zPrev, nTerm, (c
1c910 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b  onst u8*)zTerm);
1c920 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57  .          fts5W
1c930 72 69 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c  riteBtreeTerm(p,
1c940 20 26 77 72 69 74 65 72 2c 20 6e 50 72 65 2b 31   &writer, nPre+1
1c950 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65  , (const u8*)zTe
1c960 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  rm);.          p
1c970 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57  Buf = &writer.aW
1c980 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20  riter[0].buf;.  
1c990 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c9a0 6e 50 72 65 3c 6e 54 65 72 6d 20 29 3b 0a 20 20  nPre<nTerm );.  
1c9b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c9c0 6e 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b  nSuffix = nTerm;
1c9d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c9e0 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
1c9f0 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66  3PutVarint(&pBuf
1ca00 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e 53  ->p[pBuf->n], nS
1ca10 75 66 66 69 78 29 3b 0a 20 20 20 20 20 20 66 74  uffix);.      ft
1ca20 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1ca30 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 28 63 6f  ndBlob(pBuf, (co
1ca40 6e 73 74 20 75 38 2a 29 26 7a 54 65 72 6d 5b 6e  nst u8*)&zTerm[n
1ca50 54 65 72 6d 2d 6e 53 75 66 66 69 78 5d 2c 20 6e  Term-nSuffix], n
1ca60 53 75 66 66 69 78 29 3b 0a 0a 20 20 20 20 20 20  Suffix);..      
1ca70 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d  if( pgsz>=(pBuf-
1ca80 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20  >n + nDoclist + 
1ca90 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
1caa0 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c   The entire docl
1cab0 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ist will fit on 
1cac0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
1cad0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  . */.        fts
1cae0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1caf0 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63  dBlob(pBuf, pDoc
1cb00 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  list, nDoclist);
1cb10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1cb20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
1cb30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36   = 0;.        i6
1cb40 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20  4 iDelta = 0;.  
1cb50 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
1cb60 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
1cb70 62 46 69 72 73 74 44 6f 63 69 64 20 3d 20 30 3b  bFirstDocid = 0;
1cb80 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
1cb90 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
1cba0 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
1cbb0 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66  this leaf. The f
1cbc0 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20  ollowing .      
1cbd0 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74    ** loop iterat
1cbe0 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  es through the p
1cbf0 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b  oslists that mak
1cc00 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74  e up the current
1cc10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63   .        ** doc
1cc20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  list.  */.      
1cc30 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 44    while( iOff<nD
1cc40 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oclist ){.      
1cc50 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
1cc60 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70          int nCop
1cc70 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  y;.          int
1cc80 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20   bDummy;.       
1cc90 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
1cca0 72 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69  rint(&pDoclist[i
1ccb0 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
1ccc0 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
1ccd0 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50  nCopy = fts5GetP
1cce0 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63  oslistSize(&pDoc
1ccf0 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  list[iOff], &nPo
1cd00 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
1cd10 20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20         nCopy += 
1cd20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nPos;.          
1cd30 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
1cd40 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20  ;.          .   
1cd50 20 20 20 20 20 20 20 69 66 28 20 62 46 69 72 73         if( bFirs
1cd60 74 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20  tDocid ){.      
1cd70 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36        fts5PutU16
1cd80 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 70 42  (&pBuf->p[0], pB
1cd90 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72  uf->n);   /* fir
1cda0 73 74 20 64 6f 63 69 64 20 6f 6e 20 70 61 67 65  st docid on page
1cdb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1cdc0 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1cdd0 65 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  e3PutVarint(&pBu
1cde0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69  f->p[pBuf->n], i
1cdf0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
1ce00 20 20 20 20 62 46 69 72 73 74 44 6f 63 69 64 20      bFirstDocid 
1ce10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
1ce20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ce30 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c    pBuf->n += sql
1ce40 69 74 65 33 50 75 74 56 61 72 69 6e 74 28 26 70  ite3PutVarint(&p
1ce50 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c  Buf->p[pBuf->n],
1ce60 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20   iDelta);.      
1ce70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1ce80 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c  assert( pBuf->n<
1ce90 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b  =pBuf->nSpace );
1cea0 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
1ceb0 28 70 42 75 66 2d 3e 6e 20 2b 20 6e 43 6f 70 79  (pBuf->n + nCopy
1cec0 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20  ) <= pgsz ){.   
1ced0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cee0 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77  entire poslist w
1cef0 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63  ill fit on the c
1cf00 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20  urrent leaf. So 
1cf10 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20 20  copy.           
1cf20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f   ** it in one go
1cf30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
1cf40 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
1cf50 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
1cf60 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
1cf70 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20   nCopy);.       
1cf80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cf90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
1cfa0 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c  ire poslist will
1cfb0 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73   not fit on this
1cfc0 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65   leaf. So it nee
1cfd0 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ds.            *
1cfe0 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69  * to be broken i
1cff0 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68  nto sections. Th
1d000 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61  e only qualifica
1d010 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20  tion being.     
1d020 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65         ** that e
1d030 61 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20  ach varint must 
1d040 62 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67  be stored contig
1d050 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20  uously.  */.    
1d060 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38          const u8
1d070 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44   *pPoslist = &pD
1d080 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20  oclist[iOff];.  
1d090 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
1d0a0 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  os = 0;.        
1d0b0 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
1d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1d0d0 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20  t nSpace = pgsz 
1d0e0 2d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20  - pBuf->n;.     
1d0f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
1d100 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
1d110 20 20 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69    if( (nCopy - i
1d120 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a  Pos)<=nSpace ){.
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d140 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73  n = nCopy - iPos
1d150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d160 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1d170 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50         n = fts5P
1d180 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26 70 50  oslistPrefix(&pP
1d190 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53  oslist[iPos], nS
1d1a0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20  pace);.         
1d1b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d1c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30       assert( n>0
1d1d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1d1e0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1d1f0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
1d200 20 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d   &pPoslist[iPos]
1d210 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
1d220 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20      iPos += n;. 
1d230 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
1d240 20 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62   iPos>=nCopy ) b
1d250 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
1d260 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1d270 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65  shLeaf(p, &write
1d280 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
1d290 20 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72    pBuf = &writer
1d2a0 2e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b  .aWriter[0].buf;
1d2b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1d2c0 20 20 20 20 20 20 20 20 20 20 20 62 46 69 72 73             bFirs
1d2d0 74 44 6f 63 69 64 20 3d 20 31 3b 0a 20 20 20 20  tDocid = 1;.    
1d2e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d2f0 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b    iOff += nCopy;
1d300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d310 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 66 2d 3e   }..      pBuf->
1d320 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27  p[pBuf->n++] = '
1d330 5c 30 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72  \0';.      asser
1d340 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66  t( pBuf->n<=pBuf
1d350 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20  ->nSpace );.    
1d360 20 20 7a 50 72 65 76 20 3d 20 28 63 6f 6e 73 74    zPrev = (const
1d370 20 75 38 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20   u8*)zTerm;.    
1d380 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1d390 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29  hScanNext(pHash)
1d3a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1d3b0 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72  te3Fts5HashClear
1d3c0 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73  (pHash);.    fts
1d3d0 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20  5WriteFinish(p, 
1d3e0 26 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67 68  &writer, &nHeigh
1d3f0 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  t, &pgnoLast);..
1d400 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1d410 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
1d420 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20 62   It is written b
1d430 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
1d440 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a  ase by the.    *
1d450 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  * fts5StructureR
1d460 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65  elease() call be
1d470 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  low.  */.    if(
1d480 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1d490 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
1d4a0 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
1d4b0 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72  el(&p->rc, &pStr
1d4c0 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uct);.    }.    
1d4d0 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
1d4e0 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
1d4f0 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20   pStruct, 0, 1, 
1d500 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  0);.    if( p->r
1d510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d520 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 53        pSeg = &pS
1d530 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
1d540 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e  .aSeg[ pStruct->
1d550 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b  aLevel[0].nSeg++
1d560 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   ];.      pSeg->
1d570 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
1d580 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 6e 48 65  .      pSeg->nHe
1d590 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b 0a  ight = nHeight;.
1d5a0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
1d5b0 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  First = 1;.     
1d5c0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
1d5d0 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
1d5e0 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
1d5f0 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c  urePromote(p, 0,
1d600 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a   pStruct);.  }..
1d610 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69  .  if( p->pConfi
1d620 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20  g->nAutomerge>0 
1d630 29 20 66 74 73 35 49 6e 64 65 78 57 6f 72 6b 28  ) fts5IndexWork(
1d640 70 2c 20 69 48 61 73 68 2c 20 26 70 53 74 72 75  p, iHash, &pStru
1d650 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  ct, pgnoLast);. 
1d660 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1d670 4d 65 72 67 65 28 70 2c 20 69 48 61 73 68 2c 20  Merge(p, iHash, 
1d680 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73  &pStruct);.  fts
1d690 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
1d6a0 70 2c 20 69 48 61 73 68 2c 20 70 53 74 72 75 63  p, iHash, pStruc
1d6b0 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
1d6c0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
1d6d0 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  ct);.}../*.** Fl
1d6e0 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ush any data sto
1d6f0 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
1d700 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
1d710 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d730 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
1d740 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
1d750 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
1d760 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
1d770 67 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  g;.  int i;     
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d790 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1d7a0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1d7b0 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74  indexes */.  int
1d7c0 20 6e 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20   nLeaf = 0;     
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d7e0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
1d7f0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f   written */..  /
1d800 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
1d810 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65  s already occure
1d820 64 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  d this call is a
1d830 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
1d840 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1d850 4b 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  K || p->nPending
1d860 44 61 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  Data==0 ) return
1d870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
1d880 70 48 61 73 68 20 29 3b 0a 0a 20 20 2f 2a 20 46  pHash );..  /* F
1d890 6c 75 73 68 20 74 68 65 20 74 65 72 6d 73 20 61  lush the terms a
1d8a0 6e 64 20 65 61 63 68 20 70 72 65 66 69 78 20 69  nd each prefix i
1d8b0 6e 64 65 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a  ndex to disk */.
1d8c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
1d8d0 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20  onfig->nPrefix; 
1d8e0 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 46 6c  i++){.    fts5Fl
1d8f0 75 73 68 4f 6e 65 48 61 73 68 28 70 2c 20 69 2c  ushOneHash(p, i,
1d900 20 26 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a 20 20   &nLeaf);.  }.  
1d910 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
1d920 3d 20 30 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c  = 0;.}...int sql
1d930 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74  ite3Fts5IndexOpt
1d940 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20  imize(Fts5Index 
1d950 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  *p){.  Fts5Confi
1d960 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
1d970 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69  pConfig;.  int i
1d980 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c  ;..  fts5IndexFl
1d990 75 73 68 28 70 29 3b 0a 20 20 66 6f 72 28 69 3d  ush(p);.  for(i=
1d9a0 30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  0; i<=pConfig->n
1d9b0 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20  Prefix; i++){.  
1d9c0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1d9d0 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
1d9e0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20  tructureRead(p, 
1d9f0 69 29 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  i);.    Fts5Stru
1da00 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
1da10 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20  .    int nSeg = 
1da20 30 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  0;.    if( pStru
1da30 63 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 65 67  ct ){.      nSeg
1da40 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
1da50 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
1da60 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 69 66  truct);.      if
1da70 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20 20 20  ( nSeg>1 ){.    
1da80 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
1da90 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
1daa0 74 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20 6e  ture);.        n
1dab0 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74  Byte += (pStruct
1dac0 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69  ->nLevel+1) * si
1dad0 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1dae0 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20  reLevel);.      
1daf0 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74    pNew = (Fts5St
1db00 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33  ructure*)sqlite3
1db10 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
1db20 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20  p->rc, nByte);. 
1db30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1db40 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1db50 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1db60 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20  Level *pLvl;.   
1db70 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
1db80 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  Seg * sizeof(Fts
1db90 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1dba0 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  t);.      pNew->
1dbb0 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74  nLevel = pStruct
1dbc0 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20  ->nLevel+1;.    
1dbd0 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f    pNew->nWriteCo
1dbe0 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d  unter = pStruct-
1dbf0 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
1dc00 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e        pLvl = &pN
1dc10 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75  ew->aLevel[pStru
1dc20 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20  ct->nLevel];.   
1dc30 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
1dc40 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
1dc50 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
1dc60 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
1dc70 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >rc, nByte);.   
1dc80 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65     if( pLvl->aSe
1dc90 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  g ){.        int
1dca0 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
1dcb0 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74       int iSegOut
1dcc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
1dcd0 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1dce0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1dcf0 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1dd00 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1dd10 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1dd20 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1dd30 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1dd40 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b       pLvl->aSeg[
1dd50 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75  iSegOut] = pStru
1dd60 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1dd70 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
1dd80 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74           iSegOut
1dd90 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
1dda0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ddb0 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
1ddc0 53 65 67 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Seg;.      }else
1ddd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1dde0 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
1ddf0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
1de00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1de10 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
1de20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20       int iLvl = 
1de30 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a  pNew->nLevel-1;.
1de40 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
1de50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1de60 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c   pNew->aLevel[iL
1de70 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20  vl].nSeg>0 ){.  
1de80 20 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d        int nRem =
1de90 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55   FTS5_OPT_WORK_U
1dea0 4e 49 54 3b 0a 20 20 20 20 20 20 20 20 66 74 73  NIT;.        fts
1deb0 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
1dec0 28 70 2c 20 69 2c 20 26 70 4e 65 77 2c 20 69 4c  (p, i, &pNew, iL
1ded0 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
1dee0 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 53    }..      fts5S
1def0 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
1df00 20 69 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20   i, pNew);.     
1df10 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1df20 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
1df30 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75   }..    fts5Stru
1df40 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1df50 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  ruct);.  }..  re
1df60 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
1df70 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 0a 0a 2f  turn(p); .}..../
1df80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69  *.** Return a si
1df90 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61  mple checksum va
1dfa0 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  lue based on the
1dfb0 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73   arguments..*/.s
1dfc0 74 61 74 69 63 20 75 36 34 20 66 74 73 35 49 6e  tatic u64 fts5In
1dfd0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20  dexEntryCksum(. 
1dfe0 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
1dff0 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74  int iCol, .  int
1e000 20 69 50 6f 73 2c 20 0a 20 20 63 6f 6e 73 74 20   iPos, .  const 
1e010 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 0a 20 20  char *pTerm, .  
1e020 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69  int nTerm.){.  i
1e030 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20  nt i;.  u64 ret 
1e040 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20  = iRowid;.  ret 
1e050 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43  += (ret<<3) + iC
1e060 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  ol;.  ret += (re
1e070 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20  t<<3) + iPos;.  
1e080 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d  for(i=0; i<nTerm
1e090 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72  ; i++) ret += (r
1e0a0 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69  et<<3) + pTerm[i
1e0b0 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  ];.  return ret;
1e0c0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1e0d0 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69  fts5BtreeIterIni
1e0e0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
1e0f0 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a  p, .  int iIdx,.
1e100 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
1e110 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 0a 20  egment *pSeg, . 
1e120 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a   Fts5BtreeIter *
1e130 70 49 74 65 72 0a 29 7b 0a 20 20 69 6e 74 20 6e  pIter.){.  int n
1e140 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Byte;.  int i;. 
1e150 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
1e160 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 29 20  pIter->aLvl[0]) 
1e170 2a 20 28 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  * (pSeg->nHeight
1e180 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  -1);.  memset(pI
1e190 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
1e1a0 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
1e1b0 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65 67 2d 3e 6e  ->nLvl = pSeg->n
1e1c0 48 65 69 67 68 74 2d 31 3b 0a 20 20 70 49 74 65  Height-1;.  pIte
1e1d0 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
1e1e0 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a    pIter->p = p;.
1e1f0 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
1e200 70 53 65 67 3b 0a 20 20 69 66 28 20 6e 42 79 74  pSeg;.  if( nByt
1e210 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  e && p->rc==SQLI
1e220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74  TE_OK ){.    pIt
1e230 65 72 2d 3e 61 4c 76 6c 20 3d 20 28 46 74 73 35  er->aLvl = (Fts5
1e240 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 2a 29  BtreeIterLevel*)
1e250 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
1e260 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 66   nByte);.  }.  f
1e270 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=0; p->rc==S
1e280 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49  QLITE_OK && i<pI
1e290 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
1e2a0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
1e2b0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1e2c0 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d  OWID(iIdx, pSeg-
1e2d0 3e 69 53 65 67 69 64 2c 20 69 2b 31 2c 20 31 29  >iSegid, i+1, 1)
1e2e0 3b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  ;.    Fts5Data *
1e2f0 70 44 61 74 61 3b 0a 20 20 20 20 70 49 74 65 72  pData;.    pIter
1e300 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 20  ->aLvl[i].pData 
1e310 3d 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  = pData = fts5Da
1e320 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64  taRead(p, iRowid
1e330 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  );.    if( pData
1e340 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f   ){.      fts5No
1e350 64 65 49 74 65 72 49 6e 69 74 28 70 44 61 74 61  deIterInit(pData
1e360 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26  ->p, pData->n, &
1e370 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 73  pIter->aLvl[i].s
1e380 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1e390 69 66 28 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 3d  if( pIter->nLvl=
1e3a0 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20  =0 || p->rc ){. 
1e3b0 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
1e3c0 20 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   1;.    pIter->i
1e3d0 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Leaf = pSeg->pgn
1e3e0 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  oLast;.  }else{.
1e3f0 20 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74      pIter->nEmpt
1e400 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  y = pIter->aLvl[
1e410 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 20  0].s.nEmpty;.   
1e420 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20   pIter->iLeaf = 
1e430 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
1e440 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 70 49 74  .iChild;.    pIt
1e450 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74  er->bDlidx = pIt
1e460 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44  er->aLvl[0].s.bD
1e470 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  lidx;.  }.}..sta
1e480 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72  tic void fts5Btr
1e490 65 65 49 74 65 72 4e 65 78 74 28 46 74 73 35 42  eeIterNext(Fts5B
1e4a0 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29  treeIter *pIter)
1e4b0 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
1e4c0 20 3d 20 70 49 74 65 72 2d 3e 70 3b 0a 20 20 69   = pIter->p;.  i
1e4d0 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
1e4e0 20 70 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20   pIter->bEof==0 
1e4f0 26 26 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  && pIter->aLvl[0
1e500 5d 2e 73 2e 61 44 61 74 61 20 29 3b 0a 20 20 66  ].s.aData );.  f
1e510 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
1e520 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e 72 63 3d 3d  >nLvl && p->rc==
1e530 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
1e540 0a 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74  .    Fts5BtreeIt
1e550 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  erLevel *pLvl = 
1e560 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
1e570 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
1e580 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 70  rNext(&p->rc, &p
1e590 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28  Lvl->s);.    if(
1e5a0 20 70 4c 76 6c 2d 3e 73 2e 61 44 61 74 61 20 29   pLvl->s.aData )
1e5b0 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
1e5c0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1e5d0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c  Iter->term, pLvl
1e5e0 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c  ->s.term.n, pLvl
1e5f0 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20  ->s.term.p);.   
1e600 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
1e610 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4e  lse{.      fts5N
1e620 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76  odeIterFree(&pLv
1e630 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20 66 74 73  l->s);.      fts
1e640 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
1e650 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
1e660 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30   pLvl->pData = 0
1e670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1e680 28 20 69 3d 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c  ( i==pIter->nLvl
1e690 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20   || p->rc ){.   
1e6a0 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
1e6b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e6c0 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65  nt iSegid = pIte
1e6d0 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  r->pSeg->iSegid;
1e6e0 0a 20 20 20 20 66 6f 72 28 69 2d 2d 3b 20 69 3e  .    for(i--; i>
1e6f0 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
1e700 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
1e710 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  el *pLvl = &pIte
1e720 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20  r->aLvl[i];.    
1e730 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
1e740 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1e750 44 28 70 49 74 65 72 2d 3e 69 49 64 78 2c 69 53  D(pIter->iIdx,iS
1e760 65 67 69 64 2c 69 2b 31 2c 70 4c 76 6c 5b 31 5d  egid,i+1,pLvl[1]
1e770 2e 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  .s.iChild);.    
1e780 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
1e790 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1e7a0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
1e7b0 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
1e7c0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f  {.        fts5No
1e7d0 64 65 49 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d  deIterInit(pLvl-
1e7e0 3e 70 44 61 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d  >pData->p, pLvl-
1e7f0 3e 70 44 61 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c  >pData->n, &pLvl
1e800 2d 3e 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ->s);.      }.  
1e810 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72    }.  }..  pIter
1e820 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72  ->nEmpty = pIter
1e830 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70  ->aLvl[0].s.nEmp
1e840 74 79 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 6c  ty;.  pIter->bDl
1e850 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  idx = pIter->aLv
1e860 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20  l[0].s.bDlidx;. 
1e870 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20   pIter->iLeaf = 
1e880 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
1e890 2e 69 43 68 69 6c 64 3b 0a 20 20 61 73 73 65 72  .iChild;.  asser
1e8a0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
1e8b0 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45  _OK || pIter->bE
1e8c0 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  of );.}..static 
1e8d0 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74  void fts5BtreeIt
1e8e0 65 72 46 72 65 65 28 46 74 73 35 42 74 72 65 65  erFree(Fts5Btree
1e8f0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1e900 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1e910 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  ; i<pIter->nLvl;
1e920 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42   i++){.    Fts5B
1e930 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70  treeIterLevel *p
1e940 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
1e950 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e  vl[i];.    fts5N
1e960 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76  odeIterFree(&pLv
1e970 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70  l->s);.    if( p
1e980 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20  Lvl->pData ){.  
1e990 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
1e9a0 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29  ase(pLvl->pData)
1e9b0 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
1e9c0 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ata = 0;.    }. 
1e9d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1e9e0 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a  e(pIter->aLvl);.
1e9f0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1ea00 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
1ea10 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1ea20 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79  nction is purely
1ea30 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73   an internal tes
1ea40 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63  t. It does not c
1ea50 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a  ontribute to .**
1ea60 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69   FTS functionali
1ea70 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20  ty, or even the 
1ea80 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c  integrity-check,
1ea90 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a   in any way..**.
1eaa0 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74  ** Instead, it t
1eab0 65 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61  ests that the sa
1eac0 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72  me set of pgno/r
1ead0 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  owid combination
1eae0 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65  s are .** visite
1eaf0 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  d regardless of 
1eb00 77 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c  whether the docl
1eb10 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69  ist-index identi
1eb20 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
1eb30 72 73 0a 2a 2a 20 69 49 64 78 2f 69 53 65 67 69  rs.** iIdx/iSegi
1eb40 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61  d/iLeaf is itera
1eb50 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20  ted in forwards 
1eb60 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  or reverse order
1eb70 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
1eb80 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
1eb90 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
1eba0 65 72 54 65 73 74 52 65 76 65 72 73 65 28 0a 20  erTestReverse(. 
1ebb0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1ebc0 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6c 6f    /* Index to lo
1ebf0 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
1ec00 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1ec10 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
1ec20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1ec30 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64  gment id to load
1ec40 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   from */.  int i
1ec50 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20  Leaf            
1ec60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1ec70 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ad doclist-index
1ec80 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
1ec90 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  /.){.  Fts5Dlidx
1eca0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30  Iter *pDlidx = 0
1ecb0 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d 31 20 3d  ;.  i64 cksum1 =
1ecc0 20 31 33 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d   13;.  i64 cksum
1ecd0 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 66  2 = 13;..  for(f
1ece0 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
1ecf0 28 70 2c 20 30 2c 20 69 49 64 78 2c 20 69 53 65  (p, 0, iIdx, iSe
1ed00 67 69 64 2c 20 69 4c 65 61 66 2c 20 26 70 44 6c  gid, iLeaf, &pDl
1ed10 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35  idx);.      fts5
1ed20 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
1ed30 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
1ed40 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
1ed50 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 29 7b  ext(pDlidx).  ){
1ed60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c  .    assert( pDl
1ed70 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 69  idx->iLeafPgno>i
1ed80 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75  Leaf );.    cksu
1ed90 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 28  m1 = (cksum1 ^ (
1eda0 20 28 69 36 34 29 28 70 44 6c 69 64 78 2d 3e 69   (i64)(pDlidx->i
1edb0 4c 65 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32 20  LeafPgno) << 32 
1edc0 29 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 3d  ));.    cksum1 =
1edd0 20 28 63 6b 73 75 6d 31 20 5e 20 70 44 6c 69 64   (cksum1 ^ pDlid
1ede0 78 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a  x->iRowid);.  }.
1edf0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
1ee00 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
1ee10 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f  Dlidx = 0;..  fo
1ee20 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  r(fts5DlidxIterI
1ee30 6e 69 74 28 70 2c 20 31 2c 20 69 49 64 78 2c 20  nit(p, 1, iIdx, 
1ee40 69 53 65 67 69 64 2c 20 69 4c 65 61 66 2c 20 26  iSegid, iLeaf, &
1ee50 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
1ee60 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
1ee70 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
1ee80 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1ee90 65 72 50 72 65 76 28 70 44 6c 69 64 78 29 0a 20  erPrev(pDlidx). 
1eea0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1eeb0 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e  pDlidx->iLeafPgn
1eec0 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63  o>iLeaf );.    c
1eed0 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20  ksum2 = (cksum2 
1eee0 5e 20 28 20 28 69 36 34 29 28 70 44 6c 69 64 78  ^ ( (i64)(pDlidx
1eef0 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c 20  ->iLeafPgno) << 
1ef00 33 32 20 29 29 3b 0a 20 20 20 20 63 6b 73 75 6d  32 ));.    cksum
1ef10 32 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20 70 44  2 = (cksum2 ^ pD
1ef20 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  lidx->iRowid);. 
1ef30 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74   }.  fts5DlidxIt
1ef40 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
1ef50 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20    pDlidx = 0;.. 
1ef60 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1ef70 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21  TE_OK && cksum1!
1ef80 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20  =cksum2 ) p->rc 
1ef90 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 20  = FTS5_CORRUPT; 
1efa0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1efb0 65 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 54  e fts5DlidxIterT
1efc0 65 73 74 52 65 76 65 72 73 65 28 77 2c 78 2c 79  estReverse(w,x,y
1efd0 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  ,z).#endif..stat
1efe0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1eff0 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
1f000 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e  egment(.  Fts5In
1f010 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1f020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1f030 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1f040 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f060 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1f070 68 61 74 20 70 53 65 67 20 69 73 20 61 20 70 61  hat pSeg is a pa
1f080 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53  rt of */.  Fts5S
1f090 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
1f0a0 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65  *pSeg      /* Se
1f0b0 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
1f0c0 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
1f0d0 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ncy */.){.  Fts5
1f0e0 42 74 72 65 65 49 74 65 72 20 69 74 65 72 3b 20  BtreeIter iter; 
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1f100 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1f110 68 72 6f 75 67 68 20 62 2d 74 72 65 65 20 68 69  hrough b-tree hi
1f120 65 72 61 72 63 68 79 20 2a 2f 0a 0a 20 20 2f 2a  erarchy */..  /*
1f130 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
1f140 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
1f150 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 66 6f 72  archy.  */.  for
1f160 28 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e  (fts5BtreeIterIn
1f170 69 74 28 70 2c 20 69 49 64 78 2c 20 70 53 65 67  it(p, iIdx, pSeg
1f180 2c 20 26 69 74 65 72 29 3b 0a 20 20 20 20 20 20  , &iter);.      
1f190 69 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20  iter.bEof==0;.  
1f1a0 20 20 20 20 66 74 73 35 42 74 72 65 65 49 74 65      fts5BtreeIte
1f1b0 72 4e 65 78 74 28 26 69 74 65 72 29 0a 20 20 29  rNext(&iter).  )
1f1c0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20  {.    i64 iRow; 
1f1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1e0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
1f1f0 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20   this leaf */.  
1f200 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
1f210 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1f220 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73  /* Data for this
1f230 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74   leaf */.    int
1f240 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
1f250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1f260 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65  fset of first te
1f270 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  rm on leaf */.  
1f280 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2a0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
1f2b0 74 65 20 74 68 72 6f 75 67 68 20 65 6d 70 74 79  te through empty
1f2c0 20 6c 65 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20   leaves */..    
1f2d0 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20 69  /* If the leaf i
1f2e0 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61  n question has a
1f2f0 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d  lready been trim
1f300 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67  med from the seg
1f310 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67  ment, .    ** ig
1f320 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65 65  nore this b-tree
1f330 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73   entry. Otherwis
1f340 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20  e, load it into 
1f350 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69  memory. */.    i
1f360 66 28 20 69 74 65 72 2e 69 4c 65 61 66 3c 70 53  f( iter.iLeaf<pS
1f370 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20  eg->pgnoFirst ) 
1f380 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52  continue;.    iR
1f390 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ow = FTS5_SEGMEN
1f3a0 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53  T_ROWID(iIdx, pS
1f3b0 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 69  eg->iSegid, 0, i
1f3c0 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20  ter.iLeaf);.    
1f3d0 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
1f3e0 52 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20  Read(p, iRow);. 
1f3f0 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20     if( pLeaf==0 
1f400 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
1f410 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
1f420 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74  leaf contains at
1f430 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c   least one term,
1f440 20 61 6e 64 20 74 68 61 74 20 69 74 20 69 73 20   and that it is 
1f450 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20  equal.    ** to 
1f460 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  or larger than t
1f470 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20  he split-key in 
1f480 69 74 65 72 2e 74 65 72 6d 2e 20 20 2a 2f 0a 20  iter.term.  */. 
1f490 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65     iOff = fts5Ge
1f4a0 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
1f4b0 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66  ]);.    if( iOff
1f4c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1f4d0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1f4e0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
1f4f0 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20      int nTerm;  
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20  /* Size of term 
1f520 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73  on leaf in bytes
1f530 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
1f540 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1f550 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69        /* Compari
1f560 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20  son of term and 
1f570 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 20 20 20  split-key */.   
1f580 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
1f590 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
1f5a0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
1f5b0 6d 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  m);.      res = 
1f5c0 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70  memcmp(&pLeaf->p
1f5d0 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72  [iOff], iter.ter
1f5e0 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20  m.p, MIN(nTerm, 
1f5f0 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20  iter.term.n));. 
1f600 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1f610 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
1f620 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20  iter.term.n;.   
1f630 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
1f640 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1f650 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
1f660 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f670 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1f680 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
1f690 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
1f6a0 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b      /* Now check
1f6b0 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
1f6c0 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
1f6d0 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
1f6e0 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28  nt leaf.    ** (
1f6f0 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
1f700 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
1f710 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  s. */.    for(i=
1f720 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  1; p->rc==SQLITE
1f730 5f 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e  _OK && i<=iter.n
1f740 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  Empty; i++){.   
1f750 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1f760 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b  ataRead(p, iRow+
1f770 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  i);.      if( pL
1f780 65 61 66 20 26 26 20 30 21 3d 66 74 73 35 47 65  eaf && 0!=fts5Ge
1f790 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
1f7a0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ]) ){.        p-
1f7b0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1f7c0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1f7d0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1f7e0 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  e(pLeaf);.    }.
1f7f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1f800 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
1f810 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20  dex, check that 
1f820 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20  it looks right. 
1f830 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e  */.    if( iter.
1f840 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  bDlidx ){.      
1f850 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
1f860 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46  Dlidx = 0;  /* F
1f870 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
1f880 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64  ough doclist ind
1f890 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
1f8a0 69 50 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72  iPrevLeaf = iter
1f8b0 2e 69 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e  .iLeaf;.      in
1f8c0 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  t iSegid = pSeg-
1f8d0 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69  >iSegid;.      i
1f8e0 6e 74 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36  nt iPg;.      i6
1f8f0 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66  4 iKey;..      f
1f900 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
1f910 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
1f920 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c   iSegid, iter.iL
1f930 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20  eaf, &pDlidx);. 
1f940 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
1f950 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
1f960 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
1f970 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1f980 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 20  Next(pDlidx).   
1f990 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f     ){..        /
1f9a0 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69  * Check any rowi
1f9b0 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  d-less pages tha
1f9c0 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
1f9d0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1f9e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
1f9f0 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b  iPg=iPrevLeaf+1;
1fa00 20 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65   iPg<pDlidx->iLe
1fa10 61 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a  afPgno; iPg++){.
1fa20 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d            iKey =
1fa30 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1fa40 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1fa50 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20  , 0, iPg);.     
1fa60 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
1fa70 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65  5DataRead(p, iKe
1fa80 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1fa90 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
1faa0 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 47         if( fts5G
1fab0 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
1fac0 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  0])!=0 ) p->rc =
1fad0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
1fae0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44             fts5D
1faf0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
1fb00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1fb10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fb20 20 69 50 72 65 76 4c 65 61 66 20 3d 20 70 44 6c   iPrevLeaf = pDl
1fb30 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  idx->iLeafPgno;.
1fb40 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
1fb50 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
1fb60 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62  page indicated b
1fb70 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  y the iterator r
1fb80 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20  eally does.     
1fb90 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68     ** contain th
1fba0 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65  e rowid suggeste
1fbb0 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a  d by the same. *
1fbc0 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  /.        iKey =
1fbd0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1fbe0 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1fbf0 2c 20 30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c 65  , 0, pDlidx->iLe
1fc00 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  afPgno);.       
1fc10 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1fc20 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1fc30 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1fc40 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1fc50 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
1fc60 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
1fc70 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
1fc80 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
1fc90 20 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69           getVari
1fca0 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
1fcb0 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
1fcc0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1fcd0 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 70     if( iRowid!=p
1fce0 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 20  Dlidx->iRowid ) 
1fcf0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1fd00 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
1fd10 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1fd20 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
1fd30 7d 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  }..      }..    
1fd40 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
1fd50 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65  eaf+1; iPg<=(ite
1fd60 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e  r.iLeaf + iter.n
1fd70 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a  Empty); iPg++){.
1fd80 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
1fd90 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1fda0 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
1fdb0 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  0, iPg);.       
1fdc0 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1fdd0 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1fde0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1fdf0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1fe00 66 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70  f( fts5GetU16(&p
1fe10 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29  Leaf->p[0])!=0 )
1fe20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1fe30 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
1fe40 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1fe50 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
1fe60 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
1fe70 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
1fe80 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  ree(pDlidx);.   
1fe90 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1fea0 54 65 73 74 52 65 76 65 72 73 65 28 70 2c 20 69  TestReverse(p, i
1feb0 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 74 65  Idx, iSegid, ite
1fec0 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  r.iLeaf);.    }.
1fed0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1fee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1fef0 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d  ter.iLeaf!=pSeg-
1ff00 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
1ff10 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1ff20 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74  RRUPT;.  }..  ft
1ff30 73 35 42 74 72 65 65 49 74 65 72 46 72 65 65 28  s5BtreeIterFree(
1ff40 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &iter);.}../*.**
1ff50 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69   Iterator pMulti
1ff60 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1ff70 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  s to a valid ent
1ff80 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68  ry (not EOF). Th
1ff90 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1ffa0 70 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66  ppends a copy of
1ffb0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
1ffc0 73 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20  st of the entry 
1ffd0 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65  pMulti .** curre
1ffe0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
1fff0 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  o buffer pBuf..*
20000 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
20010 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
20020 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
20030 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61  n p->rc. It is a
20040 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72  ssumed.** no err
20050 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
20060 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
20070 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
20080 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
20090 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
200a0 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
200b0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
200c0 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
200d0 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a  Multi,.  int bSz
200e0 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
200f0 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d  pBuf.){.  if( p-
20100 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
20110 7b 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49  {.    Fts5ChunkI
20120 74 65 72 20 69 74 65 72 3b 0a 20 20 20 20 46 74  ter iter;.    Ft
20130 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
20140 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b  = &pMulti->aSeg[
20150 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b   pMulti->aFirst[
20160 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
20170 20 61 73 73 65 72 74 28 20 66 74 73 35 4d 75 6c   assert( fts5Mul
20180 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 4d 75  tiIterEof(p, pMu
20190 6c 74 69 29 3d 3d 30 20 29 3b 0a 20 20 20 20 66  lti)==0 );.    f
201a0 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74  ts5ChunkIterInit
201b0 28 70 2c 20 70 53 65 67 2c 20 26 69 74 65 72 29  (p, pSeg, &iter)
201c0 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 43 68  ;.    if( fts5Ch
201d0 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 69  unkIterEof(p, &i
201e0 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ter)==0 ){.     
201f0 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20 20 20   if( bSz ){.    
20200 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
20210 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20  ISTSIZE */.     
20220 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
20230 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
20240 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e 52 65  , pBuf, iter.nRe
20250 6d 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 7d 0a  m * 2);.      }.
20260 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73        while( fts
20270 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c  5ChunkIterEof(p,
20280 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20   &iter)==0 ){.  
20290 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
202a0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
202b0 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e 2c  c, pBuf, iter.n,
202c0 20 69 74 65 72 2e 70 29 3b 0a 20 20 20 20 20 20   iter.p);.      
202d0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e    fts5ChunkIterN
202e0 65 78 74 28 70 2c 20 26 69 74 65 72 29 3b 0a 20  ext(p, &iter);. 
202f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
20300 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65   fts5ChunkIterRe
20310 6c 65 61 73 65 28 26 69 74 65 72 29 3b 0a 20 20  lease(&iter);.  
20320 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
20330 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
20340 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73 74  Next(Fts5Doclist
20350 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
20360 69 66 28 20 70 49 74 65 72 2d 3e 69 3c 70 49 74  if( pIter->i<pIt
20370 65 72 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 6e 74  er->n ){.    int
20380 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69 66 28   bDummy;.    if(
20390 20 70 49 74 65 72 2d 3e 69 20 29 7b 0a 20 20 20   pIter->i ){.   
203a0 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
203b0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d       pIter->i +=
203c0 20 67 65 74 56 61 72 69 6e 74 28 26 70 49 74 65   getVarint(&pIte
203d0 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20  r->a[pIter->i], 
203e0 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
203f0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
20400 3e 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20  >bDesc ){.      
20410 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
20420 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  -= iDelta;.     
20430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20440 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
20450 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d   iDelta;.      }
20460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20470 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65    pIter->i += ge
20480 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e  tVarint(&pIter->
20490 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36  a[pIter->i], (u6
204a0 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
204b0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  d);.    }.    pI
204c0 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73 35 47 65  ter->i += fts5Ge
204d0 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 0a 20 20  tPoslistSize(.  
204e0 20 20 20 20 20 20 26 70 49 74 65 72 2d 3e 61 5b        &pIter->a[
204f0 70 49 74 65 72 2d 3e 69 5d 2c 20 26 70 49 74 65  pIter->i], &pIte
20500 72 2d 3e 6e 50 6f 73 6c 69 73 74 2c 20 26 62 44  r->nPoslist, &bD
20510 75 6d 6d 79 0a 20 20 20 20 29 3b 0a 20 20 20 20  ummy.    );.    
20520 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
20530 3d 20 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  = &pIter->a[pIte
20540 72 2d 3e 69 5d 3b 0a 20 20 20 20 70 49 74 65 72  r->i];.    pIter
20550 2d 3e 69 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50  ->i += pIter->nP
20560 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  oslist;.  }else{
20570 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73  .    pIter->aPos
20580 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  list = 0;.  }.}.
20590 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
205a0 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
205b0 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
205c0 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 62 44 65  pBuf, .  int bDe
205d0 73 63 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c 69  sc, .  Fts5Docli
205e0 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b  stIter *pIter.){
205f0 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
20600 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
20610 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 20  r));.  pIter->a 
20620 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74  = pBuf->p;.  pIt
20630 65 72 2d 3e 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b  er->n = pBuf->n;
20640 0a 20 20 70 49 74 65 72 2d 3e 62 44 65 73 63 20  .  pIter->bDesc 
20650 3d 20 62 44 65 73 63 3b 0a 20 20 66 74 73 35 44  = bDesc;.  fts5D
20660 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
20670 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Iter);.}../*.** 
20680 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74  Append a doclist
20690 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
206a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
206b0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
206c0 6f 63 69 64 28 0a 20 20 69 6e 74 20 2a 70 52 63  ocid(.  int *pRc
206d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
206e0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
206f0 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: Error code */
20700 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 0a 20 20  .  int bDesc,.  
20710 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
20720 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20730 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 69  /* Buffer to wri
20740 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a  te to */.  i64 *
20750 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20  piLastRowid,    
20760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
20770 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72  /OUT: Previous r
20780 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69 66  owid written (if
20790 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69   any) */.  i64 i
207a0 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
207b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
207c0 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  wid to append */
207d0 0a 29 7b 0a 20 20 69 66 28 20 70 42 75 66 2d 3e  .){.  if( pBuf->
207e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
207f0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20800 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52  nt(pRc, pBuf, iR
20810 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  owid);.  }else i
20820 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20  f( bDesc ){.    
20830 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
20840 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66  Varint(pRc, pBuf
20850 2c 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 2d  , *piLastRowid -
20860 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73   iRowid);.  }els
20870 65 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  e{.    fts5Buffe
20880 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 52  rAppendVarint(pR
20890 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69 64 20  c, pBuf, iRowid 
208a0 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3b  - *piLastRowid);
208b0 0a 20 20 7d 0a 20 20 2a 70 69 4c 61 73 74 52 6f  .  }.  *piLastRo
208c0 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a  wid = iRowid;.}.
208d0 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70  ./*.** Buffers p
208e0 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e  1 and p2 contain
208f0 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20   doclists. This 
20900 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20  function merges 
20910 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f  the content.** o
20920 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73  f the two doclis
20930 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20  ts together and 
20940 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74  sets buffer p1 t
20950 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66  o the result bef
20960 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
20970 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
20980 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
20990 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
209a0 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61  t in p->rc. If a
209b0 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61  n error has.** a
209c0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
209d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
209e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
209f0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
20a00 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a  rgePrefixLists(.
20a10 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a30 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
20a40 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  d object */.  in
20a50 74 20 62 44 65 73 63 2c 0a 20 20 46 74 73 35 42  t bDesc,.  Fts5B
20a60 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20  uffer *p1,      
20a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
20a80 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  rst list to merg
20a90 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
20aa0 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20 20  r *p2           
20ab0 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64         /* Second
20ac0 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
20ad0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e  /.){.  if( p2->n
20ae0 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73   ){.    i64 iLas
20af0 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  tRowid = 0;.    
20b00 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
20b10 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c  i1;.    Fts5Docl
20b20 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20  istIter i2;.    
20b30 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a  Fts5Buffer out;.
20b40 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
20b50 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  mp;.    memset(&
20b60 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f  out, 0, sizeof(o
20b70 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ut));.    memset
20b80 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66  (&tmp, 0, sizeof
20b90 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20 66 74 73  (tmp));..    fts
20ba0 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
20bb0 28 70 31 2c 20 62 44 65 73 63 2c 20 26 69 31 29  (p1, bDesc, &i1)
20bc0 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ;.    fts5Doclis
20bd0 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20 62 44  tIterInit(p2, bD
20be0 65 73 63 2c 20 26 69 32 29 3b 0a 20 20 20 20 77  esc, &i2);.    w
20bf0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
20c00 49 54 45 5f 4f 4b 20 26 26 20 28 69 31 2e 61 50  ITE_OK && (i1.aP
20c10 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e  oslist!=0 || i2.
20c20 61 50 6f 73 6c 69 73 74 21 3d 30 29 20 29 7b 0a  aPoslist!=0) ){.
20c30 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f        if( i2.aPo
20c40 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e  slist==0 || (i1.
20c50 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20 20 20  aPoslist && .   
20c60 20 20 20 20 20 20 20 20 28 20 28 62 44 65 73 63          ( (bDesc
20c70 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e 69 32   && i1.iRowid>i2
20c80 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 21 62 44  .iRowid) || (!bD
20c90 65 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64  esc && i1.iRowid
20ca0 3c 69 32 2e 69 52 6f 77 69 64 29 20 29 0a 20 20  <i2.iRowid) ).  
20cb0 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20      )){.        
20cc0 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72  /* Copy entry fr
20cd0 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20 20  om i1 */.       
20ce0 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
20cf0 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 44  Docid(&p->rc, bD
20d00 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73  esc, &out, &iLas
20d10 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69  tRowid, i1.iRowi
20d20 64 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  d);.        /* W
20d30 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
20d40 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
20d50 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
20d60 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  t(&p->rc, &out, 
20d70 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2a 20 32 29  i1.nPoslist * 2)
20d80 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
20d90 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
20da0 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e  p->rc, &out, i1.
20db0 6e 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 50 6f  nPoslist, i1.aPo
20dc0 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  slist);.        
20dd0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
20de0 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20  ext(&i1);.      
20df0 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
20e00 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20   i1.aPoslist==0 
20e10 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31  || i2.iRowid!=i1
20e20 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  .iRowid ){.     
20e30 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79     /* Copy entry
20e40 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20   from i2 */.    
20e50 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
20e60 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c  endDocid(&p->rc,
20e70 20 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69   bDesc, &out, &i
20e80 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
20e90 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 2f  owid);.        /
20ea0 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
20eb0 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  ZE */.        ft
20ec0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
20ed0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75  rint(&p->rc, &ou
20ee0 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 20 2a  t, i2.nPoslist *
20ef0 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   2);.        fts
20f00 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
20f10 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  b(&p->rc, &out, 
20f20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 32 2e  i2.nPoslist, i2.
20f30 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  aPoslist);.     
20f40 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
20f50 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20  erNext(&i2);.   
20f60 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b     }.      else{
20f70 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73  .        Fts5Pos
20f80 6c 69 73 74 52 65 61 64 65 72 20 72 31 3b 0a 20  listReader r1;. 
20f90 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69         Fts5Posli
20fa0 73 74 52 65 61 64 65 72 20 72 32 3b 0a 20 20 20  stReader r2;.   
20fb0 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
20fc0 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 0a  Writer writer;..
20fd0 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
20fe0 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  writer, 0, sizeo
20ff0 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20 20  f(writer));..   
21000 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68       /* Merge th
21010 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  e two position l
21020 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ists. */ .      
21030 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
21040 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62  dDocid(&p->rc, b
21050 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61  Desc, &out, &iLa
21060 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
21070 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
21080 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70  5BufferZero(&tmp
21090 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
210a0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
210b0 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e 61  derInit(-1, i1.a
210c0 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
210d0 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20 20  list, &r1);.    
210e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
210f0 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
21100 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74  (-1, i2.aPoslist
21110 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i2.nPoslist, &
21120 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  r2);.        whi
21130 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
21140 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f 66  E_OK && (r1.bEof
21150 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d 3d  ==0 || r2.bEof==
21160 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
21170 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  i64 iNew;.      
21180 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66 20      if( r2.bEof 
21190 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 26  || (r1.bEof==0 &
211a0 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50 6f  & r1.iPos<r2.iPo
211b0 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
211c0 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f 73    iNew = r1.iPos
211d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
211e0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
211f0 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b  ReaderNext(&r1);
21200 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21210 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e  {.            iN
21220 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20 20  ew = r2.iPos;.  
21230 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21240 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
21250 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20 20  erNext(&r2);.   
21260 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 2e           if( r1.
21270 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29 20  iPos==r2.iPos ) 
21280 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
21290 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31  stReaderNext(&r1
212a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
212b0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
212c0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
212d0 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28  istWriterAppend(
212e0 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20 69  &tmp, &writer, i
212f0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  New);.        }.
21300 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54  .        /* WRIT
21310 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
21320 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
21330 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
21340 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70  p->rc, &out, tmp
21350 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20  .n * 2);.       
21360 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
21370 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f  dBlob(&p->rc, &o
21380 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70  ut, tmp.n, tmp.p
21390 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
213a0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
213b0 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  i1);.        fts
213c0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
213d0 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (&i2);.      }. 
213e0 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75     }..    fts5Bu
213f0 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
21400 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70  p1, out.n, out.p
21410 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
21420 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20  rFree(&tmp);.   
21430 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
21440 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  &out);.  }.}..st
21450 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 75  atic void fts5Bu
21460 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75 66  fferSwap(Fts5Buf
21470 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66  fer *p1, Fts5Buf
21480 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35  fer *p2){.  Fts5
21490 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31  Buffer tmp = *p1
214a0 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20  ;.  *p1 = *p2;. 
214b0 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73   *p2 = tmp;.}..s
214c0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
214d0 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28 0a  etupPrefixIter(.
214e0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65    /* Index to re
21510 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
21520 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20   bDesc,         
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21540 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20  True for "ORDER 
21550 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a  BY rowid DESC" *
21560 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
21570 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
21580 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
21590 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20  ntaining prefix 
215a0 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e  to match */.  in
215b0 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20  t nToken,       
215c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
215d0 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
215e0 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20  pToken in bytes 
215f0 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
21600 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
21610 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65       /* Populate
21620 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
21630 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
21640 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46  re *pStruct;.  F
21650 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b  ts5Buffer *aBuf;
21660 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
21670 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66 20  f = 32;..  aBuf 
21680 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29 66  = (Fts5Buffer*)f
21690 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
216a0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
216b0 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72  r)*nBuf);.  pStr
216c0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
216d0 75 72 65 52 65 61 64 28 70 2c 20 30 29 3b 0a 0a  ureRead(p, 0);..
216e0 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70 53    if( aBuf && pS
216f0 74 72 75 63 74 20 29 7b 0a 20 20 20 20 46 74 73  truct ){.    Fts
21700 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 44  5DoclistIter *pD
21710 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  oclist;.    int 
21720 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74  i;.    i64 iLast
21730 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46  Rowid = 0;.    F
21740 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
21750 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  *p1 = 0;     /* 
21760 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f  Iterator used to
21770 20 67 61 74 68 65 72 20 64 61 74 61 20 66 72 6f   gather data fro
21780 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46  m index */.    F
21790 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73  ts5Buffer doclis
217a0 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  t;..    memset(&
217b0 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65  doclist, 0, size
217c0 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20  of(doclist));.  
217d0 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49    for(fts5MultiI
217e0 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63  terNew(p, pStruc
217f0 74 2c 20 30 2c 20 31 2c 20 31 2c 20 70 54 6f 6b  t, 0, 1, 1, pTok
21800 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20  en, nToken, -1, 
21810 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20 20  0, &p1);.       
21820 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
21830 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20  f(p, p1)==0;.   
21840 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
21850 65 72 4e 65 78 74 28 70 2c 20 70 31 2c 20 30 2c  erNext(p, p1, 0,
21860 20 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   0).    ){.     
21870 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
21880 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
21890 28 70 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (p1);.      int 
218a0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e  nTerm;.      con
218b0 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66  st u8 *pTerm = f
218c0 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
218d0 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20  (p1, &nTerm);.  
218e0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
218f0 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
21900 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54  , MIN(nToken, nT
21910 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20  erm))<=0 );.    
21920 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b    if( nTerm<nTok
21930 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f  en || memcmp(pTo
21940 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b  ken, pTerm, nTok
21950 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  en) ) break;..  
21960 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e      if( doclist.
21970 6e 3e 30 20 0a 20 20 20 20 20 20 20 26 26 20 28  n>0 .       && (
21980 28 21 62 44 65 73 63 20 26 26 20 69 52 6f 77 69  (!bDesc && iRowi
21990 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 29 20 7c  d<=iLastRowid) |
219a0 7c 20 28 62 44 65 73 63 20 26 26 20 69 52 6f 77  | (bDesc && iRow
219b0 69 64 3e 3d 69 4c 61 73 74 52 6f 77 69 64 29 29  id>=iLastRowid))
219c0 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20  .      ){..     
219d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72     for(i=0; p->r
219e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
219f0 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b  doclist.n; i++){
21a00 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
21a10 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20  t( i<nBuf );.   
21a20 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b         if( aBuf[
21a30 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  i].n==0 ){.     
21a40 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
21a50 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20  rSwap(&doclist, 
21a60 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
21a70 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
21a80 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b  rZero(&doclist);
21a90 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
21ab0 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
21ac0 74 73 28 70 2c 20 62 44 65 73 63 2c 20 26 64 6f  ts(p, bDesc, &do
21ad0 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
21ae0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
21af0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42  s5BufferZero(&aB
21b00 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
21b10 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
21b20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21b30 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30 20 29 7b 0a  doclist.n==0 ){.
21b40 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
21b50 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
21b60 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c  p->rc, &doclist,
21b70 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
21b80 7d 65 6c 73 65 20 69 66 28 20 62 44 65 73 63 20  }else if( bDesc 
21b90 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
21ba0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
21bb0 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69  t(&p->rc, &docli
21bc0 73 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 20 2d  st, iLastRowid -
21bd0 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
21be0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
21bf0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
21c00 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64  arint(&p->rc, &d
21c10 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69 64 20 2d  oclist, iRowid -
21c20 20 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20   iLastRowid);.  
21c30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73      }.      iLas
21c40 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  tRowid = iRowid;
21c50 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
21c60 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70  IterPoslist(p, p
21c70 31 2c 20 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b  1, 1, &doclist);
21c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
21c90 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b  i=0; i<nBuf; i++
21ca0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72  ){.      fts5Mer
21cb0 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c  gePrefixLists(p,
21cc0 20 62 44 65 73 63 2c 20 26 64 6f 63 6c 69 73 74   bDesc, &doclist
21cd0 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
21ce0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
21cf0 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  e(&aBuf[i]);.   
21d00 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69   }.    fts5Multi
21d10 49 74 65 72 46 72 65 65 28 70 2c 20 70 31 29 3b  IterFree(p, p1);
21d20 0a 0a 20 20 20 20 70 44 6f 63 6c 69 73 74 20 3d  ..    pDoclist =
21d30 20 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65   (Fts5DoclistIte
21d40 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
21d50 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
21d60 6f 63 6c 69 73 74 49 74 65 72 29 29 3b 0a 20 20  oclistIter));.  
21d70 20 20 69 66 28 20 21 70 44 6f 63 6c 69 73 74 20    if( !pDoclist 
21d80 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
21d90 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69 73 74  ferFree(&doclist
21da0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
21db0 20 20 20 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c      pIter->pDocl
21dc0 69 73 74 20 3d 20 70 44 6f 63 6c 69 73 74 3b 0a  ist = pDoclist;.
21dd0 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
21de0 74 49 74 65 72 49 6e 69 74 28 26 64 6f 63 6c 69  tIterInit(&docli
21df0 73 74 2c 20 62 44 65 73 63 2c 20 70 49 74 65 72  st, bDesc, pIter
21e00 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20  ->pDoclist);.   
21e10 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 74   }.  }..  fts5St
21e20 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
21e30 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c 69 74  Struct);.  sqlit
21e40 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b 0a 7d  e3_free(aBuf);.}
21e50 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
21e60 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46  5QueryCksum(.  F
21e70 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 63  ts5Index *p,.  c
21e80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 0a 20 20  onst char *z,.  
21e90 69 6e 74 20 6e 2c 0a 20 20 69 6e 74 20 66 6c 61  int n,.  int fla
21ea0 67 73 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75  gs,.  u64 *pCksu
21eb0 6d 0a 29 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d  m.){.  u64 cksum
21ec0 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74   = *pCksum;.  Ft
21ed0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 64  s5IndexIter *pId
21ee0 78 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  xIter = 0;.  int
21ef0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
21f00 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20 7a  5IndexQuery(p, z
21f10 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 26 70 49 64  , n, flags, &pId
21f20 78 49 74 65 72 29 3b 0a 0a 20 20 77 68 69 6c 65  xIter);..  while
21f30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21f40 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  && 0==sqlite3Fts
21f50 35 49 74 65 72 45 6f 66 28 70 49 64 78 49 74 65  5IterEof(pIdxIte
21f60 72 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  r) ){.    const 
21f70 75 38 20 2a 70 50 6f 73 3b 0a 20 20 20 20 69 6e  u8 *pPos;.    in
21f80 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 36 34 20  t nPos;.    i64 
21f90 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46  rowid = sqlite3F
21fa0 74 73 35 49 74 65 72 52 6f 77 69 64 28 70 49 64  ts5IterRowid(pId
21fb0 78 49 74 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  xIter);.    rc =
21fc0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
21fd0 50 6f 73 6c 69 73 74 28 70 49 64 78 49 74 65 72  Poslist(pIdxIter
21fe0 2c 20 26 70 50 6f 73 2c 20 26 6e 50 6f 73 29 3b  , &pPos, &nPos);
21ff0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22010 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
22020 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20  r sReader;.     
22030 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35   for(sqlite3Fts5
22040 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
22050 74 28 2d 31 2c 20 70 50 6f 73 2c 20 6e 50 6f 73  t(-1, pPos, nPos
22060 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20 20  , &sReader);.   
22070 20 20 20 20 20 20 20 73 52 65 61 64 65 72 2e 62         sReader.b
22080 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  Eof==0;.        
22090 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
220a0 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26  listReaderNext(&
220b0 73 52 65 61 64 65 72 29 0a 20 20 20 20 20 20 29  sReader).      )
220c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
220d0 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f  ol = FTS5_POS2CO
220e0 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50 6f  LUMN(sReader.iPo
220f0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  s);.        int 
22100 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32  iOff = FTS5_POS2
22110 4f 46 46 53 45 54 28 73 52 65 61 64 65 72 2e 69  OFFSET(sReader.i
22120 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63 6b  Pos);.        ck
22130 73 75 6d 20 5e 3d 20 66 74 73 35 49 6e 64 65 78  sum ^= fts5Index
22140 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64  EntryCksum(rowid
22150 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 7a 2c  , iCol, iOff, z,
22160 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
22170 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
22180 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 64 78  ts5IterNext(pIdx
22190 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Iter);.    }.  }
221a0 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  .  sqlite3Fts5It
221b0 65 72 43 6c 6f 73 65 28 70 49 64 78 49 74 65 72  erClose(pIdxIter
221c0 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20  );..  *pCksum = 
221d0 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20  cksum;.  return 
221e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  rc;.}../*.** Run
221f0 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
22200 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
22210 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 61  the FTS index (a
22220 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ) is internally 
22230 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61  .** consistent a
22240 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20  nd (b) contains 
22250 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69 63  entries for whic
22260 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65  h the XOR of the
22270 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73   checksums.** as
22280 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 66   calculated by f
22290 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
222a0 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a  um() is cksum..*
222b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
222c0 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
222d0 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  y of the interna
222e0 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f  l checks fail, o
222f0 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63  r if the.** chec
22300 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ksum does not ma
22310 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  tch. Return SQLI
22320 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65  TE_OK if all che
22330 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74  cks pass without
22340 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f  .** error, or so
22350 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
22360 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
22370 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67  other error (e.g
22380 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73  . OOM).** occurs
22390 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
223a0 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
223b0 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
223c0 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29  x *p, u64 cksum)
223d0 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
223e0 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
223f0 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 49 64 78  nfig;.  int iIdx
22400 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22410 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
22420 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
22430 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  gh indexes */.  
22440 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20  u64 cksum2 = 0; 
22450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22460 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65  /* Checksum base
22470 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66  d on contents of
22480 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 75 36   indexes */.  u6
22490 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20  4 cksum3 = 0;   
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
224b0 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   Checksum based 
224c0 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69  on contents of i
224d0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35  ndexes */.  Fts5
224e0 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b 30  Buffer term = {0
224f0 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42  ,0,0};      /* B
22500 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f  uffer used to ho
22510 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 74  ld most recent t
22520 65 72 6d 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65  erm */..  /* Che
22530 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74 65  ck that the inte
22540 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61  rnal nodes of ea
22550 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63 68  ch segment match
22560 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20   the leaves */. 
22570 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 70 2d 3e   for(iIdx=0; p->
22580 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22590 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e   iIdx<=pConfig->
225a0 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29  nPrefix; iIdx++)
225b0 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
225c0 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66  ure *pStruct = f
225d0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
225e0 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69  (p, iIdx);.    i
225f0 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
22600 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
22610 65 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c  eg;.      for(iL
22620 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
22630 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
22640 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
22650 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
22660 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
22670 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
22680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ){.          Fts
22690 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
226a0 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75  t *pSeg = &pStru
226b0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
226c0 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
226d0 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78         fts5Index
226e0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
226f0 67 6d 65 6e 74 28 70 2c 20 69 49 64 78 2c 20 70  gment(p, iIdx, p
22700 53 65 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Seg);.        }.
22710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22720 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
22730 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
22740 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
22750 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61  ksum argument pa
22760 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
22770 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b  ction is a check
22780 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20  sum calculated. 
22790 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c   ** based on all
227a0 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69 65   expected entrie
227b0 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64  s in the FTS ind
227c0 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72  ex (including pr
227d0 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20  efix index.  ** 
227e0 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20 62  entries). This b
227f0 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74  lock checks that
22800 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63   a checksum calc
22810 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
22820 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
22830 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20  contents of FTS 
22840 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69 63  index is identic
22850 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77  al..  **.  ** Tw
22860 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
22870 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20  e same checksum 
22880 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20  are calculated. 
22890 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63 6b  The first (stack
228a0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63  .  ** variable c
228b0 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20  ksum2) based on 
228c0 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74 65  entries extracte
228d0 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d  d from the full-
228e0 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20  text index.  ** 
228f0 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69  while doing a li
22900 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63  near scan of eac
22910 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64  h individual ind
22920 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a  ex in turn. .  *
22930 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74  *.  ** As each t
22940 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20 74  erm visited by t
22950 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c  he linear scans,
22960 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65 72   a separate quer
22970 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73  y for the.  ** s
22980 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72 66  ame term is perf
22990 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73  ormed. cksum3 is
229a0 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65   calculated base
229b0 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73  d on the entries
229c0 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20  .  ** extracted 
229d0 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65 73  by these queries
229e0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 49 64  ..  */.  for(iId
229f0 78 3d 30 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66  x=0; iIdx<=pConf
22a00 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64  ig->nPrefix; iId
22a10 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 4d 75  x++){.    Fts5Mu
22a20 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
22a30 72 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  r;.    Fts5Struc
22a40 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
22a50 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
22a60 64 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20  d(p, iIdx);.    
22a70 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
22a80 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
22a90 20 69 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20   iIdx, 0, 0, 0, 
22aa0 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74 65 72  0, -1, 0, &pIter
22ab0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
22ac0 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
22ad0 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  Iter)==0;.      
22ae0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
22af0 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
22b00 20 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   0).    ){.     
22b10 20 46 74 73 35 50 6f 73 49 74 65 72 20 73 50 6f   Fts5PosIter sPo
22b20 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
22b30 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
22b40 74 68 72 6f 75 67 68 20 70 6f 73 69 74 69 6f 6e  through position
22b50 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69   list */.      i
22b60 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
22b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
22b80 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79  ze of term in by
22b90 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  tes */.      i64
22ba0 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
22bb0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
22bc0 65 72 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  er);.      char 
22bd0 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35  *z = (char*)fts5
22be0 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
22bf0 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 20  ter, &n);..     
22c00 20 2f 2a 20 55 70 64 61 74 65 20 63 6b 73 75 6d   /* Update cksum
22c10 32 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 69  2 with the entri
22c20 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
22c30 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  th the current t
22c40 65 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  erm.      ** and
22c50 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20   rowid.  */.    
22c60 20 20 66 6f 72 28 66 74 73 35 50 6f 73 49 74 65    for(fts5PosIte
22c70 72 49 6e 69 74 28 70 2c 20 70 49 74 65 72 2c 20  rInit(p, pIter, 
22c80 26 73 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  &sPos);.        
22c90 20 20 66 74 73 35 50 6f 73 49 74 65 72 45 6f 66    fts5PosIterEof
22ca0 28 70 2c 20 26 73 50 6f 73 29 3d 3d 30 3b 0a 20  (p, &sPos)==0;. 
22cb0 20 20 20 20 20 20 20 20 20 66 74 73 35 50 6f 73           fts5Pos
22cc0 49 74 65 72 4e 65 78 74 28 70 2c 20 26 73 50 6f  IterNext(p, &sPo
22cd0 73 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  s).      ){.    
22ce0 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66 74      cksum2 ^= ft
22cf0 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
22d00 6d 28 69 52 6f 77 69 64 2c 20 73 50 6f 73 2e 69  m(iRowid, sPos.i
22d10 43 6f 6c 2c 20 73 50 6f 73 2e 69 50 6f 73 2c 20  Col, sPos.iPos, 
22d20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  z, n);.      }..
22d30 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
22d40 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20   is a new term, 
22d50 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70  query for it. Up
22d60 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68  date cksum3 with
22d70 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f   the results. */
22d80 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
22d90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
22da0 74 65 72 6d 2e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d  term.n!=n || mem
22db0 63 6d 70 28 74 65 72 6d 2e 70 2c 20 7a 2c 20 6e  cmp(term.p, z, n
22dc0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
22dd0 74 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 6e  t rc;.        in
22de0 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d  t flags = (iIdx=
22df0 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44  =0 ? 0 : FTS5IND
22e00 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29  EX_QUERY_PREFIX)
22e10 3b 0a 20 20 20 20 20 20 20 20 75 36 34 20 63 6b  ;.        u64 ck
22e20 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  1 = 0;.        u
22e30 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20  64 ck2 = 0;..   
22e40 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
22e50 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72  at the results r
22e60 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20  eturned for ASC 
22e70 61 6e 64 20 44 45 53 43 20 71 75 65 72 69 65 73  and DESC queries
22e80 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
22e90 74 68 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74  the same. If not
22ea0 2c 20 63 61 6c 6c 20 74 68 69 73 20 63 6f 72 72  , call this corr
22eb0 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
22ec0 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
22ed0 72 79 43 6b 73 75 6d 28 70 2c 20 7a 2c 20 6e 2c  ryCksum(p, z, n,
22ee0 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20   flags, &ck1);. 
22ef0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
22f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22f10 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51        rc = fts5Q
22f20 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 7a 2c 20  ueryCksum(p, z, 
22f30 6e 2c 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44  n, flags|FTS5IND
22f40 45 58 5f 51 55 45 52 59 5f 44 45 53 43 2c 20 26  EX_QUERY_DESC, &
22f50 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ck2);.        }.
22f60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22f70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
22f80 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
22f90 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
22fa0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
22fb0 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79  s a prefix query
22fc0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
22fd0 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
22fe0 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20 20  d if the.       
22ff0 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73   ** the index is
23000 20 64 69 73 61 62 6c 65 64 20 61 72 65 20 74 68   disabled are th
23010 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20  e same. In both 
23020 41 53 43 20 61 6e 64 20 44 45 53 43 20 6f 72 64  ASC and DESC ord
23030 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  er. */.        i
23040 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d  f( iIdx>0 && rc=
23050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23060 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
23070 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
23080 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
23090 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 32 20  ;.          ck2 
230a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
230b0 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73  c = fts5QueryCks
230c0 75 6d 28 70 2c 20 7a 2c 20 6e 2c 20 66 2c 20 26  um(p, z, n, f, &
230d0 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ck2);.          
230e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
230f0 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
23100 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
23110 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
23120 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20       if( iIdx>0 
23130 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
23140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
23150 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
23160 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54  INDEX_QUERY_TEST
23170 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58  _NOIDX|FTS5INDEX
23180 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20  _QUERY_DESC;.   
23190 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a         ck2 = 0;.
231a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 66            rc = f
231b0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
231c0 20 7a 2c 20 6e 2c 20 66 2c 20 26 63 6b 32 29 3b   z, n, f, &ck2);
231d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
231e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
231f0 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
23200 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
23210 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
23220 20 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a   cksum3 ^= ck1;.
23230 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
23240 65 72 53 65 74 28 26 72 63 2c 20 26 74 65 72 6d  erSet(&rc, &term
23250 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  , n, (const u8*)
23260 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  z);.        p->r
23270 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  c = rc;.      }.
23280 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75      }.    fts5Mu
23290 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
232a0 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 53  Iter);.    fts5S
232b0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
232c0 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20  pStruct);.  }.  
232d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
232e0 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63  E_OK && cksum!=c
232f0 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
23300 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
23310 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
23320 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63  E_OK && cksum!=c
23330 6b 73 75 6d 33 20 29 20 70 2d 3e 72 63 20 3d 20  ksum3 ) p->rc = 
23340 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
23350 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
23360 26 74 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e  &term);.  return
23370 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
23380 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  (p);.}.../*.** I
23390 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c  ndicate that all
233a0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
233b0 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  s to sqlite3Fts5
233c0 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72  IndexWrite() per
233d0 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tain.** to the d
233e0 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77  ocument with row
233f0 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  id iRowid..*/.in
23400 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
23410 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73  exBeginWrite(Fts
23420 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69  5Index *p, i64 i
23430 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72 74  Rowid){.  assert
23440 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
23450 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  OK );..  /* Allo
23460 63 61 74 65 20 68 61 73 68 20 74 61 62 6c 65 73  cate hash tables
23470 20 69 66 20 74 68 65 79 20 68 61 76 65 20 6e 6f   if they have no
23480 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  t already been a
23490 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66  llocated */.  if
234a0 28 20 70 2d 3e 61 70 48 61 73 68 3d 3d 30 20 29  ( p->apHash==0 )
234b0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
234c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
234d0 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 6e 48 61  _OK;.    int nHa
234e0 73 68 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  sh = p->pConfig-
234f0 3e 6e 50 72 65 66 69 78 20 2b 20 31 3b 0a 20 20  >nPrefix + 1;.  
23500 20 20 46 74 73 35 48 61 73 68 20 2a 2a 61 70 4e    Fts5Hash **apN
23510 65 77 3b 0a 0a 20 20 20 20 61 70 4e 65 77 20 3d  ew;..    apNew =
23520 20 28 46 74 73 35 48 61 73 68 2a 2a 29 73 71 6c   (Fts5Hash**)sql
23530 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
23540 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46  ro(&rc, sizeof(F
23550 74 73 35 48 61 73 68 2a 29 2a 6e 48 61 73 68 29  ts5Hash*)*nHash)
23560 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  ;.    for(i=0; r
23570 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23580 69 3c 6e 48 61 73 68 3b 20 69 2b 2b 29 7b 0a 20  i<nHash; i++){. 
23590 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
235a0 33 46 74 73 35 48 61 73 68 4e 65 77 28 26 61 70  3Fts5HashNew(&ap
235b0 4e 65 77 5b 69 5d 2c 20 26 70 2d 3e 6e 50 65 6e  New[i], &p->nPen
235c0 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 20 20 7d  dingData);.    }
235d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
235e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
235f0 70 2d 3e 61 70 48 61 73 68 20 3d 20 61 70 4e 65  p->apHash = apNe
23600 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  w;.    }else{.  
23610 20 20 20 20 69 66 28 20 61 70 4e 65 77 20 29 7b      if( apNew ){
23620 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
23630 3b 20 69 3c 6e 48 61 73 68 3b 20 69 2b 2b 29 7b  ; i<nHash; i++){
23640 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23650 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28 61  e3Fts5HashFree(a
23660 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pNew[i]);.      
23670 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
23680 74 65 33 5f 66 72 65 65 28 61 70 4e 65 77 29 3b  te3_free(apNew);
23690 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
236a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
236b0 20 20 7d 0a 0a 20 20 69 66 28 20 69 52 6f 77 69    }..  if( iRowi
236c0 64 3c 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  d<=p->iWriteRowi
236d0 64 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e  d || (p->nPendin
236e0 67 44 61 74 61 20 3e 20 70 2d 3e 6e 4d 61 78 50  gData > p->nMaxP
236f0 65 6e 64 69 6e 67 44 61 74 61 29 20 29 7b 0a 20  endingData) ){. 
23700 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73     fts5IndexFlus
23710 68 28 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  h(p);.  }.  p->i
23720 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52 6f  WriteRowid = iRo
23730 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  wid;.  return ft
23740 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
23750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
23760 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a  t data to disk..
23770 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
23780 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35  s5IndexSync(Fts5
23790 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43  Index *p, int bC
237a0 6f 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74  ommit){.  assert
237b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
237c0 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  OK );.  fts5Inde
237d0 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28  xFlush(p);.  if(
237e0 20 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43   bCommit ) fts5C
237f0 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
23800 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
23810 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
23820 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79  *.** Discard any
23830 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
23840 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
23850 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f  sh tables. Do no
23860 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f  t write it.** to
23870 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
23880 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73  dditionally, ass
23890 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ume that the con
238a0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64  tents of the %_d
238b0 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79  ata.** table may
238c0 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e   have changed on
238d0 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e   disk. So any in
238e0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f  -memory caches o
238f0 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63  f %_data .** rec
23900 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76  ords must be inv
23910 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  alidated..*/.int
23920 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
23930 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e  xRollback(Fts5In
23940 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43  dex *p){.  fts5C
23950 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
23960 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72   fts5IndexDiscar
23970 64 44 61 74 61 28 70 29 3b 0a 20 20 61 73 73 65  dData(p);.  asse
23980 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
23990 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
239a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
239b0 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
239c0 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74  table is complet
239d0 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74  ely empty when t
239e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
239f0 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20  called. This.** 
23a00 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
23a10 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20 69  es it with the i
23a20 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72 65  nitial structure
23a30 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
23a40 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20  h index,.** and 
23a50 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73  the initial vers
23a60 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72  ion of the "aver
23a70 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61 20  ages" record (a 
23a80 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e  zero-byte blob).
23a90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
23aa0 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46  ts5IndexReinit(F
23ab0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
23ac0 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 53 74 72  int i;.  Fts5Str
23ad0 75 63 74 75 72 65 20 73 3b 0a 0a 20 20 6d 65 6d  ucture s;..  mem
23ae0 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f  set(&s, 0, sizeo
23af0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
23b00 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
23b10 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  p->pConfig->nPre
23b20 66 69 78 2b 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  fix+1; i++){.   
23b30 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
23b40 69 74 65 28 70 2c 20 69 2c 20 26 73 29 3b 0a 20  ite(p, i, &s);. 
23b50 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d   }.  if( p->rc==
23b60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23b70 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
23b80 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65 72  Fts5IndexSetAver
23b90 61 67 65 73 28 70 2c 20 28 63 6f 6e 73 74 20 75  ages(p, (const u
23ba0 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a  8*)"", 0);.  }..
23bb0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
23bc0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
23bd0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
23be0 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
23bf0 65 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74  e. If the bCreat
23c00 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  e argument is tr
23c10 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e  ue, create.** an
23c20 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
23c30 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61   underlying %_da
23c40 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
23c50 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
23c60 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20  et *pp to point 
23c70 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
23c80 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
23c90 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72  ITE_OK..** Other
23ca0 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f  wise, set *pp to
23cb0 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e   NULL and return
23cc0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
23cd0 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
23ce0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
23cf0 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  en(.  Fts5Config
23d00 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e   *pConfig, .  in
23d10 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74  t bCreate, .  Ft
23d20 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20  s5Index **pp,.  
23d30 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
23d40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23d50 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65  E_OK;.  Fts5Inde
23d60 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
23d70 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f          /* New o
23d80 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20  bject */..  *pp 
23d90 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78  = p = (Fts5Index
23da0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
23db0 28 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65  (sizeof(Fts5Inde
23dc0 78 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20  x));.  if( !p ) 
23dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
23de0 4d 45 4d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  MEM;..  memset(p
23df0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
23e00 49 6e 64 65 78 29 29 3b 0a 20 20 70 2d 3e 70 43  Index));.  p->pC
23e10 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b  onfig = pConfig;
23e20 0a 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20  .  p->nWorkUnit 
23e30 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54  = FTS5_WORK_UNIT
23e40 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69  ;.  p->nMaxPendi
23e50 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31 30  ngData = 1024*10
23e60 32 34 3b 0a 20 20 70 2d 3e 7a 44 61 74 61 54 62  24;.  p->zDataTb
23e70 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
23e80 6e 74 66 28 22 25 73 5f 64 61 74 61 22 2c 20 70  ntf("%s_data", p
23e90 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a  Config->zName);.
23ea0 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62    if( p->zDataTb
23eb0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
23ec0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
23ed0 20 7d 65 6c 73 65 20 69 66 28 20 62 43 72 65 61   }else if( bCrea
23ee0 74 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  te ){.    rc = s
23ef0 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
23f00 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20 70  Table(.        p
23f10 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20  Config, "data", 
23f20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  "id INTEGER PRIM
23f30 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
23f40 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20  LOB", 0, pzErr. 
23f50 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
23f60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23f70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23f80 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74  3Fts5IndexReinit
23f90 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  (p);.    }.  }..
23fa0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
23fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
23fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
23fd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
23fe0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
23ff0 6c 6f 73 65 28 70 2c 20 30 29 3b 0a 20 20 20 20  lose(p, 0);.    
24000 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  *pp = 0;.  }.  r
24010 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24020 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c  ** Close a handl
24030 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65  e opened by an e
24040 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73  arlier call to s
24050 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
24060 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pen()..*/.int sq
24070 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c  lite3Fts5IndexCl
24080 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ose(Fts5Index *p
24090 2c 20 69 6e 74 20 62 44 65 73 74 72 6f 79 29 7b  , int bDestroy){
240a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
240b0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29  TE_OK;.  if( p )
240c0 7b 0a 20 20 20 20 69 66 28 20 62 44 65 73 74 72  {.    if( bDestr
240d0 6f 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  oy ){.      rc =
240e0 20 73 71 6c 69 74 65 33 46 74 73 35 44 72 6f 70   sqlite3Fts5Drop
240f0 54 61 62 6c 65 28 70 2d 3e 70 43 6f 6e 66 69 67  Table(p->pConfig
24100 2c 20 22 64 61 74 61 22 29 3b 0a 20 20 20 20 7d  , "data");.    }
24110 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
24120 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20  pReader==0 );.  
24130 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
24140 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  ze(p->pWriter);.
24150 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
24160 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72  lize(p->pDeleter
24170 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 70  );.    if( p->ap
24180 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 69 6e  Hash ){.      in
24190 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
241a0 3d 30 3b 20 69 3c 3d 70 2d 3e 70 43 6f 6e 66 69  =0; i<=p->pConfi
241b0 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29  g->nPrefix; i++)
241c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
241d0 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70 2d  3Fts5HashFree(p-
241e0 3e 61 70 48 61 73 68 5b 69 5d 29 3b 0a 20 20 20  >apHash[i]);.   
241f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
24200 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 48 61 73  e3_free(p->apHas
24210 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  h);.    }.    sq
24220 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44  lite3_free(p->zD
24230 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c  ataTbl);.    sql
24240 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
24250 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24260 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
24270 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62   p points to a b
24280 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
24290 20 75 74 66 2d 38 20 74 65 78 74 20 74 68 61 74   utf-8 text that
242a0 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a   is n bytes in .
242b0 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  ** size. Return 
242c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
242d0 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72  tes in the nChar
242e0 20 63 68 61 72 61 63 74 65 72 20 70 72 65 66 69   character prefi
242f0 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66  x of the.** buff
24300 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72  er, or 0 if ther
24310 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  e are less than 
24320 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 73  nChar characters
24330 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73 74   in total..*/.st
24340 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
24350 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c  exCharlenToBytel
24360 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  en(const char *p
24370 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
24380 20 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74 20 6e   nChar){.  int n
24390 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
243a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61   for(i=0; i<nCha
243b0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
243c0 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74 75   n>=nByte ) retu
243d0 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e  rn 0;      /* In
243e0 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65 77  put contains few
243f0 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  er than nChar ch
24400 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  ars */.    if( (
24410 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 5b  unsigned char)p[
24420 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20  n++]>=0xc0 ){.  
24430 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d      while( (p[n]
24440 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29   & 0xc0)==0x80 )
24450 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
24460 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
24470 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55 54  *.** pIn is a UT
24480 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69  F-8 encoded stri
24490 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69 6e  ng, nIn bytes in
244a0 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68   size. Return th
244b0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75  e number of.** u
244c0 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
244d0 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e  s in the string.
244e0 0a 2a 2f 0a 69 6e 74 20 66 74 73 35 49 6e 64 65  .*/.int fts5Inde
244f0 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63  xCharlen(const c
24500 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49  har *pIn, int nI
24510 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20  n){.  int nChar 
24520 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
24530 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
24540 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a  while( i<nIn ){.
24550 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
24560 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e  d char)pIn[i++]>
24570 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77  =0xc0 ){.      w
24580 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28  hile( i<nIn && (
24590 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d  pIn[i] & 0xc0)==
245a0 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20  0x80 ) i++;.    
245b0 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20  }.    nChar++;. 
245c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61   }.  return nCha
245d0 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63  r;.}../*.** Calc
245e0 75 6c 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ulate and return
245f0 20 61 20 63 68 65 63 6b 73 75 6d 20 74 68 61 74   a checksum that
24600 20 69 73 20 74 68 65 20 58 4f 52 20 6f 66 20 74   is the XOR of t
24610 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
24620 2a 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c  * checksum of al
24630 6c 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  l entries that w
24640 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65  ould be generate
24650 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 20 73  d by the token s
24660 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
24670 68 65 20 66 69 6e 61 6c 20 35 20 61 72 67 75 6d  he final 5 argum
24680 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c  ents..*/.u64 sql
24690 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6b 73  ite3Fts5IndexCks
246a0 75 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  um(.  Fts5Config
246b0 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20   *pConfig,      
246c0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
246d0 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  ration object */
246e0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20  .  i64 iRowid,  
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24700 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20 74     /* Document t
24710 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a  erm appears in *
24720 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24740 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65      /* Column te
24750 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f  rm appears in */
24760 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20  .  int iPos,    
24770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24780 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 74     /* Position t
24790 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a  erm appears in *
247a0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
247b0 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
247c0 20 20 20 20 2f 2a 20 54 65 72 6d 20 61 74 20 69      /* Term at i
247d0 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20  Pos */.){.  u64 
247e0 72 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ret = 0;        
247f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24800 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
24810 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20   int iIdx;      
24820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24830 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e   /* For iteratin
24840 67 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65  g through indexe
24850 73 20 2a 2f 0a 0a 20 20 72 65 74 20 3d 20 66 74  s */..  ret = ft
24860 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
24870 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  m(iRowid, iCol, 
24880 69 50 6f 73 2c 20 70 54 65 72 6d 2c 20 6e 54 65  iPos, pTerm, nTe
24890 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 49 64 78  rm);..  for(iIdx
248a0 3d 30 3b 20 69 49 64 78 3c 70 43 6f 6e 66 69 67  =0; iIdx<pConfig
248b0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
248c0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  +){.    int nByt
248d0 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61  e = fts5IndexCha
248e0 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54  rlenToBytelen(pT
248f0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 43 6f 6e  erm, nTerm, pCon
24900 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
24910 78 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  x]);.    if( nBy
24920 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 20  te ){.      ret 
24930 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  ^= fts5IndexEntr
24940 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69  yCksum(iRowid, i
24950 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 65 72 6d  Col, iPos, pTerm
24960 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
24970 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65    }..  return re
24980 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  t;.}../*.** Inse
24990 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74  rt or remove dat
249a0 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  a to or from the
249b0 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d   index. Each tim
249c0 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20  e a document is 
249d0 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20  .** added to or 
249e0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
249f0 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e   index, this fun
24a00 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
24a10 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74  one or more.** t
24a20 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  imes..**.** For 
24a30 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75  an insert, it mu
24a40 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  st be called onc
24a50 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e  e for each token
24a60 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75   in the new docu
24a70 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ment..** If the 
24a80 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64  operation is a d
24a90 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62  elete, it must b
24aa0 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61  e called (at lea
24ab0 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  st) once for eac
24ac0 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65  h.** unique toke
24ad0 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  n in the documen
24ae0 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76  t with an iCol v
24af0 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a  alue less than z
24b00 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a  ero. The iPos.**
24b10 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e   argument is ign
24b20 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74  ored for a delet
24b30 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
24b40 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
24b50 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
24b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b70 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
24b80 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
24b90 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
24ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24bb0 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70  Column token app
24bc0 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20  ears in (-ve -> 
24bd0 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74  delete) */.  int
24be0 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c00 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
24c10 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20  n within column 
24c20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
24c30 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
24c40 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
24c50 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
24c60 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
24c70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c90 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
24ca0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
24cb0 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  gh indexes */.  
24cc0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
24cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ce0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
24cf0 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
24d00 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
24d10 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nfig;..  assert(
24d20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
24d30 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74  K );..  /* Add t
24d40 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20 74 6f 20  he new token to 
24d50 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 68  the main terms h
24d60 61 73 68 20 74 61 62 6c 65 2e 20 41 6e 64 20 74  ash table. And t
24d70 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 20 20  o each of the.  
24d80 2a 2a 20 70 72 65 66 69 78 20 68 61 73 68 20 74  ** prefix hash t
24d90 61 62 6c 65 73 20 74 68 61 74 20 69 74 20 69 73  ables that it is
24da0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
24db0 72 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  r. */.  rc = sql
24dc0 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
24dd0 65 28 0a 20 20 20 20 20 20 70 2d 3e 61 70 48 61  e(.      p->apHa
24de0 73 68 5b 30 5d 2c 20 70 2d 3e 69 57 72 69 74 65  sh[0], p->iWrite
24df0 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
24e00 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  s, pToken, nToke
24e10 6e 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  n.  );.  for(i=0
24e20 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  ; i<pConfig->nPr
24e30 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49  efix && rc==SQLI
24e40 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
24e50 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74 73   int nByte = fts
24e60 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42  5IndexCharlenToB
24e70 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e  ytelen(pToken, n
24e80 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e  Token, pConfig->
24e90 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20  aPrefix[i]);.   
24ea0 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20   if( nByte ){.  
24eb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24ec0 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a 20  Fts5HashWrite(. 
24ed0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 48 61           p->apHa
24ee0 73 68 5b 69 2b 31 5d 2c 20 70 2d 3e 69 57 72 69  sh[i+1], p->iWri
24ef0 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
24f00 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42 79  Pos, pToken, nBy
24f10 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  te.      );.    
24f20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
24f30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
24f40 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72  n a new iterator
24f50 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75   to iterate thou
24f60 67 68 20 61 6c 6c 20 64 6f 63 69 64 73 20 74 68  gh all docids th
24f70 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a  at match the .**
24f80 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e   specified token
24f90 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78   or token prefix
24fa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24fb0 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a  Fts5IndexQuery(.
24fc0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
24fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fe0 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74    /* FTS index t
24ff0 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e  o query */.  con
25000 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
25010 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20   int nToken, /* 
25020 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78  Token (or prefix
25030 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  ) to query for *
25040 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
25050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25060 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46      /* Mask of F
25070 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58  TS5INDEX_QUERY_X
25080 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
25090 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74  IndexIter **ppIt
250a0 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er          /* O
250b0 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72  UT: New iterator
250c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
250d0 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
250e0 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
250f0 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ;.  Fts5IndexIte
25100 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20 69  r *pRet;.  int i
25110 49 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Idx = 0;..  if( 
25120 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
25130 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29  X_QUERY_PREFIX )
25140 7b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20  {.    if( flags 
25150 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
25160 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 29 7b 0a  Y_TEST_NOIDX ){.
25170 20 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b 70        iIdx = 1+p
25180 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
25190 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
251a0 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66 74    int nChar = ft
251b0 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 70  s5IndexCharlen(p
251c0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
251d0 20 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31        for(iIdx=1
251e0 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ; iIdx<=pConfig-
251f0 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b  >nPrefix; iIdx++
25200 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
25210 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
25220 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29  iIdx-1]==nChar )
25230 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25240 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65      }.  }..  pRe
25250 74 20 3d 20 28 46 74 73 35 49 6e 64 65 78 49 74  t = (Fts5IndexIt
25260 65 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  er*)sqlite3Fts5M
25270 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63  allocZero(&p->rc
25280 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  , sizeof(Fts5Ind
25290 65 78 49 74 65 72 29 29 3b 0a 20 20 69 66 28 20  exIter));.  if( 
252a0 70 52 65 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73  pRet ){.    mems
252b0 65 74 28 70 52 65 74 2c 20 30 2c 20 73 69 7a 65  et(pRet, 0, size
252c0 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  of(Fts5IndexIter
252d0 29 29 3b 0a 0a 20 20 20 20 70 52 65 74 2d 3e 70  ));..    pRet->p
252e0 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 69  Index = p;.    i
252f0 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  f( iIdx<=pConfig
25300 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20  ->nPrefix ){.   
25310 20 20 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74     pRet->pStruct
25320 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
25330 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20  Read(p, iIdx);. 
25340 20 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70       if( pRet->p
25350 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20  Struct ){.      
25360 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
25370 65 77 28 70 2c 20 70 52 65 74 2d 3e 70 53 74 72  ew(p, pRet->pStr
25380 75 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20  uct, .          
25390 20 20 69 49 64 78 2c 20 31 2c 20 66 6c 61 67 73    iIdx, 1, flags
253a0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 54 6f  , (const u8*)pTo
253b0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c  ken, nToken, -1,
253c0 20 30 2c 20 26 70 52 65 74 2d 3e 70 4d 75 6c 74   0, &pRet->pMult
253d0 69 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  i.        );.   
253e0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
253f0 20 20 20 20 20 20 69 6e 74 20 62 44 65 73 63 20        int bDesc 
25400 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  = (flags & FTS5I
25410 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29  NDEX_QUERY_DESC)
25420 21 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 53  !=0;.      fts5S
25430 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28 70  etupPrefixIter(p
25440 2c 20 62 44 65 73 63 2c 20 28 63 6f 6e 73 74 20  , bDesc, (const 
25450 75 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  u8*)pToken, nTok
25460 65 6e 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 7d  en, pRet);.    }
25470 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
25480 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
25490 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 52  Fts5IterClose(pR
254a0 65 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  et);.    pRet = 
254b0 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 74 65 72  0;.  }.  *ppIter
254c0 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72   = pRet;.  retur
254d0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
254e0 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
254f0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
25500 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
25510 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
25520 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46  gument is at EOF
25530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25540 46 74 73 35 49 74 65 72 45 6f 66 28 46 74 73 35  Fts5IterEof(Fts5
25550 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
25560 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
25570 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
25580 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
25590 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  f( pIter->pDocli
255a0 73 74 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  st ){ .    retur
255b0 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  n pIter->pDoclis
255c0 74 2d 3e 61 50 6f 73 6c 69 73 74 3d 3d 30 3b 20  t->aPoslist==0; 
255d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
255e0 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74  turn fts5MultiIt
255f0 65 72 45 6f 66 28 70 49 74 65 72 2d 3e 70 49 6e  erEof(pIter->pIn
25600 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c  dex, pIter->pMul
25610 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ti);.  }.}../*.*
25620 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65  * Move to the ne
25630 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69  xt matching rowi
25640 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  d. .*/.int sqlit
25650 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 46  e3Fts5IterNext(F
25660 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
25670 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
25680 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
25690 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
256a0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
256b0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 66 74 73  clist ){.    fts
256c0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
256d0 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74  (pIter->pDoclist
256e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
256f0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
25700 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
25710 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
25720 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49  erNext(pIter->pI
25730 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75  ndex, pIter->pMu
25740 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  lti, 0, 0);.  }.
25750 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
25760 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
25770 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
25780 2a 20 4d 6f 76 65 20 74 68 65 20 64 6f 63 6c 69  * Move the docli
25790 73 74 2d 69 74 65 72 20 70 61 73 73 65 64 20 61  st-iter passed a
257a0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
257b0 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  ment to the next
257c0 20 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f   .** matching ro
257d0 77 69 64 20 74 68 61 74 20 6f 63 63 75 72 73 20  wid that occurs 
257e0 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74  at or after iMat
257f0 63 68 2e 20 54 68 65 20 64 65 66 69 6e 69 74 69  ch. The definiti
25800 6f 6e 20 6f 66 20 22 61 74 20 0a 2a 2a 20 6f 72  on of "at .** or
25810 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73 20   after" depends 
25820 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73 20  on whether this 
25830 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65  iterator iterate
25840 73 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  s in ascending o
25850 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 69 6e 67  r .** descending
25860 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f   rowid order..*/
25870 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
25880 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
25890 46 72 6f 6d 28 46 74 73 35 44 6f 63 6c 69 73 74  From(Fts5Doclist
258a0 49 74 65 72 20 2a 70 2c 20 69 36 34 20 69 4d 61  Iter *p, i64 iMa
258b0 74 63 68 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20  tch){.  do{.    
258c0 69 36 34 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e  i64 iRowid = p->
258d0 69 52 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20  iRowid;.    if( 
258e0 70 2d 3e 62 44 65 73 63 3d 3d 30 20 26 26 20 69  p->bDesc==0 && i
258f0 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
25900 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
25910 2d 3e 62 44 65 73 63 21 3d 30 20 26 26 20 69 52  ->bDesc!=0 && iR
25920 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62  owid<=iMatch ) b
25930 72 65 61 6b 3b 0a 20 20 20 20 66 74 73 35 44 6f  reak;.    fts5Do
25940 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 29  clistIterNext(p)
25950 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e 61  ;.  }while( p->a
25960 50 6f 73 6c 69 73 74 20 29 3b 0a 7d 0a 0a 2f 2a  Poslist );.}../*
25970 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
25980 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f  next matching ro
25990 77 69 64 20 74 68 61 74 20 6f 63 63 75 72 73 20  wid that occurs 
259a0 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74  at or after iMat
259b0 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e  ch. The.** defin
259c0 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20  ition of "at or 
259d0 61 66 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f  after" depends o
259e0 6e 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69  n whether this i
259f0 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73  terator iterates
25a00 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
25a10 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72   or descending r
25a20 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69  owid order..*/.i
25a30 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
25a40 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49  erNextFrom(Fts5I
25a50 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
25a60 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20   i64 iMatch){.  
25a70 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
25a80 69 73 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44  ist ){.    fts5D
25a90 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72  oclistIterNextFr
25aa0 6f 6d 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  om(pIter->pDocli
25ab0 73 74 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 7d  st, iMatch);.  }
25ac0 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75  else{.    fts5Mu
25ad0 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ltiIterNextFrom(
25ae0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
25af0 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d  Iter->pMulti, iM
25b00 61 74 63 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74  atch);.  }.  ret
25b10 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
25b20 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
25b30 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  x);.}../*.** Ret
25b40 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
25b50 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71  rowid..*/.i64 sq
25b60 6c 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77  lite3Fts5IterRow
25b70 69 64 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  id(Fts5IndexIter
25b80 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
25b90 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20  pIter->pDoclist 
25ba0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49  ){.    return pI
25bb0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 69  ter->pDoclist->i
25bc0 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rowid;.  }else{.
25bd0 20 20 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d      return fts5M
25be0 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
25bf0 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20  ter->pMulti);.  
25c00 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  }.}.../*.** Retu
25c10 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
25c20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
25c30 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ing a copy of th
25c40 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
25c50 66 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  for.** the curre
25c60 6e 74 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74  nt entry. Output
25c70 20 76 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73   variable *pn is
25c80 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
25c90 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a   of the buffer .
25ca0 2a 2a 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f  ** in bytes befo
25cb0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
25cc0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
25cd0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
25ce0 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
25cf0 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 62  the "number of b
25d00 79 74 65 73 22 20 76 61 72 69 6e 74 0a 2a 2a 20  ytes" varint.** 
25d10 66 69 65 6c 64 20 74 68 61 74 20 73 74 61 72 74  field that start
25d20 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
25d30 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a  ist on disk..*/.
25d40 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
25d50 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49  terPoslist(Fts5I
25d60 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
25d70 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20   const u8 **pp, 
25d80 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 61 73 73 65  int *pn){.  asse
25d90 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
25da0 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
25db0 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d   );.  if( pIter-
25dc0 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  >pDoclist ){.   
25dd0 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 44   *pn = pIter->pD
25de0 6f 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c 69 73 74  oclist->nPoslist
25df0 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65  ;.    *pp = pIte
25e00 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50 6f  r->pDoclist->aPo
25e10 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  slist;.  }else{.
25e20 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70      Fts5Index *p
25e30 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
25e40 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
25e50 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73  Zero(&pIter->pos
25e60 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 4d  list);.    fts5M
25e70 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
25e80 70 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  p, pIter->pMulti
25e90 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  , 0, &pIter->pos
25ea0 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 6e 20 3d  list);.    *pn =
25eb0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
25ec0 6e 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74  n;.    *pp = pIt
25ed0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
25ee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35   }.  return fts5
25ef0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65  IndexReturn(pIte
25f00 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  r->pIndex);.}../
25f10 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74  *.** Close an it
25f20 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79  erator opened by
25f30 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
25f40 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
25f50 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a  ndexQuery()..*/.
25f60 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
25f70 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e  IterClose(Fts5In
25f80 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
25f90 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
25fa0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
25fb0 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
25fc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
25fd0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61  ter->pDoclist->a
25fe0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25ff0 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f  _free(pIter->pDo
26000 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73  clist);.    }els
26010 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  e{.      fts5Mul
26020 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72  tiIterFree(pIter
26030 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d  ->pIndex, pIter-
26040 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20  >pMulti);.      
26050 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
26060 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72  ease(pIter->pStr
26070 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  uct);.      fts5
26080 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65  BufferFree(&pIte
26090 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
260a0 20 7d 0a 20 20 20 20 66 74 73 35 43 6c 6f 73 65   }.    fts5Close
260b0 52 65 61 64 65 72 28 70 49 74 65 72 2d 3e 70 49  Reader(pIter->pI
260c0 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
260d0 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
260e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
260f0 64 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  d the "averages"
26100 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
26110 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64   buffer supplied
26120 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
26130 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74  ** argument. Ret
26140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
26150 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
26160 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
26170 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65 72  code.** if an er
26180 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  ror occurs..*/.i
26190 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
261a0 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
261b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
261c0 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
261d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
261e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
261f0 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
26200 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46 54  ffer(p, pBuf, FT
26210 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
26220 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  D);.  return fts
26230 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
26240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  .}../*.** Replac
26250 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61  e the current "a
26260 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
26270 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
26280 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
26290 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20  .** supplied as 
262a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
262b0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
262c0 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
262d0 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
262e0 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a  x *p, const u8 *
262f0 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
26300 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
26310 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
26320 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
26330 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
26340 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20  S_ROWID, pData, 
26350 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  nData);.  return
26360 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
26370 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
26380 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
26390 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20  umber of blocks 
263a0 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20  this module has 
263b0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  read from the %_
263c0 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69  data.** table si
263d0 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74  nce it was creat
263e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
263f0 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73  e3Fts5IndexReads
26400 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
26410 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61    return p->nRea
26420 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  d;.}../*.** Set 
26430 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69  the 32-bit cooki
26440 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61  e value stored a
26450 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  t the start of a
26460 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  ll structure .**
26470 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20   records to the 
26480 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
26490 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
264a0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ent..**.** Retur
264b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
264c0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
264d0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
264e0 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
264f0 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
26500 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
26510 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49  xSetCookie(Fts5I
26520 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65  ndex *p, int iNe
26530 77 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  w){.  int rc = S
26540 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35  QLITE_OK;.  Fts5
26550 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
26560 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
26570 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 0a 20  u8 aCookie[4];. 
26580 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
26590 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
265a0 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  _OK );.  sqlite3
265b0 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b 69  Fts5Put32(aCooki
265c0 65 2c 20 69 4e 65 77 29 3b 0a 20 20 66 6f 72 28  e, iNew);.  for(
265d0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
265e0 4f 4b 20 26 26 20 69 3c 3d 70 43 6f 6e 66 69 67  OK && i<=pConfig
265f0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b  ->nPrefix; i++){
26600 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  .    sqlite3_blo
26610 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20  b *pBlob = 0;.  
26620 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
26630 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
26640 57 49 44 28 69 29 3b 0a 20 20 20 20 72 63 20 3d  WID(i);.    rc =
26650 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70   sqlite3_blob_op
26660 65 6e 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e  en(.        pCon
26670 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67  fig->db, pConfig
26680 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54  ->zDb, p->zDataT
26690 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f  bl, "block", iRo
266a0 77 69 64 2c 20 31 2c 20 26 70 42 6c 6f 62 0a 20  wid, 1, &pBlob. 
266b0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
266c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
266d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f       sqlite3_blo
266e0 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61  b_write(pBlob, a
266f0 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20  Cookie, 4, 0);. 
26700 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26710 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c  3_blob_close(pBl
26720 6f 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ob);.    }.  }..
26730 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26740 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
26750 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28 46  ndexLoadConfig(F
26760 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
26770 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
26780 53 74 72 75 63 74 3b 0a 20 20 70 53 74 72 75 63  Struct;.  pStruc
26790 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
267a0 65 52 65 61 64 28 70 2c 20 30 29 3b 0a 20 20 66  eRead(p, 0);.  f
267b0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
267c0 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
267d0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
267e0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
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 2a 2a 2a 2a  ****************
26830 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26880 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69  ***.** Below thi
26890 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69  s point is the i
268a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
268b0 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
268c0 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e  () scalar.** fun
268d0 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a  ction only..*/..
268e0 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73  /*.** Decode a s
268f0 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77 69  egment-data rowi
26900 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
26910 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  a table. This fu
26920 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65  nction is.** the
26930 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61 63   opposite of mac
26940 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ro FTS5_SEGMENT_
26950 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74  ROWID()..*/.stat
26960 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
26970 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20 69  deRowid(.  i64 i
26980 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
26990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
269a0 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61 20  wid from %_data 
269b0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  table */.  int *
269c0 70 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  piIdx,          
269d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
269e0 54 3a 20 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  T: Index */.  in
269f0 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20  t *piSegid,     
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a10 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64   OUT: Segment id
26a20 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69   */.  int *piHei
26a30 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
26a40 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65        /* OUT: He
26a50 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ight */.  int *p
26a60 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20  iPgno           
26a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
26a80 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  : Page number */
26a90 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20  .){.  *piPgno = 
26aa0 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
26ab0 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
26ac0 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31  DATA_PAGE_B) - 1
26ad0 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
26ae0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
26af0 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20  B;..  *piHeight 
26b00 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
26b10 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
26b20 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29  5_DATA_HEIGHT_B)
26b30 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64   - 1));.  iRowid
26b40 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48   >>= FTS5_DATA_H
26b50 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 69 53  EIGHT_B;..  *piS
26b60 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f  egid = (int)(iRo
26b70 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
26b80 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  < FTS5_DATA_ID_B
26b90 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69  ) - 1));.  iRowi
26ba0 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
26bb0 49 44 5f 42 3b 0a 0a 20 20 2a 70 69 49 64 78 20  ID_B;..  *piIdx 
26bc0 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
26bd0 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
26be0 35 5f 44 41 54 41 5f 49 44 58 5f 42 29 20 2d 20  5_DATA_IDX_B) - 
26bf0 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  1));.}..static v
26c00 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77  oid fts5DebugRow
26c10 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  id(int *pRc, Fts
26c20 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
26c30 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20  64 iKey){.  int 
26c40 69 49 64 78 2c 69 53 65 67 69 64 2c 69 48 65 69  iIdx,iSegid,iHei
26c50 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52  ght,iPgno;  /* R
26c60 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20  owid compenents 
26c70 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52  */.  fts5DecodeR
26c80 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 49 64 78  owid(iKey, &iIdx
26c90 2c 20 26 69 53 65 67 69 64 2c 20 26 69 48 65 69  , &iSegid, &iHei
26ca0 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
26cb0 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
26cc0 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d  {.    if( iKey==
26cd0 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
26ce0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  WID ){.      sql
26cf0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
26d00 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
26d10 70 42 75 66 2c 20 22 28 61 76 65 72 61 67 65 73  pBuf, "(averages
26d20 29 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ) ");.    }else{
26d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
26d40 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
26d50 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
26d60 0a 20 20 20 20 20 20 20 20 20 20 22 7b 73 74 72  .          "{str
26d70 75 63 74 75 72 65 20 69 64 78 3d 25 64 7d 22 2c  ucture idx=%d}",
26d80 20 28 69 6e 74 29 28 69 4b 65 79 2d 31 30 29 0a   (int)(iKey-10).
26d90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
26da0 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 69 48   }.  else if( iH
26db0 65 69 67 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d  eight==FTS5_SEGM
26dc0 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 29  ENT_MAX_HEIGHT )
26dd0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
26de0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
26df0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
26e00 28 64 6c 69 64 78 20 69 64 78 3d 25 64 20 73 65  (dlidx idx=%d se
26e10 67 69 64 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22  gid=%d pgno=%d)"
26e20 2c 0a 20 20 20 20 20 20 20 20 69 49 64 78 2c 20  ,.        iIdx, 
26e30 69 53 65 67 69 64 2c 20 69 50 67 6e 6f 0a 20 20  iSegid, iPgno.  
26e40 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
26e50 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
26e60 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
26e70 70 52 63 2c 20 70 42 75 66 2c 20 22 28 69 64 78  pRc, pBuf, "(idx
26e80 3d 25 64 20 73 65 67 69 64 3d 25 64 20 68 3d 25  =%d segid=%d h=%
26e90 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20 20 20  d pgno=%d)",.   
26ea0 20 20 20 20 20 69 49 64 78 2c 20 69 53 65 67 69       iIdx, iSegi
26eb0 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
26ec0 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
26ed0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
26ee0 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a  DebugStructure(.
26ef0 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
26f20 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
26f30 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
26f40 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
26f50 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  p.){.  int iLvl,
26f60 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
26f70 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
26f80 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
26f90 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20  , segments */.. 
26fa0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
26fb0 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  l<p->nLevel; iLv
26fc0 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74  l++){.    Fts5St
26fd0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
26fe0 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b  vl = &p->aLevel[
26ff0 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74  iLvl];.    sqlit
27000 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
27010 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
27020 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b  uf, .        " {
27030 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64  lvl=%d nMerge=%d
27040 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e  ", iLvl, pLvl->n
27050 4d 65 72 67 65 0a 20 20 20 20 29 3b 0a 20 20 20  Merge.    );.   
27060 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
27070 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
27080 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  eg++){.      Fts
27090 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
270a0 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d  t *pSeg = &pLvl-
270b0 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  >aSeg[iSeg];.   
270c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
270d0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
270e0 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20  (pRc, pBuf, .   
270f0 20 20 20 20 20 20 20 22 20 7b 69 64 3d 25 64 20         " {id=%d 
27100 68 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e  h=%d leaves=%d..
27110 25 64 7d 22 2c 20 70 53 65 67 2d 3e 69 53 65 67  %d}", pSeg->iSeg
27120 69 64 2c 20 70 53 65 67 2d 3e 6e 48 65 69 67 68  id, pSeg->nHeigh
27130 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 53  t, .          pS
27140 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70  eg->pgnoFirst, p
27150 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20  Seg->pgnoLast.  
27160 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
27170 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
27180 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
27190 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a  Rc, pBuf, "}");.
271a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
271b0 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  s is part of the
271c0 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
271d0 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a  ebugging aid..**
271e0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42  .** Arguments pB
271f0 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69  lob/nBlob contai
27200 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20 46  n a serialized F
27210 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
27220 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ect. This.** fun
27230 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20  ction appends a 
27240 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72  human-readable r
27250 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
27260 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63 74   the same object
27270 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66 65  .** to the buffe
27280 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
27290 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
272a0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
272b0 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63   fts5DecodeStruc
272c0 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ture(.  int *pRc
272d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
272e0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
272f0 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: error code */
27300 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
27310 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20  Buf,.  const u8 
27320 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
27330 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  b.){.  int rc;  
27340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27350 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
27360 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53   code */.  Fts5S
27370 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b  tructure *p = 0;
27380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
27390 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65 20  coded structure 
273a0 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20  object */..  rc 
273b0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  = fts5StructureD
273c0 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c  ecode(pBlob, nBl
273d0 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69 66  ob, 0, &p);.  if
273e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
273f0 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63  ){.    *pRc = rc
27400 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
27410 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53 74  }..  fts5DebugSt
27420 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42 75  ructure(pRc, pBu
27430 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74 72  f, p);.  fts5Str
27440 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 29  uctureRelease(p)
27450 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  ;.}../*.** Buffe
27460 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d  r (a/n) is assum
27470 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20  ed to contain a 
27480 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a  list of serializ
27490 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64  ed varints. Read
274a0 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20  .** each varint 
274b0 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20 73  and append its s
274c0 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
274d0 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70  tion to buffer p
274e0 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61  Buf. Return.** a
274f0 66 74 65 72 20 65 69 74 68 65 72 20 74 68 65 20  fter either the 
27500 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20  input buffer is 
27510 65 78 68 61 75 73 74 65 64 20 6f 72 20 61 20 30  exhausted or a 0
27520 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a   value is read..
27530 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
27540 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
27550 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
27560 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
27570 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
27580 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
27590 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70  dePoslist(int *p
275a0 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
275b0 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
275c0 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  a, int n){.  int
275d0 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69   iOff = 0;.  whi
275e0 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  le( iOff<n ){.  
275f0 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
27600 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
27610 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
27620 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  , iVal);.    sql
27630 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
27640 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
27650 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61  pBuf, " %d", iVa
27660 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  l);.  }.  return
27670 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
27680 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66  The start of buf
27690 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69  fer (a/n) contai
276a0 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ns the start of 
276b0 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64  a doclist. The d
276c0 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72  oclist.** may or
276d0 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20   may not finish 
276e0 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65  within the buffe
276f0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
27700 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a   appends a text.
27710 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ** representatio
27720 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66  n of the part of
27730 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61   the doclist tha
27740 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20  t is present to 
27750 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20  buffer.** pBuf. 
27760 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
27770 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
27780 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
27790 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
277a0 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
277b0 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
277c0 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a  odeDoclist(int *
277d0 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
277e0 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
277f0 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36  *a, int n){.  i6
27800 34 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74 20  4 iDocid;.  int 
27810 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28  iOff = 0;..  if(
27820 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
27830 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Off += sqlite3Ge
27840 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
27850 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29  , (u64*)&iDocid)
27860 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
27870 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
27880 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
27890 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44   rowid=%lld", iD
278a0 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69  ocid);.  }.  whi
278b0 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  le( iOff<n ){.  
278c0 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
278d0 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
278e0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50  iOff += fts5GetP
278f0 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f  oslistSize(&a[iO
27900 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  ff], &nPos, &bDu
27910 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b  mmy);.    iOff +
27920 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  = fts5DecodePosl
27930 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26  ist(pRc, pBuf, &
27940 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69  a[iOff], MIN(n-i
27950 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20  Off, nPos));.   
27960 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20   if( iOff<n ){. 
27970 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
27980 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73  .      iOff += s
27990 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
279a0 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  &a[iOff], (u64*)
279b0 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
279c0 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20  if( iDelta==0 ) 
279d0 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20  return iOff;.   
279e0 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65     iDocid += iDe
279f0 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lta;.      sqlit
27a00 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
27a10 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
27a20 75 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64  uf, " rowid=%lld
27a30 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20  ", iDocid);.    
27a40 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
27a50 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
27a60 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
27a70 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65  n of user-define
27a80 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  d scalar functio
27a90 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e  n fts5_decode().
27aa0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27ab0 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
27ac0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
27ad0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
27ae0 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
27af0 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
27b00 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
27b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27b30 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
27b40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
27b50 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
27b60 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
27b70 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
27b80 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  {.  i64 iRowid; 
27b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ba0 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
27bb0 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65   record being de
27bc0 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  coded */.  int i
27bd0 49 64 78 2c 69 53 65 67 69 64 2c 69 48 65 69 67  Idx,iSegid,iHeig
27be0 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f  ht,iPgno;  /* Ro
27bf0 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a  wid components *
27c00 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42  /.  const u8 *aB
27c10 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20  lob; int n;     
27c20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f      /* Record to
27c30 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20   decode */.  u8 
27c40 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75  *a = 0;.  Fts5Bu
27c50 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20 20  ffer s;         
27c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69            /* Bui
27c70 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72 65  ld up text to re
27c80 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  turn here */.  i
27c90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27ca0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
27cb0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
27cc0 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20  .  int nSpace = 
27cd0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41  0;..  assert( nA
27ce0 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65  rg==2 );.  memse
27cf0 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&s, 0, sizeof(
27d00 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20  Fts5Buffer));.  
27d10 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
27d20 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56  _value_int64(apV
27d30 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71  al[0]);.  n = sq
27d40 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
27d50 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61  s(apVal[1]);.  a
27d60 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76  Blob = sqlite3_v
27d70 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b  alue_blob(apVal[
27d80 31 5d 29 3b 0a 0a 20 20 6e 53 70 61 63 65 20 3d  1]);..  nSpace =
27d90 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a   n + FTS5_DATA_Z
27da0 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61  ERO_PADDING;.  a
27db0 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46   = (u8*)sqlite3F
27dc0 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
27dd0 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66  c, nSpace);.  if
27de0 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65  ( a==0 ) goto de
27df0 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63  code_out;.  memc
27e00 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b  py(a, aBlob, n);
27e10 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
27e20 69 64 28 69 52 6f 77 69 64 2c 20 26 69 49 64 78  id(iRowid, &iIdx
27e30 2c 20 26 69 53 65 67 69 64 2c 20 26 69 48 65 69  , &iSegid, &iHei
27e40 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20  ght, &iPgno);.. 
27e50 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28   fts5DebugRowid(
27e60 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29  &rc, &s, iRowid)
27e70 3b 0a 20 20 69 66 28 20 69 48 65 69 67 68 74 3d  ;.  if( iHeight=
27e80 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41  =FTS5_SEGMENT_MA
27e90 58 5f 48 45 49 47 48 54 20 29 7b 0a 20 20 20 20  X_HEIGHT ){.    
27ea0 46 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a  Fts5Data dlidx;.
27eb0 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65      Fts5DlidxIte
27ec0 72 20 69 74 65 72 3b 0a 0a 20 20 20 20 64 6c 69  r iter;..    dli
27ed0 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c  dx.p = a;.    dl
27ee0 69 64 78 2e 6e 20 3d 20 6e 3b 0a 20 20 20 20 64  idx.n = n;.    d
27ef0 6c 69 64 78 2e 6e 52 65 66 20 3d 20 32 3b 0a 0a  lidx.nRef = 2;..
27f00 20 20 20 20 6d 65 6d 73 65 74 28 26 69 74 65 72      memset(&iter
27f10 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
27f20 44 6c 69 64 78 49 74 65 72 29 29 3b 0a 20 20 20  DlidxIter));.   
27f30 20 69 74 65 72 2e 70 44 61 74 61 20 3d 20 26 64   iter.pData = &d
27f40 6c 69 64 78 3b 0a 20 20 20 20 69 74 65 72 2e 69  lidx;.    iter.i
27f50 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f  LeafPgno = iPgno
27f60 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44  ;..    for(fts5D
27f70 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 26 69  lidxIterFirst(&i
27f80 74 65 72 29 3b 20 69 74 65 72 2e 62 45 6f 66 3d  ter); iter.bEof=
27f90 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 49 74 65  =0; fts5DlidxIte
27fa0 72 4e 65 78 74 28 26 69 74 65 72 29 29 7b 0a 20  rNext(&iter)){. 
27fb0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
27fc0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
27fd0 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20  tf(&rc, &s, .   
27fe0 20 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64         " %d(%lld
27ff0 29 22 2c 20 69 74 65 72 2e 69 4c 65 61 66 50 67  )", iter.iLeafPg
28000 6e 6f 2c 20 69 74 65 72 2e 69 52 6f 77 69 64 0a  no, iter.iRowid.
28010 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
28020 20 7d 65 6c 73 65 20 69 66 28 20 69 53 65 67 69   }else if( iSegi
28030 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d==0 ){.    if( 
28040 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45  iRowid==FTS5_AVE
28050 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20  RAGES_ROWID ){. 
28060 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a       /* todo */.
28070 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28080 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63   fts5DecodeStruc
28090 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c  ture(&rc, &s, a,
280a0 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   n);.    }.  }el
280b0 73 65 7b 0a 0a 20 20 20 20 46 74 73 35 42 75 66  se{..    Fts5Buf
280c0 66 65 72 20 74 65 72 6d 3b 0a 20 20 20 20 6d 65  fer term;.    me
280d0 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
280e0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
280f0 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65  ));..    if( iHe
28100 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ight==0 ){.     
28110 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20   int iTermOff = 
28120 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f  0;.      int iRo
28130 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  widOff = 0;.    
28140 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
28150 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
28160 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 3d 34  ..      if( n>=4
28170 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52 6f 77   ){.        iRow
28180 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  idOff = fts5GetU
28190 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20  16(&a[0]);.     
281a0 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 66 74     iTermOff = ft
281b0 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b  s5GetU16(&a[2]);
281c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
281d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
281e0 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
281f0 26 73 2c 20 38 2c 20 28 63 6f 6e 73 74 20 75 38  &s, 8, (const u8
28200 2a 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20  *)"corrupt");.  
28210 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64        goto decod
28220 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  e_out;.      }..
28230 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
28240 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Off ){.        i
28250 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b  Off = iRowidOff;
28260 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28270 20 69 54 65 72 6d 4f 66 66 20 29 7b 0a 20 20 20   iTermOff ){.   
28280 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72       iOff = iTer
28290 6d 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mOff;.      }els
282a0 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
282b0 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
282c0 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73     fts5DecodePos
282d0 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
282e0 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20  [4], iOff-4);.. 
282f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 52 6f       assert( iRo
28300 77 69 64 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66  widOff==0 || iOf
28310 66 3d 3d 69 52 6f 77 69 64 4f 66 66 20 29 3b 0a  f==iRowidOff );.
28320 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
28330 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Off ){.        i
28340 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
28350 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
28360 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f  , &a[iOff], n-iO
28370 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ff);.      }..  
28380 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72      assert( iTer
28390 6d 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d  mOff==0 || iOff=
283a0 3d 69 54 65 72 6d 4f 66 66 20 29 3b 0a 20 20 20  =iTermOff );.   
283b0 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e     while( iOff<n
283c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
283d0 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69  nByte;.        i
283e0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
283f0 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
28400 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
28410 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65 65 70 3b 0a   term.n= nKeep;.
28420 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
28430 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63  erAppendBlob(&rc
28440 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20  , &term, nByte, 
28450 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  &a[iOff]);.     
28460 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65     iOff += nByte
28470 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
28480 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
28490 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  ndPrintf(.      
284a0 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22        &rc, &s, "
284b0 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72   term=%.*s", ter
284c0 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  m.n, (const char
284d0 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 20  *)term.p.       
284e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   );.        iOff
284f0 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f   += fts5DecodeDo
28500 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
28510 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29  a[iOff], n-iOff)
28520 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f  ;.        if( iO
28530 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
28540 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
28550 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
28560 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
28570 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28580 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
28590 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 20 20 7d  ee(&term);.    }
285a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35  else{.      Fts5
285b0 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20  NodeIter ss;.   
285c0 20 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65 49     for(fts5NodeI
285d0 74 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 73  terInit(a, n, &s
285e0 73 29 3b 20 73 73 2e 61 44 61 74 61 3b 20 66 74  s); ss.aData; ft
285f0 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
28600 72 63 2c 20 26 73 73 29 29 7b 0a 20 20 20 20 20  rc, &ss)){.     
28610 20 20 20 69 66 28 20 73 73 2e 74 65 72 6d 2e 6e     if( ss.term.n
28620 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
28630 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
28640 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
28650 72 63 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d 25  rc, &s, " left=%
28660 64 22 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b 0a  d", ss.iChild);.
28670 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28680 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
28690 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
286a0 50 72 69 6e 74 66 28 26 72 63 2c 26 73 2c 20 22  Printf(&rc,&s, "
286b0 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20 20   \"%.*s\"", .   
286c0 20 20 20 20 20 20 20 20 20 20 20 73 73 2e 74 65             ss.te
286d0 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 0a  rm.n, ss.term.p.
286e0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
286f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
28700 66 28 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b 0a  f( ss.nEmpty ){.
28710 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28720 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
28730 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
28740 20 22 20 65 6d 70 74 79 3d 25 64 25 73 22 2c 20   " empty=%d%s", 
28750 73 73 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20 20  ss.nEmpty,.     
28760 20 20 20 20 20 20 20 20 20 73 73 2e 62 44 6c 69           ss.bDli
28770 64 78 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20 20  dx ? "*" : "".  
28780 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
28790 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
287a0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46     fts5NodeIterF
287b0 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 7d 0a  ree(&ss);.    }.
287c0 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f    }.  . decode_o
287d0 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ut:.  sqlite3_fr
287e0 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d  ee(a);.  if( rc=
287f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28800 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
28810 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e  _text(pCtx, (con
28820 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e  st char*)s.p, s.
28830 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  n, SQLITE_TRANSI
28840 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ENT);.  }else{. 
28850 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
28860 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74  t_error_code(pCt
28870 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74  x, rc);.  }.  ft
28880 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29  s5BufferFree(&s)
28890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
288a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
288b0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63   user-defined sc
288c0 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74  alar function ft
288d0 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73  s5_rowid()..*/.s
288e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 52  tatic void fts5R
288f0 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20  owidFunction(.  
28900 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
28910 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
28920 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  /* Function call
28930 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
28940 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28960 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20   Number of args 
28970 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20  (always 2) */.  
28980 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
28990 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20  apVal           
289a0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75  /* Function argu
289b0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ments */.){.  co
289c0 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a  nst char *zArg;.
289d0 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b    if( nArg==0 ){
289e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
289f0 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
28a00 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35  "should be: fts5
28a10 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20  _rowid(subject, 
28a20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d  ....)", -1);.  }
28a30 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d  else{.    zArg =
28a40 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
28a50 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
28a60 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20  (apVal[0]);.    
28a70 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
28a80 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65  tricmp(zArg, "se
28a90 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  gment") ){.     
28aa0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
28ab0 20 20 20 69 6e 74 20 69 64 78 2c 20 73 65 67 69     int idx, segi
28ac0 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 3b  d, height, pgno;
28ad0 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 21  .      if( nArg!
28ae0 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =5 ){.        sq
28af0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
28b00 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20  or(pCtx, .      
28b10 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62 65        "should be
28b20 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73 65  : fts5_rowid('se
28b30 67 6d 65 6e 74 27 2c 20 69 64 78 2c 20 73 65 67  gment', idx, seg
28b40 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f  id, height, pgno
28b50 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20  ))", -1.        
28b60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
28b70 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 73 71          idx = sq
28b80 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
28b90 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20  apVal[1]);.     
28ba0 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74     segid = sqlit
28bb0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
28bc0 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  al[2]);.        
28bd0 68 65 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  height = sqlite3
28be0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
28bf0 5b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67  [3]);.        pg
28c00 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  no = sqlite3_val
28c10 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 34 5d 29  ue_int(apVal[4])
28c20 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64  ;.        iRowid
28c30 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
28c40 52 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69 64  ROWID(idx, segid
28c50 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 3b  , height, pgno);
28c60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28c70 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
28c80 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  tx, iRowid);.   
28c90 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
28ca0 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
28cb0 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 74 61  ricmp(zArg, "sta
28cc0 72 74 2d 6f 66 2d 69 6e 64 65 78 22 29 20 29 7b  rt-of-index") ){
28cd0 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
28ce0 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  d;.      int idx
28cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
28d00 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=2 ){.        s
28d10 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
28d20 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
28d30 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62         "should b
28d40 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73  e: fts5_rowid('s
28d50 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78 27 2c 20  tart-of-index', 
28d60 69 64 78 29 22 2c 20 2d 31 0a 20 20 20 20 20 20  idx)", -1.      
28d70 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65    );.      }else
28d80 7b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  {.        idx = 
28d90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
28da0 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20  t(apVal[1]);.   
28db0 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46 54       iRowid = FT
28dc0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
28dd0 28 69 64 78 2c 20 31 2c 20 30 2c 20 30 29 3b 0a  (idx, 1, 0, 0);.
28de0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28df0 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
28e00 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  x, iRowid);.    
28e10 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a    }.    }else {.
28e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
28e30 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
28e40 20 0a 20 20 20 20 20 20 20 20 22 66 69 72 73 74   .        "first
28e50 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77   arg to fts5_row
28e60 69 64 28 29 20 6d 75 73 74 20 62 65 20 27 73 65  id() must be 'se
28e70 67 6d 65 6e 74 27 20 22 0a 20 20 20 20 20 20 20  gment' ".       
28e80 20 22 6f 72 20 27 73 74 61 72 74 2d 6f 66 2d 69   "or 'start-of-i
28e90 6e 64 65 78 27 22 0a 20 20 20 20 20 20 20 20 2c  ndex'".        ,
28ea0 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20   -1.      );.   
28eb0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
28ec0 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61  This is called a
28ed0 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74  s part of regist
28ee0 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d  ering the FTS5 m
28ef0 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62  odule with datab
28f00 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
28f10 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65  n db. It registe
28f20 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d  rs several user-
28f30 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66  defined scalar f
28f40 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a  unctions useful.
28f50 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a  ** with FTS5..**
28f60 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
28f70 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
28f80 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
28f90 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f  error occurs, so
28fa0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69  me other.** SQLi
28fb0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
28fc0 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
28fd0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
28fe0 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73  3Fts5IndexInit(s
28ff0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
29000 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
29010 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
29020 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35  .      db, "fts5
29030 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c  _decode", 2, SQL
29040 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73  ITE_UTF8, 0, fts
29050 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c  5DecodeFunction,
29060 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28   0, 0.  );.  if(
29070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29080 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
29090 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
290a0 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20  on(.        db, 
290b0 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31  "fts5_rowid", -1
290c0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
290d0 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74  , fts5RowidFunct
290e0 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b  ion, 0, 0.    );
290f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
29100 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
29110 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
29120 35 20 2a 2f 0a                                   5 */.