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

Artifact 28f1bfadf3eb4f860c8b978f4d8d6ea0cf7c724d:


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 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
de30: 6d 70 74 79 28 46 74 73 35 49 6e 64 65 78 20 2a  mpty(Fts5Index *
de40: 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  p, Fts5MultiSegI
de50: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
de60: 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
de70: 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
de80: 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
de90: 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75  .iFirst];.  retu
dea0: 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
deb0: 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c  E_OK && pSeg->pL
dec0: 65 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f  eaf && pSeg->nPo
ded0: 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  s==0);.}../*.** 
dee0: 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
def0: 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65   pIter to the ne
df00: 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
df10: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
df20: 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
df30: 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
df40: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
df50: 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73   code. It .** is
df60: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
df70: 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
df80: 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73  iterator reaches
df90: 20 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f   EOF. If an erro
dfa0: 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
dfb0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
dfc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
dfd0: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
dfe0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
dff0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
e000: 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e  erNext(.  Fts5In
e010: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
e020: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
e030: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
e040: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
e050: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
e060: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
e070: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
e080: 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d    int *pbNewTerm
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f    /* OUT: Set fo
e0b0: 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b  r new term */.){
e0c0: 0a 20 20 61 73 73 65 72 74 28 20 70 62 4e 65 77  .  assert( pbNew
e0d0: 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70 62 4e 65  Term==0 || *pbNe
e0e0: 77 54 65 72 6d 3d 3d 30 20 29 3b 0a 20 20 69 66  wTerm==0 );.  if
e0f0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
e100: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  OK ){.    if( pI
e110: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
e120: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
e130: 45 20 29 7b 0a 0a 20 20 20 20 20 20 69 66 28 20  E ){..      if( 
e140: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
e150: 73 65 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  set>0 ){.       
e160: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
e170: 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20  pLeaf->p;.      
e180: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
e190: 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
e1a0: 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79        int bDummy
e1b0: 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 44  ;.        i64 iD
e1c0: 65 6c 74 61 3b 0a 0a 20 20 20 20 20 20 20 20 69  elta;..        i
e1d0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
e1e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
e1f0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
e200: 66 73 65 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  fset--;.        
e210: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e220: 66 73 65 74 20 3d 20 69 4f 66 66 20 3d 20 70 49  fset = iOff = pI
e230: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
e240: 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f  t[pIter->iRowidO
e250: 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  ffset];.        
e260: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
e270: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
e280: 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
e290: 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  Dummy);.        
e2a0: 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a    iOff += nPos;.
e2b0: 20 20 20 20 20 20 20 20 20 20 67 65 74 56 61 72            getVar
e2c0: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
e2d0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
e2e0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e2f0: 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b  Rowid -= iDelta;
e300: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
e310: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
e320: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
e330: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
e340: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
e350: 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61  IterReverseNewPa
e360: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
e370: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
e380: 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20  .      Fts5Data 
e390: 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  *pLeaf = pIter->
e3a0: 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74  pLeaf;.      int
e3b0: 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74   iOff;.      int
e3c0: 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20   bNewTerm = 0;. 
e3d0: 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d       int nKeep =
e3e0: 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65   0;..      /* Se
e3f0: 61 72 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64  arch for the end
e400: 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
e410: 20 6c 69 73 74 20 77 69 74 68 69 6e 20 74 68 65   list within the
e420: 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a   current page. *
e430: 2f 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20  /.      u8 *a = 
e440: 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20  pLeaf->p;.      
e450: 69 6e 74 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 6e  int n = pLeaf->n
e460: 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ;..      iOff = 
e470: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e480: 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73  et + pIter->nPos
e490: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  ;..      if( iOf
e4a0: 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  f<n ){.        /
e4b0: 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79  * The next entry
e4c0: 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65   is on the curre
e4d0: 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  nt page */.     
e4e0: 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a 20     u64 iDelta;. 
e4f0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
e500: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
e510: 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74  &a[iOff], &iDelt
e520: 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  a);.        pIte
e530: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e540: 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69   iOff;.        i
e550: 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 7b 0a  f( iDelta==0 ){.
e560: 20 20 20 20 20 20 20 20 20 20 62 4e 65 77 54 65            bNewTe
e570: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
e580: 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29 7b    if( iOff>=n ){
e590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
e5a0: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
e5b0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
e5c0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e5d0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a  LeafOffset = 4;.
e5e0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
e5f0: 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35 47 65  if( iOff!=fts5Ge
e600: 74 55 31 36 28 26 61 5b 32 5d 29 20 29 7b 0a 20  tU16(&a[2]) ){. 
e610: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
e620: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d  ->iLeafOffset +=
e630: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
e640: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
e650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
e660: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e670: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e680: 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
e690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e6a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 72   }else if( pIter
e6b0: 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pSeg==0 ){.   
e6c0: 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
e6d0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
e6e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
e6f0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  erm;.        int
e700: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20   nList;.        
e710: 69 66 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66  if( 0==(pIter->f
e720: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
e730: 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a  TER_ONETERM) ){.
e740: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e750: 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78  3Fts5HashScanNex
e760: 74 28 70 2d 3e 61 70 48 61 73 68 5b 30 5d 29 3b  t(p->apHash[0]);
e770: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e780: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
e790: 74 72 79 28 70 2d 3e 61 70 48 61 73 68 5b 30 5d  try(p->apHash[0]
e7a0: 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74  , &zTerm, &pList
e7b0: 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20  , &nList);.     
e7c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
e7d0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
e7e0: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
e7f0: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
e800: 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
e810: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
e820: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e830: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e840: 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38  ->pLeaf->p = (u8
e850: 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  *)pList;.       
e860: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
e870: 3e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  >n = nList;.    
e880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
e890: 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
e8a0: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
e8b0: 20 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20   strlen(zTerm), 
e8c0: 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20  (u8*)zTerm);.   
e8d0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
e8e0: 65 61 66 4f 66 66 73 65 74 20 3d 20 67 65 74 56  eafOffset = getV
e8f0: 61 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36  arint(pList, (u6
e900: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
e910: 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
e920: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e930: 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20     iOff = 0;.   
e940: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74       /* Next ent
e950: 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  ry is not on the
e960: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f   current page */
e970: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
e980: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
e990: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
e9a0: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
e9b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  r);.          pL
e9c0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
e9d0: 61 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  af;.          if
e9e0: 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ( pLeaf==0 ) bre
e9f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
ea00: 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35 47 65  ( (iOff = fts5Ge
ea10: 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30  tU16(&pLeaf->p[0
ea20: 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ])) ){.         
ea30: 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
ea40: 65 33 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  e3GetVarint(&pLe
ea50: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  af->p[iOff], (u6
ea60: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
ea70: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
ea80: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ea90: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
eaa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
eab0: 20 65 6c 73 65 20 69 66 28 20 28 69 4f 66 66 20   else if( (iOff 
eac0: 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  = fts5GetU16(&pL
ead0: 65 61 66 2d 3e 70 5b 32 5d 29 29 20 29 7b 0a 20  eaf->p[2])) ){. 
eae0: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
eaf0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
eb00: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
eb10: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
eb20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
eb30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
eb40: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
eb50: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
eb60: 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49 66 20   now at EOF. If 
eb70: 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  so, return early
eb80: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
eb90: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
eba0: 20 20 20 20 20 20 20 69 66 28 20 62 4e 65 77 54         if( bNewT
ebb0: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  erm ){.         
ebc0: 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67   if( pIter->flag
ebd0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
ebe0: 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20 20  _ONETERM ){.    
ebf0: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
ec00: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
ec10: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
ec20: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
ec30: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
ec40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ec50: 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
ec60: 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20  dTerm(p, pIter, 
ec70: 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20  nKeep);.        
ec80: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
ec90: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
eca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
ecb0: 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a  f( pbNewTerm ) *
ecc0: 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20  pbNewTerm = 1;. 
ecd0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ece0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ecf0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
ed00: 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
ed10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ed20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
ed30: 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50 56 41  ..#define SWAPVA
ed40: 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54 20 74  L(T, a, b) { T t
ed50: 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20  mp; tmp=a; a=b; 
ed60: 62 3d 74 6d 70 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20  b=tmp; }../*.** 
ed70: 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63  Iterator pIter c
ed80: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
ed90: 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
eda0: 69 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e  id in a doclist.
edb0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
edc0: 6e 20 73 65 74 73 20 74 68 65 20 69 74 65 72 61  n sets the itera
edd0: 74 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20 69  tor up so that i
ede0: 74 65 72 61 74 65 73 20 69 6e 20 72 65 76 65 72  terates in rever
edf0: 73 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68  se order through
ee00: 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e  .** the doclist.
ee10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ee20: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
ee30: 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  se(Fts5Index *p,
ee40: 20 69 6e 74 20 69 49 64 78 2c 20 46 74 73 35 53   int iIdx, Fts5S
ee50: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
ee60: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73    Fts5Data *pLas
ee70: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e  t = 0;.  int pgn
ee80: 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66  oLast = 0;..  if
ee90: 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20  ( pIter->pDlidx 
eea0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  ){.    int iSegi
eeb0: 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  d = pIter->pSeg-
eec0: 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e  >iSegid;.    pgn
eed0: 6f 4c 61 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  oLast = pIter->p
eee0: 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f  Dlidx->iLeafPgno
eef0: 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74  ;.    pLast = ft
ef00: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
ef10: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
ef20: 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30  (iIdx, iSegid, 0
ef30: 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20  , pgnoLast));.  
ef40: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
ef50: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
ef80: 74 20 77 69 74 68 69 6e 20 70 4c 65 61 66 20 2a  t within pLeaf *
ef90: 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
efa0: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
efb0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a  Leaf;         /*
efc0: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
efd0: 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75  ta */..    /* Cu
efe0: 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67  rrently, Fts5Seg
eff0: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
f000: 20 28 61 6e 64 20 69 4f 66 66 29 20 70 6f 69 6e   (and iOff) poin
f010: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
f020: 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 66 20  .    ** byte of 
f030: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f  position-list co
f040: 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75  ntent for the cu
f050: 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63  rrent rowid. Bac
f060: 6b 20 69 74 20 75 70 0a 20 20 20 20 2a 2a 20 73  k it up.    ** s
f070: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
f080: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
f090: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
f0a0: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a  st size field. *
f0b0: 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  /.    pIter->iLe
f0c0: 61 66 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69  afOffset -= sqli
f0d0: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
f0e0: 4c 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a  Len(pIter->nPos*
f0f0: 32 20 2b 20 70 49 74 65 72 2d 3e 62 44 65 6c 29  2 + pIter->bDel)
f100: 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74  ;.    iOff = pIt
f110: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
f120: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 66  .    assert( iOf
f130: 66 3e 3d 34 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  f>=4 );..    /* 
f140: 53 65 61 72 63 68 20 66 6f 72 20 61 20 6e 65 77  Search for a new
f150: 20 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65   term within the
f160: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 49   current leaf. I
f170: 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75  f one can be fou
f180: 6e 64 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  nd,.    ** then 
f190: 74 68 69 73 20 70 61 67 65 20 63 6f 6e 74 61 69  this page contai
f1a0: 6e 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  ns the largest r
f1b0: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72  owid for the cur
f1c0: 72 65 6e 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  rent term. */.  
f1d0: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c    while( iOff<pL
f1e0: 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20  eaf->n ){.      
f1f0: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
f200: 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  i64 iDelta;.    
f210: 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 0a 20    int bDummy;.. 
f220: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65       /* Read the
f230: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
f240: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20  ize field */.   
f250: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
f260: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70  etPoslistSize(&p
f270: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26  Leaf->p[iOff], &
f280: 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  nPos, &bDummy);.
f290: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50        iOff += nP
f2a0: 6f 73 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f  os;.      if( iO
f2b0: 66 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 20 62  ff>=pLeaf->n ) b
f2c0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  reak;..      /* 
f2d0: 52 6f 77 69 64 20 64 65 6c 74 61 2e 20 4f 72 2c  Rowid delta. Or,
f2e0: 20 69 66 20 30 78 30 30 2c 20 74 68 65 20 65 6e   if 0x00, the en
f2f0: 64 20 6f 66 20 64 6f 63 6c 69 73 74 20 6d 61 72  d of doclist mar
f300: 6b 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 50  ker. */.      nP
f310: 6f 73 20 3d 20 67 65 74 56 61 72 69 6e 74 28 26  os = getVarint(&
f320: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
f330: 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
f340: 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61        if( iDelta
f350: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
f360: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b     iOff += nPos;
f370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
f380: 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  f this condition
f390: 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 74 68   is true then th
f3a0: 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20  e largest rowid 
f3b0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
f3c0: 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20      ** term may 
f3d0: 6e 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e  not be stored on
f3e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
f3f0: 65 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72  e. So search for
f400: 77 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73  ward to.    ** s
f410: 65 65 20 77 68 65 72 65 20 73 61 69 64 20 72 6f  ee where said ro
f420: 77 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20  wid really is.  
f430: 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e  */.    if( iOff>
f440: 3d 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  =pLeaf->n ){.   
f450: 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20     int pgno;.   
f460: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
f470: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
f480: 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20  pIter->pSeg;..  
f490: 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20      /* The last 
f4a0: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
f4b0: 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  list may not be 
f4c0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
f4d0: 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20  age. Search.    
f4e0: 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20    ** forward to 
f4f0: 66 69 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f  find the page co
f500: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73  ntaining the las
f510: 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20  t rowid.  */.   
f520: 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65     for(pgno=pIte
f530: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20  r->iLeafPgno+1; 
f540: 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d  !p->rc && pgno<=
f550: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20  pSeg->pgnoLast; 
f560: 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pgno++){.       
f570: 20 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35   i64 iAbs = FTS5
f580: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
f590: 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  Idx, pSeg->iSegi
f5a0: 64 2c 20 30 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  d, 0, pgno);.   
f5b0: 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
f5c0: 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65  New = fts5DataRe
f5d0: 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20 20  ad(p, iAbs);.   
f5e0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
f5f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
f600: 52 6f 77 69 64 2c 20 69 54 65 72 6d 3b 0a 20 20  Rowid, iTerm;.  
f610: 20 20 20 20 20 20 20 20 66 74 73 35 4c 65 61 66          fts5Leaf
f620: 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52  Header(pNew, &iR
f630: 6f 77 69 64 2c 20 26 69 54 65 72 6d 29 3b 0a 20  owid, &iTerm);. 
f640: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
f650: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
f660: 20 20 20 53 57 41 50 56 41 4c 28 46 74 73 35 44     SWAPVAL(Fts5D
f670: 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73  ata*, pNew, pLas
f680: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
f690: 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b  pgnoLast = pgno;
f6a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f6b0: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
f6c0: 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
f6d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72          if( iTer
f6e0: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
f6f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f700: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
f710: 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74  pLast is NULL at
f720: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
f730: 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  n the last rowid
f740: 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73   for this doclis
f750: 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74  t.  ** lies on t
f760: 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  he page currentl
f770: 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  y indicated by t
f780: 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20  he iterator. In 
f790: 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20  this case .  ** 
f7a0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f7b0: 65 74 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  et is already se
f7c0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
f7d0: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
f7e0: 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  size.  ** field 
f7f0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f800: 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61  the first releva
f810: 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  nt rowid on the 
f820: 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  page..  **.  ** 
f830: 4f 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20  Or, if pLast is 
f840: 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  non-NULL, then i
f850: 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
f860: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
f870: 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e  last.  ** rowid.
f880: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f   In this case co
f890: 6e 66 69 67 75 72 65 20 74 68 65 20 69 74 65 72  nfigure the iter
f8a0: 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  ator so that it 
f8b0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20  points to the.  
f8c0: 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  ** first rowid o
f8d0: 6e 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a  n this page..  *
f8e0: 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b  /.  if( pLast ){
f8f0: 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a  .    int dummy;.
f900: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
f910: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f920: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f930: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
f940: 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70  f = pLast;.    p
f950: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
f960: 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
f970: 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28 70  fts5LeafHeader(p
f980: 4c 61 73 74 2c 20 26 69 4f 66 66 2c 20 26 64 75  Last, &iOff, &du
f990: 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b  mmy);.    iOff +
f9a0: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 61  = getVarint(&pLa
f9b0: 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  st->p[iOff], (u6
f9c0: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
f9d0: 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  d);.    pIter->i
f9e0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f9f0: 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65  f;.  }..  fts5Se
fa00: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
fa10: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
fa20: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
fa30: 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
fa40: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
fa50: 66 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61  first rowid of a
fa60: 20 64 6f 63 6c 69 73 74 20 77 69 74 68 69 6e 0a   doclist within.
fa70: 2a 2a 20 69 6e 64 65 78 20 69 49 64 78 2e 20 54  ** index iIdx. T
fa80: 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
fa90: 74 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  t-index associat
faa0: 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6e 61  ed with the fina
fab0: 6c 20 74 65 72 6d 20 6f 6e 0a 2a 2a 20 74 68 65  l term on.** the
fac0: 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 49   current page. I
fad0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  f the current te
fae0: 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  rm is the last t
faf0: 65 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  erm on the page,
fb00: 20 0a 2a 2a 20 6c 6f 61 64 20 74 68 65 20 64 6f   .** load the do
fb10: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d  clist-index from
fb20: 20 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61   disk and initia
fb30: 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72  lize an iterator
fb40: 20 61 74 20 0a 2a 2a 20 28 70 49 74 65 72 2d 3e   at .** (pIter->
fb50: 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74  pDlidx)..*/.stat
fb60: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
fb70: 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73  terLoadDlidx(Fts
fb80: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
fb90: 49 64 78 2c 20 46 74 73 35 53 65 67 49 74 65 72  Idx, Fts5SegIter
fba0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
fbb0: 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53  iSeg = pIter->pS
fbc0: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e  eg->iSegid;.  in
fbd0: 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d  t bRev = (pIter-
fbe0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
fbf0: 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a  GITER_REVERSE);.
fc00: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
fc10: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
fc20: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61  ; /* Current lea
fc30: 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73  f data */..  ass
fc40: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
fc50: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
fc60: 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73  _ONETERM );.  as
fc70: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c  sert( pIter->pDl
fc80: 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  idx==0 );..  /* 
fc90: 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 75 72  Check if the cur
fca0: 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e 64  rent doclist end
fcb0: 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20  s on this page. 
fcc0: 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74 75  If it does, retu
fcd0: 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77 69  rn.  ** early wi
fce0: 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74 68  thout loading th
fcf0: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
fd00: 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20 74  (as it belongs t
fd10: 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20 20  o a different.  
fd20: 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66  ** term. */.  if
fd30: 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ( pIter->iTermLe
fd40: 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
fd50: 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
fd60: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
fd70: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20  ->iLeafOffset + 
fd80: 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20  pIter->nPos;.   
fd90: 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65   while( iOff<pLe
fda0: 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69  af->n ){.      i
fdb0: 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  64 iDelta;..    
fdc0: 20 20 2f 2a 20 69 4f 66 66 20 69 73 20 63 75 72    /* iOff is cur
fdd0: 72 65 6e 74 6c 79 20 74 68 65 20 6f 66 66 73 65  rently the offse
fde0: 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f  t of the start o
fdf0: 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  f position list 
fe00: 64 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 4f  data */.      iO
fe10: 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  ff += getVarint(
fe20: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
fe30: 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
fe40: 0a 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74  .      if( iDelt
fe50: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  a==0 ) return;..
fe60: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 70        if( iOff<p
fe70: 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Leaf->n ){.     
fe80: 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
fe90: 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b         int nPos;
fea0: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
feb0: 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
fec0: 69 7a 65 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  ize(&pLeaf->p[iO
fed0: 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  ff], &nPos, &bDu
fee0: 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  mmy);.        iO
fef0: 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  ff += nPos;.    
ff00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
ff10: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e   fts5DlidxIterIn
ff20: 69 74 28 70 2c 20 62 52 65 76 2c 20 69 49 64 78  it(p, bRev, iIdx
ff30: 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e 69  , iSeg, pIter->i
ff40: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20 26 70  TermLeafPgno, &p
ff50: 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 7d  Iter->pDlidx);.}
ff60: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
ff70: 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49  ze the object pI
ff80: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ter to point to 
ff90: 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
ffa0: 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a   within segment.
ffb0: 2a 2a 20 70 53 65 67 2c 20 69 6e 64 65 78 20 69  ** pSeg, index i
ffc0: 49 64 78 2e 20 49 66 20 74 68 65 72 65 20 69 73  Idx. If there is
ffd0: 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e   no such term in
ffe0: 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20   the index, the 
fff0: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 73  iterator.** is s
10000 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
10010 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
10020 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
10030 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
10040 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
10050 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
10060 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
10070 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
10080 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
10090 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
100a0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
100b0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
100c0 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46  terSeekInit(.  F
100d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
100f0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
10100 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20  /.  int iIdx,   
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48      /* Config.aH
10130 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46  ash[] index of F
10140 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  TS index */.  co
10150 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
10160 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
10170 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
10180 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
101b0 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66   FTS5INDEX_XXX f
101c0 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74  lags */.  Fts5St
101d0 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
101e0 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73  pSeg,     /* Des
101f0 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d  cription of segm
10200 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ent */.  Fts5Seg
10210 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
10220 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
10230 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
10240 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d  /.){.  int iPg =
10250 20 31 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69   1;.  int h;.  i
10260 6e 74 20 62 47 65 20 3d 20 28 28 66 6c 61 67 73  nt bGe = ((flags
10270 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
10280 52 59 5f 50 52 45 46 49 58 29 20 26 26 20 69 49  RY_PREFIX) && iI
10290 64 78 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 62 44  dx==0);.  int bD
102a0 6c 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  lidx = 0;       
102b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
102c0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
102d0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f  doclist-index */
102e0 0a 0a 20 20 61 73 73 65 72 74 28 20 62 47 65 3d  ..  assert( bGe=
102f0 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46  =0 || (flags & F
10300 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
10310 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ESC)==0 );.  ass
10320 65 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54  ert( pTerm && nT
10330 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  erm );.  memset(
10340 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
10350 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
10360 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b  er->pSeg = pSeg;
10370 0a 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d  .  pIter->iIdx =
10380 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 54 68 69   iIdx;..  /* Thi
10390 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74 61  s block sets sta
103a0 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67 20  ck variable iPg 
103b0 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  to the leaf page
103c0 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 79   number that may
103d0 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65  .  ** contain te
103e0 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  rm (pTerm/nTerm)
103f0 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
10400 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  nt in the segmen
10410 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 68 3d 70 53  t. */.  for(h=pS
10420 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20 68  eg->nHeight-1; h
10430 3e 30 3b 20 68 2d 2d 29 7b 0a 20 20 20 20 46 74  >0; h--){.    Ft
10440 73 35 4e 6f 64 65 49 74 65 72 20 6e 6f 64 65 3b  s5NodeIter node;
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10460 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
10470 68 72 6f 75 67 68 20 69 6e 74 65 72 6e 61 6c 20  hrough internal 
10480 6e 6f 64 65 73 20 2a 2f 0a 20 20 20 20 69 36 34  nodes */.    i64
10490 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53   iRowid = FTS5_S
104a0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
104b0 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  x, pSeg->iSegid,
104c0 20 68 2c 20 69 50 67 29 3b 0a 20 20 20 20 46 74   h, iPg);.    Ft
104d0 73 35 44 61 74 61 20 2a 70 4e 6f 64 65 20 3d 20  s5Data *pNode = 
104e0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
104f0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  iRowid);.    if(
10500 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61   pNode==0 ) brea
10510 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f 64 65  k;..    fts5Node
10520 49 74 65 72 49 6e 69 74 28 70 4e 6f 64 65 2d 3e  IterInit(pNode->
10530 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26 6e 6f  p, pNode->n, &no
10540 64 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  de);.    assert(
10550 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d 30 20   node.term.n==0 
10560 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20 6e 6f  );..    iPg = no
10570 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 62  de.iChild;.    b
10580 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44 6c  Dlidx = node.bDl
10590 69 64 78 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  idx;.    for(fts
105a0 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70  5NodeIterNext(&p
105b0 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a 20 20  ->rc, &node);.  
105c0 20 20 20 20 20 20 6e 6f 64 65 2e 61 44 61 74 61        node.aData
105d0 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f   && fts5BufferCo
105e0 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64 65 2e  mpareBlob(&node.
105f0 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  term, pTerm, nTe
10600 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20 20 20  rm)<=0;.        
10610 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74  fts5NodeIterNext
10620 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 0a  (&p->rc, &node).
10630 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 67      ){.      iPg
10640 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a   = node.iChild;.
10650 20 20 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e        bDlidx = n
10660 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20  ode.bDlidx;.    
10670 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74  }.    fts5NodeIt
10680 65 72 46 72 65 65 28 26 6e 6f 64 65 29 3b 0a 20  erFree(&node);. 
10690 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
106a0 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a  se(pNode);.  }..
106b0 20 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e    if( iPg<pSeg->
106c0 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20  pgnoFirst ){.   
106d0 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e   iPg = pSeg->pgn
106e0 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69  oFirst;.    bDli
106f0 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  dx = 0;.  }..  p
10700 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
10710 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73  = iPg - 1;.  fts
10720 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
10730 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69  (p, pIter);..  i
10740 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
10750 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  ){.    int res;.
10760 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
10770 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
10780 55 31 36 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  U16(&pIter->pLea
10790 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 66 74  f->p[2]);.    ft
107a0 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
107b0 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  m(p, pIter, 0);.
107c0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
107d0 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
107e0 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  );.    do {.    
107f0 20 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66    res = fts5Buff
10800 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70  erCompareBlob(&p
10810 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72  Iter->term, pTer
10820 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, nTerm);.     
10830 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62 72   if( res>=0 ) br
10840 65 61 6b 3b 0a 20 20 20 20 20 20 66 74 73 35 53  eak;.      fts5S
10850 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  egIterNext(p, pI
10860 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 77 68  ter, 0);.    }wh
10870 69 6c 65 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ile( pIter->pLea
10880 66 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  f && p->rc==SQLI
10890 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 69 66  TE_OK );..    if
108a0 28 20 62 47 65 3d 3d 30 20 26 26 20 72 65 73 20  ( bGe==0 && res 
108b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ){.      /* Set 
108c0 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
108d0 74 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20 20 20  t to EOF */.    
108e0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
108f0 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
10900 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  .      pIter->pL
10910 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  eaf = 0;.    }. 
10920 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
10930 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47  =SQLITE_OK && bG
10940 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65  e==0 ){.    pIte
10950 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
10960 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
10970 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
10980 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
10990 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
109a0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
109b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
109c0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
109d0 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
109e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
109f0 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20  if( bDlidx ){.  
10a00 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
10a10 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 69 49  rLoadDlidx(p, iI
10a20 64 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  dx, pIter);.    
10a30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c    }.      if( fl
10a40 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
10a50 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
10a60 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
10a70 72 52 65 76 65 72 73 65 28 70 2c 20 69 49 64 78  rReverse(p, iIdx
10a80 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
10a90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
10aa0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
10ab0 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72  the object pIter
10ac0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72   to point to ter
10ad0 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69  m pTerm/nTerm wi
10ae0 74 68 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d  thin the.** in-m
10af0 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
10b00 20 69 49 64 78 2e 20 49 66 20 74 68 65 72 65 20   iIdx. If there 
10b10 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20  is no such term 
10b20 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 74 68  in the table, th
10b30 65 20 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69  e .** iterator i
10b40 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a  s set to EOF..**
10b50 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
10b60 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
10b70 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
10b80 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
10b90 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
10ba0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
10bb0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
10bc0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
10bd0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
10be0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
10bf0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
10c00 65 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a  egIterHashInit(.
10c10 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
10c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c30 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
10c40 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  d */.  int iIdx,
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
10c70 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f  .aHash[] index o
10c80 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20  f FTS index */. 
10c90 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
10ca0 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20  , int nTerm,    
10cb0 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b   /* Term to seek
10cc0 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   to */.  int fla
10cd0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
10ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
10cf0 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58   of FTS5INDEX_XX
10d00 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
10d10 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
10d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10d30 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
10d40 74 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 48  te */.){.  Fts5H
10d50 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e  ash *pHash = p->
10d60 61 70 48 61 73 68 5b 69 49 64 78 5d 3b 0a 20 20  apHash[iIdx];.  
10d70 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20  const u8 *pList 
10d80 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74  = 0;.  int nList
10d90 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38   = 0;.  const u8
10da0 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e   *z = 0;.  int n
10db0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
10dc0 20 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65   pHash );.  asse
10dd0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
10de0 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70  E_OK );..  if( p
10df0 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 69 49 64 78  Term==0 || (iIdx
10e00 3d 3d 30 20 26 26 20 28 66 6c 61 67 73 20 26 20  ==0 && (flags & 
10e10 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
10e20 50 52 45 46 49 58 29 29 20 29 7b 0a 20 20 20 20  PREFIX)) ){.    
10e30 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
10e40 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28  ts5HashScanInit(
10e50 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
10e60 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
10e70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
10e80 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
10e90 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
10ea0 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c  ar**)&z, &pList,
10eb0 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20   &nList);.    n 
10ec0 3d 20 28 7a 20 3f 20 73 74 72 6c 65 6e 28 28 63  = (z ? strlen((c
10ed0 6f 6e 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20  onst char*)z) : 
10ee0 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
10ef0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
10f00 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
10f10 45 54 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74  ETERM;.    sqlit
10f20 65 33 46 74 73 35 48 61 73 68 51 75 65 72 79 28  e3Fts5HashQuery(
10f30 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
10f40 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
10f50 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
10f60 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d  );.    z = pTerm
10f70 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b  ;.    n = nTerm;
10f80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73  .  }..  if( pLis
10f90 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  t ){.    Fts5Dat
10fa0 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71  a *pLeaf;.    sq
10fb0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
10fc0 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
10fd0 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a  r->term, n, z);.
10fe0 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
10ff0 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
11000 65 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a  eof(Fts5Data));.
11010 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30      if( pLeaf==0
11020 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
11030 4c 65 61 66 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  Leaf->nRef = 1;.
11040 20 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28      pLeaf->p = (
11050 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 70  u8*)pList;.    p
11060 4c 65 61 66 2d 3e 6e 20 3d 20 6e 4c 69 73 74 3b  Leaf->n = nList;
11070 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
11080 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20 20 20 70  f = pLeaf;.    p
11090 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
110a0 74 20 3d 20 67 65 74 56 61 72 69 6e 74 28 70 4c  t = getVarint(pL
110b0 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  eaf->p, (u64*)&p
110c0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 0a  Iter->iRowid);..
110d0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
110e0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
110f0 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70 49  DESC ){.      pI
11100 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
11110 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
11120 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  SE;.      fts5Se
11130 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
11140 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
11150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11160 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
11170 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
11180 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11190 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72  ** Zero the iter
111a0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
111b0 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
111c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
111d0 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61   fts5SegIterClea
111e0 72 28 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  r(Fts5SegIter *p
111f0 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66  Iter){.  fts5Buf
11200 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
11210 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74  term);.  fts5Dat
11220 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
11230 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c  pLeaf);.  fts5Dl
11240 69 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65  idxIterFree(pIte
11250 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71  r->pDlidx);.  sq
11260 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
11270 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b  ->aRowidOffset);
11280 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
11290 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
112a0 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66  egIter));.}..#if
112b0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
112c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
112d0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73  ction is used as
112e0 20 70 61 72 74 20 6f 66 20 74 68 65 20 62 69 67   part of the big
112f0 20 61 73 73 65 72 74 28 29 20 70 72 6f 63 65 64   assert() proced
11300 75 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  ure implemented 
11310 62 79 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74  by.** fts5Assert
11320 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 29  MultiIterSetup()
11330 2e 20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61  . It ensures tha
11340 74 20 74 68 65 20 72 65 73 75 6c 74 20 63 75 72  t the result cur
11350 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a  rently stored.**
11360 20 69 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65   in *pRes is the
11370 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20   correct result 
11380 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65  of comparing the
11390 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
113a0 6e 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ns of the.** two
113b0 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73   iterators..*/.s
113c0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41  tatic void fts5A
113d0 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52  ssertComparisonR
113e0 65 73 75 6c 74 28 0a 20 20 46 74 73 35 4d 75 6c  esult(.  Fts5Mul
113f0 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
11400 2c 20 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  , .  Fts5SegIter
11410 20 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49   *p1,.  Fts5SegI
11420 74 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43  ter *p2,.  Fts5C
11430 52 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a  Result *pRes.){.
11440 20 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20    int i1 = p1 - 
11450 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69  pIter->aSeg;.  i
11460 6e 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74  nt i2 = p2 - pIt
11470 65 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28  er->aSeg;..  if(
11480 20 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32   p1->pLeaf || p2
11490 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69  ->pLeaf ){.    i
114a0 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p1->pLeaf==0 
114b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
114c0 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69   pRes->iFirst==i
114d0 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  2 );.    }else i
114e0 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p2->pLeaf==0 
114f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11500 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69   pRes->iFirst==i
11510 31 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1 );.    }else{.
11520 20 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d        int nMin =
11530 20 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c   MIN(p1->term.n,
11540 20 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20   p2->term.n);.  
11550 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65      int res = me
11560 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70 2c  mcmp(p1->term.p,
11570 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d 69   p2->term.p, nMi
11580 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  n);.      if( re
11590 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31 2d  s==0 ) res = p1-
115a0 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74 65  >term.n - p2->te
115b0 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66 28  rm.n;..      if(
115c0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
115d0 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d     assert( pRes-
115e0 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a 20  >bTermEq==1 );. 
115f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11600 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e 69  1->iRowid!=p2->i
11610 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20  Rowid );.       
11620 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f   res = ((p1->iRo
11630 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64  wid > p2->iRowid
11640 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20  )==pIter->bRev) 
11650 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20 20  ? -1 : 1;.      
11660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
11670 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65  ssert( pRes->bTe
11680 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20 20  rmEq==0 );.     
11690 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65   }..      if( re
116a0 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  s<0 ){.        a
116b0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
116c0 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 20  rst==i1 );.     
116d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
116e0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
116f0 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20  irst==i2 );.    
11700 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
11710 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11720 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
11730 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44 45  unless SQLITE_DE
11740 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 20 77  BUG is defined w
11750 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65 0a  hen this module.
11760 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e 20  ** is compiled. 
11770 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
11780 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
11790 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61 73  ssentially an as
117a0 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
117b0 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 76 65 72  ment used to ver
117c0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ify that the con
117d0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74  tents of the pIt
117e0 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72 72  er->aFirst[] arr
117f0 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65 63  ay.** are correc
11800 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
11810 64 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  d fts5AssertMult
11820 69 49 74 65 72 53 65 74 75 70 28 46 74 73 35 49  iIterSetup(Fts5I
11830 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c  ndex *p, Fts5Mul
11840 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
11850 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
11860 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11870 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
11880 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
11890 65 67 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  eg; i+=2){.     
118a0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
118b0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
118c0 69 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65  i];.      Fts5Se
118d0 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74  gIter *p2 = &pIt
118e0 65 72 2d 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20  er->aSeg[i+1];. 
118f0 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74       Fts5CResult
11900 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d   *pRes = &pIter-
11910 3e 61 46 69 72 73 74 5b 28 70 49 74 65 72 2d 3e  >aFirst[(pIter->
11920 6e 53 65 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a  nSeg + i) / 2];.
11930 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
11940 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
11950 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20  (pIter, p1, p2, 
11960 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pRes);.    }..  
11970 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49    for(i=1; i<(pI
11980 74 65 72 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20  ter->nSeg / 2); 
11990 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73  i+=2){.      Fts
119a0 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
119b0 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
119c0 69 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65  i];.      Fts5Se
119d0 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
119e0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
119f0 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69  >aFirst[i*2].iFi
11a00 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73  rst ];.      Fts
11a10 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26  5SegIter *p2 = &
11a20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
11a30 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31  er->aFirst[i*2+1
11a40 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 0a 20 20 20  ].iFirst ];..   
11a50 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d     fts5AssertCom
11a60 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49  parisonResult(pI
11a70 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65  ter, p1, p2, pRe
11a80 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  s);.    }.  }.}.
11a90 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
11aa0 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
11ab0 65 72 53 65 74 75 70 28 78 2c 79 29 0a 23 65 6e  erSetup(x,y).#en
11ac0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68  dif../*.** Do th
11ad0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63  e comparison nec
11ae0 65 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c 61  essary to popula
11af0 74 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  te pIter->aFirst
11b00 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66  [iOut]..**.** If
11b10 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
11b20 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  lue is non-zero,
11b30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
11b40 69 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74 72  index of an entr
11b50 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74 65  y.** in the pIte
11b60 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 20  r->aSeg[] array 
11b70 74 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74 20  that is (a) not 
11b80 61 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29 20  at EOF, and (b) 
11b90 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
11ba0 20 6b 65 79 20 74 68 61 74 20 69 73 20 61 20 64   key that is a d
11bb0 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f 74  uplicate of anot
11bc0 68 65 72 2c 20 68 69 67 68 65 72 20 70 72 69 6f  her, higher prio
11bd0 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e  rity, .** segmen
11be0 74 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74 68  t-iterator in th
11bf0 65 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61  e pSeg->aSeg[] a
11c00 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
11c10 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65  int fts5MultiIte
11c20 72 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35 4d  rDoCompare(Fts5M
11c30 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
11c40 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20  er, int iOut){. 
11c50 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20   int i1;        
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c70 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66   /* Index of lef
11c80 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
11c90 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20  er */.  int i2; 
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cb0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
11cc0 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46   of right-hand F
11cd0 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
11ce0 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35  int iRes;.  Fts5
11cf0 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20  SegIter *p1;    
11d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
11d10 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  eft-hand Fts5Seg
11d20 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65  Iter */.  Fts5Se
11d30 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20  gIter *p2;      
11d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
11d50 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ht-hand Fts5SegI
11d60 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65  ter */.  Fts5CRe
11d70 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
11d80 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
11d90 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f  ];..  assert( iO
11da0 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26  ut<pIter->nSeg &
11db0 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73  & iOut>0 );.  as
11dc0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65  sert( pIter->bRe
11dd0 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62  v==0 || pIter->b
11de0 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28  Rev==1 );..  if(
11df0 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e   iOut>=(pIter->n
11e00 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31  Seg/2) ){.    i1
11e10 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72   = (iOut - pIter
11e20 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20  ->nSeg/2) * 2;. 
11e30 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a     i2 = i1 + 1;.
11e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20    }else{.    i1 
11e50 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
11e60 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a  iOut*2].iFirst;.
11e70 20 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e      i2 = pIter->
11e80 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d  aFirst[iOut*2+1]
11e90 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70  .iFirst;.  }.  p
11ea0 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
11eb0 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49  [i1];.  p2 = &pI
11ec0 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a  ter->aSeg[i2];..
11ed0 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20    pRes->bTermEq 
11ee0 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70  = 0;.  if( p1->p
11ef0 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20  Leaf==0 ){      
11f00 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73       /* If p1 is
11f10 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69   at EOF */.    i
11f20 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73  Res = i2;.  }els
11f30 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d  e if( p2->pLeaf=
11f40 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20  =0 ){     /* If 
11f50 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  p2 is at EOF */.
11f60 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20      iRes = i1;. 
11f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
11f80 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72  res = fts5Buffer
11f90 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72  Compare(&p1->ter
11fa0 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20  m, &p2->term);. 
11fb0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
11fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
11fd0 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73  2>i1 );.      as
11fe0 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20  sert( i2!=0 );. 
11ff0 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d       pRes->bTerm
12000 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  Eq = 1;.      if
12010 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32  ( p1->iRowid==p2
12020 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
12030 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70      p1->bDel = p
12040 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20  2->bDel;.       
12050 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20   return i2;.    
12060 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
12070 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70  ((p1->iRowid > p
12080 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  2->iRowid)==pIte
12090 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20  r->bRev) ? -1 : 
120a0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  +1;.    }.    as
120b0 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a  sert( res!=0 );.
120c0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
120d0 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 31  .      iRes = i1
120e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
120f0 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
12100 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d    }.  }..  pRes-
12110 3e 69 46 69 72 73 74 20 3d 20 69 52 65 73 3b 0a  >iFirst = iRes;.
12120 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
12130 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65  *.** Move the se
12140 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20 69  g-iter so that i
12150 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
12160 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70  first rowid on p
12170 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a  age iLeafPgno..*
12180 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  * It is an error
12190 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67   if leaf iLeafPg
121a0 6e 6f 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  no contains no r
121b0 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owid..*/.static 
121c0 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
121d0 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35  GotoPage(.  Fts5
121e0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
121f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12200 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
12210 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
12220 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
12230 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
12240 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
12250 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
12260 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  o.){.  assert( i
12270 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
12280 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 69  iLeafPgno );.  i
12290 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
122a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
122b0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c  ->iLeafPgno = iL
122c0 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66  eafPgno-1;.    f
122d0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
122e0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
122f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
12300 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49  =SQLITE_OK || pI
12310 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d  ter->iLeafPgno==
12320 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 7d  iLeafPgno );.  }
12330 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
12340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12350 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 75 38  int iOff;.    u8
12360 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
12370 61 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 6e  af->p;.    int n
12380 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
12390 3e 6e 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20  >n;..    iOff = 
123a0 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d  fts5GetU16(&a[0]
123b0 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c  );.    if( iOff<
123c0 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a  4 || iOff>=n ){.
123d0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
123e0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
123f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66  }else{.      iOf
12400 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  f += getVarint(&
12410 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
12420 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
12430 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
12440 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
12450 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
12460 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
12470 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
12480 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
12490 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
124a0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
124b0 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69  nd argument unti
124c0 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a  l it is at or .*
124d0 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72  * past rowid iFr
124e0 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  om. Regardless o
124f0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  f the value of i
12500 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74  From, the iterat
12510 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  or is.** always 
12520 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73  advanced at leas
12530 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  t once..*/.stati
12540 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
12550 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
12560 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12580 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
12590 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
125a0 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
125b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
125c0 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
125d0 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68   */.  i64 iMatch
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125f0 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
12600 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61   iterator at lea
12610 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29  st this far */.)
12620 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28  {.  int bRev = (
12630 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
12640 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
12650 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64  RSE);.  Fts5Dlid
12660 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
12670 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20  pIter->pDlidx;. 
12680 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d   int iLeafPgno =
12690 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
126a0 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d  o;.  int bMove =
126b0 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   1;..  assert( p
126c0 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
126d0 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
126e0 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RM );.  assert( 
126f0 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b  pIter->pDlidx );
12700 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
12710 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66  ->pLeaf );..  if
12720 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
12730 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
12740 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
12750 64 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68  dx)==0 && iMatch
12760 3e 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  >pDlidx->iRowid 
12770 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67  ){.      iLeafPg
12780 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65  no = pDlidx->iLe
12790 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74  afPgno;.      ft
127a0 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
127b0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20  pDlidx);.    }. 
127c0 20 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66     assert( iLeaf
127d0 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno>=pIter->iLe
127e0 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20  afPgno || p->rc 
127f0 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66  );.    if( iLeaf
12800 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
12810 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66  fPgno ){.      f
12820 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
12830 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65  ge(p, pIter, iLe
12840 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62  afPgno);.      b
12850 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
12860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
12870 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65  ert( iMatch<pIte
12880 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  r->iRowid );.   
12890 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
128a0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
128b0 64 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68  dx)==0 && iMatch
128c0 3c 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  <pDlidx->iRowid 
128d0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
128e0 64 78 49 74 65 72 50 72 65 76 28 70 44 6c 69 64  dxIterPrev(pDlid
128f0 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c  x);.    }.    iL
12900 65 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64 78  eafPgno = pDlidx
12910 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20  ->iLeafPgno;..  
12920 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c    assert( fts5Dl
12930 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
12940 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67  lidx) || iLeafPg
12950 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no<=pIter->iLeaf
12960 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28  Pgno );..    if(
12970 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72   iLeafPgno<pIter
12980 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
12990 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
129a0 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
129b0 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53  o+1;.      fts5S
129c0 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
129d0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
129e0 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b        bMove = 0;
129f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68  .    }.  }..  wh
12a00 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66  ile( 1 ){.    if
12a10 28 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65  ( bMove ) fts5Se
12a20 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  gIterNext(p, pIt
12a30 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
12a40 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
12a50 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
12a60 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65   bRev==0 && pIte
12a70 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  r->iRowid>=iMatc
12a80 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
12a90 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49  f( bRev!=0 && pI
12aa0 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61  ter->iRowid<=iMa
12ab0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
12ac0 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a   bMove = 1;.  }.
12ad0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  }.../*.** Free t
12ae0 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
12af0 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
12b00 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12b20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
12b30 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ee(Fts5Index *p,
12b40 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
12b50 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
12b60 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e   pIter ){.    in
12b70 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
12b80 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
12b90 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73   i++){.      fts
12ba0 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70  5SegIterClear(&p
12bb0 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a  Iter->aSeg[i]);.
12bc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
12bd0 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20  3_free(pIter);. 
12be0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
12bf0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  d fts5MultiIterA
12c00 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49  dvanced(.  Fts5I
12c10 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
12c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
12c30 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
12c40 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
12c50 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
12c60 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
12c70 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
12c80 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
12c90 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
12ca0 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20  int iChanged,   
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
12cd0 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
12ce0 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  vanced */.  int 
12cf0 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20  iMinset         
12d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
12d10 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20  inimum entry in 
12d20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20  aFirst[] to set 
12d30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
12d40 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
12d50 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
12d60 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70   i>=iMinset && p
12d70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  ->rc==SQLITE_OK;
12d80 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74   i=i/2){.    int
12d90 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69   iEq;.    if( (i
12da0 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
12db0 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65  erDoCompare(pIte
12dc0 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20  r, i)) ){.      
12dd0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
12de0 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
12df0 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iEq], 0);.      
12e00 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20  i = pIter->nSeg 
12e10 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  + iEq;.    }.  }
12e20 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
12e30 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
12e40 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35  nceRowid(.  Fts5
12e50 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
12e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
12e70 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
12e80 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
12e90 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
12ea0 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
12eb0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
12ec0 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
12ed0 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
12ee0 20 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20   int iChanged   
12ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f00 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
12f10 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
12f20 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20  dvanced */.){.  
12f30 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 53 65 67  int i;.  Fts5Seg
12f40 49 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49  Iter *pNew = &pI
12f50 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
12f60 65 64 5d 3b 0a 20 20 46 74 73 35 53 65 67 49 74  ed];.  Fts5SegIt
12f70 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49  er *pOther = &pI
12f80 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
12f90 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 0a 20  ed ^ 0x0001];.. 
12fa0 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
12fb0 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
12fc0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12fd0 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 46  K; i=i/2){.    F
12fe0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
12ff0 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
13000 74 5b 69 5d 3b 0a 0a 20 20 20 20 61 73 73 65 72  t[i];..    asser
13010 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29  t( pNew->pLeaf )
13020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52  ;.    assert( pR
13030 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c  es->bTermEq==0 |
13040 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20  | pOther->pLeaf 
13050 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
13060 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b  pRes->bTermEq ){
13070 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
13080 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d  >iRowid==pOther-
13090 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
130a0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
130b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
130c0 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65  ther->iRowid>pNe
130d0 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  w->iRowid)==pIte
130e0 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  r->bRev ){.     
130f0 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72     pNew = pOther
13100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13110 20 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74      pRes->iFirst
13120 20 3d 20 28 70 4e 65 77 20 2d 20 70 49 74 65 72   = (pNew - pIter
13130 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 69 66 28  ->aSeg);.    if(
13140 20 69 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a   i==1 ) break;..
13150 20 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49      pOther = &pI
13160 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
13170 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30  ->aFirst[i ^ 0x0
13180 30 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  001].iFirst ];. 
13190 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
131a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
131b0 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
131c0 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
131d0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
131e0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
131f0 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
13200 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  n Fts5Index.rc. 
13210 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  It is not .** co
13220 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
13230 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
13240 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f  r reaches EOF, o
13250 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
13260 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68  dy at .** EOF wh
13270 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
13280 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
13290 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
132a0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20  ultiIterNext(.  
132b0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
132c0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
132d0 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
132e0 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  bFrom,          
132f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
13300 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20  rue if argument 
13310 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a  iFrom is valid *
13320 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20  /.  i64 iFrom   
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13340 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61      /* Advance a
13350 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61  t least as far a
13360 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69  s this */.){.  i
13370 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13380 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  _OK ){.    int b
13390 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b  UseFrom = bFrom;
133a0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
133b0 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
133c0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
133d0 69 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  irst;.      int 
133e0 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
133f0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13400 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
13410 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
13420 20 20 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d      if( bUseFrom
13430 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78   && pSeg->pDlidx
13440 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
13450 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
13460 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b  p, pSeg, iFrom);
13470 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13480 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
13490 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26  rNext(p, pSeg, &
134a0 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20  bNewTerm);.     
134b0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53   }..      if( pS
134c0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20  eg->pLeaf==0 || 
134d0 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20  bNewTerm .      
134e0 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65   || fts5MultiIte
134f0 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c  rAdvanceRowid(p,
13500 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a   pIter, iFirst).
13510 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
13520 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
13530 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c  vanced(p, pIter,
13540 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20   iFirst, 1);.   
13550 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41     }.      fts5A
13560 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
13570 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  tup(p, pIter);..
13580 20 20 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d        bUseFrom =
13590 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
135a0 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74  pIter->bSkipEmpt
135b0 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74  y && fts5MultiIt
135c0 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74  erIsEmpty(p, pIt
135d0 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  er) );.  }.}../*
135e0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
135f0 65 77 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  ew Fts5MultiSegI
13600 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ter object..**.*
13610 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
13620 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
13630 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
13640 20 64 61 74 61 20 69 6e 20 73 74 72 75 63 74 75   data in structu
13650 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49  re pStruct..** I
13660 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c  f iLevel is -ve,
13670 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   then all data i
13680 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  n all segments i
13690 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66  s merged. Or, if
136a0 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65   iLevel.** is ze
136b0 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64  ro or greater, d
136c0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72  ata from the fir
136d0 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d  st nSegment segm
136e0 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c  ents on level iL
136f0 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65  evel.** is merge
13700 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65  d..**.** The ite
13710 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20  rator initially 
13720 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
13730 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65  rst term/rowid e
13740 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20  ntry in the .** 
13750 69 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a  iterated data..*
13760 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
13770 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a  s5MultiIterNew(.
13780 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137a0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
137b0 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
137c0 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  hin */.  Fts5Str
137d0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c  ucture *pStruct,
137e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75           /* Stru
137f0 63 74 75 72 65 20 6f 66 20 73 70 65 63 69 66 69  cture of specifi
13800 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  c index */.  int
13810 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20   iIdx,          
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13830 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69  Config.aHash[] i
13840 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65  ndex of FTS inde
13850 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  x */.  int bSkip
13860 45 6d 70 74 79 2c 20 20 20 20 20 20 20 20 20 20  Empty,          
13870 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
13880 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d  o ignore delete-
13890 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  keys */.  int fl
138a0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
138b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
138c0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58  5INDEX_QUERY_XXX
138d0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
138e0 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
138f0 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
13900 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28  erm to seek to (
13910 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20  or NULL/0) */.  
13920 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13940 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72  /* Level to iter
13950 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29  ate (-1 for all)
13960 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
13970 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
13980 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13990 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d  of segments to m
139a0 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29  erge (iLevel>=0)
139b0 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53   */.  Fts5MultiS
139c0 65 67 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20  egIter **ppOut  
139d0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
139e0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
139f0 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
13a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13a10 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
13a20 73 20 6d 65 72 67 65 64 20 2a 2f 0a 20 20 69 6e  s merged */.  in
13a30 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20  t nSlot;        
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a50 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d   Power of two >=
13a60 20 6e 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69   nSeg */.  int i
13a70 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Iter = 0;       
13a80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f             /* */
13a90 0a 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20  .  int iSeg;    
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
13ac0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65  erate through se
13ad0 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35  gments */.  Fts5
13ae0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
13af0 70 4c 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74  pLvl;.  Fts5Mult
13b00 69 53 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a  iSegIter *pNew;.
13b10 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
13b20 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30  m==0 && nTerm==0
13b30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b  ) || iLevel<0 );
13b40 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
13b50 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
13b60 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72  w multi-seg-iter
13b70 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 69  ator. */.  if( i
13b80 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 6e  Level<0 ){.    n
13b90 53 65 67 20 3d 20 66 74 73 35 53 74 72 75 63 74  Seg = fts5Struct
13ba0 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
13bb0 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 6e  (pStruct);.    n
13bc0 53 65 67 20 2b 3d 20 28 70 2d 3e 61 70 48 61 73  Seg += (p->apHas
13bd0 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 7d 65  h ? 1 : 0);.  }e
13be0 6c 73 65 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20  lse{.    nSeg = 
13bf0 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65  MIN(pStruct->aLe
13c00 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67  vel[iLevel].nSeg
13c10 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d  , nSegment);.  }
13c20 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20  .  for(nSlot=2; 
13c30 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f  nSlot<nSeg; nSlo
13c40 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 2a 70  t=nSlot*2);.  *p
13c50 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74  pOut = pNew = ft
13c60 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a  s5IdxMalloc(p, .
13c70 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
13c80 35 4d 75 6c 74 69 53 65 67 49 74 65 72 29 20 2b  5MultiSegIter) +
13c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
13ca0 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f  w */.      sizeo
13cb0 66 28 46 74 73 35 53 65 67 49 74 65 72 29 20 2a  f(Fts5SegIter) *
13cc0 20 6e 53 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f   nSlot +       /
13cd0 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a  * pNew->aSeg[] *
13ce0 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  /.      sizeof(F
13cf0 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53  ts5CResult) * nS
13d00 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70  lot         /* p
13d10 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f  New->aFirst[] */
13d20 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  .  );.  if( pNew
13d30 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
13d40 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c  pNew->nSeg = nSl
13d50 6f 74 3b 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67  ot;.  pNew->aSeg
13d60 20 3d 20 28 46 74 73 35 53 65 67 49 74 65 72 2a   = (Fts5SegIter*
13d70 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65  )&pNew[1];.  pNe
13d80 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73  w->aFirst = (Fts
13d90 35 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d  5CResult*)&pNew-
13da0 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20  >aSeg[nSlot];.  
13db0 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21  pNew->bRev = (0!
13dc0 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  =(flags & FTS5IN
13dd0 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29  DEX_QUERY_DESC))
13de0 3b 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45  ;.  pNew->bSkipE
13df0 6d 70 74 79 20 3d 20 62 53 6b 69 70 45 6d 70 74  mpty = bSkipEmpt
13e00 79 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  y;..  /* Initial
13e10 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20  ize each of the 
13e20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e  component segmen
13e30 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a  t iterators. */.
13e40 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29    if( iLevel<0 )
13e50 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
13e60 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d  ureLevel *pEnd =
13e70 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
13e80 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l[pStruct->nLeve
13e90 6c 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  l];.    if( p->a
13ea0 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 2f  pHash ){.      /
13eb0 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20  * Add a segment 
13ec0 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  iterator for the
13ed0 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
13ee0 73 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61  s of the hash ta
13ef0 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 74  ble. */.      Ft
13f00 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
13f10 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
13f20 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 66  Iter++];.      f
13f30 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
13f40 69 74 28 70 2c 20 69 49 64 78 2c 20 70 54 65 72  it(p, iIdx, pTer
13f50 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
13f60 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
13f70 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74     for(pLvl=&pSt
13f80 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b  ruct->aLevel[0];
13f90 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c   pLvl<pEnd; pLvl
13fa0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
13fb0 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31  Seg=pLvl->nSeg-1
13fc0 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
13fd0 2d 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  -){.        Fts5
13fe0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
13ff0 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
14000 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
14010 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
14020 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
14030 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20  aSeg[iIter++];. 
14040 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
14050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
14060 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
14070 28 70 2c 20 69 49 64 78 2c 20 70 53 65 67 2c 20  (p, iIdx, pSeg, 
14080 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
14090 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
140a0 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b   fts5SegIterSeek
140b0 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 70 54  Init(p, iIdx, pT
140c0 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
140d0 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  s, pSeg, pIter);
140e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
140f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
14100 7b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53  {.    pLvl = &pS
14110 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
14120 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69  evel];.    for(i
14130 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67  Seg=nSeg-1; iSeg
14140 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20  >=0; iSeg--){.  
14150 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
14160 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 26 70 4c  nit(p, iIdx, &pL
14170 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20  vl->aSeg[iSeg], 
14180 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
14190 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  r++]);.    }.  }
141a0 0a 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72  .  assert( iIter
141b0 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20  ==nSeg );..  /* 
141c0 49 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73  If the above was
141d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63   successful, eac
141e0 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72  h component iter
141f0 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73  ators now points
14200 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69   .  ** to the fi
14210 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73  rst entry in its
14220 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69   segment. In thi
14230 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a  s case initializ
14240 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72  e the .  ** aFir
14250 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20  st[] array. Or, 
14260 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
14270 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74  occurred, free t
14280 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a  he iterator.  **
14290 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20   object and set 
142a0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
142b0 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f  ble to NULL.  */
142c0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
142d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
142e0 6f 72 28 69 49 74 65 72 3d 6e 53 6c 6f 74 2d 31  or(iIter=nSlot-1
142f0 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72  ; iIter>0; iIter
14300 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  --){.      int i
14310 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  Eq;.      if( (i
14320 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
14330 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77  erDoCompare(pNew
14340 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20  , iIter)) ){.   
14350 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14360 4e 65 78 74 28 70 2c 20 26 70 4e 65 77 2d 3e 61  Next(p, &pNew->a
14370 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20  Seg[iEq], 0);.  
14380 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
14390 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
143a0 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29  New, iEq, iIter)
143b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
143c0 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75      fts5AssertMu
143d0 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20  ltiIterSetup(p, 
143e0 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
143f0 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79  pNew->bSkipEmpty
14400 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65   && fts5MultiIte
14410 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77  rIsEmpty(p, pNew
14420 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  ) ){.      fts5M
14430 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
14440 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pNew, 0, 0);.   
14450 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
14460 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
14470 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  e(p, pNew);.    
14480 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a  *ppOut = 0;.  }.
14490 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
144a0 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65 72  true if the iter
144b0 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f  ator is at EOF o
144c0 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  r if an error ha
144d0 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20  s occurred. .** 
144e0 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  False otherwise.
144f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
14500 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
14510 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
14520 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
14530 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
14540 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72   (p->rc || pIter
14550 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
14560 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
14570 5d 2e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a  ].pLeaf==0);.}..
14580 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
14590 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e   rowid of the en
145a0 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65  try that the ite
145b0 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  rator currently 
145c0 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66  points.** to. If
145d0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
145e0 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e  ints to EOF when
145f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
14600 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20  s called the.** 
14610 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65  results are unde
14620 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
14630 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74   i64 fts5MultiIt
14640 65 72 52 6f 77 69 64 28 46 74 73 35 4d 75 6c 74  erRowid(Fts5Mult
14650 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  iSegIter *pIter)
14660 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
14670 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
14680 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
14690 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65   ].pLeaf );.  re
146a0 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67  turn pIter->aSeg
146b0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
146c0 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77  1].iFirst ].iRow
146d0 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  id;.}../*.** Mov
146e0 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  e the iterator t
146f0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
14700 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67   at or following
14710 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74   iMatch..*/.stat
14720 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
14730 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20  iIterNextFrom(. 
14740 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
14750 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
14760 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36  er *pIter, .  i6
14770 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68  4 iMatch.){.  wh
14780 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
14790 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74  4 iRowid;.    ft
147a0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
147b0 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61  p, pIter, 1, iMa
147c0 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74  tch);.    if( ft
147d0 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
147e0 2c 20 70 49 74 65 72 29 20 29 20 62 72 65 61 6b  , pIter) ) break
147f0 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66  ;.    iRowid = f
14800 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
14810 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  d(pIter);.    if
14820 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30  ( pIter->bRev==0
14830 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74   && iRowid>=iMat
14840 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
14850 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21  if( pIter->bRev!
14860 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d  =0 && iRowid<=iM
14870 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
14880 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
14890 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
148a0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
148b0 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f  ng the term asso
148c0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
148d0 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74  .** entry that t
148e0 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
148f0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
14900 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
14910 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74   u8 *fts5MultiIt
14920 65 72 54 65 72 6d 28 46 74 73 35 4d 75 6c 74 69  erTerm(Fts5Multi
14930 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
14940 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35  int *pn){.  Fts5
14950 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49  SegIter *p = &pI
14960 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
14970 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
14980 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d  st ];.  *pn = p-
14990 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72  >term.n;.  retur
149a0 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a  n p->term.p;.}..
149b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
149c0 65 20 69 66 20 74 68 65 20 63 68 75 6e 6b 20 69  e if the chunk i
149d0 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
149e0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
149f0 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45  ument is.** at E
14a00 4f 46 2e 20 4f 72 20 69 66 20 61 6e 20 65 72 72  OF. Or if an err
14a10 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
14a20 63 63 75 72 72 65 64 2e 20 4f 74 68 65 72 77 69  ccurred. Otherwi
14a30 73 65 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  se, return false
14a40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14a50 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
14a60 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
14a70 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49  ts5ChunkIter *pI
14a80 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ter){.  return (
14a90 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e  p->rc || pIter->
14aa0 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  pLeaf==0);.}../*
14ab0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
14ac0 63 68 75 6e 6b 2d 69 74 65 72 61 74 6f 72 20 74  chunk-iterator t
14ad0 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b  o the next chunk
14ae0 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65 61 64   of data to read
14af0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14b00 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65   fts5ChunkIterNe
14b10 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
14b20 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a   Fts5ChunkIter *
14b30 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
14b40 28 20 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 3d 70  ( pIter->nRem>=p
14b50 49 74 65 72 2d 3e 6e 20 29 3b 0a 20 20 70 49 74  Iter->n );.  pIt
14b60 65 72 2d 3e 6e 52 65 6d 20 2d 3d 20 70 49 74 65  er->nRem -= pIte
14b70 72 2d 3e 6e 3b 0a 20 20 66 74 73 35 44 61 74 61  r->n;.  fts5Data
14b80 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
14b90 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
14ba0 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 70 49 74  pLeaf = 0;.  pIt
14bb0 65 72 2d 3e 70 20 3d 20 30 3b 0a 20 20 69 66 28  er->p = 0;.  if(
14bc0 20 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 30 20 29   pIter->nRem>0 )
14bd0 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
14be0 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  pLeaf;.    pIter
14bf0 2d 3e 69 4c 65 61 66 52 6f 77 69 64 2b 2b 3b 0a  ->iLeafRowid++;.
14c00 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65      pLeaf = pIte
14c10 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 44  r->pLeaf = fts5D
14c20 61 74 61 52 65 61 64 28 70 2c 20 70 49 74 65 72  ataRead(p, pIter
14c30 2d 3e 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  ->iLeafRowid);. 
14c40 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a     if( pLeaf ){.
14c50 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 20 3d        pIter->n =
14c60 20 4d 49 4e 28 70 49 74 65 72 2d 3e 6e 52 65 6d   MIN(pIter->nRem
14c70 2c 20 70 4c 65 61 66 2d 3e 6e 2d 34 29 3b 0a 20  , pLeaf->n-4);. 
14c80 20 20 20 20 20 70 49 74 65 72 2d 3e 70 20 3d 20       pIter->p = 
14c90 70 4c 65 61 66 2d 3e 70 2b 34 3b 0a 20 20 20 20  pLeaf->p+4;.    
14ca0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
14cb0 6e 74 69 61 6c 69 7a 65 20 74 68 65 20 63 68 75  ntialize the chu
14cc0 6e 6b 20 69 74 65 72 61 74 6f 72 20 74 6f 20 72  nk iterator to r
14cd0 65 61 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ead the position
14ce0 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20 77   list data for w
14cf0 68 69 63 68 20 0a 2a 2a 20 74 68 65 20 73 69 7a  hich .** the siz
14d00 65 20 66 69 65 6c 64 20 69 73 20 61 74 20 6f 66  e field is at of
14d10 66 73 65 74 20 69 4f 66 66 20 6f 66 20 6c 65 61  fset iOff of lea
14d20 66 20 70 4c 65 61 66 2e 20 0a 2a 2f 0a 73 74 61  f pLeaf. .*/.sta
14d30 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
14d40 6e 6b 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  nkIterInit(.  Ft
14d50 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
14d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14d70 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
14d80 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
14d90 67 49 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20  gIter *pSeg,    
14da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
14db0 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 74 6f  ment iterator to
14dc0 20 72 65 61 64 20 70 6f 73 6c 69 73 74 20 66 72   read poslist fr
14dd0 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 43 68 75 6e  om */.  Fts5Chun
14de0 6b 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  kIter *pIter    
14df0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
14e00 61 6c 69 7a 65 20 74 68 69 73 20 6f 62 6a 65 63  alize this objec
14e10 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61  t */.){.  Fts5Da
14e20 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 53 65 67  ta *pLeaf = pSeg
14e30 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69  ->pLeaf;.  int i
14e40 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61  Off = pSeg->iLea
14e50 66 4f 66 66 73 65 74 3b 0a 0a 20 20 6d 65 6d 73  fOffset;..  mems
14e60 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
14e70 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
14e80 2f 2a 20 49 66 20 46 74 73 35 53 65 67 49 74 65  /* If Fts5SegIte
14e90 72 2e 70 53 65 67 20 69 73 20 4e 55 4c 4c 2c 20  r.pSeg is NULL, 
14ea0 74 68 65 6e 20 74 68 69 73 20 69 74 65 72 61 74  then this iterat
14eb0 6f 72 20 69 74 65 72 61 74 65 73 20 74 68 72 6f  or iterates thro
14ec0 75 67 68 20 64 61 74 61 0a 20 20 2a 2a 20 63 75  ugh data.  ** cu
14ed0 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69  rrently stored i
14ee0 6e 20 61 20 68 61 73 68 20 74 61 62 6c 65 2e 20  n a hash table. 
14ef0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
14f00 72 65 20 69 73 20 6e 6f 20 6c 65 61 66 2d 72 6f  re is no leaf-ro
14f10 77 69 64 0a 20 20 2a 2a 20 74 6f 20 63 61 6c 63  wid.  ** to calc
14f20 75 6c 61 74 65 2e 20 20 2a 2f 0a 20 20 69 66 28  ulate.  */.  if(
14f30 20 70 53 65 67 2d 3e 70 53 65 67 20 29 7b 0a 20   pSeg->pSeg ){. 
14f40 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65     int iId = pSe
14f50 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  g->pSeg->iSegid;
14f60 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20 3d  .    i64 rowid =
14f70 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
14f80 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c 20  WID(pSeg->iIdx, 
14f90 69 49 64 2c 20 30 2c 20 70 53 65 67 2d 3e 69 4c  iId, 0, pSeg->iL
14fa0 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 49  eafPgno);.    pI
14fb0 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 20  ter->iLeafRowid 
14fc0 3d 20 72 6f 77 69 64 3b 0a 20 20 7d 0a 0a 20 20  = rowid;.  }..  
14fd0 66 74 73 35 44 61 74 61 52 65 66 65 72 65 6e 63  fts5DataReferenc
14fe0 65 28 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65  e(pLeaf);.  pIte
14ff0 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66  r->pLeaf = pLeaf
15000 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20  ;.  pIter->nRem 
15010 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20  = pSeg->nPos;.  
15020 70 49 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70  pIter->n = MIN(p
15030 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20  Leaf->n - iOff, 
15040 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b 0a 20 20  pIter->nRem);.  
15050 70 49 74 65 72 2d 3e 70 20 3d 20 70 4c 65 61 66  pIter->p = pLeaf
15060 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a 20 20 69 66  ->p + iOff;.  if
15070 28 20 70 49 74 65 72 2d 3e 6e 3d 3d 30 20 29 7b  ( pIter->n==0 ){
15080 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74  .    fts5ChunkIt
15090 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  erNext(p, pIter)
150a0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
150b0 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74  void fts5ChunkIt
150c0 65 72 52 65 6c 65 61 73 65 28 46 74 73 35 43 68  erRelease(Fts5Ch
150d0 75 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b  unkIter *pIter){
150e0 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
150f0 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
15100 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ;.  pIter->pLeaf
15110 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
15120 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ead and return t
15130 68 65 20 6e 65 78 74 20 33 32 2d 62 69 74 20 76  he next 32-bit v
15140 61 72 69 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  arint from the p
15150 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 74 65  osition-list ite
15160 72 61 74 6f 72 20 0a 2a 2a 20 70 61 73 73 65 64  rator .** passed
15170 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
15180 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  rgument..**.** I
15190 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
151a0 73 2c 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72  s, zero is retur
151b0 6e 65 64 20 61 6e 20 61 6e 20 65 72 72 6f 72 20  ned an an error 
151c0 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 0a 2a 2a  code left in .**
151d0 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
151e0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
151f0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
15200 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
15210 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c  on is.** called,
15220 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
15230 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
15240 73 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72  s5PosIterReadVar
15250 69 6e 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  int(Fts5Index *p
15260 2c 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70  , Fts5PosIter *p
15270 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 56 61  Iter){.  int iVa
15280 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  l = 0;.  if( p->
15290 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
152a0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
152b0 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 63 68 75  iOff>=pIter->chu
152c0 6e 6b 2e 6e 20 29 7b 0a 20 20 20 20 20 20 66 74  nk.n ){.      ft
152d0 73 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28  s5ChunkIterNext(
152e0 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b  p, &pIter->chunk
152f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  );.      if( fts
15300 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c  5ChunkIterEof(p,
15310 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 20   &pIter->chunk) 
15320 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
15330 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20    pIter->iOff = 
15340 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  0;.    }.    pIt
15350 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  er->iOff += fts5
15360 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
15370 65 72 2d 3e 63 68 75 6e 6b 2e 70 5b 70 49 74 65  er->chunk.p[pIte
15380 72 2d 3e 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b  r->iOff], iVal);
15390 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 56  .  }.  return iV
153a0 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  al;.}../*.** Adv
153b0 61 6e 63 65 20 74 68 65 20 70 6f 73 69 74 69 6f  ance the positio
153c0 6e 20 6c 69 73 74 20 69 74 65 72 61 74 6f 72 20  n list iterator 
153d0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
153e0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
153f0 64 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78  d fts5PosIterNex
15400 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
15410 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74  Fts5PosIter *pIt
15420 65 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 3b  er){.  int iVal;
15430 0a 20 20 61 73 73 65 72 74 28 20 66 74 73 35 43  .  assert( fts5C
15440 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
15450 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30  pIter->chunk)==0
15460 20 29 3b 0a 20 20 69 56 61 6c 20 3d 20 66 74 73   );.  iVal = fts
15470 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69  5PosIterReadVari
15480 6e 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  nt(p, pIter);.  
15490 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65  if( fts5ChunkIte
154a0 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e  rEof(p, &pIter->
154b0 63 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  chunk)==0 ){.   
154c0 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a   if( iVal==1 ){.
154d0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 43 6f        pIter->iCo
154e0 6c 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52  l = fts5PosIterR
154f0 65 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74  eadVarint(p, pIt
15500 65 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  er);.      pIter
15510 2d 3e 69 50 6f 73 20 3d 20 66 74 73 35 50 6f 73  ->iPos = fts5Pos
15520 49 74 65 72 52 65 61 64 56 61 72 69 6e 74 28 70  IterReadVarint(p
15530 2c 20 70 49 74 65 72 29 20 2d 20 32 3b 0a 20 20  , pIter) - 2;.  
15540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
15550 49 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28 69  Iter->iPos += (i
15560 56 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 7d 0a  Val - 2);.    }.
15570 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
15580 74 69 61 6c 69 7a 65 20 74 68 65 20 46 74 73 35  tialize the Fts5
15590 50 6f 73 49 74 65 72 20 6f 62 6a 65 63 74 20 70  PosIter object p
155a0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 6e  assed as the fin
155b0 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69  al argument to i
155c0 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
155d0 68 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  h the position-l
155e0 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ist associated w
155f0 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 65 6e  ith the index en
15600 74 72 79 20 74 68 61 74 20 69 74 65 72 61 74 6f  try that iterato
15610 72 20 0a 2a 2a 20 70 4d 75 6c 74 69 20 63 75 72  r .** pMulti cur
15620 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
15630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15640 20 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69 74   fts5PosIterInit
15650 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15670 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
15680 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
15690 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
156a0 20 2a 70 4d 75 6c 74 69 2c 20 20 20 20 20 20 20   *pMulti,       
156b0 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 20 69 74 65  /* Multi-seg ite
156c0 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f  rator to read po
156d0 73 2d 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20  s-list from */. 
156e0 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49   Fts5PosIter *pI
156f0 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
15700 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
15710 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
15720 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
15730 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
15740 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
15750 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67   = &pMulti->aSeg
15760 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74  [ pMulti->aFirst
15770 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
15780 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
15790 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
157a0 29 29 3b 0a 20 20 20 20 66 74 73 35 43 68 75 6e  ));.    fts5Chun
157b0 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  kIterInit(p, pSe
157c0 67 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b  g, &pIter->chunk
157d0 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 43  );.    if( fts5C
157e0 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
157f0 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30  pIter->chunk)==0
15800 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 6f   ){.      fts5Po
15810 73 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  sIterNext(p, pIt
15820 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  er);.    }.  }.}
15830 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
15840 72 75 65 20 69 66 20 74 68 65 20 70 6f 73 69 74  rue if the posit
15850 69 6f 6e 20 69 74 65 72 61 74 6f 72 20 70 61 73  ion iterator pas
15860 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
15870 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  d argument is.**
15880 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20 61   at EOF. Or if a
15890 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
158a0 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f 74  ady occurred. Ot
158b0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
158c0 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  false..*/.static
158d0 20 69 6e 74 20 66 74 73 35 50 6f 73 49 74 65 72   int fts5PosIter
158e0 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
158f0 2c 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70  , Fts5PosIter *p
15900 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
15910 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
15920 3e 63 68 75 6e 6b 2e 70 4c 65 61 66 3d 3d 30 29  >chunk.pLeaf==0)
15930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
15940 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e  ate a new segmen
15950 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73 74 72  t-id for the str
15960 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a  ucture pStruct..
15970 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
15980 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
15990 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
159a0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
159b0 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  . 0 is .** retur
159c0 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
159d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
159e0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
159f0 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
15a00 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
15a10 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69  Struct){.  int i
15a20 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ;.  if( p->rc!=S
15a30 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
15a40 6e 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  n 0;..  for(i=0;
15a50 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20   i<100; i++){.  
15a60 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
15a70 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
15a80 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e 74 29  ness(sizeof(int)
15a90 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64  , (void*)&iSegid
15aa0 29 3b 0a 20 20 20 20 69 53 65 67 69 64 20 3d 20  );.    iSegid = 
15ab0 69 53 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20  iSegid & ((1 << 
15ac0 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d  FTS5_DATA_ID_B)-
15ad0 31 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65 67  1);.    if( iSeg
15ae0 69 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  id ){.      int 
15af0 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
15b00 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
15b10 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
15b20 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
15b30 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
15b40 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
15b50 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
15b60 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
15b70 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64 3d       if( iSegid=
15b80 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  =pStruct->aLevel
15b90 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
15ba0 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20  ].iSegid ){.    
15bb0 20 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d          iSegid =
15bc0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
15bd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15be0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
15bf0 69 53 65 67 69 64 20 29 20 72 65 74 75 72 6e 20  iSegid ) return 
15c00 69 53 65 67 69 64 3b 0a 20 20 7d 0a 0a 20 20 70  iSegid;.  }..  p
15c10 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
15c20 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ROR;.  return 0;
15c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
15c40 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65  d all data curre
15c50 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74  ntly cached in t
15c60 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a  he hash-tables..
15c70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15c80 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
15c90 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ata(Fts5Index *p
15ca0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
15cb0 61 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65  apHash || p->nPe
15cc0 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a  ndingData==0 );.
15cd0 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 20    if( p->apHash 
15ce0 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
15cf0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
15d00 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69 6e 74  pConfig;.    int
15d10 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
15d20 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72   i<=pConfig->nPr
15d30 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  efix; i++){.    
15d40 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 5b    if( p->apHash[
15d50 69 5d 20 29 20 73 71 6c 69 74 65 33 46 74 73 35  i] ) sqlite3Fts5
15d60 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 61 70 48  HashClear(p->apH
15d70 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ash[i]);.    }. 
15d80 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61     p->nPendingDa
15d90 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ta = 0;.  }.}../
15da0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15db0 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66  size of the pref
15dc0 69 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68  ix, in bytes, th
15dd0 61 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f  at buffer (nNew/
15de0 70 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20  pNew) shares.** 
15df0 77 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c  with buffer (nOl
15e00 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74  d/pOld)..*/.stat
15e10 69 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69  ic int fts5Prefi
15e20 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74  xCompress(.  int
15e30 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20   nOld, const u8 
15e40 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65  *pOld,.  int nNe
15e50 77 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65  w, const u8 *pNe
15e60 77 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  w.){.  int i;.  
15e70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20  for(i=0; i<nNew 
15e80 26 26 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  && i<nOld; i++){
15e90 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d  .    if( pOld[i]
15ea0 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61  !=pNew[i] ) brea
15eb0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
15ec0 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  i;.}../*.** If a
15ed0 6e 20 22 6e 45 6d 70 74 79 22 20 72 65 63 6f 72  n "nEmpty" recor
15ee0 64 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  d must be writte
15ef0 6e 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  n to the b-tree 
15f00 62 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 0a  before the next.
15f10 2a 2a 20 74 65 72 6d 2c 20 77 72 69 74 65 20 69  ** term, write i
15f20 74 20 6e 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t now..*/.static
15f30 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
15f40 74 72 65 65 4e 45 6d 70 74 79 28 46 74 73 35 49  treeNEmpty(Fts5I
15f50 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
15f60 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
15f70 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  {.  if( pWriter-
15f80 3e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 69  >nEmpty ){.    i
15f90 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20  nt bFlag = 0;.  
15fa0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
15fb0 20 2a 70 50 67 3b 0a 20 20 20 20 70 50 67 20 3d   *pPg;.    pPg =
15fc0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
15fd0 65 72 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70  er[1];.    if( p
15fe0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d  Writer->nEmpty>=
15ff0 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
16000 49 5a 45 20 26 26 20 70 57 72 69 74 65 72 2d 3e  IZE && pWriter->
16010 63 64 6c 69 64 78 2e 6e 20 29 7b 0a 20 20 20 20  cdlidx.n ){.    
16020 20 20 69 36 34 20 69 4b 65 79 20 3d 20 46 54 53    i64 iKey = FTS
16030 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f  5_DOCLIST_IDX_RO
16040 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
16050 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
16060 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 0a  riter->iSegid, .
16070 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65            pWrite
16080 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67  r->aWriter[0].pg
16090 6e 6f 20 2d 20 31 20 2d 20 70 57 72 69 74 65 72  no - 1 - pWriter
160a0 2d 3e 6e 45 6d 70 74 79 0a 20 20 20 20 20 20 29  ->nEmpty.      )
160b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
160c0 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2e  pWriter->cdlidx.
160d0 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73  n>0 );.      fts
160e0 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4b  5DataWrite(p, iK
160f0 65 79 2c 20 70 57 72 69 74 65 72 2d 3e 63 64 6c  ey, pWriter->cdl
16100 69 64 78 2e 70 2c 20 70 57 72 69 74 65 72 2d 3e  idx.p, pWriter->
16110 63 64 6c 69 64 78 2e 6e 29 3b 0a 20 20 20 20 20  cdlidx.n);.     
16120 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20   bFlag = 1;.    
16130 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
16140 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
16150 3e 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20  >rc, &pPg->buf, 
16160 62 46 6c 61 67 29 3b 0a 20 20 20 20 66 74 73 35  bFlag);.    fts5
16170 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
16180 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d  nt(&p->rc, &pPg-
16190 3e 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e 6e  >buf, pWriter->n
161a0 45 6d 70 74 79 29 3b 0a 20 20 20 20 70 57 72 69  Empty);.    pWri
161b0 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b  ter->nEmpty = 0;
161c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 74 68  .  }..  /* Wheth
161d0 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 77 61 73  er or not it was
161e0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
161f0 2c 20 7a 65 72 6f 20 74 68 65 20 64 6f 63 6c 69  , zero the docli
16200 73 74 20 69 6e 64 65 78 20 61 74 20 74 68 69 73  st index at this
16210 0a 20 20 2a 2a 20 70 6f 69 6e 74 20 2a 2f 0a 20  .  ** point */. 
16220 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
16230 65 72 5a 65 72 6f 28 26 70 57 72 69 74 65 72 2d  erZero(&pWriter-
16240 3e 63 64 6c 69 64 78 29 3b 0a 20 20 70 57 72 69  >cdlidx);.  pWri
16250 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56  ter->bDlidxPrevV
16260 61 6c 69 64 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61  alid = 0;.}..sta
16270 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
16280 74 65 42 74 72 65 65 47 72 6f 77 28 46 74 73 35  teBtreeGrow(Fts5
16290 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
162a0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
162b0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
162c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
162d0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
162e0 2a 61 4e 65 77 3b 0a 20 20 20 20 46 74 73 35 50  *aNew;.    Fts5P
162f0 61 67 65 57 72 69 74 65 72 20 2a 70 4e 65 77 3b  ageWriter *pNew;
16300 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
16310 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57  sizeof(Fts5PageW
16320 72 69 74 65 72 29 20 2a 20 28 70 57 72 69 74 65  riter) * (pWrite
16330 72 2d 3e 6e 57 72 69 74 65 72 2b 31 29 3b 0a 0a  r->nWriter+1);..
16340 20 20 20 20 61 4e 65 77 20 3d 20 28 46 74 73 35      aNew = (Fts5
16350 50 61 67 65 57 72 69 74 65 72 2a 29 73 71 6c 69  PageWriter*)sqli
16360 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69  te3_realloc(pWri
16370 74 65 72 2d 3e 61 57 72 69 74 65 72 2c 20 6e 4e  ter->aWriter, nN
16380 65 77 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ew);.    if( aNe
16390 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
163a0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
163b0 45 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  EM;.      return
163c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 65  ;.    }..    pNe
163d0 77 20 3d 20 26 61 4e 65 77 5b 70 57 72 69 74 65  w = &aNew[pWrite
163e0 72 2d 3e 6e 57 72 69 74 65 72 5d 3b 0a 20 20 20  r->nWriter];.   
163f0 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
16400 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65   sizeof(Fts5Page
16410 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 70 4e  Writer));.    pN
16420 65 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ew->pgno = 1;.  
16430 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
16440 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
16450 20 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29 3b   &pNew->buf, 1);
16460 0a 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e  ..    pWriter->n
16470 57 72 69 74 65 72 2b 2b 3b 0a 20 20 20 20 70 57  Writer++;.    pW
16480 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d  riter->aWriter =
16490 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   aNew;.  }.}../*
164a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
164b0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
164c0 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70   leaf page excep
164d0 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74  t the first that
164e0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20   contains.** at 
164f0 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20  least one term. 
16500 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f  Argument (nTerm/
16510 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70  pTerm) is the sp
16520 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d  lit-key - a term
16530 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
16540 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d  er than all term
16550 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72  s written to ear
16560 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64  lier leaves, and
16570 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20   equal to or.** 
16580 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
16590 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
165a0 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a  he new leaf..**.
165b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
165c0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
165d0 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
165e0 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66  Fts5Index.rc. If
165f0 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73   an error.** has
16600 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
16610 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
16620 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
16630 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
16640 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
16650 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
16660 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16670 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16680 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
16690 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
166a0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
166b0 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
166c0 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
166d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
166e0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
166f0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
16700 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20  erm on new page 
16710 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65 69  */.){.  int iHei
16720 67 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69 67  ght;.  for(iHeig
16730 68 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68 74  ht=1; 1; iHeight
16740 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  ++){.    Fts5Pag
16750 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b 0a  eWriter *pPage;.
16760 0a 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74  .    if( iHeight
16770 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74  >=pWriter->nWrit
16780 65 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  er ){.      fts5
16790 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 70  WriteBtreeGrow(p
167a0 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
167b0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
167c0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
167d0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
167e0 2d 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67 68  ->aWriter[iHeigh
167f0 74 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  t];..    fts5Wri
16800 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c  teBtreeNEmpty(p,
16810 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20 20   pWriter);..    
16820 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
16830 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  >=p->pConfig->pg
16840 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  sz ){.      /* p
16850 50 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69  Page will be wri
16860 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68  tten to disk. Th
16870 65 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77  e term will be w
16880 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
16890 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20        ** parent 
168a0 6f 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20  of pPage.  */.  
168b0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
168c0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
168d0 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
168e0 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
168f0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
16900 48 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70  Height, pPage->p
16910 67 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  gno.      );.   
16920 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
16930 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67  (p, iRowid, pPag
16940 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
16950 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66  >buf.n);.      f
16960 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
16970 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20  Page->buf);.    
16980 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
16990 28 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a  (&pPage->term);.
169a0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
169b0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
169c0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
169d0 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f  , pPage[-1].pgno
169e0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  );.      pPage->
169f0 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  pgno++;.    }els
16a00 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72  e{.      int nPr
16a10 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  e = fts5PrefixCo
16a20 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
16a30 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
16a40 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
16a50 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  m);.      fts5Bu
16a60 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
16a70 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
16a80 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20  >buf, nPre+2);. 
16a90 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
16aa0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
16ab0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
16ac0 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20   nTerm-nPre);.  
16ad0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
16ae0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
16af0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
16b00 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b  erm-nPre, pTerm+
16b10 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73  nPre);.      fts
16b20 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
16b30 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c  c, &pPage->term,
16b40 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
16b50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16b60 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
16b70 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
16b80 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74  treeNoTerm(.  Ft
16b90 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
16ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16bb0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
16bc0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
16bd0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
16be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
16bf0 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ter object */.){
16c00 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
16c10 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
16c20 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72  e ){.    /* No r
16c30 6f 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70 61  owids on this pa
16c40 67 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30 78  ge. Append an 0x
16c50 30 30 20 62 79 74 65 20 74 6f 20 74 68 65 20 63  00 byte to the c
16c60 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64  urrent .    ** d
16c70 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
16c80 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
16c90 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64  >bDlidxPrevValid
16ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  ==0 ){.      i64
16cb0 20 69 52 6f 77 69 64 20 3d 20 70 57 72 69 74 65   iRowid = pWrite
16cc0 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 3b 0a 20  r->iPrevRowid;. 
16cd0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
16ce0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
16cf0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  nt(&p->rc, &pWri
16d00 74 65 72 2d 3e 63 64 6c 69 64 78 2c 20 69 52 6f  ter->cdlidx, iRo
16d10 77 69 64 29 3b 0a 20 20 20 20 20 20 70 57 72 69  wid);.      pWri
16d20 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56  ter->bDlidxPrevV
16d30 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
16d40 70 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78 50  pWriter->iDlidxP
16d50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  rev = iRowid;.  
16d60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
16d70 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
16d80 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
16d90 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c 20  Writer->cdlidx, 
16da0 30 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65  0);.  }.  pWrite
16db0 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a  r->nEmpty++;.}..
16dc0 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77  /*.** Rowid iRow
16dd0 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  id has just been
16de0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
16df0 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
16e00 67 65 2e 20 41 73 20 69 74 20 69 73 0a 2a 2a 20  ge. As it is.** 
16e10 74 68 65 20 66 69 72 73 74 20 6f 6e 20 69 74 73  the first on its
16e20 20 70 61 67 65 2c 20 61 70 70 65 6e 64 20 61 6e   page, append an
16e30 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75   entry to the cu
16e40 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e  rrent doclist-in
16e50 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
16e60 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69  oid fts5WriteDli
16e70 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35  dxAppend(.  Fts5
16e80 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
16e90 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
16ea0 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77  ter, .  i64 iRow
16eb0 69 64 0a 29 7b 0a 20 20 69 36 34 20 69 56 61 6c  id.){.  i64 iVal
16ec0 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ;.  if( pWriter-
16ed0 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64  >bDlidxPrevValid
16ee0 20 29 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20 69   ){.    iVal = i
16ef0 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d  Rowid - pWriter-
16f00 3e 69 44 6c 69 64 78 50 72 65 76 3b 0a 20 20 7d  >iDlidxPrev;.  }
16f10 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
16f20 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
16f30 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
16f40 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78  &pWriter->cdlidx
16f50 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69  , iRowid);.    i
16f60 56 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  Val = 1;.  }.  s
16f70 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
16f80 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
16f90 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 63  >rc, &pWriter->c
16fa0 64 6c 69 64 78 2c 20 69 56 61 6c 29 3b 0a 20 20  dlidx, iVal);.  
16fb0 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50  pWriter->bDlidxP
16fc0 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  revValid = 1;.  
16fd0 70 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78 50  pWriter->iDlidxP
16fe0 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a  rev = iRowid;.}.
16ff0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17000 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
17010 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
17020 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
17030 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  iter){.  static 
17040 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20  const u8 zero[] 
17050 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20  = { 0x00, 0x00, 
17060 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x00, 0x00 };.  
17070 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
17080 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
17090 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20  ->aWriter[0];.  
170a0 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 69  i64 iRowid;..  i
170b0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
170c0 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a  stTermInPage ){.
170d0 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77      /* No term w
170e0 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  as written to th
170f0 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  is page. */.    
17100 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47  assert( 0==fts5G
17110 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  etU16(&pPage->bu
17120 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66  f.p[2]) );.    f
17130 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
17140 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
17150 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
17160 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
17170 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a  e to the db. */.
17180 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
17190 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
171a0 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
171b0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c  iter->iSegid, 0,
171c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
171d0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
171e0 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d  , iRowid, pPage-
171f0 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
17200 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  uf.n);..  /* Ini
17210 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74  tialize the next
17220 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
17230 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
17240 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  e->buf);.  fts5B
17250 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
17260 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
17270 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20  buf, 4, zero);. 
17280 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a   pPage->pgno++;.
17290 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74  .  /* Increase t
172a0 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  he leaves writte
172b0 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70  n counter */.  p
172c0 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69  Writer->nLeafWri
172d0 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  tten++;..  /* Th
172e0 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73  e new leaf holds
172f0 20 6e 6f 20 74 65 72 6d 73 20 2a 2f 0a 20 20 70   no terms */.  p
17300 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
17310 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a  rmInPage = 1;.}.
17320 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65  ./*.** Append te
17330 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74  rm pTerm/nTerm t
17340 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65  o the segment be
17350 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20 74  ing written by t
17360 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65 64  he writer passed
17370 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
17380 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
17390 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
173a0 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
173b0 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
173c0 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
173d0 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
173e0 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
173f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
17400 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
17410 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
17420 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73  ppendTerm(.  Fts
17430 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
17440 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
17450 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72  iter,.  int nTer
17460 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  m, const u8 *pTe
17470 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72  rm .){.  int nPr
17480 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
17490 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
174a0 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70  s of prefix comp
174b0 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d  ression for term
174c0 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
174d0 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
174e0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
174f0 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  0];..  assert( p
17500 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Page==0 || pPage
17510 2d 3e 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50  ->buf.n==0 || pP
17520 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a  age->buf.n>4 );.
17530 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 70    if( pPage && p
17540 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29  Page->buf.n==0 )
17550 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68  {.    /* Zero th
17560 65 20 66 69 72 73 74 20 74 65 72 6d 20 61 6e 64  e first term and
17570 20 66 69 72 73 74 20 64 6f 63 69 64 20 66 69 65   first docid fie
17580 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  lds */.    stati
17590 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b  c const u8 zero[
175a0 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30  ] = { 0x00, 0x00
175b0 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a  , 0x00, 0x00 };.
175c0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
175d0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
175e0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c   &pPage->buf, 4,
175f0 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61 73 73 65   zero);.    asse
17600 72 74 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  rt( pWriter->bFi
17610 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b  rstTermInPage );
17620 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63  .  }.  if( p->rc
17630 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20 20   ) return;.  .  
17640 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
17650 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
17660 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
17670 68 65 20 22 66 69 72 73 74 20 74 65 72 6d 22 20  he "first term" 
17680 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 67  field of the pag
17690 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
176a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
176b0 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20 70  buf.p[2]==0 && p
176c0 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d 3d  Page->buf.p[3]==
176d0 30 20 29 3b 0a 20 20 20 20 66 74 73 35 50 75 74  0 );.    fts5Put
176e0 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
176f0 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  p[2], pPage->buf
17700 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65 66 69 78  .n);.    nPrefix
17710 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
17720 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a  age->pgno!=1 ){.
17730 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
17740 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
17750 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20 69  on a leaf that i
17760 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f  s not the leftmo
17770 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20  st leaf in.     
17780 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20   ** the segment 
17790 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20  b-tree. In this 
177a0 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65 73  case it is neces
177b0 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74 65  sary to add a te
177c0 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  rm to.      ** t
177d0 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
177e0 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29 20  chy that is (a) 
177f0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
17800 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20  largest term .  
17810 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77      ** already w
17820 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65  ritten to the se
17830 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d  gment and (b) sm
17840 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71  aller than or eq
17850 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ual to.      ** 
17860 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74  this term. In ot
17870 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65  her words, a pre
17880 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54  fix of (pTerm/nT
17890 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65  erm) that is one
178a0 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c  .      ** byte l
178b0 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  onger than the l
178c0 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28 70  ongest prefix (p
178d0 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72  Term/nTerm) shar
178e0 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20  es with the.    
178f0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65    ** previous te
17900 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rm. .      **.  
17910 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20      ** Usually, 
17920 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
17930 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  m is available i
17940 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54  n pPage->term. T
17950 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20  he exception.   
17960 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73     ** is if this
17970 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
17980 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e  rm written in an
17990 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72   incremental-mer
179a0 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a  ge step..      *
179b0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
179c0 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  he previous term
179d0 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
179e0 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65  e, so just write
179f0 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
17a00 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d   of (pTerm/nTerm
17a10 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  ) into the paren
17a20 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20  t node. This is 
17a30 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a  slightly.      *
17a40 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62  * inefficient, b
17a50 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74  ut still correct
17a60 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  .  */.      int 
17a70 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  n = nTerm;.     
17a80 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d   if( pPage->term
17a90 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20  .n ){.        n 
17aa0 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69 78  = 1 + fts5Prefix
17ab0 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e  Compress(pPage->
17ac0 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74  term.n, pPage->t
17ad0 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54  erm.p, nTerm, pT
17ae0 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  erm);.      }.  
17af0 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
17b00 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65  eeTerm(p, pWrite
17b10 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20  r, n, pTerm);.  
17b20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72      pPage = &pWr
17b30 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
17b40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
17b50 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66  .    nPrefix = f
17b60 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
17b70 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c  s(pPage->term.n,
17b80 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
17b90 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
17ba0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
17bb0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
17bc0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
17bd0 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20  Prefix);.  }..  
17be0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75  /* Append the nu
17bf0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
17c00 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20   new data, then 
17c10 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74  the term data it
17c20 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65  self.  ** to the
17c30 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
17c40 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
17c50 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
17c60 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
17c70 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35  nPrefix);.  fts5
17c80 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
17c90 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
17ca0 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50  >buf, nTerm - nP
17cb0 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50  refix, &pTerm[nP
17cc0 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55  refix]);..  /* U
17cd0 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61  pdate the Fts5Pa
17ce0 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69  geWriter.term fi
17cf0 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  eld. */.  fts5Bu
17d00 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
17d10 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54  &pPage->term, nT
17d20 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70  erm, pTerm);.  p
17d30 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
17d40 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20  rmInPage = 0;.. 
17d50 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
17d60 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
17d70 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
17d80 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
17d90 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 1;..  /* If t
17da0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
17db0 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c  page is full, fl
17dc0 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20  ush it to disk. 
17dd0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
17de0 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69  buf.n>=p->pConfi
17df0 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66  g->pgsz ){.    f
17e00 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
17e10 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
17e20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
17e30 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
17e40 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
17e50 41 70 70 65 6e 64 20 61 20 64 6f 63 69 64 20 61  Append a docid a
17e60 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  nd position-list
17e70 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20 74   size field to t
17e80 68 65 20 77 72 69 74 65 72 73 20 6f 75 74 70 75  he writers outpu
17e90 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
17ea0 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
17eb0 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49  ndRowid(.  Fts5I
17ec0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
17ed0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
17ee0 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64  er,.  i64 iRowid
17ef0 2c 0a 20 20 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a  ,.  int nPos.){.
17f00 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
17f10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
17f20 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
17f30 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
17f40 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 20  aWriter[0];..   
17f50 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
17f60 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 64  o be the first d
17f70 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  ocid written to 
17f80 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74 68  the page, set th
17f90 65 20 0a 20 20 20 20 2a 2a 20 64 6f 63 69 64 2d  e .    ** docid-
17fa0 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70  pointer in the p
17fb0 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f  age-header. Also
17fc0 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20   append a value 
17fd0 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20  to the dlidx.   
17fe0 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63   ** buffer, in c
17ff0 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ase a doclist-in
18000 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e  dex is required.
18010 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72    */.    if( pWr
18020 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
18030 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
18040 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61 67   fts5PutU16(pPag
18050 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
18060 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66  >buf.n);.      f
18070 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
18080 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20  end(p, pWriter, 
18090 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iRowid);.    }..
180a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
180b0 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 20 20 69   docid. */.    i
180c0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
180d0 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
180e0 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69   || pWriter->bFi
180f0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
18100 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
18110 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
18120 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
18130 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  uf, iRowid);.   
18140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
18150 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69  sert( p->rc || i
18160 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69  Rowid>pWriter->i
18170 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20  PrevRowid );.   
18180 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
18190 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
181a0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69  , &pPage->buf, i
181b0 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d  Rowid - pWriter-
181c0 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20  >iPrevRowid);.  
181d0 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d    }.    pWriter-
181e0 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52  >iPrevRowid = iR
181f0 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65  owid;.    pWrite
18200 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
18210 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Doclist = 0;.   
18220 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
18230 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
18240 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
18250 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
18260 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
18270 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 69 66  , nPos);..    if
18280 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
18290 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
182a0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72   ){.      fts5Wr
182b0 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
182c0 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  pWriter);.      
182d0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
182e0 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a  owidInPage = 1;.
182f0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
18300 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
18310 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49  teAppendPoslistI
18320 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nt(.  Fts5Index 
18330 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
18340 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
18350 20 69 6e 74 20 69 56 61 6c 0a 29 7b 0a 20 20 69   int iVal.){.  i
18360 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
18370 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50  _OK ){.    Fts5P
18380 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
18390 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
183a0 69 74 65 72 5b 30 5d 3b 0a 20 20 20 20 66 74 73  iter[0];.    fts
183b0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
183c0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
183d0 67 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a  ge->buf, iVal);.
183e0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62      if( pPage->b
183f0 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  uf.n>=p->pConfig
18400 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  ->pgsz ){.      
18410 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
18420 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
18430 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62        pWriter->b
18440 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
18450 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
18460 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
18470 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
18480 73 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73  slistData(.  Fts
18490 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
184a0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
184b0 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75  iter, .  const u
184c0 38 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74  8 *aData, .  int
184d0 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35   nData.){.  Fts5
184e0 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
184f0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  e = &pWriter->aW
18500 72 69 74 65 72 5b 30 5d 3b 0a 20 20 63 6f 6e 73  riter[0];.  cons
18510 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b  t u8 *a = aData;
18520 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61  .  int n = nData
18530 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
18540 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e  ->pConfig->pgsz>
18550 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
18560 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
18570 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  & (pPage->buf.n 
18580 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  + n)>=p->pConfig
18590 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 6e  ->pgsz ){.    in
185a0 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e  t nReq = p->pCon
185b0 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67  fig->pgsz - pPag
185c0 65 2d 3e 62 75 66 2e 6e 3b 0a 20 20 20 20 69 6e  e->buf.n;.    in
185d0 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20  t nCopy = 0;.   
185e0 20 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52   while( nCopy<nR
185f0 65 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  eq ){.      i64 
18600 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f  dummy;.      nCo
18610 70 79 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  py += getVarint(
18620 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a  &a[nCopy], (u64*
18630 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a  )&dummy);.    }.
18640 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
18650 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
18660 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43   &pPage->buf, nC
18670 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b  opy, a);.    a +
18680 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d  = nCopy;.    n -
18690 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73  = nCopy;.    fts
186a0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
186b0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
186c0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
186d0 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
186e0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
186f0 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
18700 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
18710 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
18720 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  n, a);.  }.}..st
18730 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
18740 69 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74  iteAppendZerobyt
18750 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
18760 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
18770 57 72 69 74 65 72 29 7b 0a 20 20 66 74 73 35 42  Writer){.  fts5B
18780 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
18790 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  t(&p->rc, &pWrit
187a0 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62  er->aWriter[0].b
187b0 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
187c0 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
187d0 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72  cached by the wr
187e0 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  iter object to t
187f0 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65  he database. Fre
18800 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e any.** allocat
18810 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
18820 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e  with the writer.
18830 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18840 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
18850 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
18860 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
18870 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
18880 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
18890 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
188a0 6e 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20  nHeight,        
188b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
188c0 3a 20 48 65 69 67 68 74 20 6f 66 20 74 68 65 20  : Height of the 
188d0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
188e0 2a 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20  *pnLeaf         
188f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
18900 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65  UT: Number of le
18910 61 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72  af pages in b-tr
18920 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ee */.){.  int i
18930 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
18940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18950 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
18960 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72  pLeaf = &pWriter
18970 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20  ->aWriter[0];.  
18980 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67 6e    if( pLeaf->pgn
18990 6f 3d 3d 31 20 26 26 20 70 4c 65 61 66 2d 3e 62  o==1 && pLeaf->b
189a0 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  uf.n==0 ){.     
189b0 20 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20   *pnLeaf = 0;.  
189c0 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
189d0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
189e0 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62      if( pLeaf->b
189f0 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20  uf.n>4 ){.      
18a00 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
18a10 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
18a20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18a30 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d  *pnLeaf = pLeaf-
18a40 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 20 20 69  >pgno-1;.      i
18a50 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69  f( pWriter->nWri
18a60 74 65 72 3d 3d 31 20 26 26 20 70 57 72 69 74 65  ter==1 && pWrite
18a70 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f  r->nEmpty>=FTS5_
18a80 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29  MIN_DLIDX_SIZE )
18a90 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72  {.        fts5Wr
18aa0 69 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c 20  iteBtreeGrow(p, 
18ab0 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  pWriter);.      
18ac0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 57 72 69  }.      if( pWri
18ad0 74 65 72 2d 3e 6e 57 72 69 74 65 72 3e 31 20 29  ter->nWriter>1 )
18ae0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72  {.        fts5Wr
18af0 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70  iteBtreeNEmpty(p
18b00 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
18b10 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e 48 65 69    }.      *pnHei
18b20 67 68 74 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e  ght = pWriter->n
18b30 57 72 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 66  Writer;..      f
18b40 6f 72 28 69 3d 31 3b 20 69 3c 70 57 72 69 74 65  or(i=1; i<pWrite
18b50 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29  r->nWriter; i++)
18b60 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 61  {.        Fts5Pa
18b70 67 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20  geWriter *pPg = 
18b80 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
18b90 72 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 66 74  r[i];.        ft
18ba0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a  s5DataWrite(p, .
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35              FTS5
18bc0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
18bd0 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
18be0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
18bf0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 2c 20 0a 20  , pPg->pgno), . 
18c00 20 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e             pPg->
18c10 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e  buf.p, pPg->buf.
18c20 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  n.        );.   
18c30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
18c40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69   for(i=0; i<pWri
18c50 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b  ter->nWriter; i+
18c60 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65  +){.    Fts5Page
18c70 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70  Writer *pPg = &p
18c80 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
18c90 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
18ca0 70 50 67 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51  pPg || p->rc!=SQ
18cb0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69  LITE_OK );.    i
18cc0 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20  f( pPg ){.      
18cd0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
18ce0 70 50 67 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20  pPg->term);.    
18cf0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
18d00 28 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20 20 20  (&pPg->buf);.   
18d10 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
18d20 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61  _free(pWriter->a
18d30 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Writer);.  sqlit
18d40 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65  e3Fts5BufferFree
18d50 28 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64  (&pWriter->cdlid
18d60 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  x);.}..static vo
18d70 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69 74  id fts5WriteInit
18d80 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
18d90 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
18da0 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20  er *pWriter, .  
18db0 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53  int iIdx, int iS
18dc0 65 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  egid.){.  memset
18dd0 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (pWriter, 0, siz
18de0 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
18df0 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  r));.  pWriter->
18e00 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70  iIdx = iIdx;.  p
18e10 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d  Writer->iSegid =
18e20 20 69 53 65 67 69 64 3b 0a 0a 20 20 70 57 72 69   iSegid;..  pWri
18e30 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 28  ter->aWriter = (
18e40 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29  Fts5PageWriter*)
18e50 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
18e60 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57  sizeof(Fts5PageW
18e70 72 69 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70  riter));.  if( p
18e80 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 3d  Writer->aWriter=
18e90 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
18ea0 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20  Writer->nWriter 
18eb0 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
18ec0 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20  aWriter[0].pgno 
18ed0 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
18ee0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
18ef0 20 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 1;.}..static 
18f00 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e  void fts5WriteIn
18f10 69 74 46 6f 72 41 70 70 65 6e 64 28 0a 20 20 46  itForAppend(.  F
18f20 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
18f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18f40 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
18f50 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
18f60 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
18f70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r,         /* Wr
18f80 69 74 65 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  iter to initiali
18f90 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ze */.  int iIdx
18fa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18fb0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18fc0 20 73 65 67 6d 65 6e 74 20 69 73 20 61 20 70 61   segment is a pa
18fd0 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53  rt of */.  Fts5S
18fe0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
18ff0 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65  *pSeg      /* Se
19000 67 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f 20  gment object to 
19010 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b 0a  append to */.){.
19020 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70 53    int nByte = pS
19030 65 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73 69  eg->nHeight * si
19040 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69  zeof(Fts5PageWri
19050 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  ter);.  memset(p
19060 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Writer, 0, sizeo
19070 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
19080 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 49  );.  pWriter->iI
19090 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57 72  dx = iIdx;.  pWr
190a0 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 70  iter->iSegid = p
190b0 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 70  Seg->iSegid;.  p
190c0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20  Writer->aWriter 
190d0 3d 20 28 46 74 73 35 50 61 67 65 57 72 69 74 65  = (Fts5PageWrite
190e0 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
190f0 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 57  (p, nByte);.  pW
19100 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d  riter->nWriter =
19110 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3b 0a   pSeg->nHeight;.
19120 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
19130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
19140 6e 74 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  nt pgno = 1;.   
19150 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 57 72 69   int i;.    pWri
19160 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e  ter->aWriter[0].
19170 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e  pgno = pSeg->pgn
19180 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 66 6f 72  oLast+1;.    for
19190 28 69 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  (i=pSeg->nHeight
191a0 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
191b0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
191c0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
191d0 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49  OWID(pWriter->iI
191e0 64 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65  dx, pWriter->iSe
191f0 67 69 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a 20  gid, i, pgno);. 
19200 20 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69       Fts5PageWri
19210 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69  ter *pPg = &pWri
19220 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b  ter->aWriter[i];
19230 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f  .      pPg->pgno
19240 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 66   = pgno;.      f
19250 74 73 35 44 61 74 61 42 75 66 66 65 72 28 70 2c  ts5DataBuffer(p,
19260 20 26 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f 77   &pPg->buf, iRow
19270 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
19280 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19290 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 4e  ){.        Fts5N
192a0 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20  odeIter ss;.    
192b0 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
192c0 49 6e 69 74 28 70 50 67 2d 3e 62 75 66 2e 70 2c  Init(pPg->buf.p,
192d0 20 70 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73 73   pPg->buf.n, &ss
192e0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
192f0 28 20 73 73 2e 61 44 61 74 61 20 29 20 66 74 73  ( ss.aData ) fts
19300 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70  5NodeIterNext(&p
19310 2d 3e 72 63 2c 20 26 73 73 29 3b 0a 20 20 20 20  ->rc, &ss);.    
19320 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
19330 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e  t(&p->rc, &pPg->
19340 74 65 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c  term, ss.term.n,
19350 20 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20   ss.term.p);.   
19360 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e 69       pgno = ss.i
19370 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20 66  Child;.        f
19380 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
19390 26 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &ss);.      }.  
193a0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 65 67    }.    if( pSeg
193b0 2d 3e 6e 48 65 69 67 68 74 3d 3d 31 20 29 7b 0a  ->nHeight==1 ){.
193c0 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e        pWriter->n
193d0 45 6d 70 74 79 20 3d 20 70 53 65 67 2d 3e 70 67  Empty = pSeg->pg
193e0 6e 6f 4c 61 73 74 2d 31 3b 0a 20 20 20 20 7d 0a  noLast-1;.    }.
193f0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 67 6e      assert( (pgn
19400 6f 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74  o+pWriter->nEmpt
19410 79 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  y)==pSeg->pgnoLa
19420 73 74 20 29 3b 0a 20 20 20 20 70 57 72 69 74 65  st );.    pWrite
19430 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
19440 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  age = 1;.    ass
19450 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 61 57  ert( pWriter->aW
19460 72 69 74 65 72 5b 30 5d 2e 74 65 72 6d 2e 6e 3d  riter[0].term.n=
19470 3d 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  =0 );.  }.}../*.
19480 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
19490 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74  r was used to it
194a0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
194b0 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  e input segments
194c0 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63   of on an.** inc
194d0 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f  remental merge o
194e0 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66  peration. This f
194f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
19500 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65  d if the increme
19510 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74  ntal.** merge st
19520 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ep has finished 
19530 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61  but the input ha
19540 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c  s not been compl
19550 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e  etely exhausted.
19560 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19570 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
19580 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
19590 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
195a0 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
195b0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
195c0 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
195d0 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
195e0 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72  5Buffer));.  for
195f0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
19600 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Seg; i++){.    F
19610 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
19620 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
19630 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67  i];.    if( pSeg
19640 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pSeg==0 ){.   
19650 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
19660 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
19670 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  g->pLeaf==0 ){. 
19680 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
19690 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20  >pgnoLast = 0;. 
196a0 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
196b0 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a  >pgnoFirst = 0;.
196c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
196d0 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67   int iOff = pSeg
196e0 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
196f0 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  t;     /* Offset
19700 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65   on new first le
19710 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  af page */.     
19720 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b   i64 iLeafRowid;
19730 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20  .      Fts5Data 
19740 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e  *pData;.      in
19750 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53  t iId = pSeg->pS
19760 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
19770 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b    u8 aHdr[4] = {
19780 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
19790 2c 20 30 78 30 34 7d 3b 0a 0a 20 20 20 20 20 20  , 0x04};..      
197a0 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53  iLeafRowid = FTS
197b0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
197c0 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c  pSeg->iIdx, iId,
197d0 20 30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c   0, pSeg->iTermL
197e0 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  eafPgno);.      
197f0 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
19800 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77  Read(p, iLeafRow
19810 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
19820 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
19830 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
19840 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74  buf);.        ft
19850 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
19860 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
19870 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61   sizeof(aHdr), a
19880 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Hdr);.        ft
19890 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
198a0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
198b0 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29  f, pSeg->term.n)
198c0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
198d0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
198e0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
198f0 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d  g->term.n, pSeg-
19900 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20  >term.p);.      
19910 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
19920 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
19930 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 20 2d 20  buf, pData->n - 
19940 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b  iOff, &pData->p[
19950 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20  iOff]);.        
19960 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
19970 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
19980 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
19990 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54  First = pSeg->iT
199a0 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ermLeafPgno;.   
199b0 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c       fts5DataDel
199c0 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ete(p, FTS5_SEGM
199d0 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
199e0 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 31 29  iIdx, iId, 0, 1)
199f0 2c 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20  ,iLeafRowid);.  
19a00 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
19a10 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
19a20 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
19a30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19a40 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
19a50 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f  Free(&buf);.}../
19a60 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
19a70 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72  oid fts5IndexMer
19a80 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49  geLevel(.  Fts5I
19a90 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
19aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
19ab0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
19ac0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
19ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ae0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
19af0 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20  to work on */.  
19b00 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
19b10 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  ppStruct,       
19b20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74  /* IN/OUT: Stuct
19b30 75 72 65 20 6f 66 20 69 6e 64 65 78 20 69 49 64  ure of index iId
19b40 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  x */.  int iLvl,
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
19b70 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 72  to read input fr
19b80 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52  om */.  int *pnR
19b90 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
19ba0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
19bb0 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79   up to this many
19bc0 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a   output leaves *
19bd0 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
19be0 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
19bf0 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73  *ppStruct;.  Fts
19c00 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
19c10 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
19c20 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
19c30 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
19c40 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20  evel *pLvlOut;. 
19c50 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
19c60 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20  r *pIter = 0;   
19c70 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
19c80 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20  read input data 
19c90 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  */.  int nRem = 
19ca0 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a  pnRem ? *pnRem :
19cb0 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c   0;  /* Output l
19cc0 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74  eaf pages left t
19cd0 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
19ce0 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20   nInput;        
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d00 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  Number of input 
19d10 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74  segments */.  Ft
19d20 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
19d30 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
19d40 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
19d50 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
19d60 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
19d70 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65      /* Output se
19d80 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42  gment */.  Fts5B
19d90 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e  uffer term;.  in
19da0 74 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73  t bRequireDoclis
19db0 74 54 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a  tTerm = 0;    /*
19dc0 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61   Doclist termina
19dd0 74 6f 72 20 28 30 78 30 30 29 20 72 65 71 75 69  tor (0x00) requi
19de0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6c  red */.  int bOl
19df0 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  dest;           
19e00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
19e10 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 73   if the output s
19e20 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c  egment is the ol
19e30 64 65 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  dest */..  asser
19e40 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  t( iLvl<pStruct-
19e50 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73  >nLevel );.  ass
19e60 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ert( pLvl->nMerg
19e70 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b  e<=pLvl->nSeg );
19e80 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74  ..  memset(&writ
19e90 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
19ea0 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
19eb0 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30   memset(&term, 0
19ec0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
19ed0 66 65 72 29 29 3b 0a 20 20 77 72 69 74 65 72 2e  fer));.  writer.
19ee0 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 69  iIdx = iIdx;.  i
19ef0 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
19f00 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d  ){.    pLvlOut =
19f10 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
19f20 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61  l[iLvl+1];.    a
19f30 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e  ssert( pLvlOut->
19f40 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49  nSeg>0 );.    nI
19f50 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65  nput = pLvl->nMe
19f60 72 67 65 3b 0a 20 20 20 20 66 74 73 35 57 72 69  rge;.    fts5Wri
19f70 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28  teInitForAppend(
19f80 70 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64 78  p, &writer, iIdx
19f90 2c 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67  , &pLvlOut->aSeg
19fa0 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31  [pLvlOut->nSeg-1
19fb0 5d 29 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26  ]);.    pSeg = &
19fc0 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
19fd0 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a  vlOut->nSeg-1];.
19fe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19ff0 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c   iSegid = fts5Al
1a000 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70  locateSegid(p, p
1a010 53 74 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a  Struct);..    /*
1a020 20 45 78 74 65 6e 64 20 74 68 65 20 46 74 73 35   Extend the Fts5
1a030 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
1a040 20 61 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   as required to 
1a050 65 6e 73 75 72 65 20 74 68 65 20 6f 75 74 70 75  ensure the outpu
1a060 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74  t.    ** segment
1a070 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20   exists. */.    
1a080 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63  if( iLvl==pStruc
1a090 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20  t->nLevel-1 ){. 
1a0a0 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
1a0b0 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72  reAddLevel(&p->r
1a0c0 63 2c 20 70 70 53 74 72 75 63 74 29 3b 0a 20 20  c, ppStruct);.  
1a0d0 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 2a 70      pStruct = *p
1a0e0 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20  pStruct;.    }. 
1a0f0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1a100 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
1a110 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 4c 76  rc, pStruct, iLv
1a120 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  l+1, 1, 0);.    
1a130 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
1a140 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26  rn;.    pLvl = &
1a150 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1a160 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f  iLvl];.    pLvlO
1a170 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
1a180 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a  Level[iLvl+1];..
1a190 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
1a1a0 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 49  t(p, &writer, iI
1a1b0 64 78 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20  dx, iSegid);..  
1a1c0 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
1a1d0 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20   segment to the 
1a1e0 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a  output level */.
1a1f0 20 20 20 20 69 66 28 20 69 4c 76 6c 2b 31 3d 3d      if( iLvl+1==
1a200 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20  pStruct->nLevel 
1a210 29 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ) pStruct->nLeve
1a220 6c 2b 2b 3b 0a 20 20 20 20 70 53 65 67 20 3d 20  l++;.    pSeg = 
1a230 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
1a240 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20  LvlOut->nSeg];. 
1a250 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
1a260 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67  ++;.    pSeg->pg
1a270 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
1a280 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
1a290 69 53 65 67 69 64 3b 0a 0a 20 20 20 20 2f 2a 20  iSegid;..    /* 
1a2a0 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  Read input from 
1a2b0 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  all segments in 
1a2c0 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20  the input level 
1a2d0 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20  */.    nInput = 
1a2e0 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a  pLvl->nSeg;.  }.
1a2f0 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76    bOldest = (pLv
1a300 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26  lOut->nSeg==1 &&
1a310 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1a320 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 23 69 66 20  ==iLvl+2);..#if 
1a330 30 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74  0.fprintf(stdout
1a340 2c 20 22 6d 65 72 67 69 6e 67 20 25 64 20 73 65  , "merging %d se
1a350 67 6d 65 6e 74 73 20 66 72 6f 6d 20 6c 65 76 65  gments from leve
1a360 6c 20 25 64 21 22 2c 20 6e 49 6e 70 75 74 2c 20  l %d!", nInput, 
1a370 69 4c 76 6c 29 3b 0a 66 66 6c 75 73 68 28 73 74  iLvl);.fflush(st
1a380 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  dout);.#endif.. 
1a390 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30   assert( iLvl>=0
1a3a0 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75   );.  for(fts5Mu
1a3b0 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
1a3c0 74 72 75 63 74 2c 20 69 49 64 78 2c 20 30 2c 20  truct, iIdx, 0, 
1a3d0 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e  0, 0, 0, iLvl, n
1a3e0 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a  Input, &pIter);.
1a3f0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1a400 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1a410 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  ==0;.      fts5M
1a420 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
1a430 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29  pIter, 0, 0).  )
1a440 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1a450 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
1a460 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1a470 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1a480 5d 3b 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b  ];.    Fts5Chunk
1a490 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20  Iter sPos;      
1a4a0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1a4b0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1a4c0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
1a4d0 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20  .    int nPos;  
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4f0 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c     /* position-l
1a500 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 76  ist size field v
1a510 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alue */.    int 
1a520 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74  nTerm;.    const
1a530 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20   u8 *pTerm;..   
1a540 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b 65   /* Check for ke
1a550 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20  y annihilation. 
1a560 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  */.    if( pSeg-
1a570 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c  >nPos==0 && (bOl
1a580 64 65 73 74 20 7c 7c 20 70 53 65 67 2d 3e 62 44  dest || pSeg->bD
1a590 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  el==0) ) continu
1a5a0 65 3b 0a 0a 20 20 20 20 66 74 73 35 43 68 75 6e  e;..    fts5Chun
1a5b0 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  kIterInit(p, pSe
1a5c0 67 2c 20 26 73 50 6f 73 29 3b 0a 0a 20 20 20 20  g, &sPos);..    
1a5d0 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74  pTerm = fts5Mult
1a5e0 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c  iIterTerm(pIter,
1a5f0 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66   &nTerm);.    if
1a600 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20  ( nTerm!=term.n 
1a610 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c  || memcmp(pTerm,
1a620 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20   term.p, nTerm) 
1a630 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 6e 52  ){.      if( pnR
1a640 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65  em && writer.nLe
1a650 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29  afWritten>nRem )
1a660 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68  {.        fts5Ch
1a670 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 26  unkIterRelease(&
1a680 73 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 62  sPos);.        b
1a690 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1a6a0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
1a6b0 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65  a new term. Appe
1a6c0 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  nd a term to the
1a6d0 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
1a6e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 52   */.      if( bR
1a6f0 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72  equireDoclistTer
1a700 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  m ){.        fts
1a710 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f  5WriteAppendZero
1a720 62 79 74 65 28 70 2c 20 26 77 72 69 74 65 72 29  byte(p, &writer)
1a730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a740 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
1a750 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20  erm(p, &writer, 
1a760 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1a770 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1a780 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d  et(&p->rc, &term
1a790 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
1a7a0 0a 20 20 20 20 20 20 62 52 65 71 75 69 72 65 44  .      bRequireD
1a7b0 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 31 3b 0a  oclistTerm = 1;.
1a7c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70      }..    /* Ap
1a7d0 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74  pend the rowid t
1a7e0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
1a7f0 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
1a800 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 6e  ISTSIZE */.    n
1a810 50 6f 73 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  Pos = pSeg->nPos
1a820 2a 32 20 2b 20 70 53 65 67 2d 3e 62 44 65 6c 3b  *2 + pSeg->bDel;
1a830 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70  .    fts5WriteAp
1a840 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72  pendRowid(p, &wr
1a850 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49  iter, fts5MultiI
1a860 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 2c  terRowid(pIter),
1a870 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 66 6f 72   nPos);..    for
1a880 28 2f 2a 20 6e 6f 6f 70 20 2a 2f 3b 20 21 66 74  (/* noop */; !ft
1a890 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70  s5ChunkIterEof(p
1a8a0 2c 20 26 73 50 6f 73 29 3b 20 66 74 73 35 43 68  , &sPos); fts5Ch
1a8b0 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 26  unkIterNext(p, &
1a8c0 73 50 6f 73 29 29 7b 0a 20 20 20 20 20 20 66 74  sPos)){.      ft
1a8d0 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
1a8e0 6c 69 73 74 44 61 74 61 28 70 2c 20 26 77 72 69  listData(p, &wri
1a8f0 74 65 72 2c 20 73 50 6f 73 2e 70 2c 20 73 50 6f  ter, sPos.p, sPo
1a900 73 2e 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  s.n);.    }..   
1a910 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65   fts5ChunkIterRe
1a920 6c 65 61 73 65 28 26 73 50 6f 73 29 3b 0a 20 20  lease(&sPos);.  
1a930 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68  }..  /* Flush th
1a940 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65  e last leaf page
1a950 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68   to disk. Set th
1a960 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1a970 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20   b-tree height. 
1a980 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61   ** and last lea
1a990 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74  f page number at
1a9a0 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20   the same time. 
1a9b0 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46   */.  fts5WriteF
1a9c0 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72  inish(p, &writer
1a9d0 2c 20 26 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  , &pSeg->nHeight
1a9e0 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  , &pSeg->pgnoLas
1a9f0 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d  t);..  if( fts5M
1aa00 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
1aa10 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Iter) ){.    int
1aa20 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   i;..    /* Remo
1aa30 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
1aa40 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
1aa50 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
1aa60 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
1aa70 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a  i<nInput; i++){.
1aa80 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
1aa90 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 69  moveSegment(p, i
1aaa0 49 64 78 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  Idx, pLvl->aSeg[
1aab0 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  i].iSegid);.    
1aac0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
1aad0 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73   the redundant s
1aae0 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
1aaf0 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
1ab00 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
1ab10 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20  eg!=nInput ){.  
1ab20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20      int nMove = 
1ab30 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49  (pLvl->nSeg - nI
1ab40 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46  nput) * sizeof(F
1ab50 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1ab60 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d  ent);.      memm
1ab70 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20  ove(pLvl->aSeg, 
1ab80 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70  &pLvl->aSeg[nInp
1ab90 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20  ut], nMove);.   
1aba0 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65   }.    pLvl->nSe
1abb0 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20  g -= nInput;.   
1abc0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
1abd0 30 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  0;.    if( pSeg-
1abe0 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a  >pgnoLast==0 ){.
1abf0 20 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e        pLvlOut->n
1ac00 53 65 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Seg--;.    }.  }
1ac10 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1ac20 28 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3e  ( pSeg->nHeight>
1ac30 30 20 26 26 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  0 && pSeg->pgnoL
1ac40 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73  ast>0 );.    fts
1ac50 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c  5TrimSegments(p,
1ac60 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76   pIter);.    pLv
1ac70 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70  l->nMerge = nInp
1ac80 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d  ut;.  }..  fts5M
1ac90 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
1aca0 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75  pIter);.  fts5Bu
1acb0 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
1acc0 0a 20 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a  .  if( pnRem ) *
1acd0 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e  pnRem -= writer.
1ace0 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a  nLeafWritten;.}.
1acf0 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  ./*.** A total o
1ad00 66 20 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67  f nLeaf leaf pag
1ad10 65 73 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a  es of data has j
1ad20 75 73 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64  ust been flushed
1ad30 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a   to a level-0.**
1ad40 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64   segments in ind
1ad50 65 78 20 69 49 64 78 20 77 69 74 68 20 73 74 72  ex iIdx with str
1ad60 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
1ad70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70  This function up
1ad80 64 61 74 65 73 20 74 68 65 0a 2a 2a 20 77 72 69  dates the.** wri
1ad90 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72  te-counter accor
1ada0 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66 20 6e  dingly and, if n
1adb0 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72  ecessary, perfor
1adc0 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  ms incremental m
1add0 65 72 67 65 0a 2a 2a 20 77 6f 72 6b 2e 0a 2a 2a  erge.** work..**
1ade0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1adf0 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
1ae00 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
1ae10 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
1ae20 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
1ae30 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
1ae40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ae50 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1ae60 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
1ae70 78 57 6f 72 6b 28 0a 20 20 46 74 73 35 49 6e 64  xWork(.  Fts5Ind
1ae80 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1ae90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1aea0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1aeb0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
1aee0 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74   work on */.  Ft
1aef0 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1af00 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
1af10 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1af20 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1af30 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  dex */.  int nLe
1af40 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
1af50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1af60 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61  er of output lea
1af70 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ves just written
1af80 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
1af90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1afa0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1afb0 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
1afc0 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 36 34  pStruct;.    i64
1afd0 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
1afe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1aff0 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77  itial value of w
1b000 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a  rite-counter */.
1b010 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20      int nWork;  
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b030 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77    /* Number of w
1b040 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65  ork-quanta to pe
1b050 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  rform */.    int
1b060 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
1b070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b080 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
1b090 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
1b0a0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61   */..    /* Upda
1b0b0 74 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75  te the write-cou
1b0c0 6e 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e  nter. While doin
1b0d0 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e  g so, set nWork.
1b0e0 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d   */.    nWrite =
1b0f0 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
1b100 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f  Counter;.    nWo
1b110 72 6b 20 3d 20 28 28 6e 57 72 69 74 65 20 2b 20  rk = ((nWrite + 
1b120 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72  nLeaf) / p->nWor
1b130 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74 65  kUnit) - (nWrite
1b140 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
1b150 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  ;.    pStruct->n
1b160 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20  WriteCounter += 
1b170 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20  nLeaf;.    nRem 
1b180 3d 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a  = p->nWorkUnit *
1b190 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74   nWork * pStruct
1b1a0 2d 3e 6e 4c 65 76 65 6c 3b 0a 0a 20 20 20 20 77  ->nLevel;..    w
1b1b0 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a  hile( nRem>0 ){.
1b1c0 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20        int iLvl; 
1b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1e0 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20    /* To iterate 
1b1f0 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
1b200 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 42 65 73  /.      int iBes
1b210 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  tLvl = 0;       
1b220 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66      /* Level off
1b230 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69  ering the most i
1b240 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
1b250 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 65 73 74  .      int nBest
1b260 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b270 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b280 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
1b290 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a  n best level */.
1b2a0 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69 42  .      /* Set iB
1b2b0 65 73 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65  estLvl to the le
1b2c0 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75  vel to read inpu
1b2d0 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e  t segments from.
1b2e0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1b2f0 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
1b300 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  l>0 );.      for
1b310 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1b320 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1b330 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
1b340 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
1b350 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
1b360 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1b370 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
1b380 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
1b390 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76           if( pLv
1b3a0 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20  l->nMerge>nBest 
1b3b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1b3c0 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a  BestLvl = iLvl;.
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 65 73              nBes
1b3e0 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  t = pLvl->nMerge
1b3f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b400 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b420 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e   if( pLvl->nSeg>
1b430 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  nBest ){.       
1b440 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
1b450 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20 20  >nSeg;.         
1b460 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
1b470 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b480 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
1b490 20 6e 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20   nBest is still 
1b4a0 30 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65  0, then the inde
1b4b0 78 20 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e  x must be empty.
1b4c0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1b4d0 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 6f  E_DEBUG.      fo
1b4e0 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d  r(iLvl=0; nBest=
1b4f0 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75  =0 && iLvl<pStru
1b500 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1b510 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
1b520 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c  ert( pStruct->aL
1b530 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d  evel[iLvl].nSeg=
1b540 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  =0 );.      }.#e
1b550 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20  ndif..      if( 
1b560 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67  nBest<p->pConfig
1b570 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a 20 20  ->nAutomerge .  
1b580 20 20 20 20 20 26 26 20 70 53 74 72 75 63 74 2d       && pStruct-
1b590 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c  >aLevel[iBestLvl
1b5a0 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20  ].nMerge==0 .   
1b5b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72     ){.        br
1b5c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1b5d0 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1b5e0 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78 2c 20  eLevel(p, iIdx, 
1b5f0 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c  &pStruct, iBestL
1b600 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
1b610 20 20 61 73 73 65 72 74 28 20 6e 52 65 6d 3d 3d    assert( nRem==
1b620 30 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  0 || p->rc==SQLI
1b630 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
1b640 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1b650 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e  _OK && pStruct->
1b660 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d  aLevel[iBestLvl]
1b670 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  .nMerge==0 ){.  
1b680 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
1b690 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42  urePromote(p, iB
1b6a0 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  estLvl+1, pStruc
1b6b0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
1b6c0 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
1b6d0 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  truct;.    }..  
1b6e0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1b6f0 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1b700 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  Merge(.  Fts5Ind
1b710 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1b720 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1b730 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1b740 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b760 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
1b770 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74   work on */.  Ft
1b780 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1b790 53 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a  Struct        /*
1b7a0 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1b7b0 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1b7c0 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  dex */.){.  Fts5
1b7d0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1b7e0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1b7f0 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a    int iLvl = 0;.
1b800 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1b810 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
1b820 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74   && iLvl<pStruct
1b830 2d 3e 6e 4c 65 76 65 6c 0a 20 20 20 20 20 20 26  ->nLevel.      &
1b840 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
1b850 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 70 2d  l[iLvl].nSeg>=p-
1b860 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69  >pConfig->nCrisi
1b870 73 4d 65 72 67 65 20 0a 20 20 29 7b 0a 20 20 20  sMerge .  ){.   
1b880 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
1b890 65 76 65 6c 28 70 2c 20 69 49 64 78 2c 20 26 70  evel(p, iIdx, &p
1b8a0 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29  Struct, iLvl, 0)
1b8b0 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
1b8c0 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c  urePromote(p, iL
1b8d0 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a  vl+1, pStruct);.
1b8e0 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a      iLvl++;.  }.
1b8f0 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
1b900 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
1b910 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65   int fts5IndexRe
1b920 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a  turn(Fts5Index *
1b930 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  p){.  int rc = p
1b940 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ->rc;.  p->rc = 
1b950 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74  SQLITE_OK;.  ret
1b960 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64  urn rc;.}..typed
1b970 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c  ef struct Fts5Fl
1b980 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68  ushCtx Fts5Flush
1b990 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35  Ctx;.struct Fts5
1b9a0 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73  FlushCtx {.  Fts
1b9b0 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20  5Index *pIdx;.  
1b9c0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
1b9d0 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  iter; .};../*.**
1b9e0 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63   Buffer aBuf[] c
1b9f0 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f  ontains a list o
1ba00 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73  f varints, all s
1ba10 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66  mall enough to f
1ba20 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69  it.** in a 32-bi
1ba30 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72  t integer. Retur
1ba40 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1ba50 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69 78  e largest prefix
1ba60 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73   of this .** lis
1ba70 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20  t nMax bytes or 
1ba80 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  less in size..*/
1ba90 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1baa0 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f  PoslistPrefix(co
1bab0 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e  nst u8 *aBuf, in
1bac0 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72  t nMax){.  int r
1bad0 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b  et;.  u32 dummy;
1bae0 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65 74  .  ret = fts5Get
1baf0 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64  Varint32(aBuf, d
1bb00 75 6d 6d 79 29 3b 0a 20 20 77 68 69 6c 65 28 20  ummy);.  while( 
1bb10 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  1 ){.    int i =
1bb20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
1bb30 28 26 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d  (&aBuf[ret], dum
1bb40 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 28 72 65  my);.    if( (re
1bb50 74 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20  t + i) > nMax ) 
1bb60 62 72 65 61 6b 3b 0a 20 20 20 20 72 65 74 20 2b  break;.    ret +
1bb70 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
1bb80 6e 20 72 65 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e  n ret;.}..#defin
1bb90 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65  e fts5BufferSafe
1bba0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
1bbb0 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b   pBlob, nBlob) {
1bbc0 20 5c 0a 20 20 61 73 73 65 72 74 28 20 70 42 75   \.  assert( pBu
1bbd0 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66  f->nSpace>=(pBuf
1bbe0 2d 3e 6e 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20  ->n+nBlob) );   
1bbf0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 6d 65            \.  me
1bc00 6d 63 70 79 28 26 70 42 75 66 2d 3e 70 5b 70 42  mcpy(&pBuf->p[pB
1bc10 75 66 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e  uf->n], pBlob, n
1bc20 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20 20  Blob);          
1bc30 20 20 20 5c 0a 20 20 70 42 75 66 2d 3e 6e 20 2b     \.  pBuf->n +
1bc40 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20  = nBlob;        
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
1bc70 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65  ./*.** Flush the
1bc80 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d   contents of in-
1bc90 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1bca0 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77  e iHash to a new
1bcb0 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67   level-0 .** seg
1bcc0 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c  ment on disk. Al
1bcd0 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f  so update the co
1bce0 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75  rresponding stru
1bcf0 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a  cture record..**
1bd00 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1bd10 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
1bd20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
1bd30 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
1bd40 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
1bd50 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
1bd60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1bd70 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1bd80 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73  ic void fts5Flus
1bd90 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64  hOneHash(Fts5Ind
1bda0 65 78 20 2a 70 2c 20 69 6e 74 20 69 48 61 73 68  ex *p, int iHash
1bdb0 2c 20 69 6e 74 20 2a 70 6e 4c 65 61 66 29 7b 0a  , int *pnLeaf){.
1bdc0 20 20 46 74 73 35 48 61 73 68 20 2a 70 48 61 73    Fts5Hash *pHas
1bdd0 68 20 3d 20 70 2d 3e 61 70 48 61 73 68 5b 69 48  h = p->apHash[iH
1bde0 61 73 68 5d 3b 0a 20 20 46 74 73 35 53 74 72 75  ash];.  Fts5Stru
1bdf0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
1be00 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
1be10 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
1be20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be30 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70    /* Last leaf p
1be40 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
1be50 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  gment */..  /* O
1be60 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
1be70 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73  e to the index s
1be80 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
1be90 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d  ocate a new segm
1bea0 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20  ent-id.  ** for 
1beb0 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20  the new level-0 
1bec0 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70  segment.  */.  p
1bed0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1bee0 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69 48  uctureRead(p, iH
1bef0 61 73 68 29 3b 0a 20 20 69 53 65 67 69 64 20 3d  ash);.  iSegid =
1bf00 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
1bf10 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  id(p, pStruct);.
1bf20 0a 20 20 69 66 28 20 69 53 65 67 69 64 20 29 7b  .  if( iSegid ){
1bf30 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70  .    const int p
1bf40 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  gsz = p->pConfig
1bf50 2d 3e 70 67 73 7a 3b 0a 0a 20 20 20 20 46 74 73  ->pgsz;..    Fts
1bf60 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1bf70 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65  t *pSeg;   /* Ne
1bf80 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e  w segment within
1bf90 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20   pStruct */.    
1bfa0 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20  int nHeight;    
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bfc0 20 48 65 69 67 68 74 20 6f 66 20 6e 65 77 20 73   Height of new s
1bfd0 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f  egment b-tree */
1bfe0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
1bff0 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  *pBuf;          
1c000 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20     /* Buffer in 
1c010 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c  which to assembl
1c020 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  e leaf page */. 
1c030 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 72     const u8 *zPr
1c040 65 76 20 3d 20 30 3b 0a 0a 20 20 20 20 46 74 73  ev = 0;..    Fts
1c050 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
1c060 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  r;.    fts5Write
1c070 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c  Init(p, &writer,
1c080 20 69 48 61 73 68 2c 20 69 53 65 67 69 64 29 3b   iHash, iSegid);
1c090 0a 0a 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c  ..    /* Pre-all
1c0a0 6f 63 61 74 65 20 74 68 65 20 62 75 66 66 65 72  ocate the buffer
1c0b0 20 75 73 65 64 20 74 6f 20 61 73 73 65 6d 62 6c   used to assembl
1c0c0 65 20 6c 65 61 66 20 70 61 67 65 73 20 74 6f 20  e leaf pages to 
1c0d0 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
1c0e0 2a 20 70 61 67 65 20 73 69 7a 65 2e 20 20 2a 2f  * page size.  */
1c0f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 73  .    assert( pgs
1c100 7a 3e 30 20 29 3b 0a 20 20 20 20 70 42 75 66 20  z>0 );.    pBuf 
1c110 3d 20 26 77 72 69 74 65 72 2e 61 57 72 69 74 65  = &writer.aWrite
1c120 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 66 74  r[0].buf;.    ft
1c130 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1c140 3e 72 63 2c 20 70 42 75 66 2c 20 70 67 73 7a 20  >rc, pBuf, pgsz 
1c150 2b 20 32 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42  + 20);..    /* B
1c160 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68  egin scanning th
1c170 72 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c 65  rough hash table
1c180 20 65 6e 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   entries. */.   
1c190 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c1a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
1c1b0 65 6d 73 65 74 28 70 42 75 66 2d 3e 70 2c 20 30  emset(pBuf->p, 0
1c1c0 2c 20 34 29 3b 0a 20 20 20 20 20 20 70 42 75 66  , 4);.      pBuf
1c1d0 2d 3e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 70  ->n = 4;.      p
1c1e0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
1c1f0 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70  s5HashScanInit(p
1c200 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Hash, 0, 0);.   
1c210 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70   }..    while( p
1c220 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1c230 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  && 0==sqlite3Fts
1c240 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61  5HashScanEof(pHa
1c250 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  sh) ){.      con
1c260 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 0a  st char *zTerm;.
1c270 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
1c280 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
1c290 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20  *pDoclist;.     
1c2a0 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 20   int nDoclist;. 
1c2b0 20 20 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78       int nSuffix
1c2c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c2d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
1c2e0 20 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20 20 20   suffix */..    
1c2f0 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1c300 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68  hScanEntry(pHash
1c310 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c  , &zTerm, &pDocl
1c320 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b  ist, &nDoclist);
1c330 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 3d 20 73  .      nTerm = s
1c340 74 72 6c 65 6e 28 7a 54 65 72 6d 29 3b 0a 0a 20  trlen(zTerm);.. 
1c350 20 20 20 20 20 2f 2a 20 44 65 63 69 64 65 20 69       /* Decide i
1c360 66 20 74 68 65 20 74 65 72 6d 20 77 69 6c 6c 20  f the term will 
1c370 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  fit on the curre
1c380 6e 74 20 6c 65 61 66 2e 20 49 66 20 69 74 20 77  nt leaf. If it w
1c390 69 6c 6c 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20  ill not, .      
1c3a0 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 6c 65 61  ** flush the lea
1c3b0 66 20 74 6f 20 64 69 73 6b 20 68 65 72 65 2e 20  f to disk here. 
1c3c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
1c3d0 42 75 66 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b  Buf->n + nTerm +
1c3e0 20 32 29 20 3e 20 70 67 73 7a 20 29 7b 0a 20 20   2) > pgsz ){.  
1c3f0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1c400 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69  lushLeaf(p, &wri
1c410 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 42  ter);.        pB
1c420 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72  uf = &writer.aWr
1c430 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20  iter[0].buf;.   
1c440 20 20 20 20 20 69 66 28 20 28 6e 54 65 72 6d 20       if( (nTerm 
1c450 2b 20 33 32 29 20 3e 20 70 42 75 66 2d 3e 6e 53  + 32) > pBuf->nS
1c460 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  pace ){.        
1c470 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77    fts5BufferGrow
1c480 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 6e  (&p->rc, pBuf, n
1c490 54 65 72 6d 20 2b 20 33 32 20 2d 20 70 42 75 66  Term + 32 - pBuf
1c4a0 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1c4b0 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61  if( p->rc ) brea
1c4c0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c4d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 57     }..      /* W
1c4e0 72 69 74 65 20 74 68 65 20 74 65 72 6d 20 74 6f  rite the term to
1c4f0 20 74 68 65 20 6c 65 61 66 2e 20 41 6e 64 20 70   the leaf. And p
1c500 75 73 68 20 69 74 20 75 70 20 69 6e 74 6f 20 74  ush it up into t
1c510 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
1c520 63 68 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  chy */.      if(
1c530 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 54 65   writer.bFirstTe
1c540 72 6d 49 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  rmInPage==0 ){. 
1c550 20 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20         int nPre 
1c560 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  = fts5PrefixComp
1c570 72 65 73 73 28 6e 54 65 72 6d 2c 20 7a 50 72 65  ress(nTerm, zPre
1c580 76 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73 74  v, nTerm, (const
1c590 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20   u8*)zTerm);.   
1c5a0 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20       pBuf->n += 
1c5b0 73 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74  sqlite3PutVarint
1c5c0 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
1c5d0 6e 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20 20 20  n], nPre);.     
1c5e0 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65     nSuffix = nTe
1c5f0 72 6d 20 2d 20 6e 50 72 65 3b 0a 20 20 20 20 20  rm - nPre;.     
1c600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c610 66 74 73 35 50 75 74 55 31 36 28 26 70 42 75 66  fts5PutU16(&pBuf
1c620 2d 3e 70 5b 32 5d 2c 20 70 42 75 66 2d 3e 6e 29  ->p[2], pBuf->n)
1c630 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 72  ;.        writer
1c640 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  .bFirstTermInPag
1c650 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
1c660 66 28 20 77 72 69 74 65 72 2e 61 57 72 69 74 65  f( writer.aWrite
1c670 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a  r[0].pgno!=1 ){.
1c680 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50            int nP
1c690 72 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  re = fts5PrefixC
1c6a0 6f 6d 70 72 65 73 73 28 6e 54 65 72 6d 2c 20 7a  ompress(nTerm, z
1c6b0 50 72 65 76 2c 20 6e 54 65 72 6d 2c 20 28 63 6f  Prev, nTerm, (co
1c6c0 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a  nst u8*)zTerm);.
1c6d0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72            fts5Wr
1c6e0 69 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20  iteBtreeTerm(p, 
1c6f0 26 77 72 69 74 65 72 2c 20 6e 50 72 65 2b 31 2c  &writer, nPre+1,
1c700 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72   (const u8*)zTer
1c710 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  m);.          pB
1c720 75 66 20 3d 20 26 77 72 69 74 65 72 2e 61 57 72  uf = &writer.aWr
1c730 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20  iter[0].buf;.   
1c740 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
1c750 50 72 65 3c 6e 54 65 72 6d 20 29 3b 0a 20 20 20  Pre<nTerm );.   
1c760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
1c770 53 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 3b 0a  Suffix = nTerm;.
1c780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 42        }.      pB
1c790 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33  uf->n += sqlite3
1c7a0 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
1c7b0 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e 53 75  >p[pBuf->n], nSu
1c7c0 66 66 69 78 29 3b 0a 20 20 20 20 20 20 66 74 73  ffix);.      fts
1c7d0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1c7e0 64 42 6c 6f 62 28 70 42 75 66 2c 20 28 63 6f 6e  dBlob(pBuf, (con
1c7f0 73 74 20 75 38 2a 29 26 7a 54 65 72 6d 5b 6e 54  st u8*)&zTerm[nT
1c800 65 72 6d 2d 6e 53 75 66 66 69 78 5d 2c 20 6e 53  erm-nSuffix], nS
1c810 75 66 66 69 78 29 3b 0a 0a 20 20 20 20 20 20 69  uffix);..      i
1c820 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e  f( pgsz>=(pBuf->
1c830 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31  n + nDoclist + 1
1c840 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1c850 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  The entire docli
1c860 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  st will fit on t
1c870 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1c880 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
1c890 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1c8a0 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c  Blob(pBuf, pDocl
1c8b0 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ist, nDoclist);.
1c8c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c8d0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
1c8e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
1c8f0 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20   iDelta = 0;.   
1c900 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
1c910 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62  0;.        int b
1c920 46 69 72 73 74 44 6f 63 69 64 20 3d 20 30 3b 0a  FirstDocid = 0;.
1c930 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1c940 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77  entire doclist w
1c950 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74  ill not fit on t
1c960 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66 6f  his leaf. The fo
1c970 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20 20  llowing .       
1c980 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74 65   ** loop iterate
1c990 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f  s through the po
1c9a0 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b 65  slists that make
1c9b0 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 20   up the current 
1c9c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c  .        ** docl
1c9d0 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
1c9e0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 44 6f   while( iOff<nDo
1c9f0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  clist ){.       
1ca00 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
1ca10 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79         int nCopy
1ca20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
1ca30 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20  bDummy;.        
1ca40 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
1ca50 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  int(&pDoclist[iO
1ca60 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
1ca70 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ta);.          n
1ca80 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50 6f  Copy = fts5GetPo
1ca90 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63 6c  slistSize(&pDocl
1caa0 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73  ist[iOff], &nPos
1cab0 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
1cac0 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e        nCopy += n
1cad0 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Pos;.          i
1cae0 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
1caf0 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
1cb00 20 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74        if( bFirst
1cb10 44 6f 63 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Docid ){.       
1cb20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28       fts5PutU16(
1cb30 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 70 42 75  &pBuf->p[0], pBu
1cb40 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73  f->n);   /* firs
1cb50 74 20 64 6f 63 69 64 20 6f 6e 20 70 61 67 65 20  t docid on page 
1cb60 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
1cb70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
1cb80 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66  3PutVarint(&pBuf
1cb90 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52  ->p[pBuf->n], iR
1cba0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
1cbb0 20 20 20 62 46 69 72 73 74 44 6f 63 69 64 20 3d     bFirstDocid =
1cbc0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
1cbd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1cbe0 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
1cbf0 74 65 33 50 75 74 56 61 72 69 6e 74 28 26 70 42  te3PutVarint(&pB
1cc00 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
1cc10 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  iDelta);.       
1cc20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
1cc30 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d  ssert( pBuf->n<=
1cc40 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a  pBuf->nSpace );.
1cc50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
1cc60 70 42 75 66 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29  pBuf->n + nCopy)
1cc70 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20   <= pgsz ){.    
1cc80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1cc90 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69  ntire poslist wi
1cca0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75  ll fit on the cu
1ccb0 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63  rrent leaf. So c
1ccc0 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20 20 20  opy.            
1ccd0 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e  ** it in one go.
1cce0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1ccf0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
1cd00 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26  pendBlob(pBuf, &
1cd10 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
1cd20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
1cd30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1cd40 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
1cd50 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20  re poslist will 
1cd60 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20  not fit on this 
1cd70 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64  leaf. So it need
1cd80 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
1cd90 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e   to be broken in
1cda0 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65  to sections. The
1cdb0 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74   only qualificat
1cdc0 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20  ion being.      
1cdd0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61        ** that ea
1cde0 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62  ch varint must b
1cdf0 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75  e stored contigu
1ce00 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20  ously.  */.     
1ce10 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20         const u8 
1ce20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f  *pPoslist = &pDo
1ce30 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20  clist[iOff];.   
1ce40 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f           int iPo
1ce50 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
1ce60 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
1ce80 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d   nSpace = pgsz -
1ce90 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20 20   pBuf->n;.      
1cea0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
1ceb0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
1cec0 20 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69 50   if( (nCopy - iP
1ced0 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20  os)<=nSpace ){. 
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1cef0 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b   = nCopy - iPos;
1cf00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1cf10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1cf20 20 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50 6f        n = fts5Po
1cf30 73 6c 69 73 74 50 72 65 66 69 78 28 26 70 50 6f  slistPrefix(&pPo
1cf40 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70  slist[iPos], nSp
1cf50 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ace);.          
1cf60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1cf70 20 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20      assert( n>0 
1cf80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1cf90 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
1cfa0 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
1cfb0 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c  &pPoslist[iPos],
1cfc0 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   n);.           
1cfd0 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20     iPos += n;.  
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1cff0 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72  iPos>=nCopy ) br
1d000 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1d010 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1d020 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72  hLeaf(p, &writer
1d030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1d040 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e   pBuf = &writer.
1d050 61 57 72 69 74 65 72 5b 30 5d 2e 62 75 66 3b 0a  aWriter[0].buf;.
1d060 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1d070 20 20 20 20 20 20 20 20 20 20 62 46 69 72 73 74            bFirst
1d080 44 6f 63 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Docid = 1;.     
1d090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1d0a0 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a   iOff += nCopy;.
1d0b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d0c0 7d 0a 0a 20 20 20 20 20 20 70 42 75 66 2d 3e 70  }..      pBuf->p
1d0d0 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c  [pBuf->n++] = '\
1d0e0 30 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0';.      assert
1d0f0 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d  ( pBuf->n<=pBuf-
1d100 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20  >nSpace );.     
1d110 20 7a 50 72 65 76 20 3d 20 28 63 6f 6e 73 74 20   zPrev = (const 
1d120 75 38 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20 20  u8*)zTerm;.     
1d130 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1d140 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b  ScanNext(pHash);
1d150 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1d160 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
1d170 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35  pHash);.    fts5
1d180 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
1d190 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67 68 74  writer, &nHeight
1d1a0 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20  , &pgnoLast);.. 
1d1b0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
1d1c0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 20   Fts5Structure. 
1d1d0 49 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  It is written ba
1d1e0 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ck to the databa
1d1f0 73 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  se by the.    **
1d200 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1d210 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65 6c  lease() call bel
1d220 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ow.  */.    if( 
1d230 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d  pStruct->nLevel=
1d240 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
1d250 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
1d260 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72 75  l(&p->rc, &pStru
1d270 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ct);.    }.    f
1d280 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
1d290 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
1d2a0 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 30  pStruct, 0, 1, 0
1d2b0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1d2c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d2d0 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74       pSeg = &pSt
1d2e0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e  ruct->aLevel[0].
1d2f0 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e 61  aSeg[ pStruct->a
1d300 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20  Level[0].nSeg++ 
1d310 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 69  ];.      pSeg->i
1d320 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
1d330 20 20 20 20 20 20 70 53 65 67 2d 3e 6e 48 65 69        pSeg->nHei
1d340 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b 0a 20  ght = nHeight;. 
1d350 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
1d360 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
1d370 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1d380 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 7d   pgnoLast;.    }
1d390 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1d3a0 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20  rePromote(p, 0, 
1d3b0 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 0a  pStruct);.  }...
1d3c0 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
1d3d0 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20 29  ->nAutomerge>0 )
1d3e0 20 66 74 73 35 49 6e 64 65 78 57 6f 72 6b 28 70   fts5IndexWork(p
1d3f0 2c 20 69 48 61 73 68 2c 20 26 70 53 74 72 75 63  , iHash, &pStruc
1d400 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  t, pgnoLast);.  
1d410 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 4d  fts5IndexCrisisM
1d420 65 72 67 65 28 70 2c 20 69 48 61 73 68 2c 20 26  erge(p, iHash, &
1d430 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
1d440 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
1d450 2c 20 69 48 61 73 68 2c 20 70 53 74 72 75 63 74  , iHash, pStruct
1d460 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
1d470 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
1d480 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  t);.}../*.** Flu
1d490 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72  sh any data stor
1d4a0 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ed in the in-mem
1d4b0 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
1d4c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1d4d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d4e0 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46  fts5IndexFlush(F
1d4f0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1d500 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1d510 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
1d520 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
1d530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d540 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
1d550 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69  terate through i
1d560 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndexes */.  int 
1d570 6e 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20 20  nLeaf = 0;      
1d580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d590 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
1d5a0 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a  written */..  /*
1d5b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
1d5c0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64   already occured
1d5d0 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
1d5e0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
1d5f0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1d600 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44   || p->nPendingD
1d610 61 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ata==0 ) return;
1d620 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  .  assert( p->ap
1d630 48 61 73 68 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c  Hash );..  /* Fl
1d640 75 73 68 20 74 68 65 20 74 65 72 6d 73 20 61 6e  ush the terms an
1d650 64 20 65 61 63 68 20 70 72 65 66 69 78 20 69 6e  d each prefix in
1d660 64 65 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  dex to disk */. 
1d670 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f   for(i=0; i<=pCo
1d680 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
1d690 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 46 6c 75  ++){.    fts5Flu
1d6a0 73 68 4f 6e 65 48 61 73 68 28 70 2c 20 69 2c 20  shOneHash(p, i, 
1d6b0 26 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a 20 20 70  &nLeaf);.  }.  p
1d6c0 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
1d6d0 20 30 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69   0;.}...int sqli
1d6e0 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69  te3Fts5IndexOpti
1d6f0 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a  mize(Fts5Index *
1d700 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  p){.  Fts5Config
1d710 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
1d720 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 3b  Config;.  int i;
1d730 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ..  fts5IndexFlu
1d740 73 68 28 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30  sh(p);.  for(i=0
1d750 3b 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  ; i<=pConfig->nP
1d760 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  refix; i++){.   
1d770 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1d780 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
1d790 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69  ructureRead(p, i
1d7a0 29 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  );.    Fts5Struc
1d7b0 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  ture *pNew = 0;.
1d7c0 20 20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30      int nSeg = 0
1d7d0 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63  ;.    if( pStruc
1d7e0 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 65 67 20  t ){.      nSeg 
1d7f0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43  = fts5StructureC
1d800 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74  ountSegments(pSt
1d810 72 75 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ruct);.      if(
1d820 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20 20 20 20   nSeg>1 ){.     
1d830 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
1d840 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
1d850 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 42  ure);.        nB
1d860 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d  yte += (pStruct-
1d870 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a  >nLevel+1) * siz
1d880 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1d890 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20  eLevel);.       
1d8a0 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72   pNew = (Fts5Str
1d8b0 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46  ucture*)sqlite3F
1d8c0 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70  ts5MallocZero(&p
1d8d0 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->rc, nByte);.  
1d8e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1d8f0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1d900 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
1d910 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
1d920 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 53    int nByte = nS
1d930 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  eg * sizeof(Fts5
1d940 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
1d950 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
1d960 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
1d970 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 20  >nLevel+1;.     
1d980 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75   pNew->nWriteCou
1d990 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d 3e  nter = pStruct->
1d9a0 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
1d9b0 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65       pLvl = &pNe
1d9c0 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63  w->aLevel[pStruc
1d9d0 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  t->nLevel];.    
1d9e0 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
1d9f0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1da00 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
1da10 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1da20 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1da30 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67    if( pLvl->aSeg
1da40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1da50 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
1da60 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20      int iSegOut 
1da70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
1da80 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1da90 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1daa0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
1dab0 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
1dac0 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
1dad0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
1dae0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
1daf0 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69      pLvl->aSeg[i
1db00 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63  SegOut] = pStruc
1db10 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1db20 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
1db30 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b          iSegOut+
1db40 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
1db50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1db60 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53   pLvl->nSeg = nS
1db70 65 67 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  eg;.      }else{
1db80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1db90 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  _free(pNew);.   
1dba0 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20       pNew = 0;. 
1dbb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1dbc0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
1dbd0 20 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70      int iLvl = p
1dbe0 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20  New->nLevel-1;. 
1dbf0 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
1dc00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1dc10 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  pNew->aLevel[iLv
1dc20 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20  l].nSeg>0 ){.   
1dc30 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20       int nRem = 
1dc40 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e  FTS5_OPT_WORK_UN
1dc50 49 54 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  IT;.        fts5
1dc60 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1dc70 70 2c 20 69 2c 20 26 70 4e 65 77 2c 20 69 4c 76  p, i, &pNew, iLv
1dc80 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 20  l, &nRem);.     
1dc90 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 53 74   }..      fts5St
1dca0 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
1dcb0 69 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  i, pNew);.      
1dcc0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1dcd0 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
1dce0 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  }..    fts5Struc
1dcf0 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1dd00 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  uct);.  }..  ret
1dd10 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
1dd20 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 0a 0a 2f 2a  urn(p); .}..../*
1dd30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d  .** Return a sim
1dd40 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  ple checksum val
1dd50 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ue based on the 
1dd60 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  arguments..*/.st
1dd70 61 74 69 63 20 75 36 34 20 66 74 73 35 49 6e 64  atic u64 fts5Ind
1dd80 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20  exEntryCksum(.  
1dd90 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69  i64 iRowid, .  i
1dda0 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20  nt iCol, .  int 
1ddb0 69 50 6f 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  iPos, .  const c
1ddc0 68 61 72 20 2a 70 54 65 72 6d 2c 20 0a 20 20 69  har *pTerm, .  i
1ddd0 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e  nt nTerm.){.  in
1dde0 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d  t i;.  u64 ret =
1ddf0 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b   iRowid;.  ret +
1de00 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f  = (ret<<3) + iCo
1de10 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74  l;.  ret += (ret
1de20 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66  <<3) + iPos;.  f
1de30 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
1de40 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65   i++) ret += (re
1de50 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d  t<<3) + pTerm[i]
1de60 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
1de70 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1de80 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69 74  ts5BtreeIterInit
1de90 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1dea0 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20  , .  int iIdx,. 
1deb0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
1dec0 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 0a 20 20  gment *pSeg, .  
1ded0 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a 70  Fts5BtreeIter *p
1dee0 49 74 65 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  Iter.){.  int nB
1def0 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
1df00 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 70  nByte = sizeof(p
1df10 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 29 20 2a  Iter->aLvl[0]) *
1df20 20 28 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d   (pSeg->nHeight-
1df30 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  1);.  memset(pIt
1df40 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
1df50 49 74 65 72 29 29 3b 0a 20 20 69 66 28 20 6e 42  Iter));.  if( nB
1df60 79 74 65 20 29 7b 0a 20 20 20 20 70 49 74 65 72  yte ){.    pIter
1df70 2d 3e 61 4c 76 6c 20 3d 20 28 46 74 73 35 42 74  ->aLvl = (Fts5Bt
1df80 72 65 65 49 74 65 72 4c 65 76 65 6c 2a 29 66 74  reeIterLevel*)ft
1df90 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e  s5IdxMalloc(p, n
1dfa0 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Byte);.  }.  if(
1dfb0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1dfc0 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
1dfd0 6e 4c 76 6c 20 3d 20 70 53 65 67 2d 3e 6e 48 65  nLvl = pSeg->nHe
1dfe0 69 67 68 74 2d 31 3b 0a 20 20 20 20 70 49 74 65  ight-1;.    pIte
1dff0 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
1e000 20 20 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70      pIter->p = p
1e010 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65  ;.    pIter->pSe
1e020 67 20 3d 20 70 53 65 67 3b 0a 20 20 7d 0a 20 20  g = pSeg;.  }.  
1e030 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d  for(i=0; p->rc==
1e040 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
1e050 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29  Iter->nLvl; i++)
1e060 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
1e070 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1e080 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67  ROWID(iIdx, pSeg
1e090 2d 3e 69 53 65 67 69 64 2c 20 69 2b 31 2c 20 31  ->iSegid, i+1, 1
1e0a0 29 3b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  );.    Fts5Data 
1e0b0 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 49 74 65  *pData;.    pIte
1e0c0 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61  r->aLvl[i].pData
1e0d0 20 3d 20 70 44 61 74 61 20 3d 20 66 74 73 35 44   = pData = fts5D
1e0e0 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69  ataRead(p, iRowi
1e0f0 64 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74  d);.    if( pDat
1e100 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4e  a ){.      fts5N
1e110 6f 64 65 49 74 65 72 49 6e 69 74 28 70 44 61 74  odeIterInit(pDat
1e120 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20  a->p, pData->n, 
1e130 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e  &pIter->aLvl[i].
1e140 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  s);.    }.  }.. 
1e150 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 4c 76 6c   if( pIter->nLvl
1e160 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a  ==0 || p->rc ){.
1e170 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20      pIter->bEof 
1e180 3d 20 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  = 1;.    pIter->
1e190 69 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67  iLeaf = pSeg->pg
1e1a0 6e 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  noLast;.  }else{
1e1b0 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d 70  .    pIter->nEmp
1e1c0 74 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c  ty = pIter->aLvl
1e1d0 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20 20  [0].s.nEmpty;.  
1e1e0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d    pIter->iLeaf =
1e1f0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
1e200 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 70 49  s.iChild;.    pI
1e210 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49  ter->bDlidx = pI
1e220 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62  ter->aLvl[0].s.b
1e230 44 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Dlidx;.  }.}..st
1e240 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74  atic void fts5Bt
1e250 72 65 65 49 74 65 72 4e 65 78 74 28 46 74 73 35  reeIterNext(Fts5
1e260 42 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72  BtreeIter *pIter
1e270 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  ){.  Fts5Index *
1e280 70 20 3d 20 70 49 74 65 72 2d 3e 70 3b 0a 20 20  p = pIter->p;.  
1e290 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
1e2a0 28 20 70 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 30  ( pIter->bEof==0
1e2b0 20 26 26 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   && pIter->aLvl[
1e2c0 30 5d 2e 73 2e 61 44 61 74 61 20 29 3b 0a 20 20  0].s.aData );.  
1e2d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
1e2e0 2d 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e 72 63 3d  ->nLvl && p->rc=
1e2f0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
1e300 7b 0a 20 20 20 20 46 74 73 35 42 74 72 65 65 49  {.    Fts5BtreeI
1e310 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  terLevel *pLvl =
1e320 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d   &pIter->aLvl[i]
1e330 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74  ;.    fts5NodeIt
1e340 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26  erNext(&p->rc, &
1e350 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66  pLvl->s);.    if
1e360 28 20 70 4c 76 6c 2d 3e 73 2e 61 44 61 74 61 20  ( pLvl->s.aData 
1e370 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
1e380 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
1e390 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 4c 76  pIter->term, pLv
1e3a0 6c 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20 70 4c 76  l->s.term.n, pLv
1e3b0 6c 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20  l->s.term.p);.  
1e3c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1e3d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
1e3e0 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c  NodeIterFree(&pL
1e3f0 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20 66 74  vl->s);.      ft
1e400 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
1e410 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  vl->pData);.    
1e420 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
1e430 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  0;.    }.  }.  i
1e440 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e 6e 4c 76  f( i==pIter->nLv
1e450 6c 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20  l || p->rc ){.  
1e460 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
1e470 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
1e480 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74  int iSegid = pIt
1e490 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
1e4a0 3b 0a 20 20 20 20 66 6f 72 28 69 2d 2d 3b 20 69  ;.    for(i--; i
1e4b0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
1e4c0 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65   Fts5BtreeIterLe
1e4d0 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  vel *pLvl = &pIt
1e4e0 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  er->aLvl[i];.   
1e4f0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1e500 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1e510 49 44 28 70 49 74 65 72 2d 3e 69 49 64 78 2c 69  ID(pIter->iIdx,i
1e520 53 65 67 69 64 2c 69 2b 31 2c 70 4c 76 6c 5b 31  Segid,i+1,pLvl[1
1e530 5d 2e 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20  ].s.iChild);.   
1e540 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d     pLvl->pData =
1e550 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
1e560 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
1e570 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20  if( pLvl->pData 
1e580 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e  ){.        fts5N
1e590 6f 64 65 49 74 65 72 49 6e 69 74 28 70 4c 76 6c  odeIterInit(pLvl
1e5a0 2d 3e 70 44 61 74 61 2d 3e 70 2c 20 70 4c 76 6c  ->pData->p, pLvl
1e5b0 2d 3e 70 44 61 74 61 2d 3e 6e 2c 20 26 70 4c 76  ->pData->n, &pLv
1e5c0 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l->s);.      }. 
1e5d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65     }.  }..  pIte
1e5e0 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65  r->nEmpty = pIte
1e5f0 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d  r->aLvl[0].s.nEm
1e600 70 74 79 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44  pty;.  pIter->bD
1e610 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c  lidx = pIter->aL
1e620 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a  vl[0].s.bDlidx;.
1e630 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d    pIter->iLeaf =
1e640 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
1e650 73 2e 69 43 68 69 6c 64 3b 0a 20 20 61 73 73 65  s.iChild;.  asse
1e660 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
1e670 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 62  E_OK || pIter->b
1e680 45 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Eof );.}..static
1e690 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49   void fts5BtreeI
1e6a0 74 65 72 46 72 65 65 28 46 74 73 35 42 74 72 65  terFree(Fts5Btre
1e6b0 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  eIter *pIter){. 
1e6c0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1e6d0 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c  0; i<pIter->nLvl
1e6e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
1e6f0 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a  BtreeIterLevel *
1e700 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
1e710 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35  Lvl[i];.    fts5
1e720 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 70 4c  NodeIterFree(&pL
1e730 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20  vl->s);.    if( 
1e740 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20  pLvl->pData ){. 
1e750 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
1e760 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61  ease(pLvl->pData
1e770 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
1e780 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Data = 0;.    }.
1e790 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
1e7a0 65 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b  ee(pIter->aLvl);
1e7b0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1e7c0 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b  e(&pIter->term);
1e7d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1e7e0 75 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c  unction is purel
1e7f0 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65  y an internal te
1e800 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  st. It does not 
1e810 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a  contribute to .*
1e820 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c  * FTS functional
1e830 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65  ity, or even the
1e840 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
1e850 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a  , in any way..**
1e860 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20  .** Instead, it 
1e870 74 65 73 74 73 20 74 68 61 74 20 74 68 65 20 73  tests that the s
1e880 61 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f  ame set of pgno/
1e890 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  rowid combinatio
1e8a0 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74  ns are .** visit
1e8b0 65 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ed regardless of
1e8c0 20 77 68 65 74 68 65 72 20 74 68 65 20 64 6f 63   whether the doc
1e8d0 6c 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74  list-index ident
1e8e0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
1e8f0 65 72 73 0a 2a 2a 20 69 49 64 78 2f 69 53 65 67  ers.** iIdx/iSeg
1e900 69 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72  id/iLeaf is iter
1e910 61 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73  ated in forwards
1e920 20 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64 65   or reverse orde
1e930 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r..*/.#ifdef SQL
1e940 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
1e950 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
1e960 74 65 72 54 65 73 74 52 65 76 65 72 73 65 28 0a  terTestReverse(.
1e970 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1e980 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
1e990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6c     /* Index to l
1e9b0 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  oad doclist-inde
1e9c0 78 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  x from */.  int 
1e9d0 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
1e9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1e9f0 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61  egment id to loa
1ea00 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
1ea10 69 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  iLeaf           
1ea20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1ea30 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  oad doclist-inde
1ea40 78 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20  x for this leaf 
1ea50 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  */.){.  Fts5Dlid
1ea60 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
1ea70 30 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d 31 20  0;.  i64 cksum1 
1ea80 3d 20 31 33 3b 0a 20 20 69 36 34 20 63 6b 73 75  = 13;.  i64 cksu
1ea90 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28  m2 = 13;..  for(
1eaa0 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
1eab0 74 28 70 2c 20 30 2c 20 69 49 64 78 2c 20 69 53  t(p, 0, iIdx, iS
1eac0 65 67 69 64 2c 20 69 4c 65 61 66 2c 20 26 70 44  egid, iLeaf, &pD
1ead0 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73  lidx);.      fts
1eae0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
1eaf0 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20   pDlidx)==0;.   
1eb00 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1eb10 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 29  Next(pDlidx).  )
1eb20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
1eb30 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e  lidx->iLeafPgno>
1eb40 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73  iLeaf );.    cks
1eb50 75 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20  um1 = (cksum1 ^ 
1eb60 28 20 28 69 36 34 29 28 70 44 6c 69 64 78 2d 3e  ( (i64)(pDlidx->
1eb70 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32  iLeafPgno) << 32
1eb80 20 29 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20   ));.    cksum1 
1eb90 3d 20 28 63 6b 73 75 6d 31 20 5e 20 70 44 6c 69  = (cksum1 ^ pDli
1eba0 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d  dx->iRowid);.  }
1ebb0 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
1ebc0 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
1ebd0 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66  pDlidx = 0;..  f
1ebe0 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
1ebf0 49 6e 69 74 28 70 2c 20 31 2c 20 69 49 64 78 2c  Init(p, 1, iIdx,
1ec00 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 2c 20   iSegid, iLeaf, 
1ec10 26 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  &pDlidx);.      
1ec20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
1ec30 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
1ec40 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
1ec50 74 65 72 50 72 65 76 28 70 44 6c 69 64 78 29 0a  terPrev(pDlidx).
1ec60 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
1ec70 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67   pDlidx->iLeafPg
1ec80 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  no>iLeaf );.    
1ec90 63 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32  cksum2 = (cksum2
1eca0 20 5e 20 28 20 28 69 36 34 29 28 70 44 6c 69 64   ^ ( (i64)(pDlid
1ecb0 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c  x->iLeafPgno) <<
1ecc0 20 33 32 20 29 29 3b 0a 20 20 20 20 63 6b 73 75   32 ));.    cksu
1ecd0 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20 70  m2 = (cksum2 ^ p
1ece0 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a  Dlidx->iRowid);.
1ecf0 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49    }.  fts5DlidxI
1ed00 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
1ed10 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a  .  pDlidx = 0;..
1ed20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1ed30 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31  ITE_OK && cksum1
1ed40 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63  !=cksum2 ) p->rc
1ed50 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
1ed60 20 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69   .}.#else.# defi
1ed70 6e 65 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  ne fts5DlidxIter
1ed80 54 65 73 74 52 65 76 65 72 73 65 28 77 2c 78 2c  TestReverse(w,x,
1ed90 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61  y,z).#endif..sta
1eda0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
1edb0 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
1edc0 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49  Segment(.  Fts5I
1edd0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1ede0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1edf0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1ee00 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1ee30 74 68 61 74 20 70 53 65 67 20 69 73 20 61 20 70  that pSeg is a p
1ee40 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35  art of */.  Fts5
1ee50 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
1ee60 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53   *pSeg      /* S
1ee70 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20  egment to check 
1ee80 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74  internal consist
1ee90 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ency */.){.  Fts
1eea0 35 42 74 72 65 65 49 74 65 72 20 69 74 65 72 3b  5BtreeIter iter;
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eec0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
1eed0 74 68 72 6f 75 67 68 20 62 2d 74 72 65 65 20 68  through b-tree h
1eee0 69 65 72 61 72 63 68 79 20 2a 2f 0a 0a 20 20 2f  ierarchy */..  /
1eef0 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
1ef00 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  h the b-tree hie
1ef10 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 66 6f  rarchy.  */.  fo
1ef20 72 28 66 74 73 35 42 74 72 65 65 49 74 65 72 49  r(fts5BtreeIterI
1ef30 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 70 53 65  nit(p, iIdx, pSe
1ef40 67 2c 20 26 69 74 65 72 29 3b 0a 20 20 20 20 20  g, &iter);.     
1ef50 20 69 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20   iter.bEof==0;. 
1ef60 20 20 20 20 20 66 74 73 35 42 74 72 65 65 49 74       fts5BtreeIt
1ef70 65 72 4e 65 78 74 28 26 69 74 65 72 29 0a 20 20  erNext(&iter).  
1ef80 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b  ){.    i64 iRow;
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efa0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
1efb0 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20  r this leaf */. 
1efc0 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
1efd0 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
1efe0 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69   /* Data for thi
1eff0 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e  s leaf */.    in
1f000 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20  t iOff;         
1f010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1f020 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74  ffset of first t
1f030 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20  erm on leaf */. 
1f040 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
1f050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f060 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
1f070 61 74 65 20 74 68 72 6f 75 67 68 20 65 6d 70 74  ate through empt
1f080 79 20 6c 65 61 76 65 73 20 2a 2f 0a 0a 20 20 20  y leaves */..   
1f090 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20   /* If the leaf 
1f0a0 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20  in question has 
1f0b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 69  already been tri
1f0c0 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65  mmed from the se
1f0d0 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69  gment, .    ** i
1f0e0 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65  gnore this b-tre
1f0f0 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  e entry. Otherwi
1f100 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f  se, load it into
1f110 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20   memory. */.    
1f120 69 66 28 20 69 74 65 72 2e 69 4c 65 61 66 3c 70  if( iter.iLeaf<p
1f130 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  Seg->pgnoFirst )
1f140 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1f150 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Row = FTS5_SEGME
1f160 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70  NT_ROWID(iIdx, p
1f170 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20  Seg->iSegid, 0, 
1f180 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20  iter.iLeaf);.   
1f190 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1f1a0 61 52 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a  aRead(p, iRow);.
1f1b0 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30      if( pLeaf==0
1f1c0 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
1f1d0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
1f1e0 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61   leaf contains a
1f1f0 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d  t least one term
1f200 2c 20 61 6e 64 20 74 68 61 74 20 69 74 20 69 73  , and that it is
1f210 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f   equal.    ** to
1f220 20 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20   or larger than 
1f230 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e  the split-key in
1f240 20 69 74 65 72 2e 74 65 72 6d 2e 20 20 2a 2f 0a   iter.term.  */.
1f250 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47      iOff = fts5G
1f260 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
1f270 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66  2]);.    if( iOf
1f280 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  f==0 ){.      p-
1f290 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1f2a0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
1f2b0 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20       int nTerm; 
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
1f2e0 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65   on leaf in byte
1f2f0 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  s */.      int r
1f300 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
1f310 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
1f320 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64  ison of term and
1f330 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 20 20   split-key */.  
1f340 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
1f350 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
1f360 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65  af->p[iOff], nTe
1f370 72 6d 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d  rm);.      res =
1f380 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e   memcmp(&pLeaf->
1f390 70 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65  p[iOff], iter.te
1f3a0 72 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c  rm.p, MIN(nTerm,
1f3b0 20 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a   iter.term.n));.
1f3c0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
1f3d0 20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d   ) res = nTerm -
1f3e0 20 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20   iter.term.n;.  
1f3f0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
1f400 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
1f410 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
1f420 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1f430 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1f440 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28  (pLeaf);.    if(
1f450 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a   p->rc ) break;.
1f460 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63  .    /* Now chec
1f470 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e  k that the iter.
1f480 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f  nEmpty leaves fo
1f490 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72  llowing the curr
1f4a0 65 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20  ent leaf.    ** 
1f4b0 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62  (a) exist and (b
1f4c0 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72  ) contain no ter
1f4d0 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ms. */.    for(i
1f4e0 3d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =1; p->rc==SQLIT
1f4f0 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e  E_OK && i<=iter.
1f500 6e 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20  nEmpty; i++){.  
1f510 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
1f520 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
1f530 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +i);.      if( p
1f540 4c 65 61 66 20 26 26 20 30 21 3d 66 74 73 35 47  Leaf && 0!=fts5G
1f550 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
1f560 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  2]) ){.        p
1f570 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
1f580 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
1f590 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
1f5a0 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d  se(pLeaf);.    }
1f5b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1f5c0 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
1f5d0 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74  ndex, check that
1f5e0 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e   it looks right.
1f5f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72   */.    if( iter
1f600 2e 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  .bDlidx ){.     
1f610 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
1f620 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20  pDlidx = 0;  /* 
1f630 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
1f640 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e  rough doclist in
1f650 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
1f660 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 74 65   iPrevLeaf = ite
1f670 72 2e 69 4c 65 61 66 3b 0a 20 20 20 20 20 20 69  r.iLeaf;.      i
1f680 6e 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67  nt iSegid = pSeg
1f690 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ->iSegid;.      
1f6a0 69 6e 74 20 69 50 67 3b 0a 20 20 20 20 20 20 69  int iPg;.      i
1f6b0 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20  64 iKey;..      
1f6c0 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65  for(fts5DlidxIte
1f6d0 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78  rInit(p, 0, iIdx
1f6e0 2c 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69  , iSegid, iter.i
1f6f0 4c 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a  Leaf, &pDlidx);.
1f700 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c            fts5Dl
1f710 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
1f720 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
1f730 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
1f740 72 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20  rNext(pDlidx).  
1f750 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20      ){..        
1f760 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77  /* Check any row
1f770 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68  id-less pages th
1f780 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20  at occur before 
1f790 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
1f7a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
1f7b0 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31  (iPg=iPrevLeaf+1
1f7c0 3b 20 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c  ; iPg<pDlidx->iL
1f7d0 65 61 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b  eafPgno; iPg++){
1f7e0 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20  .          iKey 
1f7f0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1f800 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69  OWID(iIdx, iSegi
1f810 64 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20  d, 0, iPg);.    
1f820 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
1f830 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
1f840 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ey);.          i
1f850 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
1f860 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35          if( fts5
1f870 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
1f880 5b 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20  [0])!=0 ) p->rc 
1f890 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1f8b0 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
1f8c0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  f);.          }.
1f8d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f8e0 20 20 69 50 72 65 76 4c 65 61 66 20 3d 20 70 44    iPrevLeaf = pD
1f8f0 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  lidx->iLeafPgno;
1f900 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  ..        /* Che
1f910 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66  ck that the leaf
1f920 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1f930 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  by the iterator 
1f940 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20  really does.    
1f950 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74      ** contain t
1f960 68 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74  he rowid suggest
1f970 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20  ed by the same. 
1f980 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  */.        iKey 
1f990 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1f9a0 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69  OWID(iIdx, iSegi
1f9b0 64 2c 20 30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c  d, 0, pDlidx->iL
1f9c0 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  eafPgno);.      
1f9d0 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
1f9e0 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b  taRead(p, iKey);
1f9f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
1fa00 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
1fa10 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
1fa20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
1fa30 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
1fa40 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a  (&pLeaf->p[0]);.
1fa50 20 20 20 20 20 20 20 20 20 20 67 65 74 56 61 72            getVar
1fa60 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52  int(&pLeaf->p[iR
1fa70 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29  owidOff], (u64*)
1fa80 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  &iRowid);.      
1fa90 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d      if( iRowid!=
1faa0 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29  pDlidx->iRowid )
1fab0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1fac0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
1fad0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1fae0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
1faf0 20 7d 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   }..      }..   
1fb00 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76     for(iPg=iPrev
1fb10 4c 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74  Leaf+1; iPg<=(it
1fb20 65 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72 2e  er.iLeaf + iter.
1fb30 6e 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b  nEmpty); iPg++){
1fb40 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
1fb50 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1fb60 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c  ID(iIdx, iSegid,
1fb70 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20   0, iPg);.      
1fb80 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
1fb90 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b  taRead(p, iKey);
1fba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
1fbb0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
1fbc0 69 66 28 20 66 74 73 35 47 65 74 55 31 36 28 26  if( fts5GetU16(&
1fbd0 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20  pLeaf->p[0])!=0 
1fbe0 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
1fbf0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
1fc00 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1fc10 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
1fc20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1fc30 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1fc40 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
1fc50 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
1fc60 72 54 65 73 74 52 65 76 65 72 73 65 28 70 2c 20  rTestReverse(p, 
1fc70 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 74  iIdx, iSegid, it
1fc80 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d  er.iLeaf);.    }
1fc90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
1fca0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1fcb0 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67  iter.iLeaf!=pSeg
1fcc0 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
1fcd0 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
1fce0 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 66  ORRUPT;.  }..  f
1fcf0 74 73 35 42 74 72 65 65 49 74 65 72 46 72 65 65  ts5BtreeIterFree
1fd00 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (&iter);.}../*.*
1fd10 2a 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74  * Iterator pMult
1fd20 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  i currently poin
1fd30 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ts to a valid en
1fd40 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54  try (not EOF). T
1fd50 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
1fd60 61 70 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f  appends a copy o
1fd70 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  f the position-l
1fd80 69 73 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79  ist of the entry
1fd90 20 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72   pMulti .** curr
1fda0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
1fdb0 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  to buffer pBuf..
1fdc0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1fdd0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1fde0 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
1fdf0 69 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20  in p->rc. It is 
1fe00 61 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72  assumed.** no er
1fe10 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
1fe20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
1fe30 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1fe40 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
1fe50 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
1fe60 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  terPoslist(.  Ft
1fe70 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
1fe80 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
1fe90 70 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53  pMulti,.  int bS
1fea0 7a 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  z,.  Fts5Buffer 
1feb0 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70  *pBuf.){.  if( p
1fec0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1fed0 29 7b 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b  ){.    Fts5Chunk
1fee0 49 74 65 72 20 69 74 65 72 3b 0a 20 20 20 20 46  Iter iter;.    F
1fef0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1ff00 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67   = &pMulti->aSeg
1ff10 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74  [ pMulti->aFirst
1ff20 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
1ff30 20 20 61 73 73 65 72 74 28 20 66 74 73 35 4d 75    assert( fts5Mu
1ff40 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 4d  ltiIterEof(p, pM
1ff50 75 6c 74 69 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ulti)==0 );.    
1ff60 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69  fts5ChunkIterIni
1ff70 74 28 70 2c 20 70 53 65 67 2c 20 26 69 74 65 72  t(p, pSeg, &iter
1ff80 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 43  );.    if( fts5C
1ff90 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
1ffa0 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  iter)==0 ){.    
1ffb0 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20 20    if( bSz ){.   
1ffc0 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53       /* WRITEPOS
1ffd0 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20  LISTSIZE */.    
1ffe0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1fff0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
20000 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e 52  c, pBuf, iter.nR
20010 65 6d 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 7d  em * 2);.      }
20020 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74  .      while( ft
20030 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70  s5ChunkIterEof(p
20040 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20  , &iter)==0 ){. 
20050 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
20060 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
20070 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e  rc, pBuf, iter.n
20080 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20 20 20 20  , iter.p);.     
20090 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
200a0 4e 65 78 74 28 70 2c 20 26 69 74 65 72 29 3b 0a  Next(p, &iter);.
200b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
200c0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52    fts5ChunkIterR
200d0 65 6c 65 61 73 65 28 26 69 74 65 72 29 3b 0a 20  elease(&iter);. 
200e0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
200f0 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65  d fts5DoclistIte
20100 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73  rNext(Fts5Doclis
20110 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  tIter *pIter){. 
20120 20 69 66 28 20 70 49 74 65 72 2d 3e 69 3c 70 49   if( pIter->i<pI
20130 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 6e  ter->n ){.    in
20140 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69 66  t bDummy;.    if
20150 28 20 70 49 74 65 72 2d 3e 69 20 29 7b 0a 20 20  ( pIter->i ){.  
20160 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
20170 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b        pIter->i +
20180 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 49 74  = getVarint(&pIt
20190 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c  er->a[pIter->i],
201a0 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
201b0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
201c0 2d 3e 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20  ->bDesc ){.     
201d0 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
201e0 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   -= iDelta;.    
201f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20200 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
20210 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
20220 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
20230 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67     pIter->i += g
20240 65 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d  etVarint(&pIter-
20250 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75  >a[pIter->i], (u
20260 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
20270 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  id);.    }.    p
20280 49 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73 35 47  Iter->i += fts5G
20290 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 0a 20  etPoslistSize(. 
202a0 20 20 20 20 20 20 20 26 70 49 74 65 72 2d 3e 61         &pIter->a
202b0 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 26 70 49 74  [pIter->i], &pIt
202c0 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 2c 20 26 62  er->nPoslist, &b
202d0 44 75 6d 6d 79 0a 20 20 20 20 29 3b 0a 20 20 20  Dummy.    );.   
202e0 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
202f0 20 3d 20 26 70 49 74 65 72 2d 3e 61 5b 70 49 74   = &pIter->a[pIt
20300 65 72 2d 3e 69 5d 3b 0a 20 20 20 20 70 49 74 65  er->i];.    pIte
20310 72 2d 3e 69 20 2b 3d 20 70 49 74 65 72 2d 3e 6e  r->i += pIter->n
20320 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65  Poslist;.  }else
20330 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f  {.    pIter->aPo
20340 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  slist = 0;.  }.}
20350 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
20360 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
20370 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t(.  Fts5Buffer 
20380 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 62 44  *pBuf, .  int bD
20390 65 73 63 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c  esc, .  Fts5Docl
203a0 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a 29  istIter *pIter.)
203b0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  {.  memset(pIter
203c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
203d0 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61  er));.  pIter->a
203e0 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49   = pBuf->p;.  pI
203f0 74 65 72 2d 3e 6e 20 3d 20 70 42 75 66 2d 3e 6e  ter->n = pBuf->n
20400 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 65 73 63  ;.  pIter->bDesc
20410 20 3d 20 62 44 65 73 63 3b 0a 20 20 66 74 73 35   = bDesc;.  fts5
20420 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
20430 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
20440 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73   Append a doclis
20450 74 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  t to buffer pBuf
20460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
20470 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
20480 44 6f 63 69 64 28 0a 20 20 69 6e 74 20 2a 70 52  Docid(.  int *pR
20490 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
204a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
204b0 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
204c0 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 0a 20  /.  int bDesc,. 
204d0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
204e0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
204f0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72   /* Buffer to wr
20500 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
20510 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20  *piLastRowid,   
20520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
20530 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20  N/OUT: Previous 
20540 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69  rowid written (i
20550 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20  f any) */.  i64 
20560 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  iRowid          
20570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20580 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a  owid to append *
20590 2f 0a 29 7b 0a 20 20 69 66 28 20 70 42 75 66 2d  /.){.  if( pBuf-
205a0 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73  >n==0 ){.    fts
205b0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
205c0 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69  int(pRc, pBuf, i
205d0 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20  Rowid);.  }else 
205e0 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20  if( bDesc ){.   
205f0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
20600 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75  dVarint(pRc, pBu
20610 66 2c 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20  f, *piLastRowid 
20620 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c  - iRowid);.  }el
20630 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66  se{.    fts5Buff
20640 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  erAppendVarint(p
20650 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69 64  Rc, pBuf, iRowid
20660 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29   - *piLastRowid)
20670 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61 73 74 52  ;.  }.  *piLastR
20680 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d  owid = iRowid;.}
20690 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20  ../*.** Buffers 
206a0 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69  p1 and p2 contai
206b0 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73  n doclists. This
206c0 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73   function merges
206d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
206e0 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69  of the two docli
206f0 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64  sts together and
20700 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20   sets buffer p1 
20710 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65  to the result be
20720 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e  fore.** returnin
20730 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  g..**.** If an e
20740 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
20750 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
20760 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20  ft in p->rc. If 
20770 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20  an error has.** 
20780 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
20790 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
207a0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
207b0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
207c0 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28  ergePrefixLists(
207d0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
20800 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
20810 6e 74 20 62 44 65 73 63 2c 0a 20 20 46 74 73 35  nt bDesc,.  Fts5
20820 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20  Buffer *p1,     
20830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20840 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72  irst list to mer
20850 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ge */.  Fts5Buff
20860 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20  er *p2          
20870 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
20880 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  d list to merge 
20890 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e  */.){.  if( p2->
208a0 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 61  n ){.    i64 iLa
208b0 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
208c0 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
208d0 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f 63   i1;.    Fts5Doc
208e0 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20 20  listIter i2;.   
208f0 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b   Fts5Buffer out;
20900 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
20910 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  tmp;.    memset(
20920 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &out, 0, sizeof(
20930 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  out));.    memse
20940 74 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f  t(&tmp, 0, sizeo
20950 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20 66 74  f(tmp));..    ft
20960 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
20970 74 28 70 31 2c 20 62 44 65 73 63 2c 20 26 69 31  t(p1, bDesc, &i1
20980 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  );.    fts5Docli
20990 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20 62  stIterInit(p2, b
209a0 44 65 73 63 2c 20 26 69 32 29 3b 0a 20 20 20 20  Desc, &i2);.    
209b0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
209c0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 31 2e 61  LITE_OK && (i1.a
209d0 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32  Poslist!=0 || i2
209e0 2e 61 50 6f 73 6c 69 73 74 21 3d 30 29 20 29 7b  .aPoslist!=0) ){
209f0 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50  .      if( i2.aP
20a00 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31  oslist==0 || (i1
20a10 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20 20  .aPoslist && .  
20a20 20 20 20 20 20 20 20 20 20 28 20 28 62 44 65 73           ( (bDes
20a30 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e 69  c && i1.iRowid>i
20a40 32 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 21 62  2.iRowid) || (!b
20a50 44 65 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69  Desc && i1.iRowi
20a60 64 3c 69 32 2e 69 52 6f 77 69 64 29 20 29 0a 20  d<i2.iRowid) ). 
20a70 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20       )){.       
20a80 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
20a90 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20  rom i1 */.      
20aa0 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
20ab0 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62  dDocid(&p->rc, b
20ac0 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61  Desc, &out, &iLa
20ad0 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77  stRowid, i1.iRow
20ae0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  id);.        /* 
20af0 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
20b00 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
20b10 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20b20 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  nt(&p->rc, &out,
20b30 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2a 20 32   i1.nPoslist * 2
20b40 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
20b50 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
20b60 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31  &p->rc, &out, i1
20b70 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 50  .nPoslist, i1.aP
20b80 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oslist);.       
20b90 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
20ba0 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20  Next(&i1);.     
20bb0 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
20bc0 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  ( i1.aPoslist==0
20bd0 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d 69   || i2.iRowid!=i
20be0 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  1.iRowid ){.    
20bf0 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72      /* Copy entr
20c00 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20  y from i2 */.   
20c10 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
20c20 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63  pendDocid(&p->rc
20c30 2c 20 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26  , bDesc, &out, &
20c40 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69  iLastRowid, i2.i
20c50 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
20c60 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
20c70 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  IZE */.        f
20c80 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
20c90 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f  arint(&p->rc, &o
20ca0 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 20  ut, i2.nPoslist 
20cb0 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74  * 2);.        ft
20cc0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
20cd0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ob(&p->rc, &out,
20ce0 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 32   i2.nPoslist, i2
20cf0 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
20d00 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
20d10 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20  terNext(&i2);.  
20d20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
20d30 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  {.        Fts5Po
20d40 73 6c 69 73 74 52 65 61 64 65 72 20 72 31 3b 0a  slistReader r1;.
20d50 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
20d60 69 73 74 52 65 61 64 65 72 20 72 32 3b 0a 20 20  istReader r2;.  
20d70 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
20d80 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  tWriter writer;.
20d90 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
20da0 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  &writer, 0, size
20db0 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20  of(writer));..  
20dc0 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74        /* Merge t
20dd0 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20  he two position 
20de0 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20  lists. */ .     
20df0 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
20e00 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20  ndDocid(&p->rc, 
20e10 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c  bDesc, &out, &iL
20e20 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
20e30 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
20e40 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d  s5BufferZero(&tm
20e50 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
20e60 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
20e70 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e  aderInit(-1, i1.
20e80 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
20e90 73 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20  slist, &r1);.   
20ea0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
20eb0 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
20ec0 74 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73  t(-1, i2.aPoslis
20ed0 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  t, i2.nPoslist, 
20ee0 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68  &r2);.        wh
20ef0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
20f00 54 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f  TE_OK && (r1.bEo
20f10 66 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d  f==0 || r2.bEof=
20f20 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
20f30 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20   i64 iNew;.     
20f40 20 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66       if( r2.bEof
20f50 20 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20   || (r1.bEof==0 
20f60 26 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50  && r1.iPos<r2.iP
20f70 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os) ){.         
20f80 20 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f     iNew = r1.iPo
20f90 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  s;.            s
20fa0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
20fb0 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29  tReaderNext(&r1)
20fc0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
20fd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
20fe0 4e 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20  New = r2.iPos;. 
20ff0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21000 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
21010 64 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20  derNext(&r2);.  
21020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
21030 2e 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29  .iPos==r2.iPos )
21040 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
21050 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72  istReaderNext(&r
21060 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  1);.          }.
21070 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
21080 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  = sqlite3Fts5Pos
21090 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64  listWriterAppend
210a0 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20  (&tmp, &writer, 
210b0 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  iNew);.        }
210c0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ..        /* WRI
210d0 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
210e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
210f0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
21100 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d  &p->rc, &out, tm
21110 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20 20  p.n * 2);.      
21120 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
21130 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
21140 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e  out, tmp.n, tmp.
21150 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  p);.        fts5
21160 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
21170 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &i1);.        ft
21180 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
21190 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i2);.      }.
211a0 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42      }..    fts5B
211b0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
211c0 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e   p1, out.n, out.
211d0 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
211e0 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20 20  erFree(&tmp);.  
211f0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
21200 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  (&out);.  }.}..s
21210 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
21220 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42 75  ufferSwap(Fts5Bu
21230 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75  ffer *p1, Fts5Bu
21240 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73  ffer *p2){.  Fts
21250 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70  5Buffer tmp = *p
21260 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a  1;.  *p1 = *p2;.
21270 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a    *p2 = tmp;.}..
21280 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
21290 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
212a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
212b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72     /* Index to r
212d0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
212e0 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21300 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45 52   True for "ORDER
21310 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
21320 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
21330 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
21340 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
21350 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
21360 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69   to match */.  i
21370 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21390 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
213a0 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73   pToken in bytes
213b0 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
213c0 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
213d0 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
213e0 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
213f0 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
21400 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
21410 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66  Fts5Buffer *aBuf
21420 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42  ;.  const int nB
21430 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66  uf = 32;..  aBuf
21440 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29   = (Fts5Buffer*)
21450 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
21460 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
21470 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74  er)*nBuf);.  pSt
21480 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
21490 74 75 72 65 52 65 61 64 28 70 2c 20 30 29 3b 0a  tureRead(p, 0);.
214a0 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70  .  if( aBuf && p
214b0 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 46 74  Struct ){.    Ft
214c0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
214d0 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74  Doclist;.    int
214e0 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73   i;.    i64 iLas
214f0 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  tRowid = 0;.    
21500 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
21510 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a   *p1 = 0;     /*
21520 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74   Iterator used t
21530 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66 72  o gather data fr
21540 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  om index */.    
21550 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69  Fts5Buffer docli
21560 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28  st;..    memset(
21570 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a  &doclist, 0, siz
21580 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20  eof(doclist));. 
21590 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69     for(fts5Multi
215a0 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75  IterNew(p, pStru
215b0 63 74 2c 20 30 2c 20 31 2c 20 31 2c 20 70 54 6f  ct, 0, 1, 1, pTo
215c0 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c  ken, nToken, -1,
215d0 20 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20   0, &p1);.      
215e0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
215f0 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20  of(p, p1)==0;.  
21600 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
21610 74 65 72 4e 65 78 74 28 70 2c 20 70 31 2c 20 30  terNext(p, p1, 0
21620 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  , 0).    ){.    
21630 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66    i64 iRowid = f
21640 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
21650 64 28 70 31 29 3b 0a 20 20 20 20 20 20 69 6e 74  d(p1);.      int
21660 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f   nTerm;.      co
21670 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d 20  nst u8 *pTerm = 
21680 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
21690 6d 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20  m(p1, &nTerm);. 
216a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
216b0 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
216c0 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e  m, MIN(nToken, n
216d0 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20  Term))<=0 );.   
216e0 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f     if( nTerm<nTo
216f0 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54  ken || memcmp(pT
21700 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f  oken, pTerm, nTo
21710 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ken) ) break;.. 
21720 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74       if( doclist
21730 2e 6e 3e 30 20 0a 20 20 20 20 20 20 20 26 26 20  .n>0 .       && 
21740 28 28 21 62 44 65 73 63 20 26 26 20 69 52 6f 77  ((!bDesc && iRow
21750 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 29 20  id<=iLastRowid) 
21760 7c 7c 20 28 62 44 65 73 63 20 26 26 20 69 52 6f  || (bDesc && iRo
21770 77 69 64 3e 3d 69 4c 61 73 74 52 6f 77 69 64 29  wid>=iLastRowid)
21780 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20  ).      ){..    
21790 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e      for(i=0; p->
217a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
217b0 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29   doclist.n; i++)
217c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
217d0 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20  rt( i<nBuf );.  
217e0 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66          if( aBuf
217f0 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  [i].n==0 ){.    
21800 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
21810 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c  erSwap(&doclist,
21820 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
21830 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
21840 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29  erZero(&doclist)
21850 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
21860 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  e{.            f
21870 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
21880 73 74 73 28 70 2c 20 62 44 65 73 63 2c 20 26 64  sts(p, bDesc, &d
21890 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
218a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
218b0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61  ts5BufferZero(&a
218c0 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
218d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
218e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
218f0 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30 20 29 7b   doclist.n==0 ){
21900 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
21910 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
21920 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74  &p->rc, &doclist
21930 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
21940 20 7d 65 6c 73 65 20 69 66 28 20 62 44 65 73 63   }else if( bDesc
21950 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
21960 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
21970 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c  nt(&p->rc, &docl
21980 69 73 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 20  ist, iLastRowid 
21990 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  - iRowid);.     
219a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
219b0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
219c0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
219d0 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69 64 20  doclist, iRowid 
219e0 2d 20 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20  - iLastRowid);. 
219f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61       }.      iLa
21a00 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
21a10 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
21a20 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20  iIterPoslist(p, 
21a30 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69 73 74 29  p1, 1, &doclist)
21a40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
21a50 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b  (i=0; i<nBuf; i+
21a60 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65  +){.      fts5Me
21a70 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 70  rgePrefixLists(p
21a80 2c 20 62 44 65 73 63 2c 20 26 64 6f 63 6c 69 73  , bDesc, &doclis
21a90 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
21aa0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
21ab0 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  ee(&aBuf[i]);.  
21ac0 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74    }.    fts5Mult
21ad0 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 31 29  iIterFree(p, p1)
21ae0 3b 0a 0a 20 20 20 20 70 44 6f 63 6c 69 73 74 20  ;..    pDoclist 
21af0 3d 20 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74  = (Fts5DoclistIt
21b00 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
21b10 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
21b20 44 6f 63 6c 69 73 74 49 74 65 72 29 29 3b 0a 20  DoclistIter));. 
21b30 20 20 20 69 66 28 20 21 70 44 6f 63 6c 69 73 74     if( !pDoclist
21b40 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
21b50 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69 73  fferFree(&doclis
21b60 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
21b70 20 20 20 20 20 70 49 74 65 72 2d 3e 70 44 6f 63       pIter->pDoc
21b80 6c 69 73 74 20 3d 20 70 44 6f 63 6c 69 73 74 3b  list = pDoclist;
21b90 0a 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69  .      fts5Docli
21ba0 73 74 49 74 65 72 49 6e 69 74 28 26 64 6f 63 6c  stIterInit(&docl
21bb0 69 73 74 2c 20 62 44 65 73 63 2c 20 70 49 74 65  ist, bDesc, pIte
21bc0 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20  r->pDoclist);.  
21bd0 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53    }.  }..  fts5S
21be0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
21bf0 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c 69  pStruct);.  sqli
21c00 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b 0a  te3_free(aBuf);.
21c10 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
21c20 73 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20  s5QueryCksum(.  
21c30 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
21c40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 0a 20  const char *z,. 
21c50 20 69 6e 74 20 6e 2c 0a 20 20 69 6e 74 20 66 6c   int n,.  int fl
21c60 61 67 73 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73  ags,.  u64 *pCks
21c70 75 6d 0a 29 7b 0a 20 20 75 36 34 20 63 6b 73 75  um.){.  u64 cksu
21c80 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46  m = *pCksum;.  F
21c90 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
21ca0 64 78 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e  dxIter = 0;.  in
21cb0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  t rc = sqlite3Ft
21cc0 73 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20  s5IndexQuery(p, 
21cd0 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 26 70 49  z, n, flags, &pI
21ce0 64 78 49 74 65 72 29 3b 0a 0a 20 20 77 68 69 6c  dxIter);..  whil
21cf0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
21d00 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74   && 0==sqlite3Ft
21d10 73 35 49 74 65 72 45 6f 66 28 70 49 64 78 49 74  s5IterEof(pIdxIt
21d20 65 72 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  er) ){.    const
21d30 20 75 38 20 2a 70 50 6f 73 3b 0a 20 20 20 20 69   u8 *pPos;.    i
21d40 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 36 34  nt nPos;.    i64
21d50 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33   rowid = sqlite3
21d60 46 74 73 35 49 74 65 72 52 6f 77 69 64 28 70 49  Fts5IterRowid(pI
21d70 64 78 49 74 65 72 29 3b 0a 20 20 20 20 72 63 20  dxIter);.    rc 
21d80 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
21d90 72 50 6f 73 6c 69 73 74 28 70 49 64 78 49 74 65  rPoslist(pIdxIte
21da0 72 2c 20 26 70 50 6f 73 2c 20 26 6e 50 6f 73 29  r, &pPos, &nPos)
21db0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21dc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21dd0 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
21de0 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20  er sReader;.    
21df0 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73    for(sqlite3Fts
21e00 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
21e10 69 74 28 2d 31 2c 20 70 50 6f 73 2c 20 6e 50 6f  it(-1, pPos, nPo
21e20 73 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20  s, &sReader);.  
21e30 20 20 20 20 20 20 20 20 73 52 65 61 64 65 72 2e          sReader.
21e40 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20  bEof==0;.       
21e50 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
21e60 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
21e70 26 73 52 65 61 64 65 72 29 0a 20 20 20 20 20 20  &sReader).      
21e80 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
21e90 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43  Col = FTS5_POS2C
21ea0 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50  OLUMN(sReader.iP
21eb0 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  os);.        int
21ec0 20 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53   iOff = FTS5_POS
21ed0 32 4f 46 46 53 45 54 28 73 52 65 61 64 65 72 2e  2OFFSET(sReader.
21ee0 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63  iPos);.        c
21ef0 6b 73 75 6d 20 5e 3d 20 66 74 73 35 49 6e 64 65  ksum ^= fts5Inde
21f00 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69  xEntryCksum(rowi
21f10 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 7a  d, iCol, iOff, z
21f20 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , n);.      }.  
21f30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21f40 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49 64  Fts5IterNext(pId
21f50 78 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  xIter);.    }.  
21f60 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 49  }.  sqlite3Fts5I
21f70 74 65 72 43 6c 6f 73 65 28 70 49 64 78 49 74 65  terClose(pIdxIte
21f80 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d  r);..  *pCksum =
21f90 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e   cksum;.  return
21fa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75   rc;.}../*.** Ru
21fb0 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  n internal check
21fc0 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
21fd0 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28   the FTS index (
21fe0 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  a) is internally
21ff0 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20   .** consistent 
22000 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73  and (b) contains
22010 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69   entries for whi
22020 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68  ch the XOR of th
22030 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61  e checksums.** a
22040 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20  s calculated by 
22050 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  fts5IndexEntryCk
22060 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a  sum() is cksum..
22070 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
22080 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
22090 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e  ny of the intern
220a0 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20  al checks fail, 
220b0 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65  or if the.** che
220c0 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  cksum does not m
220d0 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c  atch. Return SQL
220e0 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68  ITE_OK if all ch
220f0 65 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75  ecks pass withou
22100 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73  t.** error, or s
22110 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65  ome other SQLite
22120 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
22130 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e  nother error (e.
22140 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72  g. OOM).** occur
22150 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
22160 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72  3Fts5IndexIntegr
22170 69 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64  ityCheck(Fts5Ind
22180 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d  ex *p, u64 cksum
22190 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
221a0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
221b0 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 49 64  onfig;.  int iId
221c0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
221d0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
221e0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
221f0 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ugh indexes */. 
22200 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b   u64 cksum2 = 0;
22210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22220 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73   /* Checksum bas
22230 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f  ed on contents o
22240 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 75  f indexes */.  u
22250 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20  64 cksum3 = 0;  
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22270 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
22280 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   on contents of 
22290 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73  indexes */.  Fts
222a0 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b  5Buffer term = {
222b0 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20  0,0,0};      /* 
222c0 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68  Buffer used to h
222d0 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  old most recent 
222e0 74 65 72 6d 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  term */..  /* Ch
222f0 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74  eck that the int
22300 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65  ernal nodes of e
22310 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63  ach segment matc
22320 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a  h the leaves */.
22330 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 70 2d    for(iIdx=0; p-
22340 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
22350 26 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  & iIdx<=pConfig-
22360 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b  >nPrefix; iIdx++
22370 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
22380 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
22390 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
223a0 64 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20  d(p, iIdx);.    
223b0 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
223c0 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69       int iLvl, i
223d0 53 65 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Seg;.      for(i
223e0 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
223f0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
22400 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l++){.        fo
22410 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
22420 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
22430 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
22440 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46 74  +){.          Ft
22450 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
22460 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 53 74 72  nt *pSeg = &pStr
22470 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
22480 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ].aSeg[iSeg];.  
22490 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65          fts5Inde
224a0 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53  xIntegrityCheckS
224b0 65 67 6d 65 6e 74 28 70 2c 20 69 49 64 78 2c 20  egment(p, iIdx, 
224c0 70 53 65 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  pSeg);.        }
224d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
224e0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
224f0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
22500 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
22510 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70  cksum argument p
22520 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
22530 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63  nction is a chec
22540 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a  ksum calculated.
22550 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c    ** based on al
22560 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69  l expected entri
22570 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  es in the FTS in
22580 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70  dex (including p
22590 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a  refix index.  **
225a0 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20   entries). This 
225b0 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61  block checks tha
225c0 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  t a checksum cal
225d0 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  culated based on
225e0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
225f0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53   contents of FTS
22600 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69   index is identi
22610 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cal..  **.  ** T
22620 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
22630 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d  he same checksum
22640 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e   are calculated.
22650 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63   The first (stac
22660 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  k.  ** variable 
22670 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e  cksum2) based on
22680 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74   entries extract
22690 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c  ed from the full
226a0 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a  -text index.  **
226b0 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c   while doing a l
226c0 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61  inear scan of ea
226d0 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e  ch individual in
226e0 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20  dex in turn. .  
226f0 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20  **.  ** As each 
22700 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20  term visited by 
22710 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73  the linear scans
22720 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65  , a separate que
22730 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ry for the.  ** 
22740 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72  same term is per
22750 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69  formed. cksum3 i
22760 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  s calculated bas
22770 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65  ed on the entrie
22780 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64  s.  ** extracted
22790 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65   by these querie
227a0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 49  s..  */.  for(iI
227b0 64 78 3d 30 3b 20 69 49 64 78 3c 3d 70 43 6f 6e  dx=0; iIdx<=pCon
227c0 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49  fig->nPrefix; iI
227d0 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 4d  dx++){.    Fts5M
227e0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
227f0 65 72 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75  er;.    Fts5Stru
22800 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
22810 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
22820 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20  ad(p, iIdx);.   
22830 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
22840 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
22850 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c  , iIdx, 0, 0, 0,
22860 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74 65   0, -1, 0, &pIte
22870 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  r);.        fts5
22880 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
22890 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  pIter)==0;.     
228a0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
228b0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
228c0 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  , 0).    ){.    
228d0 20 20 46 74 73 35 50 6f 73 49 74 65 72 20 73 50    Fts5PosIter sP
228e0 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  os;           /*
228f0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
22900 20 74 68 72 6f 75 67 68 20 70 6f 73 69 74 69 6f   through positio
22910 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  n list */.      
22920 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
22930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22940 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20 62  ize of term in b
22950 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 36  ytes */.      i6
22960 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d  4 iRowid = fts5M
22970 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
22980 74 65 72 29 3b 0a 20 20 20 20 20 20 63 68 61 72  ter);.      char
22990 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73   *z = (char*)fts
229a0 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
229b0 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20  Iter, &n);..    
229c0 20 20 2f 2a 20 55 70 64 61 74 65 20 63 6b 73 75    /* Update cksu
229d0 6d 32 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  m2 with the entr
229e0 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ies associated w
229f0 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
22a00 74 65 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 6e  term.      ** an
22a10 64 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20  d rowid.  */.   
22a20 20 20 20 66 6f 72 28 66 74 73 35 50 6f 73 49 74     for(fts5PosIt
22a30 65 72 49 6e 69 74 28 70 2c 20 70 49 74 65 72 2c  erInit(p, pIter,
22a40 20 26 73 50 6f 73 29 3b 0a 20 20 20 20 20 20 20   &sPos);.       
22a50 20 20 20 66 74 73 35 50 6f 73 49 74 65 72 45 6f     fts5PosIterEo
22a60 66 28 70 2c 20 26 73 50 6f 73 29 3d 3d 30 3b 0a  f(p, &sPos)==0;.
22a70 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50 6f            fts5Po
22a80 73 49 74 65 72 4e 65 78 74 28 70 2c 20 26 73 50  sIterNext(p, &sP
22a90 6f 73 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  os).      ){.   
22aa0 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66       cksum2 ^= f
22ab0 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
22ac0 75 6d 28 69 52 6f 77 69 64 2c 20 73 50 6f 73 2e  um(iRowid, sPos.
22ad0 69 43 6f 6c 2c 20 73 50 6f 73 2e 69 50 6f 73 2c  iCol, sPos.iPos,
22ae0 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
22af0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
22b00 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c  s is a new term,
22b10 20 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55   query for it. U
22b20 70 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74  pdate cksum3 wit
22b30 68 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a  h the results. *
22b40 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  /.      if( p->r
22b50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22b60 28 74 65 72 6d 2e 6e 21 3d 6e 20 7c 7c 20 6d 65  (term.n!=n || me
22b70 6d 63 6d 70 28 74 65 72 6d 2e 70 2c 20 7a 2c 20  mcmp(term.p, z, 
22b80 6e 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  n)) ){.        i
22b90 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69  nt rc;.        i
22ba0 6e 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78  nt flags = (iIdx
22bb0 3d 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e  ==0 ? 0 : FTS5IN
22bc0 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58  DEX_QUERY_PREFIX
22bd0 29 3b 0a 20 20 20 20 20 20 20 20 75 36 34 20 63  );.        u64 c
22be0 6b 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  k1 = 0;.        
22bf0 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20  u64 ck2 = 0;..  
22c00 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
22c10 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
22c20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43  returned for ASC
22c30 20 61 6e 64 20 44 45 53 43 20 71 75 65 72 69 65   and DESC querie
22c40 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  s are.        **
22c50 20 74 68 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f   the same. If no
22c60 74 2c 20 63 61 6c 6c 20 74 68 69 73 20 63 6f 72  t, call this cor
22c70 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
22c80 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75       rc = fts5Qu
22c90 65 72 79 43 6b 73 75 6d 28 70 2c 20 7a 2c 20 6e  eryCksum(p, z, n
22ca0 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a  , flags, &ck1);.
22cb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
22cc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22cd0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
22ce0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 7a 2c  QueryCksum(p, z,
22cf0 20 6e 2c 20 66 6c 61 67 73 7c 46 54 53 35 49 4e   n, flags|FTS5IN
22d00 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 2c 20  DEX_QUERY_DESC, 
22d10 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 7d  &ck2);.        }
22d20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
22d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
22d40 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54  1!=ck2 ) rc = FT
22d50 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20  S5_CORRUPT;..   
22d60 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
22d70 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72  is a prefix quer
22d80 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  y, check that th
22d90 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
22da0 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
22db0 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
22dc0 73 20 64 69 73 61 62 6c 65 64 20 61 72 65 20 74  s disabled are t
22dd0 68 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68  he same. In both
22de0 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 6f 72   ASC and DESC or
22df0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  der. */.        
22e00 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72 63  if( iIdx>0 && rc
22e10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22e20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
22e30 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58   flags|FTS5INDEX
22e40 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44  _QUERY_TEST_NOID
22e50 58 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 32  X;.          ck2
22e60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22e70 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
22e80 73 75 6d 28 70 2c 20 7a 2c 20 6e 2c 20 66 2c 20  sum(p, z, n, f, 
22e90 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 20  &ck2);.         
22ea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22eb0 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
22ec0 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
22ed0 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
22ee0 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30        if( iIdx>0
22ef0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
22f00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
22f10 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
22f20 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53  5INDEX_QUERY_TES
22f30 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45  T_NOIDX|FTS5INDE
22f40 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20  X_QUERY_DESC;.  
22f50 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b          ck2 = 0;
22f60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
22f70 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
22f80 2c 20 7a 2c 20 6e 2c 20 66 2c 20 26 63 6b 32 29  , z, n, f, &ck2)
22f90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22fa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22fb0 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
22fc0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
22fd0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
22fe0 20 20 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31 3b    cksum3 ^= ck1;
22ff0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
23000 66 65 72 53 65 74 28 26 72 63 2c 20 26 74 65 72  ferSet(&rc, &ter
23010 6d 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a  m, n, (const u8*
23020 29 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  )z);.        p->
23030 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 7d  rc = rc;.      }
23040 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
23050 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
23060 70 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35  pIter);.    fts5
23070 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
23080 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20  (pStruct);.  }. 
23090 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
230a0 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d  TE_OK && cksum!=
230b0 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d  cksum2 ) p->rc =
230c0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
230d0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
230e0 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d  TE_OK && cksum!=
230f0 63 6b 73 75 6d 33 20 29 20 70 2d 3e 72 63 20 3d  cksum3 ) p->rc =
23100 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
23110 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
23120 28 26 74 65 72 6d 29 3b 0a 20 20 72 65 74 75 72  (&term);.  retur
23130 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
23140 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n(p);.}.../*.** 
23150 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c  Indicate that al
23160 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  l subsequent cal
23170 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ls to sqlite3Fts
23180 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65  5IndexWrite() pe
23190 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  rtain.** to the 
231a0 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f  document with ro
231b0 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69  wid iRowid..*/.i
231c0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
231d0 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74  dexBeginWrite(Ft
231e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
231f0 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72  iRowid){.  asser
23200 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
23210 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _OK );..  /* All
23220 6f 63 61 74 65 20 68 61 73 68 20 74 61 62 6c 65  ocate hash table
23230 73 20 69 66 20 74 68 65 79 20 68 61 76 65 20 6e  s if they have n
23240 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
23250 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
23260 66 28 20 70 2d 3e 61 70 48 61 73 68 3d 3d 30 20  f( p->apHash==0 
23270 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
23280 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
23290 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 6e 48  E_OK;.    int nH
232a0 61 73 68 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ash = p->pConfig
232b0 2d 3e 6e 50 72 65 66 69 78 20 2b 20 31 3b 0a 20  ->nPrefix + 1;. 
232c0 20 20 20 46 74 73 35 48 61 73 68 20 2a 2a 61 70     Fts5Hash **ap
232d0 4e 65 77 3b 0a 0a 20 20 20 20 61 70 4e 65 77 20  New;..    apNew 
232e0 3d 20 28 46 74 73 35 48 61 73 68 2a 2a 29 73 71  = (Fts5Hash**)sq
232f0 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
23300 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28  ero(&rc, sizeof(
23310 46 74 73 35 48 61 73 68 2a 29 2a 6e 48 61 73 68  Fts5Hash*)*nHash
23320 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
23330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23340 20 69 3c 6e 48 61 73 68 3b 20 69 2b 2b 29 7b 0a   i<nHash; i++){.
23350 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23360 65 33 46 74 73 35 48 61 73 68 4e 65 77 28 26 61  e3Fts5HashNew(&a
23370 70 4e 65 77 5b 69 5d 2c 20 26 70 2d 3e 6e 50 65  pNew[i], &p->nPe
23380 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 20 20  ndingData);.    
23390 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
233a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
233b0 20 70 2d 3e 61 70 48 61 73 68 20 3d 20 61 70 4e   p->apHash = apN
233c0 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ew;.    }else{. 
233d0 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 20 29       if( apNew )
233e0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
233f0 30 3b 20 69 3c 6e 48 61 73 68 3b 20 69 2b 2b 29  0; i<nHash; i++)
23400 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23410 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28  te3Fts5HashFree(
23420 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  apNew[i]);.     
23430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
23440 69 74 65 33 5f 66 72 65 65 28 61 70 4e 65 77 29  ite3_free(apNew)
23450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23460 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
23470 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 52 6f 77  .  }..  if( iRow
23480 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77  id<=p->iWriteRow
23490 69 64 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69  id || (p->nPendi
234a0 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e 4d 61 78  ngData > p->nMax
234b0 50 65 6e 64 69 6e 67 44 61 74 61 29 20 29 7b 0a  PendingData) ){.
234c0 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75      fts5IndexFlu
234d0 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  sh(p);.  }.  p->
234e0 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52  iWriteRowid = iR
234f0 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 66  owid;.  return f
23500 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
23510 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
23520 69 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e  it data to disk.
23530 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
23540 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73  ts5IndexSync(Fts
23550 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62  5Index *p, int b
23560 43 6f 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72  Commit){.  asser
23570 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
23580 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64  _OK );.  fts5Ind
23590 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66  exFlush(p);.  if
235a0 28 20 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35  ( bCommit ) fts5
235b0 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
235c0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
235d0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
235e0 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e  /*.** Discard an
235f0 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
23600 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
23610 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e  ash tables. Do n
23620 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74  ot write it.** t
23630 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
23640 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73  Additionally, as
23650 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f  sume that the co
23660 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f  ntents of the %_
23670 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61  data.** table ma
23680 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f  y have changed o
23690 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69  n disk. So any i
236a0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20  n-memory caches 
236b0 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65  of %_data .** re
236c0 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e  cords must be in
236d0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e  validated..*/.in
236e0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
236f0 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49  exRollback(Fts5I
23700 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35  ndex *p){.  fts5
23710 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
23720 20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61    fts5IndexDisca
23730 72 64 44 61 74 61 28 70 29 3b 0a 20 20 61 73 73  rdData(p);.  ass
23740 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
23750 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
23760 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
23770 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61  /*.** The %_data
23780 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65   table is comple
23790 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20  tely empty when 
237a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
237b0 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a   called. This.**
237c0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
237d0 74 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20  tes it with the 
237e0 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72  initial structur
237f0 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  e objects for ea
23800 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64  ch index,.** and
23810 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72   the initial ver
23820 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65  sion of the "ave
23830 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61  rages" record (a
23840 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29   zero-byte blob)
23850 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23860 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28  Fts5IndexReinit(
23870 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
23880 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 53 74   int i;.  Fts5St
23890 72 75 63 74 75 72 65 20 73 3b 0a 0a 20 20 6d 65  ructure s;..  me
238a0 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
238b0 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
238c0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ));.  for(i=0; i
238d0 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  <p->pConfig->nPr
238e0 65 66 69 78 2b 31 3b 20 69 2b 2b 29 7b 0a 20 20  efix+1; i++){.  
238f0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
23900 72 69 74 65 28 70 2c 20 69 2c 20 26 73 29 3b 0a  rite(p, i, &s);.
23910 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d    }.  if( p->rc=
23920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23930 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
23940 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65  3Fts5IndexSetAve
23950 72 61 67 65 73 28 70 2c 20 28 63 6f 6e 73 74 20  rages(p, (const 
23960 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d 0a  u8*)"", 0);.  }.
23970 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
23980 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
23990 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
239a0 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  w Fts5Index hand
239b0 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65 61  le. If the bCrea
239c0 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  te argument is t
239d0 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61  rue, create.** a
239e0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
239f0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64  e underlying %_d
23a00 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ata table..**.**
23a10 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
23a20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
23a30 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
23a40 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
23a50 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65  LITE_OK..** Othe
23a60 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74  rwise, set *pp t
23a70 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72  o NULL and retur
23a80 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
23a90 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
23aa0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
23ab0 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  pen(.  Fts5Confi
23ac0 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69  g *pConfig, .  i
23ad0 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46  nt bCreate, .  F
23ae0 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20  ts5Index **pp,. 
23af0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
23b00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23b10 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64  TE_OK;.  Fts5Ind
23b20 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ex *p;          
23b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
23b40 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70  object */..  *pp
23b50 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65   = p = (Fts5Inde
23b60 78 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  x*)sqlite3_mallo
23b70 63 28 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  c(sizeof(Fts5Ind
23b80 65 78 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ex));.  if( !p )
23b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
23ba0 4f 4d 45 4d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  OMEM;..  memset(
23bb0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  p, 0, sizeof(Fts
23bc0 35 49 6e 64 65 78 29 29 3b 0a 20 20 70 2d 3e 70  5Index));.  p->p
23bd0 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67  Config = pConfig
23be0 3b 0a 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  ;.  p->nWorkUnit
23bf0 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49   = FTS5_WORK_UNI
23c00 54 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64  T;.  p->nMaxPend
23c10 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31  ingData = 1024*1
23c20 30 32 34 3b 0a 20 20 70 2d 3e 7a 44 61 74 61 54  024;.  p->zDataT
23c30 62 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  bl = sqlite3_mpr
23c40 69 6e 74 66 28 22 25 73 5f 64 61 74 61 22 2c 20  intf("%s_data", 
23c50 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b  pConfig->zName);
23c60 0a 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54  .  if( p->zDataT
23c70 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  bl==0 ){.    rc 
23c80 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
23c90 20 20 7d 65 6c 73 65 20 69 66 28 20 62 43 72 65    }else if( bCre
23ca0 61 74 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ate ){.    rc = 
23cb0 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
23cc0 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20  eTable(.        
23cd0 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c  pConfig, "data",
23ce0 20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   "id INTEGER PRI
23cf0 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20  MARY KEY, block 
23d00 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a  BLOB", 0, pzErr.
23d10 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
23d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23d30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23d40 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69  e3Fts5IndexReini
23d50 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(p);.    }.  }.
23d60 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
23d70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
23d80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
23d90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23da0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
23db0 43 6c 6f 73 65 28 70 2c 20 30 29 3b 0a 20 20 20  Close(p, 0);.   
23dc0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
23dd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23de0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64  .** Close a hand
23df0 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  le opened by an 
23e00 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
23e10 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
23e20 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Open()..*/.int s
23e30 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
23e40 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  lose(Fts5Index *
23e50 70 2c 20 69 6e 74 20 62 44 65 73 74 72 6f 79 29  p, int bDestroy)
23e60 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
23e70 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
23e80 29 7b 0a 20 20 20 20 69 66 28 20 62 44 65 73 74  ){.    if( bDest
23e90 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  roy ){.      rc 
23ea0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 44 72 6f  = sqlite3Fts5Dro
23eb0 70 54 61 62 6c 65 28 70 2d 3e 70 43 6f 6e 66 69  pTable(p->pConfi
23ec0 67 2c 20 22 64 61 74 61 22 29 3b 0a 20 20 20 20  g, "data");.    
23ed0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
23ee0 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20  >pReader==0 );. 
23ef0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
23f00 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  ize(p->pWriter);
23f10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
23f20 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65  alize(p->pDelete
23f30 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  r);.    if( p->a
23f40 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 69  pHash ){.      i
23f50 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
23f60 69 3d 30 3b 20 69 3c 3d 70 2d 3e 70 43 6f 6e 66  i=0; i<=p->pConf
23f70 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b  ig->nPrefix; i++
23f80 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23f90 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70  e3Fts5HashFree(p
23fa0 2d 3e 61 70 48 61 73 68 5b 69 5d 29 3b 0a 20 20  ->apHash[i]);.  
23fb0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
23fc0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 48 61  te3_free(p->apHa
23fd0 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sh);.    }.    s
23fe0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
23ff0 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71  DataTbl);.    sq
24000 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
24010 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24020 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
24030 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  t p points to a 
24040 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
24050 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68 61  g utf-8 text tha
24060 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20  t is n bytes in 
24070 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e  .** size. Return
24080 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
24090 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61  ytes in the nCha
240a0 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65 66  r character pref
240b0 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66  ix of the.** buf
240c0 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65  fer, or 0 if the
240d0 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e  re are less than
240e0 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72   nChar character
240f0 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73  s in total..*/.s
24100 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
24110 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
24120 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  len(const char *
24130 70 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  p, int nByte, in
24140 74 20 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74 20  t nChar){.  int 
24150 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  n = 0;.  int i;.
24160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68    for(i=0; i<nCh
24170 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ar; i++){.    if
24180 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74  ( n>=nByte ) ret
24190 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49  urn 0;      /* I
241a0 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65  nput contains fe
241b0 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63  wer than nChar c
241c0 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  hars */.    if( 
241d0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
241e0 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20  [n++]>=0xc0 ){. 
241f0 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e       while( (p[n
24200 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
24210 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) n++;.    }.  }
24220 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
24230 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55  /*.** pIn is a U
24240 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  TF-8 encoded str
24250 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69  ing, nIn bytes i
24260 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74  n size. Return t
24270 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
24280 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
24290 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67  rs in the string
242a0 2e 0a 2a 2f 0a 69 6e 74 20 66 74 73 35 49 6e 64  ..*/.int fts5Ind
242b0 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20  exCharlen(const 
242c0 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e  char *pIn, int n
242d0 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  In){.  int nChar
242e0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
242f0 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20   .  int i = 0;. 
24300 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b   while( i<nIn ){
24310 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e  .    if( (unsign
24320 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d  ed char)pIn[i++]
24330 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
24340 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20  while( i<nIn && 
24350 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d  (pIn[i] & 0xc0)=
24360 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20  =0x80 ) i++;.   
24370 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a   }.    nChar++;.
24380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68    }.  return nCh
24390 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  ar;.}../*.** Cal
243a0 63 75 6c 61 74 65 20 61 6e 64 20 72 65 74 75 72  culate and retur
243b0 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 74 68 61  n a checksum tha
243c0 74 20 69 73 20 74 68 65 20 58 4f 52 20 6f 66 20  t is the XOR of 
243d0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
243e0 2a 2a 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61  ** checksum of a
243f0 6c 6c 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ll entries that 
24400 77 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  would be generat
24410 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 20  ed by the token 
24420 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
24430 74 68 65 20 66 69 6e 61 6c 20 35 20 61 72 67 75  the final 5 argu
24440 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71  ments..*/.u64 sq
24450 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6b  lite3Fts5IndexCk
24460 73 75 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  sum(.  Fts5Confi
24470 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20  g *pConfig,     
24480 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
24490 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  uration object *
244a0 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20  /.  i64 iRowid, 
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244c0 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20      /* Document 
244d0 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
244e0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
244f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24500 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
24510 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a  erm appears in *
24520 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20  /.  int iPos,   
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24540 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
24550 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
24560 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
24570 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
24580 6d 20 20 20 20 2f 2a 20 54 65 72 6d 20 61 74 20  m    /* Term at 
24590 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  iPos */.){.  u64
245a0 20 72 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20   ret = 0;       
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
245c0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
245d0 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20    int iIdx;     
245e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245f0 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69    /* For iterati
24600 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  ng through index
24610 65 73 20 2a 2f 0a 0a 20 20 72 65 74 20 3d 20 66  es */..  ret = f
24620 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
24630 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  um(iRowid, iCol,
24640 20 69 50 6f 73 2c 20 70 54 65 72 6d 2c 20 6e 54   iPos, pTerm, nT
24650 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 49 64  erm);..  for(iId
24660 78 3d 30 3b 20 69 49 64 78 3c 70 43 6f 6e 66 69  x=0; iIdx<pConfi
24670 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78  g->nPrefix; iIdx
24680 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  ++){.    int nBy
24690 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68  te = fts5IndexCh
246a0 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70  arlenToBytelen(p
246b0 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 43 6f  Term, nTerm, pCo
246c0 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49  nfig->aPrefix[iI
246d0 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  dx]);.    if( nB
246e0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  yte ){.      ret
246f0 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74   ^= fts5IndexEnt
24700 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
24710 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 65 72  iCol, iPos, pTer
24720 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  m, nByte);.    }
24730 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
24740 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  et;.}../*.** Ins
24750 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61  ert or remove da
24760 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ta to or from th
24770 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69  e index. Each ti
24780 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73  me a document is
24790 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72   .** added to or
247a0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
247b0 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75  e index, this fu
247c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
247d0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
247e0 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  times..**.** For
247f0 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d   an insert, it m
24800 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  ust be called on
24810 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65  ce for each toke
24820 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63  n in the new doc
24830 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65  ument..** If the
24840 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
24850 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20  delete, it must 
24860 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65  be called (at le
24870 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61  ast) once for ea
24880 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b  ch.** unique tok
24890 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  en in the docume
248a0 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20  nt with an iCol 
248b0 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20  value less than 
248c0 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a  zero. The iPos.*
248d0 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67  * argument is ig
248e0 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65  nored for a dele
248f0 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  te..*/.int sqlit
24900 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
24910 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
24920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24930 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
24940 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  write to */.  in
24950 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
24960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24970 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70   Column token ap
24980 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e  pears in (-ve ->
24990 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e   delete) */.  in
249a0 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  t iPos,         
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
249c0 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b   Position of tok
249d0 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e  en within column
249e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
249f0 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
24a00 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74  oken  /* Token t
24a10 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  o add or remove 
24a20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78  to or from index
24a30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a50 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
24a60 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
24a70 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ugh indexes */. 
24a80 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24aa0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
24ab0 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
24ac0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
24ad0 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74  onfig;..  assert
24ae0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
24af0 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  OK );..  /* Add 
24b00 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20 74 6f  the new token to
24b10 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20   the main terms 
24b20 68 61 73 68 20 74 61 62 6c 65 2e 20 41 6e 64 20  hash table. And 
24b30 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 20  to each of the. 
24b40 20 2a 2a 20 70 72 65 66 69 78 20 68 61 73 68 20   ** prefix hash 
24b50 74 61 62 6c 65 73 20 74 68 61 74 20 69 74 20 69  tables that it i
24b60 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
24b70 6f 72 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  or. */.  rc = sq
24b80 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
24b90 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 61 70 48  te(.      p->apH
24ba0 61 73 68 5b 30 5d 2c 20 70 2d 3e 69 57 72 69 74  ash[0], p->iWrit
24bb0 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
24bc0 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  os, pToken, nTok
24bd0 65 6e 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d  en.  );.  for(i=
24be0 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50  0; i<pConfig->nP
24bf0 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c  refix && rc==SQL
24c00 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
24c10 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74    int nByte = ft
24c20 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
24c30 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20  Bytelen(pToken, 
24c40 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69 67 2d  nToken, pConfig-
24c50 3e 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20  >aPrefix[i]);.  
24c60 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
24c70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24c80 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a  3Fts5HashWrite(.
24c90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 48            p->apH
24ca0 61 73 68 5b 69 2b 31 5d 2c 20 70 2d 3e 69 57 72  ash[i+1], p->iWr
24cb0 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  iteRowid, iCol, 
24cc0 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42  iPos, pToken, nB
24cd0 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  yte.      );.   
24ce0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
24cf0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
24d00 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f  en a new iterato
24d10 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f  r to iterate tho
24d20 75 67 68 20 61 6c 6c 20 64 6f 63 69 64 73 20 74  ugh all docids t
24d30 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a  hat match the .*
24d40 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65  * specified toke
24d50 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69  n or token prefi
24d60 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
24d70 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
24d80 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
24db0 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f  to query */.  co
24dc0 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
24dd0 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a  , int nToken, /*
24de0 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69   Token (or prefi
24df0 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  x) to query for 
24e00 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
24e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
24e30 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
24e40 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
24e50 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49  5IndexIter **ppI
24e60 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
24e70 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f  OUT: New iterato
24e80 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
24e90 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
24ea0 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
24eb0 67 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  g;.  Fts5IndexIt
24ec0 65 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20  er *pRet;.  int 
24ed0 69 49 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28  iIdx = 0;..  if(
24ee0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
24ef0 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20  EX_QUERY_PREFIX 
24f00 29 7b 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73  ){.    if( flags
24f10 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
24f20 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 29 7b  RY_TEST_NOIDX ){
24f30 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 31 2b  .      iIdx = 1+
24f40 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
24f50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24f60 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66     int nChar = f
24f70 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28  ts5IndexCharlen(
24f80 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
24f90 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64 78 3d  .      for(iIdx=
24fa0 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  1; iIdx<=pConfig
24fb0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
24fc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
24fd0 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
24fe0 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72 20  [iIdx-1]==nChar 
24ff0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
25000 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52  .    }.  }..  pR
25010 65 74 20 3d 20 28 46 74 73 35 49 6e 64 65 78 49  et = (Fts5IndexI
25020 74 65 72 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ter*)sqlite3Fts5
25030 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
25040 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e  c, sizeof(Fts5In
25050 64 65 78 49 74 65 72 29 29 3b 0a 20 20 69 66 28  dexIter));.  if(
25060 20 70 52 65 74 20 29 7b 0a 20 20 20 20 6d 65 6d   pRet ){.    mem
25070 73 65 74 28 70 52 65 74 2c 20 30 2c 20 73 69 7a  set(pRet, 0, siz
25080 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65  eof(Fts5IndexIte
25090 72 29 29 3b 0a 0a 20 20 20 20 70 52 65 74 2d 3e  r));..    pRet->
250a0 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20  pIndex = p;.    
250b0 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69  if( iIdx<=pConfi
250c0 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20  g->nPrefix ){.  
250d0 20 20 20 20 70 52 65 74 2d 3e 70 53 74 72 75 63      pRet->pStruc
250e0 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
250f0 65 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a  eRead(p, iIdx);.
25100 20 20 20 20 20 20 69 66 28 20 70 52 65 74 2d 3e        if( pRet->
25110 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20  pStruct ){.     
25120 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
25130 4e 65 77 28 70 2c 20 70 52 65 74 2d 3e 70 53 74  New(p, pRet->pSt
25140 72 75 63 74 2c 20 0a 20 20 20 20 20 20 20 20 20  ruct, .         
25150 20 20 20 69 49 64 78 2c 20 31 2c 20 66 6c 61 67     iIdx, 1, flag
25160 73 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 54  s, (const u8*)pT
25170 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31  oken, nToken, -1
25180 2c 20 30 2c 20 26 70 52 65 74 2d 3e 70 4d 75 6c  , 0, &pRet->pMul
25190 74 69 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ti.        );.  
251a0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
251b0 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 73 63  .      int bDesc
251c0 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35   = (flags & FTS5
251d0 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
251e0 29 21 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )!=0;.      fts5
251f0 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28  SetupPrefixIter(
25200 70 2c 20 62 44 65 73 63 2c 20 28 63 6f 6e 73 74  p, bDesc, (const
25210 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f   u8*)pToken, nTo
25220 6b 65 6e 2c 20 70 52 65 74 29 3b 0a 20 20 20 20  ken, pRet);.    
25230 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
25240 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
25250 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70  3Fts5IterClose(p
25260 52 65 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  Ret);.    pRet =
25270 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 74 65   0;.  }.  *ppIte
25280 72 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75  r = pRet;.  retu
25290 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
252a0 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
252b0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
252c0 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
252d0 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
252e0 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f  rgument is at EO
252f0 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  F..*/.int sqlite
25300 33 46 74 73 35 49 74 65 72 45 6f 66 28 46 74 73  3Fts5IterEof(Fts
25310 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
25320 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  r){.  assert( pI
25330 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
25340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
25350 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
25360 69 73 74 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ist ){ .    retu
25370 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  rn pIter->pDocli
25380 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3d 3d 30 3b  st->aPoslist==0;
25390 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72   .  }else{.    r
253a0 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49  eturn fts5MultiI
253b0 74 65 72 45 6f 66 28 70 49 74 65 72 2d 3e 70 49  terEof(pIter->pI
253c0 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75  ndex, pIter->pMu
253d0 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  lti);.  }.}../*.
253e0 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e  ** Move to the n
253f0 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  ext matching row
25400 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  id. .*/.int sqli
25410 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28  te3Fts5IterNext(
25420 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
25430 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
25440 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
25450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
25460 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44  .  if( pIter->pD
25470 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 66 74  oclist ){.    ft
25480 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
25490 74 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  t(pIter->pDoclis
254a0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
254b0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
254c0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
254d0 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
254e0 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70  terNext(pIter->p
254f0 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d  Index, pIter->pM
25500 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ulti, 0, 0);.  }
25510 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
25520 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d  dexReturn(pIter-
25530 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  >pIndex);.}../*.
25540 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64 6f 63 6c  ** Move the docl
25550 69 73 74 2d 69 74 65 72 20 70 61 73 73 65 64 20  ist-iter passed 
25560 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
25570 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  ument to the nex
25580 74 20 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20 72  t .** matching r
25590 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72 73  owid that occurs
255a0 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61   at or after iMa
255b0 74 63 68 2e 20 54 68 65 20 64 65 66 69 6e 69 74  tch. The definit
255c0 69 6f 6e 20 6f 66 20 22 61 74 20 0a 2a 2a 20 6f  ion of "at .** o
255d0 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73  r after" depends
255e0 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73   on whether this
255f0 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74   iterator iterat
25600 65 73 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  es in ascending 
25610 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 69 6e  or .** descendin
25620 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a  g rowid order..*
25630 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
25640 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
25650 74 46 72 6f 6d 28 46 74 73 35 44 6f 63 6c 69 73  tFrom(Fts5Doclis
25660 74 49 74 65 72 20 2a 70 2c 20 69 36 34 20 69 4d  tIter *p, i64 iM
25670 61 74 63 68 29 7b 0a 20 20 64 6f 7b 0a 20 20 20  atch){.  do{.   
25680 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 70 2d   i64 iRowid = p-
25690 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 69 66 28  >iRowid;.    if(
256a0 20 70 2d 3e 62 44 65 73 63 3d 3d 30 20 26 26 20   p->bDesc==0 && 
256b0 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29  iRowid>=iMatch )
256c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
256d0 70 2d 3e 62 44 65 73 63 21 3d 30 20 26 26 20 69  p->bDesc!=0 && i
256e0 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20  Rowid<=iMatch ) 
256f0 62 72 65 61 6b 3b 0a 20 20 20 20 66 74 73 35 44  break;.    fts5D
25700 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
25710 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e  );.  }while( p->
25720 61 50 6f 73 6c 69 73 74 20 29 3b 0a 7d 0a 0a 2f  aPoslist );.}../
25730 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
25740 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72   next matching r
25750 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72 73  owid that occurs
25760 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61   at or after iMa
25770 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69  tch. The.** defi
25780 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72  nition of "at or
25790 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73 20   after" depends 
257a0 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73 20  on whether this 
257b0 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65  iterator iterate
257c0 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  s.** in ascendin
257d0 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20  g or descending 
257e0 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a  rowid order..*/.
257f0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
25800 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35  terNextFrom(Fts5
25810 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
25820 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20  , i64 iMatch){. 
25830 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63   if( pIter->pDoc
25840 6c 69 73 74 20 29 7b 0a 20 20 20 20 66 74 73 35  list ){.    fts5
25850 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 46  DoclistIterNextF
25860 72 6f 6d 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c  rom(pIter->pDocl
25870 69 73 74 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  ist, iMatch);.  
25880 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d  }else{.    fts5M
25890 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
258a0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
258b0 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 69  pIter->pMulti, i
258c0 4d 61 74 63 68 29 3b 0a 20 20 7d 0a 20 20 72 65  Match);.  }.  re
258d0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
258e0 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
258f0 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ex);.}../*.** Re
25900 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
25910 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73   rowid..*/.i64 s
25920 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 52 6f  qlite3Fts5IterRo
25930 77 69 64 28 46 74 73 35 49 6e 64 65 78 49 74 65  wid(Fts5IndexIte
25940 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
25950 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
25960 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
25970 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e  Iter->pDoclist->
25980 69 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b  iRowid;.  }else{
25990 0a 20 20 20 20 72 65 74 75 72 6e 20 66 74 73 35  .    return fts5
259a0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
259b0 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20  Iter->pMulti);. 
259c0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   }.}.../*.** Ret
259d0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
259e0 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
259f0 6e 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 74  ning a copy of t
25a00 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
25a10 20 66 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72 72   for.** the curr
25a20 65 6e 74 20 65 6e 74 72 79 2e 20 4f 75 74 70 75  ent entry. Outpu
25a30 74 20 76 61 72 69 61 62 6c 65 20 2a 70 6e 20 69  t variable *pn i
25a40 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
25a50 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
25a60 0a 2a 2a 20 69 6e 20 62 79 74 65 73 20 62 65 66  .** in bytes bef
25a70 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
25a80 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
25a90 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  d position list 
25aa0 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
25ab0 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20   the "number of 
25ac0 62 79 74 65 73 22 20 76 61 72 69 6e 74 0a 2a 2a  bytes" varint.**
25ad0 20 66 69 65 6c 64 20 74 68 61 74 20 73 74 61 72   field that star
25ae0 74 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  ts the position 
25af0 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  list on disk..*/
25b00 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
25b10 49 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35  IterPoslist(Fts5
25b20 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
25b30 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c  , const u8 **pp,
25b40 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 61 73 73   int *pn){.  ass
25b50 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
25b60 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
25b70 4b 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72  K );.  if( pIter
25b80 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  ->pDoclist ){.  
25b90 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70    *pn = pIter->p
25ba0 44 6f 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c 69 73  Doclist->nPoslis
25bb0 74 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74  t;.    *pp = pIt
25bc0 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50  er->pDoclist->aP
25bd0 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  oslist;.  }else{
25be0 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
25bf0 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
25c00 78 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  x;.    fts5Buffe
25c10 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
25c20 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35  slist);.    fts5
25c30 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74  MultiIterPoslist
25c40 28 70 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74  (p, pIter->pMult
25c50 69 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f  i, 0, &pIter->po
25c60 73 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 6e 20  slist);.    *pn 
25c70 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
25c80 2e 6e 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49  .n;.    *pp = pI
25c90 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
25ca0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
25cb0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
25cc0 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
25cd0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69  /*.** Close an i
25ce0 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62  terator opened b
25cf0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
25d00 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  l to sqlite3Fts5
25d10 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f  IndexQuery()..*/
25d20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
25d30 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49  5IterClose(Fts5I
25d40 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
25d50 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
25d60 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
25d70 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  pDoclist ){.    
25d80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
25d90 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e  Iter->pDoclist->
25da0 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
25db0 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 70 44  3_free(pIter->pD
25dc0 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  oclist);.    }el
25dd0 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  se{.      fts5Mu
25de0 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65  ltiIterFree(pIte
25df0 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
25e00 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  ->pMulti);.     
25e10 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
25e20 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74  lease(pIter->pSt
25e30 72 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73  ruct);.      fts
25e40 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
25e50 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
25e60 20 20 7d 0a 20 20 20 20 66 74 73 35 43 6c 6f 73    }.    fts5Clos
25e70 65 52 65 61 64 65 72 28 70 49 74 65 72 2d 3e 70  eReader(pIter->p
25e80 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
25e90 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
25ea0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
25eb0 61 64 20 74 68 65 20 22 61 76 65 72 61 67 65 73  ad the "averages
25ec0 22 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  " record into th
25ed0 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65  e buffer supplie
25ee0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
25ef0 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  .** argument. Re
25f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
25f10 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
25f20 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
25f30 20 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65   code.** if an e
25f40 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
25f50 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
25f60 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28  ndexGetAverages(
25f70 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
25f80 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b  s5Buffer *pBuf){
25f90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
25fa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
25fb0 20 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42   fts5DataReadOrB
25fc0 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46  uffer(p, pBuf, F
25fd0 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
25fe0 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ID);.  return ft
25ff0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
26000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  ;.}../*.** Repla
26010 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22  ce the current "
26020 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
26030 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
26040 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
26050 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73   .** supplied as
26060 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
26070 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
26080 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
26090 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64  Averages(Fts5Ind
260a0 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20  ex *p, const u8 
260b0 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
260c0 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  a){.  assert( p-
260d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
260e0 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74  ;.  fts5DataWrit
260f0 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47  e(p, FTS5_AVERAG
26100 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c  ES_ROWID, pData,
26110 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72   nData);.  retur
26120 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
26130 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
26140 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
26150 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73  number of blocks
26160 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73   this module has
26170 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
26180 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73  _data.** table s
26190 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61  ince it was crea
261a0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
261b0 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64  te3Fts5IndexRead
261c0 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  s(Fts5Index *p){
261d0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65  .  return p->nRe
261e0 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ad;.}../*.** Set
261f0 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b   the 32-bit cook
26200 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ie value stored 
26210 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
26220 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a  all structure .*
26230 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  * records to the
26240 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
26250 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
26260 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ment..**.** Retu
26270 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
26280 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
26290 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
262a0 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
262b0 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
262c0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
262d0 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35  exSetCookie(Fts5
262e0 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e  Index *p, int iN
262f0 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ew){.  int rc = 
26300 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
26310 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
26320 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
26330 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 0a   u8 aCookie[4];.
26340 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
26350 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
26360 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
26370 33 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b  3Fts5Put32(aCook
26380 69 65 2c 20 69 4e 65 77 29 3b 0a 20 20 66 6f 72  ie, iNew);.  for
26390 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
263a0 5f 4f 4b 20 26 26 20 69 3c 3d 70 43 6f 6e 66 69  _OK && i<=pConfi
263b0 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29  g->nPrefix; i++)
263c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  {.    sqlite3_bl
263d0 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 20  ob *pBlob = 0;. 
263e0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
263f0 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
26400 4f 57 49 44 28 69 29 3b 0a 20 20 20 20 72 63 20  OWID(i);.    rc 
26410 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
26420 70 65 6e 28 0a 20 20 20 20 20 20 20 20 70 43 6f  pen(.        pCo
26430 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69  nfig->db, pConfi
26440 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
26450 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52  Tbl, "block", iR
26460 6f 77 69 64 2c 20 31 2c 20 26 70 42 6c 6f 62 0a  owid, 1, &pBlob.
26470 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
26480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26490 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
264a0 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20  ob_write(pBlob, 
264b0 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a  aCookie, 4, 0);.
264c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
264d0 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42  e3_blob_close(pB
264e0 6c 6f 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lob);.    }.  }.
264f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26500 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
26510 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67 28  IndexLoadConfig(
26520 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
26530 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
26540 70 53 74 72 75 63 74 3b 0a 20 20 70 53 74 72 75  pStruct;.  pStru
26550 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
26560 72 65 52 65 61 64 28 70 2c 20 30 29 3b 0a 20 20  reRead(p, 0);.  
26570 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
26580 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
26590 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
265a0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
265b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
265c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
265d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
265e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
265f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
26600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26640 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68  ****.** Below th
26650 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20  is point is the 
26660 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
26670 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
26680 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75  e() scalar.** fu
26690 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a  nction only..*/.
266a0 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20  ./*.** Decode a 
266b0 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77  segment-data row
266c0 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  id from the %_da
266d0 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  ta table. This f
266e0 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68  unction is.** th
266f0 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20 6d 61  e opposite of ma
26700 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  cro FTS5_SEGMENT
26710 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61  _ROWID()..*/.sta
26720 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
26730 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36 34 20  odeRowid(.  i64 
26740 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  iRowid,         
26750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26760 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61 74 61  owid from %_data
26770 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
26780 2a 70 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  *piIdx,         
26790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
267a0 55 54 3a 20 49 6e 64 65 78 20 2a 2f 0a 20 20 69  UT: Index */.  i
267b0 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20  nt *piSegid,    
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
267d0 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69  * OUT: Segment i
267e0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65  d */.  int *piHe
267f0 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
26800 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48         /* OUT: H
26810 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  eight */.  int *
26820 70 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20  piPgno          
26830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
26840 54 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a  T: Page number *
26850 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d  /.){.  *piPgno =
26860 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
26870 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
26880 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20  _DATA_PAGE_B) - 
26890 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  1));.  iRowid >>
268a0 3d 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  = FTS5_DATA_PAGE
268b0 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74  _B;..  *piHeight
268c0 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
268d0 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
268e0 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42  S5_DATA_HEIGHT_B
268f0 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69  ) - 1));.  iRowi
26900 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
26910 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 69  HEIGHT_B;..  *pi
26920 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52  Segid = (int)(iR
26930 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
26940 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f  << FTS5_DATA_ID_
26950 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77  B) - 1));.  iRow
26960 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
26970 5f 49 44 5f 42 3b 0a 0a 20 20 2a 70 69 49 64 78  _ID_B;..  *piIdx
26980 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
26990 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
269a0 53 35 5f 44 41 54 41 5f 49 44 58 5f 42 29 20 2d  S5_DATA_IDX_B) -
269b0 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   1));.}..static 
269c0 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f  void fts5DebugRo
269d0 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  wid(int *pRc, Ft
269e0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
269f0 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74  i64 iKey){.  int
26a00 20 69 49 64 78 2c 69 53 65 67 69 64 2c 69 48 65   iIdx,iSegid,iHe
26a10 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20  ight,iPgno;  /* 
26a20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73  Rowid compenents
26a30 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65   */.  fts5Decode
26a40 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 49 64  Rowid(iKey, &iId
26a50 78 2c 20 26 69 53 65 67 69 64 2c 20 26 69 48 65  x, &iSegid, &iHe
26a60 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a  ight, &iPgno);..
26a70 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20    if( iSegid==0 
26a80 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d  ){.    if( iKey=
26a90 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52  =FTS5_AVERAGES_R
26aa0 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71  OWID ){.      sq
26ab0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
26ac0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
26ad0 20 70 42 75 66 2c 20 22 28 61 76 65 72 61 67 65   pBuf, "(average
26ae0 73 29 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  s) ");.    }else
26af0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
26b00 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
26b10 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
26b20 20 0a 20 20 20 20 20 20 20 20 20 20 22 7b 73 74   .          "{st
26b30 72 75 63 74 75 72 65 20 69 64 78 3d 25 64 7d 22  ructure idx=%d}"
26b40 2c 20 28 69 6e 74 29 28 69 4b 65 79 2d 31 30 29  , (int)(iKey-10)
26b50 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
26b60 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 69    }.  else if( i
26b70 48 65 69 67 68 74 3d 3d 46 54 53 35 5f 53 45 47  Height==FTS5_SEG
26b80 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48 54 20  MENT_MAX_HEIGHT 
26b90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
26ba0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
26bb0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
26bc0 22 28 64 6c 69 64 78 20 69 64 78 3d 25 64 20 73  "(dlidx idx=%d s
26bd0 65 67 69 64 3d 25 64 20 70 67 6e 6f 3d 25 64 29  egid=%d pgno=%d)
26be0 22 2c 0a 20 20 20 20 20 20 20 20 69 49 64 78 2c  ",.        iIdx,
26bf0 20 69 53 65 67 69 64 2c 20 69 50 67 6e 6f 0a 20   iSegid, iPgno. 
26c00 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
26c10 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
26c20 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
26c30 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28 69 64  (pRc, pBuf, "(id
26c40 78 3d 25 64 20 73 65 67 69 64 3d 25 64 20 68 3d  x=%d segid=%d h=
26c50 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20 20  %d pgno=%d)",.  
26c60 20 20 20 20 20 20 69 49 64 78 2c 20 69 53 65 67        iIdx, iSeg
26c70 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67  id, iHeight, iPg
26c80 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  no.    );.  }.}.
26c90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
26ca0 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
26cb0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cd0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
26ce0 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
26cf0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
26d00 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
26d10 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c  *p.){.  int iLvl
26d20 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  , iSeg;         
26d30 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
26d40 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
26d50 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a  s, segments */..
26d60 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
26d70 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  vl<p->nLevel; iL
26d80 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53  vl++){.    Fts5S
26d90 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
26da0 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c  Lvl = &p->aLevel
26db0 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69  [iLvl];.    sqli
26dc0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
26dd0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
26de0 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20  Buf, .        " 
26df0 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25  {lvl=%d nMerge=%
26e00 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e  d", iLvl, pLvl->
26e10 6e 4d 65 72 67 65 0a 20 20 20 20 29 3b 0a 20 20  nMerge.    );.  
26e20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
26e30 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
26e40 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Seg++){.      Ft
26e50 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
26e60 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
26e70 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
26e80 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
26e90 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
26ea0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20  f(pRc, pBuf, .  
26eb0 20 20 20 20 20 20 20 20 22 20 7b 69 64 3d 25 64          " {id=%d
26ec0 20 68 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e   h=%d leaves=%d.
26ed0 2e 25 64 7d 22 2c 20 70 53 65 67 2d 3e 69 53 65  .%d}", pSeg->iSe
26ee0 67 69 64 2c 20 70 53 65 67 2d 3e 6e 48 65 69 67  gid, pSeg->nHeig
26ef0 68 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  ht, .          p
26f00 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c 20  Seg->pgnoFirst, 
26f10 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20  pSeg->pgnoLast. 
26f20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
26f30 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
26f40 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
26f50 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29 3b  pRc, pBuf, "}");
26f60 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
26f70 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  is is part of th
26f80 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20  e fts5_decode() 
26f90 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a  debugging aid..*
26fa0 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70  *.** Arguments p
26fb0 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61  Blob/nBlob conta
26fc0 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64 20  in a serialized 
26fd0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
26fe0 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ject. This.** fu
26ff0 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
27000 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
27010 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
27020 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65 63  f the same objec
27030 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66 66  t.** to the buff
27040 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
27050 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
27060 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
27070 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75  d fts5DecodeStru
27080 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
27090 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
270a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
270b0 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
270c0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
270d0 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38  pBuf,.  const u8
270e0 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c   *pBlob, int nBl
270f0 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ob.){.  int rc; 
27100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27110 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
27120 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
27130 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30  Structure *p = 0
27140 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
27150 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65  ecoded structure
27160 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63   object */..  rc
27170 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
27180 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42  Decode(pBlob, nB
27190 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20 69  lob, 0, &p);.  i
271a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
271b0 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 72   ){.    *pRc = r
271c0 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
271d0 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67 53   }..  fts5DebugS
271e0 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70 42  tructure(pRc, pB
271f0 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53 74  uf, p);.  fts5St
27200 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
27210 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66  );.}../*.** Buff
27220 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75  er (a/n) is assu
27230 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  med to contain a
27240 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69   list of seriali
27250 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61  zed varints. Rea
27260 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74  d.** each varint
27270 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20   and append its 
27280 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
27290 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20  ation to buffer 
272a0 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  pBuf. Return.** 
272b0 61 66 74 65 72 20 65 69 74 68 65 72 20 74 68 65  after either the
272c0 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73   input buffer is
272d0 20 65 78 68 61 75 73 74 65 64 20 6f 72 20 61 20   exhausted or a 
272e0 30 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e  0 value is read.
272f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
27300 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
27310 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
27320 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
27330 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
27340 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
27350 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a  odePoslist(int *
27360 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
27370 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
27380 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *a, int n){.  in
27390 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68  t iOff = 0;.  wh
273a0 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
273b0 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20     int iVal;.   
273c0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
273d0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
273e0 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71  ], iVal);.    sq
273f0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
27400 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
27410 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56   pBuf, " %d", iV
27420 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  al);.  }.  retur
27430 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
27440 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75   The start of bu
27450 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61  ffer (a/n) conta
27460 69 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66  ins the start of
27470 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20   a doclist. The 
27480 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f  doclist.** may o
27490 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68  r may not finish
274a0 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
274b0 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
274c0 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74  n appends a text
274d0 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69  .** representati
274e0 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f  on of the part o
274f0 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68  f the doclist th
27500 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f  at is present to
27510 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e   buffer.** pBuf.
27520 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75   .**.** The retu
27530 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
27540 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
27550 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  read from the in
27560 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73  put buffer..*/.s
27570 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65  tatic int fts5De
27580 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20  codeDoclist(int 
27590 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
275a0 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38   *pBuf, const u8
275b0 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *a, int n){.  i
275c0 36 34 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74  64 iDocid;.  int
275d0 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66   iOff = 0;..  if
275e0 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
275f0 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
27600 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
27610 5d 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64  ], (u64*)&iDocid
27620 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
27630 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
27640 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
27650 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69  " rowid=%lld", i
27660 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68  Docid);.  }.  wh
27670 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
27680 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
27690 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
276a0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
276b0 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69  PoslistSize(&a[i
276c0 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
276d0 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20  ummy);.    iOff 
276e0 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73  += fts5DecodePos
276f0 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20  list(pRc, pBuf, 
27700 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d  &a[iOff], MIN(n-
27710 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20  iOff, nPos));.  
27720 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
27730 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
27740 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
27750 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
27760 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
27770 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
27780 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
27790 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20   return iOff;.  
277a0 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44      iDocid += iD
277b0 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69  elta;.      sqli
277c0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
277d0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
277e0 42 75 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c  Buf, " rowid=%ll
277f0 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20  d", iDocid);.   
27800 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
27810 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
27820 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
27830 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  on of user-defin
27840 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
27850 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  on fts5_decode()
27860 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27870 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
27880 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
27890 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
278a0 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
278b0 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
278c0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
278d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
278e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
278f0 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32  f args (always 2
27900 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) */.  sqlite3_v
27910 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
27920 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
27930 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
27940 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ){.  i64 iRowid;
27950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27960 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
27970 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64  r record being d
27980 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ecoded */.  int 
27990 69 49 64 78 2c 69 53 65 67 69 64 2c 69 48 65 69  iIdx,iSegid,iHei
279a0 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52  ght,iPgno;  /* R
279b0 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  owid components 
279c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  */.  const u8 *a
279d0 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20  Blob; int n;    
279e0 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74       /* Record t
279f0 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38  o decode */.  u8
27a00 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42   *a = 0;.  Fts5B
27a10 75 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20  uffer s;        
27a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
27a30 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72  ild up text to r
27a40 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20  eturn here */.  
27a50 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27a60 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
27a70 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
27a80 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d  /.  int nSpace =
27a90 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   0;..  assert( n
27aa0 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73  Arg==2 );.  mems
27ab0 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
27ac0 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
27ad0 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65   iRowid = sqlite
27ae0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
27af0 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73  Val[0]);.  n = s
27b00 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
27b10 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  es(apVal[1]);.  
27b20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  aBlob = sqlite3_
27b30 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c  value_blob(apVal
27b40 5b 31 5d 29 3b 0a 0a 20 20 6e 53 70 61 63 65 20  [1]);..  nSpace 
27b50 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  = n + FTS5_DATA_
27b60 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20  ZERO_PADDING;.  
27b70 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  a = (u8*)sqlite3
27b80 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
27b90 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  rc, nSpace);.  i
27ba0 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64  f( a==0 ) goto d
27bb0 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d  ecode_out;.  mem
27bc0 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29  cpy(a, aBlob, n)
27bd0 3b 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f  ;.  fts5DecodeRo
27be0 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69 49 64  wid(iRowid, &iId
27bf0 78 2c 20 26 69 53 65 67 69 64 2c 20 26 69 48 65  x, &iSegid, &iHe
27c00 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a  ight, &iPgno);..
27c10 20 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64    fts5DebugRowid
27c20 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64  (&rc, &s, iRowid
27c30 29 3b 0a 20 20 69 66 28 20 69 48 65 69 67 68 74  );.  if( iHeight
27c40 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d  ==FTS5_SEGMENT_M
27c50 41 58 5f 48 45 49 47 48 54 20 29 7b 0a 20 20 20  AX_HEIGHT ){.   
27c60 20 46 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b   Fts5Data dlidx;
27c70 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74  .    Fts5DlidxIt
27c80 65 72 20 69 74 65 72 3b 0a 0a 20 20 20 20 64 6c  er iter;..    dl
27c90 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64  idx.p = a;.    d
27ca0 6c 69 64 78 2e 6e 20 3d 20 6e 3b 0a 20 20 20 20  lidx.n = n;.    
27cb0 64 6c 69 64 78 2e 6e 52 65 66 20 3d 20 32 3b 0a  dlidx.nRef = 2;.
27cc0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 74 65  .    memset(&ite
27cd0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
27ce0 35 44 6c 69 64 78 49 74 65 72 29 29 3b 0a 20 20  5DlidxIter));.  
27cf0 20 20 69 74 65 72 2e 70 44 61 74 61 20 3d 20 26    iter.pData = &
27d00 64 6c 69 64 78 3b 0a 20 20 20 20 69 74 65 72 2e  dlidx;.    iter.
27d10 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e  iLeafPgno = iPgn
27d20 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35  o;..    for(fts5
27d30 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 26  DlidxIterFirst(&
27d40 69 74 65 72 29 3b 20 69 74 65 72 2e 62 45 6f 66  iter); iter.bEof
27d50 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78 49 74  ==0; fts5DlidxIt
27d60 65 72 4e 65 78 74 28 26 69 74 65 72 29 29 7b 0a  erNext(&iter)){.
27d70 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
27d80 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
27d90 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20  ntf(&rc, &s, .  
27da0 20 20 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c          " %d(%ll
27db0 64 29 22 2c 20 69 74 65 72 2e 69 4c 65 61 66 50  d)", iter.iLeafP
27dc0 67 6e 6f 2c 20 69 74 65 72 2e 69 52 6f 77 69 64  gno, iter.iRowid
27dd0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
27de0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53 65 67    }else if( iSeg
27df0 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  id==0 ){.    if(
27e00 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56   iRowid==FTS5_AV
27e10 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a  ERAGES_ROWID ){.
27e20 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f        /* todo */
27e30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27e40 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75    fts5DecodeStru
27e50 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61  cture(&rc, &s, a
27e60 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , n);.    }.  }e
27e70 6c 73 65 7b 0a 0a 20 20 20 20 46 74 73 35 42 75  lse{..    Fts5Bu
27e80 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 20 20 6d  ffer term;.    m
27e90 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
27ea0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
27eb0 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 48  r));..    if( iH
27ec0 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eight==0 ){.    
27ed0 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d    int iTermOff =
27ee0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52   0;.      int iR
27ef0 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20  owidOff = 0;.   
27f00 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
27f10 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
27f20 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 3d  ;..      if( n>=
27f30 34 20 29 7b 0a 20 20 20 20 20 20 20 20 69 52 6f  4 ){.        iRo
27f40 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74  widOff = fts5Get
27f50 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20  U16(&a[0]);.    
27f60 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 66      iTermOff = f
27f70 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29  ts5GetU16(&a[2])
27f80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27f90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
27fa0 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
27fb0 20 26 73 2c 20 38 2c 20 28 63 6f 6e 73 74 20 75   &s, 8, (const u
27fc0 38 2a 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20  8*)"corrupt");. 
27fd0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f         goto deco
27fe0 64 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  de_out;.      }.
27ff0 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69  .      if( iRowi
28000 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  dOff ){.        
28010 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66  iOff = iRowidOff
28020 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
28030 28 20 69 54 65 72 6d 4f 66 66 20 29 7b 0a 20 20  ( iTermOff ){.  
28040 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65        iOff = iTe
28050 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  rmOff;.      }el
28060 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  se{.        iOff
28070 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = n;.      }.  
28080 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f      fts5DecodePo
28090 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  slist(&rc, &s, &
280a0 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a  a[4], iOff-4);..
280b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 52        assert( iR
280c0 6f 77 69 64 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f  owidOff==0 || iO
280d0 66 66 3d 3d 69 52 6f 77 69 64 4f 66 66 20 29 3b  ff==iRowidOff );
280e0 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69  .      if( iRowi
280f0 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  dOff ){.        
28100 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
28110 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
28120 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69  s, &a[iOff], n-i
28130 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Off);.      }.. 
28140 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65       assert( iTe
28150 72 6d 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66  rmOff==0 || iOff
28160 3d 3d 69 54 65 72 6d 4f 66 66 20 29 3b 0a 20 20  ==iTermOff );.  
28170 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c      while( iOff<
28180 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  n ){.        int
28190 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
281a0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
281b0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
281c0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
281d0 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65 65 70 3b    term.n= nKeep;
281e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
281f0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72  ferAppendBlob(&r
28200 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c  c, &term, nByte,
28210 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20   &a[iOff]);.    
28220 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74      iOff += nByt
28230 65 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e;..        sqli
28240 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
28250 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20  endPrintf(.     
28260 20 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20         &rc, &s, 
28270 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65  " term=%.*s", te
28280 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61  rm.n, (const cha
28290 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20  r*)term.p.      
282a0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66    );.        iOf
282b0 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44  f += fts5DecodeD
282c0 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
282d0 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66  &a[iOff], n-iOff
282e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
282f0 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
28300 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
28310 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
28320 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
28330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28340 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46       fts5BufferF
28350 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 20 20  ree(&term);.    
28360 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73  }else{.      Fts
28370 35 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20  5NodeIter ss;.  
28380 20 20 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65      for(fts5Node
28390 49 74 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26  IterInit(a, n, &
283a0 73 73 29 3b 20 73 73 2e 61 44 61 74 61 3b 20 66  ss); ss.aData; f
283b0 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
283c0 26 72 63 2c 20 26 73 73 29 29 7b 0a 20 20 20 20  &rc, &ss)){.    
283d0 20 20 20 20 69 66 28 20 73 73 2e 74 65 72 6d 2e      if( ss.term.
283e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
283f0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
28400 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
28410 26 72 63 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d  &rc, &s, " left=
28420 25 64 22 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b  %d", ss.iChild);
28430 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
28440 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28450 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
28460 64 50 72 69 6e 74 66 28 26 72 63 2c 26 73 2c 20  dPrintf(&rc,&s, 
28470 22 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20  " \"%.*s\"", .  
28480 20 20 20 20 20 20 20 20 20 20 20 20 73 73 2e 74              ss.t
28490 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70  erm.n, ss.term.p
284a0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
284b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
284c0 69 66 28 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b  if( ss.nEmpty ){
284d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
284e0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
284f0 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73  ndPrintf(&rc, &s
28500 2c 20 22 20 65 6d 70 74 79 3d 25 64 25 73 22 2c  , " empty=%d%s",
28510 20 73 73 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20   ss.nEmpty,.    
28520 20 20 20 20 20 20 20 20 20 20 73 73 2e 62 44 6c            ss.bDl
28530 69 64 78 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20  idx ? "*" : "". 
28540 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
28550 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28560 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
28570 46 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 7d  Free(&ss);.    }
28580 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f  .  }.  . decode_
28590 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
285a0 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63  ree(a);.  if( rc
285b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
285c0 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
285d0 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f  t_text(pCtx, (co
285e0 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73  nst char*)s.p, s
285f0 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  .n, SQLITE_TRANS
28600 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  IENT);.  }else{.
28610 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
28620 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43  lt_error_code(pC
28630 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66  tx, rc);.  }.  f
28640 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 73  ts5BufferFree(&s
28650 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
28660 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
28670 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  f user-defined s
28680 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66  calar function f
28690 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a  ts5_rowid()..*/.
286a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
286b0 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20  RowidFunction(. 
286c0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
286d0 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
286e0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c   /* Function cal
286f0 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  l context */.  i
28700 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28720 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  * Number of args
28730 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20   (always 2) */. 
28740 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
28750 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
28760 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
28770 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
28780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b  onst char *zArg;
28790 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29  .  if( nArg==0 )
287a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
287b0 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
287c0 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73   "should be: fts
287d0 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c  5_rowid(subject,
287e0 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20   ....)", -1);.  
287f0 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20  }else{.    zArg 
28800 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
28810 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
28820 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20  t(apVal[0]);.   
28830 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
28840 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73  stricmp(zArg, "s
28850 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  egment") ){.    
28860 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
28870 20 20 20 20 69 6e 74 20 69 64 78 2c 20 73 65 67      int idx, seg
28880 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f  id, height, pgno
28890 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
288a0 21 3d 35 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=5 ){.        s
288b0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
288c0 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
288d0 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62         "should b
288e0 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73  e: fts5_rowid('s
288f0 65 67 6d 65 6e 74 27 2c 20 69 64 78 2c 20 73 65  egment', idx, se
28900 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e  gid, height, pgn
28910 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20  o))", -1.       
28920 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
28930 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 73  .        idx = s
28940 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
28950 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20  (apVal[1]);.    
28960 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69      segid = sqli
28970 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
28980 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20  Val[2]);.       
28990 20 68 65 69 67 68 74 20 3d 20 73 71 6c 69 74 65   height = sqlite
289a0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
289b0 6c 5b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  l[3]);.        p
289c0 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  gno = sqlite3_va
289d0 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 34 5d  lue_int(apVal[4]
289e0 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69  );.        iRowi
289f0 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
28a00 5f 52 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69  _ROWID(idx, segi
28a10 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  d, height, pgno)
28a20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28a30 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
28a40 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Ctx, iRowid);.  
28a50 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
28a60 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73  if( 0==sqlite3_s
28a70 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 74  tricmp(zArg, "st
28a80 61 72 74 2d 6f 66 2d 69 6e 64 65 78 22 29 20 29  art-of-index") )
28a90 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  {.      i64 iRow
28aa0 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  id;.      int id
28ab0 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  x;.      if( nAr
28ac0 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=2 ){.        
28ad0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
28ae0 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20  rror(pCtx, .    
28af0 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20          "should 
28b00 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27  be: fts5_rowid('
28b10 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78 27 2c  start-of-index',
28b20 20 69 64 78 29 22 2c 20 2d 31 0a 20 20 20 20 20   idx)", -1.     
28b30 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73     );.      }els
28b40 65 7b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  e{.        idx =
28b50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
28b60 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  nt(apVal[1]);.  
28b70 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46        iRowid = F
28b80 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
28b90 44 28 69 64 78 2c 20 31 2c 20 30 2c 20 30 29 3b  D(idx, 1, 0, 0);
28ba0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28bb0 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43  _result_int64(pC
28bc0 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  tx, iRowid);.   
28bd0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 7b     }.    }else {
28be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
28bf0 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
28c00 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69 72 73  , .        "firs
28c10 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f  t arg to fts5_ro
28c20 77 69 64 28 29 20 6d 75 73 74 20 62 65 20 27 73  wid() must be 's
28c30 65 67 6d 65 6e 74 27 20 22 0a 20 20 20 20 20 20  egment' ".      
28c40 20 20 22 6f 72 20 27 73 74 61 72 74 2d 6f 66 2d    "or 'start-of-
28c50 69 6e 64 65 78 27 22 0a 20 20 20 20 20 20 20 20  index'".        
28c60 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  , -1.      );.  
28c70 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
28c80 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
28c90 61 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73  as part of regis
28ca0 74 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20  tering the FTS5 
28cb0 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61  module with data
28cc0 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
28cd0 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74  on db. It regist
28ce0 65 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72  ers several user
28cf0 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
28d00 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c  functions useful
28d10 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a  .** with FTS5..*
28d20 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
28d30 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
28d40 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
28d50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
28d60 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c  ome other.** SQL
28d70 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
28d80 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
28d90 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
28da0 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28  e3Fts5IndexInit(
28db0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
28dc0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
28dd0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
28de0 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73  (.      db, "fts
28df0 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51  5_decode", 2, SQ
28e00 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
28e10 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
28e20 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66  , 0, 0.  );.  if
28e30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28e40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
28e50 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
28e60 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ion(.        db,
28e70 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d   "fts5_rowid", -
28e80 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
28e90 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63  0, fts5RowidFunc
28ea0 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29  tion, 0, 0.    )
28eb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28ec0 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
28ed0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
28ee0 53 35 20 2a 2f 0a                                S5 */.