/ Hex Artifact Content
Login

Artifact 33473b527bc0a20fe4d262c2b7b4b67d6c4db5a2:


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 6e  s5Int.h..*/..#in
0280: 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e 68  clude "fts5Int.h
0290: 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69 65  "../*.** Overvie
02a0: 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  w:.**.** The %_d
02b0: 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  ata table contai
02c0: 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20 69  ns all the FTS i
02d0: 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46 54  ndexes for an FT
02e0: 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  S5 virtual table
02f0: 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20  ..** As well as 
0300: 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69 6e  the main term in
0310: 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20 62  dex, there may b
0320: 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66 69  e up to 31 prefi
0330: 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54 68  x indexes..** Th
0340: 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d 69  e format is simi
0350: 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20 65  lar to FTS3/4, e
0360: 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a 2a  xcept that:.**.*
0370: 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65 6e  *   * all segmen
0380: 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64 61  t b-tree leaf da
0390: 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ta is stored in 
03a0: 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65 20  fixed size page 
03b0: 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20 20  records .**     
03c0: 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65 73  (e.g. 1000 bytes
03d0: 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63 6c  ). A single docl
03e0: 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75 6c  ist may span mul
03f0: 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61 72  tiple pages. Car
0400: 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61 6b  e is .**     tak
0410: 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74 20  en to ensure it 
0420: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 69  is possible to i
0430: 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65 72  terate in either
0440: 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f 75   direction throu
0450: 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20 65  gh .**     the e
0460: 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63 6c  ntries in a docl
0470: 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b 20  ist, or to seek 
0480: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65 6e  to a specific en
0490: 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a 2a  try within a .**
04a0: 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77 69       doclist, wi
04b0: 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69 74  thout loading it
04c0: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
04d0: 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64 6f  .**   * large do
04e0: 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61 6e  clists that span
04f0: 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76 65   many pages have
0500: 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f 63   associated "doc
0510: 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20 20  list index".**  
0520: 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74 20     records that 
0530: 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20 6f  contain a copy o
0540: 66 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69  f the first doci
0550: 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 73  d on each page s
0560: 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20 20  panned by.**    
0570: 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54 68   the doclist. Th
0580: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  is is used to sp
0590: 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65 72  eed up seek oper
05a0: 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72 67  ations, and merg
05b0: 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61 72  es of.**     lar
05c0: 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74 68  ge doclists with
05d0: 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63 6c   very small docl
05e0: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ists..**.**   * 
05f0: 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e 20  extra fields in 
0600: 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20 72  the "structure r
0610: 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74 68  ecord" record th
0620: 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f 69  e state of ongoi
0630: 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65 6d  ng.**     increm
0640: 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72  ental merge oper
0650: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a 23  ations..**.*/..#
0660: 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50 54 5f  define FTS5_OPT_
0670: 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30 30 20  WORK_UNIT  1000 
0680: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
0690: 61 66 20 70 61 67 65 73 20 70 65 72 20 6f 70 74  af pages per opt
06a0: 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a 23 64  imize step */.#d
06b0: 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52 4b 5f  efine FTS5_WORK_
06c0: 55 4e 49 54 20 20 20 20 20 20 36 34 20 20 20 20  UNIT      64    
06d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
06e0: 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69 74 20  f pages in unit 
06f0: 6f 66 20 77 6f 72 6b 20 2a 2f 0a 23 64 65 66 69  of work */.#defi
0700: 6e 65 20 46 54 53 35 5f 43 52 49 53 49 53 5f 4d  ne FTS5_CRISIS_M
0710: 45 52 47 45 20 20 20 31 36 20 20 20 20 2f 2a 20  ERGE   16    /* 
0720: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
0730: 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
0740: 72 67 65 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  rge */..#define 
0750: 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
0760: 49 5a 45 20 20 34 20 20 20 20 2f 2a 20 41 64 64  IZE  4    /* Add
0770: 20 64 6c 69 64 78 20 69 66 20 74 68 69 73 20 6d   dlidx if this m
0780: 61 6e 79 20 65 6d 70 74 79 20 70 61 67 65 73 20  any empty pages 
0790: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c  */../*.** Detail
07a0: 73 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  s:.**.** The %_d
07b0: 61 74 61 20 74 61 62 6c 65 20 6d 61 6e 61 67 65  ata table manage
07c0: 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c 65  d by this module
07d0: 2c 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41  ,.**.**     CREA
07e0: 54 45 20 54 41 42 4c 45 20 25 5f 64 61 74 61 28  TE TABLE %_data(
07f0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
0800: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c  RY KEY, block BL
0810: 4f 42 29 3b 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e  OB);.**.** , con
0820: 74 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77  tains the follow
0830: 69 6e 67 20 35 20 74 79 70 65 73 20 6f 66 20 72  ing 5 types of r
0840: 65 63 6f 72 64 73 2e 20 53 65 65 20 74 68 65 20  ecords. See the 
0850: 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e  comments surroun
0860: 64 69 6e 67 0a 2a 2a 20 74 68 65 20 46 54 53 35  ding.** the FTS5
0870: 5f 2a 5f 52 4f 57 49 44 20 6d 61 63 72 6f 73 20  _*_ROWID macros 
0880: 62 65 6c 6f 77 20 66 6f 72 20 61 20 64 65 73 63  below for a desc
0890: 72 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20 25  ription of how %
08a0: 5f 64 61 74 61 20 72 6f 77 69 64 73 20 61 72 65  _data rowids are
08b0: 20 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20 74 6f   .** assigned to
08c0: 20 65 61 63 68 20 66 6f 20 74 68 65 6d 2e 0a 2a   each fo them..*
08d0: 2a 0a 2a 2a 20 31 2e 20 53 74 72 75 63 74 75 72  *.** 1. Structur
08e0: 65 20 52 65 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a  e Records:.**.**
08f0: 20 20 20 54 68 65 20 73 65 74 20 6f 66 20 73 65     The set of se
0900: 67 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 6b 65  gments that make
0910: 20 75 70 20 61 6e 20 69 6e 64 65 78 20 2d 20 74   up an index - t
0920: 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
0930: 72 65 20 2d 20 61 72 65 0a 2a 2a 20 20 20 72 65  re - are.**   re
0940: 63 6f 72 64 65 64 20 69 6e 20 61 20 73 69 6e 67  corded in a sing
0950: 6c 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e  le record within
0960: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
0970: 65 2e 20 54 68 65 20 72 65 63 6f 72 64 20 63 6f  e. The record co
0980: 6e 73 69 73 74 73 0a 2a 2a 20 20 20 6f 66 20 61  nsists.**   of a
0990: 20 73 69 6e 67 6c 65 20 33 32 2d 62 69 74 20 63   single 32-bit c
09a0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
09b0: 6b 69 65 20 76 61 6c 75 65 20 66 6f 6c 6c 6f 77  kie value follow
09c0: 65 64 20 62 79 20 61 20 6c 69 73 74 20 6f 66 20  ed by a list of 
09d0: 0a 2a 2a 20 20 20 53 51 4c 69 74 65 20 76 61 72  .**   SQLite var
09e0: 69 6e 74 73 2e 20 49 66 20 74 68 65 20 46 54 53  ints. If the FTS
09f0: 20 74 61 62 6c 65 20 66 65 61 74 75 72 65 73 20   table features 
0a00: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 69 6e  more than one in
0a10: 64 65 78 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  dex (because.** 
0a20: 20 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65 20    there are one 
0a30: 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20 69  or more prefix i
0a40: 6e 64 65 78 65 73 29 2c 20 69 74 20 69 73 20 67  ndexes), it is g
0a50: 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 61  uaranteed that a
0a60: 6c 6c 20 73 68 61 72 65 0a 2a 2a 20 20 20 74 68  ll share.**   th
0a70: 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61  e same cookie va
0a80: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d  lue..**.**   Imm
0a90: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
0aa0: 6e 67 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  ng the configura
0ab0: 74 69 6f 6e 20 63 6f 6f 6b 69 65 2c 20 74 68 65  tion cookie, the
0ac0: 20 72 65 63 6f 72 64 20 62 65 67 69 6e 73 20 77   record begins w
0ad0: 69 74 68 0a 2a 2a 20 20 20 74 68 72 65 65 20 76  ith.**   three v
0ae0: 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  arints:.**.**   
0af0: 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65    + number of le
0b00: 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 74  vels,.**     + t
0b10: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
0b20: 65 67 6d 65 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c  egments on all l
0b30: 65 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20  evels,.**     + 
0b40: 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 20 63  value of write c
0b50: 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  ounter..**.**   
0b60: 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 6c  Then, for each l
0b70: 65 76 65 6c 20 66 72 6f 6d 20 30 20 74 6f 20 6e  evel from 0 to n
0b80: 4d 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b  Max:.**.**     +
0b90: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   number of input
0ba0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 6e 67   segments in ong
0bb0: 6f 69 6e 67 20 6d 65 72 67 65 2e 0a 2a 2a 20 20  oing merge..**  
0bc0: 20 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65     + total numbe
0bd0: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e  r of segments in
0be0: 20 6c 65 76 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b   level..**     +
0bf0: 20 66 6f 72 20 65 61 63 68 20 73 65 67 6d 65 6e   for each segmen
0c00: 74 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f  t from oldest to
0c10: 20 6e 65 77 65 73 74 3a 0a 2a 2a 20 20 20 20 20   newest:.**     
0c20: 20 20 20 20 2b 20 73 65 67 6d 65 6e 74 20 69 64      + segment id
0c30: 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a   (always > 0).**
0c40: 20 20 20 20 20 20 20 20 20 2b 20 62 2d 74 72 65           + b-tre
0c50: 65 20 68 65 69 67 68 74 20 28 31 20 2d 3e 20 72  e height (1 -> r
0c60: 6f 6f 74 20 69 73 20 6c 65 61 66 2c 20 32 20 2d  oot is leaf, 2 -
0c70: 3e 20 72 6f 6f 74 20 69 73 20 70 61 72 65 6e 74  > root is parent
0c80: 20 6f 66 20 6c 65 61 66 20 65 74 63 2e 29 0a 2a   of leaf etc.).*
0c90: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 72 73  *         + firs
0ca0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
0cb0: 65 72 20 28 6f 66 74 65 6e 20 31 2c 20 61 6c 77  er (often 1, alw
0cc0: 61 79 73 20 67 72 65 61 74 65 72 20 74 68 61 6e  ays greater than
0cd0: 20 30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b   0).**         +
0ce0: 20 66 69 6e 61 6c 20 6c 65 61 66 20 70 61 67 65   final leaf page
0cf0: 20 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e   number.**.** 2.
0d00: 20 54 68 65 20 41 76 65 72 61 67 65 73 20 52 65   The Averages Re
0d10: 63 6f 72 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20  cord:.**.**   A 
0d20: 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 69  single record wi
0d30: 74 68 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  thin the %_data 
0d40: 74 61 62 6c 65 2e 20 54 68 65 20 64 61 74 61 20  table. The data 
0d50: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72  is a list of var
0d60: 69 6e 74 73 2e 0a 2a 2a 20 20 20 54 68 65 20 66  ints..**   The f
0d70: 69 72 73 74 20 76 61 6c 75 65 20 69 73 20 74 68  irst value is th
0d80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
0d90: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 20 54   in the index. T
0da0: 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 63 6f  hen, for each co
0db0: 6c 75 6d 6e 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c  lumn.**   from l
0dc0: 65 66 74 20 74 6f 20 72 69 67 68 74 2c 20 74 68  eft to right, th
0dd0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
0de0: 66 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20  f tokens in the 
0df0: 63 6f 6c 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a  column for all .
0e00: 2a 2a 20 20 20 72 6f 77 73 20 6f 66 20 74 68 65  **   rows of the
0e10: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e   table..**.** 3.
0e20: 20 53 65 67 6d 65 6e 74 20 6c 65 61 76 65 73 3a   Segment leaves:
0e30: 0a 2a 2a 0a 2a 2a 20 20 20 54 45 52 4d 20 44 4f  .**.**   TERM DO
0e40: 43 4c 49 53 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a  CLIST FORMAT:.**
0e50: 0a 2a 2a 20 20 20 20 20 4d 6f 73 74 20 6f 66 20  .**     Most of 
0e60: 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61  each segment lea
0e70: 66 20 69 73 20 74 61 6b 65 6e 20 75 70 20 62 79  f is taken up by
0e80: 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61   term/doclist da
0e90: 74 61 2e 20 54 68 65 20 0a 2a 2a 20 20 20 20 20  ta. The .**     
0ea0: 67 65 6e 65 72 61 6c 20 66 6f 72 6d 61 74 20 6f  general format o
0eb0: 66 20 74 68 65 20 74 65 72 6d 2f 64 6f 63 6c 69  f the term/docli
0ec0: 73 74 20 64 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a  st data is:.**.*
0ed0: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
0ee0: 20 3a 20 73 69 7a 65 20 6f 66 20 66 69 72 73 74   : size of first
0ef0: 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20   term.**        
0f00: 20 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74 20   blob:    first 
0f10: 74 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20  term data.**    
0f20: 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 66 69       doclist: fi
0f30: 72 73 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20  rst doclist.**  
0f40: 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d         zero-or-m
0f50: 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ore {.**        
0f60: 20 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62     varint:  numb
0f70: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  er of bytes in c
0f80: 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65 76 69  ommon with previ
0f90: 6f 75 73 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20  ous term.**     
0fa0: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 6e        varint:  n
0fb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
0fc0: 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 20  f new term data 
0fd0: 28 6e 4e 65 77 29 0a 2a 2a 20 20 20 20 20 20 20  (nNew).**       
0fe0: 20 20 20 20 62 6c 6f 62 3a 20 20 20 20 6e 4e 65      blob:    nNe
0ff0: 77 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74  w bytes of new t
1000: 65 72 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20  erm data.**     
1010: 20 20 20 20 20 20 64 6f 63 6c 69 73 74 3a 20 6e        doclist: n
1020: 65 78 74 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20  ext doclist.**  
1030: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1040: 20 20 20 64 6f 63 6c 69 73 74 20 66 6f 72 6d 61     doclist forma
1050: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1060: 20 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74 20   varint:  first 
1070: 72 6f 77 69 64 0a 2a 2a 20 20 20 20 20 20 20 20  rowid.**        
1080: 20 70 6f 73 6c 69 73 74 3a 20 66 69 72 73 74 20   poslist: first 
1090: 70 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  poslist.**      
10a0: 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20     zero-or-more 
10b0: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76  {.**           v
10c0: 61 72 69 6e 74 3a 20 20 72 6f 77 69 64 20 64 65  arint:  rowid de
10d0: 6c 74 61 20 28 61 6c 77 61 79 73 20 3e 20 30 29  lta (always > 0)
10e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 70 6f  .**           po
10f0: 73 6c 69 73 74 3a 20 66 69 72 73 74 20 70 6f 73  slist: first pos
1100: 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  list.**         
1110: 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20 30 78 30  }.**         0x0
1120: 30 20 62 79 74 65 0a 2a 2a 0a 2a 2a 20 20 20 20  0 byte.**.**    
1130: 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61 74 3a   poslist format:
1140: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76  .**.**         v
1150: 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66 20 70  arint: size of p
1160: 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73 2e  oslist in bytes.
1170: 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 20 74   not including t
1180: 68 69 73 20 66 69 65 6c 64 2e 0a 2a 2a 20 20 20  his field..**   
1190: 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63        collist: c
11a0: 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d  ollist for colum
11b0: 6e 20 30 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  n 0.**         z
11c0: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
11d0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 31 20             0x01 
11e0: 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  byte.**         
11f0: 20 20 76 61 72 69 6e 74 3a 20 63 6f 6c 75 6d 6e    varint: column
1200: 20 6e 75 6d 62 65 72 20 28 49 29 0a 2a 2a 20 20   number (I).**  
1210: 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74           collist
1220: 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f  : collist for co
1230: 6c 75 6d 6e 20 49 0a 2a 2a 20 20 20 20 20 20 20  lumn I.**       
1240: 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f    }.**.**     co
1250: 6c 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a  llist format:.**
1260: 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72 69  .**         vari
1270: 6e 74 3a 20 66 69 72 73 74 20 6f 66 66 73 65 74  nt: first offset
1280: 20 2b 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20   + 2.**         
1290: 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a  zero-or-more {.*
12a0: 2a 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69  *           vari
12b0: 6e 74 3a 20 6f 66 66 73 65 74 20 64 65 6c 74 61  nt: offset delta
12c0: 20 2b 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20   + 2.**         
12d0: 7d 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 49 4e 41  }.**.**   PAGINA
12e0: 54 49 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54  TION.**.**     T
12f0: 68 65 20 66 6f 72 6d 61 74 20 64 65 73 63 72 69  he format descri
1300: 62 65 64 20 61 62 6f 76 65 20 69 73 20 6f 6e 6c  bed above is onl
1310: 79 20 61 63 63 75 72 61 74 65 20 69 66 20 74 68  y accurate if th
1320: 65 20 65 6e 74 69 72 65 20 74 65 72 6d 2f 64 6f  e entire term/do
1330: 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 64 61 74  clist.**     dat
1340: 61 20 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67  a fits on a sing
1350: 6c 65 20 6c 65 61 66 20 70 61 67 65 2e 20 49 66  le leaf page. If
1360: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
1370: 20 63 61 73 65 2c 20 74 68 65 20 66 6f 72 6d 61   case, the forma
1380: 74 0a 2a 2a 20 20 20 20 20 69 73 20 63 68 61 6e  t.**     is chan
1390: 67 65 64 20 69 6e 20 74 77 6f 20 77 61 79 73 3a  ged in two ways:
13a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69  .**.**       + i
13b0: 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  f the first rowi
13c0: 64 20 6f 6e 20 61 20 70 61 67 65 20 6f 63 63 75  d on a page occu
13d0: 72 73 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  rs before the fi
13e0: 72 73 74 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20  rst term, it.** 
13f0: 20 20 20 20 20 20 20 20 69 73 20 73 74 6f 72 65          is store
1400: 64 20 61 73 20 61 20 6c 69 74 65 72 61 6c 20 76  d as a literal v
1410: 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  alue:.**.**     
1420: 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20          varint: 
1430: 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a   first rowid.**.
1440: 2a 2a 20 20 20 20 20 20 20 2b 20 74 68 65 20 66  **       + the f
1450: 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 65 61 63  irst term on eac
1460: 68 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64  h page is stored
1470: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
1480: 20 61 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   as the.**      
1490: 20 20 20 76 65 72 79 20 66 69 72 73 74 20 74 65     very first te
14a0: 72 6d 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e  rm of the segmen
14b0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
14c0: 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20 73 69       varint : si
14d0: 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d  ze of first term
14e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14f0: 62 6c 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74  blob:    first t
1500: 65 72 6d 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 20  erm data.**.**  
1510: 20 20 20 45 61 63 68 20 6c 65 61 66 20 70 61 67     Each leaf pag
1520: 65 20 62 65 67 69 6e 73 20 77 69 74 68 3a 0a 2a  e begins with:.*
1530: 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d 62  *.**       + 2-b
1540: 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e  yte unsigned con
1550: 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74 20 74  taining offset t
1560: 6f 20 66 69 72 73 74 20 72 6f 77 69 64 20 28 6f  o first rowid (o
1570: 72 20 30 29 2e 0a 2a 2a 20 20 20 20 20 20 20 2b  r 0)..**       +
1580: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
1590: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73   containing offs
15a0: 65 74 20 74 6f 20 66 69 72 73 74 20 74 65 72 6d  et to first term
15b0: 20 28 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 20   (or 0)..**.**  
15c0: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 72   Followed by ter
15d0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 0a  m/doclist data..
15e0: 2a 2a 0a 2a 2a 20 34 2e 20 53 65 67 6d 65 6e 74  **.** 4. Segment
15f0: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 3a   interior nodes:
1600: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 69 6e 74  .**.**   The int
1610: 65 72 69 6f 72 20 6e 6f 64 65 73 20 74 75 72 6e  erior nodes turn
1620: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6c 65 61   the list of lea
1630: 76 65 73 20 69 6e 74 6f 20 61 20 62 2b 74 72 65  ves into a b+tre
1640: 65 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63 68  e. .**.**   Each
1650: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 62   interior node b
1660: 65 67 69 6e 73 20 77 69 74 68 20 61 20 76 61 72  egins with a var
1670: 69 6e 74 20 2d 20 74 68 65 20 70 61 67 65 20 6e  int - the page n
1680: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 65 66  umber of the lef
1690: 74 0a 2a 2a 20 20 20 6d 6f 73 74 20 63 68 69 6c  t.**   most chil
16a0: 64 20 6e 6f 64 65 2e 20 46 6f 6c 6c 6f 77 69 6e  d node. Followin
16b0: 67 20 74 68 69 73 2c 20 66 6f 72 20 65 61 63 68  g this, for each
16c0: 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70   leaf page excep
16d0: 74 20 74 68 65 20 66 69 72 73 74 2c 0a 2a 2a 20  t the first,.** 
16e0: 20 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e    the interior n
16f0: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a  odes contain:.**
1700: 0a 2a 2a 20 20 20 20 20 61 29 20 49 66 20 74 68  .**     a) If th
1710: 65 20 6c 65 61 66 20 70 61 67 65 20 63 6f 6e 74  e leaf page cont
1720: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
1730: 65 20 74 65 72 6d 2c 20 74 68 65 6e 20 61 20 74  e term, then a t
1740: 65 72 6d 2d 70 72 65 66 69 78 20 74 68 61 74 0a  erm-prefix that.
1750: 2a 2a 20 20 20 20 20 20 20 20 69 73 20 67 72 65  **        is gre
1760: 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 70 72  ater than all pr
1770: 65 76 69 6f 75 73 20 74 65 72 6d 73 2c 20 61 6e  evious terms, an
1780: 64 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  d less than or e
1790: 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 20  qual to the.**  
17a0: 20 20 20 20 20 20 66 69 72 73 74 20 74 65 72 6d        first term
17b0: 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67   on the leaf pag
17c0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20  e..**.**     b) 
17d0: 49 66 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  If the leaf page
17e0: 20 6e 6f 20 74 65 72 6d 73 2c 20 61 20 72 65 63   no terms, a rec
17f0: 6f 72 64 20 69 6e 64 69 63 61 74 69 6e 67 20 68  ord indicating h
1800: 6f 77 20 6d 61 6e 79 20 63 6f 6e 73 65 63 75 74  ow many consecut
1810: 69 76 65 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65  ive.**        le
1820: 61 76 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20  aves contain no 
1830: 74 65 72 6d 73 2c 20 61 6e 64 20 77 68 65 74 68  terms, and wheth
1840: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20  er or not there 
1850: 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64  is an associated
1860: 0a 2a 2a 20 20 20 20 20 20 20 20 62 79 2d 72 6f  .**        by-ro
1870: 77 69 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  wid index record
1880: 2e 0a 2a 2a 0a 2a 2a 20 20 20 42 79 20 64 65 66  ..**.**   By def
1890: 69 6e 69 74 69 6f 6e 2c 20 74 68 65 72 65 20 69  inition, there i
18a0: 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
18b0: 6e 20 6f 6e 65 20 74 79 70 65 20 28 62 29 20 72  n one type (b) r
18c0: 65 63 6f 72 64 20 69 6e 20 61 20 72 6f 77 2e 0a  ecord in a row..
18d0: 2a 2a 20 20 20 54 79 70 65 20 28 62 29 20 72 65  **   Type (b) re
18e0: 63 6f 72 64 73 20 6f 6e 6c 79 20 65 76 65 72 20  cords only ever 
18f0: 61 70 70 65 61 72 20 6f 6e 20 68 65 69 67 68 74  appear on height
1900: 3d 31 20 70 61 67 65 73 20 2d 20 69 6d 6d 65 64  =1 pages - immed
1910: 69 61 74 65 20 70 61 72 65 6e 74 73 0a 2a 2a 20  iate parents.** 
1920: 20 20 6f 66 20 6c 65 61 76 65 73 2e 20 4f 6e 6c    of leaves. Onl
1930: 79 20 74 79 70 65 20 28 61 29 20 72 65 63 6f 72  y type (a) recor
1940: 64 73 20 61 72 65 20 70 75 73 68 65 64 20 74 6f  ds are pushed to
1950: 20 68 69 67 68 65 72 20 6c 65 76 65 6c 73 2e 0a   higher levels..
1960: 2a 2a 0a 2a 2a 20 20 20 54 65 72 6d 20 66 6f 72  **.**   Term for
1970: 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  mat:.**.**     *
1980: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1990: 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20   in common with 
19a0: 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 70 6c  previous term pl
19b0: 75 73 20 32 2c 20 61 73 20 61 20 76 61 72 69 6e  us 2, as a varin
19c0: 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62  t..**     * Numb
19d0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e  er of bytes of n
19e0: 65 77 20 74 65 72 6d 20 64 61 74 61 2c 20 61 73  ew term data, as
19f0: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20   a varint..**   
1a00: 20 20 2a 20 6e 65 77 20 74 65 72 6d 20 64 61 74    * new term dat
1a10: 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d 74 65  a..**.**   No-te
1a20: 72 6d 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  rm format:.**.**
1a30: 20 20 20 20 20 2a 20 65 69 74 68 65 72 20 61 6e       * either an
1a40: 20 30 78 30 30 20 6f 72 20 30 78 30 31 20 62 79   0x00 or 0x01 by
1a50: 74 65 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65  te. If the value
1a60: 20 30 78 30 31 20 69 73 20 75 73 65 64 2c 20 74   0x01 is used, t
1a70: 68 65 6e 20 74 68 65 72 65 20 0a 2a 2a 20 20 20  hen there .**   
1a80: 20 20 20 20 69 73 20 61 6e 20 61 73 73 6f 63 69      is an associ
1a90: 61 74 65 64 20 69 6e 64 65 78 2d 62 79 2d 72 6f  ated index-by-ro
1aa0: 77 69 64 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 20  wid record..**  
1ab0: 20 20 20 2a 20 74 68 65 20 6e 75 6d 62 65 72 20     * the number 
1ac0: 6f 66 20 7a 65 72 6f 2d 74 65 72 6d 20 6c 65 61  of zero-term lea
1ad0: 76 65 73 20 61 73 20 61 20 76 61 72 69 6e 74 2e  ves as a varint.
1ae0: 0a 2a 2a 0a 2a 2a 20 35 2e 20 53 65 67 6d 65 6e  .**.** 5. Segmen
1af0: 74 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 65  t doclist indexe
1b00: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 6c 69 73  s:.**.**   A lis
1b10: 74 20 6f 66 20 76 61 72 69 6e 74 73 20 2d 20 74  t of varints - t
1b20: 68 65 20 66 69 72 73 74 20 64 6f 63 69 64 20 6f  he first docid o
1b30: 6e 20 65 61 63 68 20 70 61 67 65 20 28 73 74 61  n each page (sta
1b40: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 0a 2a  rting with the.*
1b50: 2a 20 20 20 66 69 72 73 74 20 74 65 72 6d 6c 65  *   first termle
1b60: 73 73 20 70 61 67 65 29 20 6f 66 20 74 68 65 20  ss page) of the 
1b70: 64 6f 63 6c 69 73 74 2e 20 46 69 72 73 74 20 65  doclist. First e
1b80: 6c 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 6c 69  lement in the li
1b90: 73 74 20 69 73 20 61 0a 2a 2a 20 20 20 6c 69 74  st is a.**   lit
1ba0: 65 72 61 6c 20 64 6f 63 69 64 2e 20 45 61 63 68  eral docid. Each
1bb0: 20 64 6f 63 69 64 20 74 68 65 72 65 61 66 74 65   docid thereafte
1bc0: 72 20 69 73 20 61 20 28 6e 65 67 61 74 69 76 65  r is a (negative
1bd0: 29 20 64 65 6c 74 61 2e 20 49 66 20 74 68 65 72  ) delta. If ther
1be0: 65 0a 2a 2a 20 20 20 61 72 65 20 6e 6f 20 64 6f  e.**   are no do
1bf0: 63 69 64 73 20 61 74 20 61 6c 6c 20 6f 6e 20 61  cids at all on a
1c00: 20 70 61 67 65 2c 20 61 20 30 78 30 30 20 62 79   page, a 0x00 by
1c10: 74 65 20 74 61 6b 65 73 20 74 68 65 20 70 6c 61  te takes the pla
1c20: 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 64  ce of the.**   d
1c30: 65 6c 74 61 20 76 61 6c 75 65 2e 0a 2a 2f 0a 0a  elta value..*/..
1c40: 2f 2a 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72  /*.** Rowids for
1c50: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 61 6e   the averages an
1c60: 64 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  d structure reco
1c70: 72 64 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74  rds in the %_dat
1c80: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66  a table..*/.#def
1c90: 69 6e 65 20 46 54 53 35 5f 41 56 45 52 41 47 45  ine FTS5_AVERAGE
1ca0: 53 5f 52 4f 57 49 44 20 20 20 20 20 31 20 20 20  S_ROWID     1   
1cb0: 20 2f 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66   /* Rowid used f
1cc0: 6f 72 20 74 68 65 20 61 76 65 72 61 67 65 73 20  or the averages 
1cd0: 72 65 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e  record */.#defin
1ce0: 65 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  e FTS5_STRUCTURE
1cf0: 5f 52 4f 57 49 44 28 69 49 64 78 29 20 28 31 30  _ROWID(iIdx) (10
1d00: 20 2b 20 28 69 49 64 78 29 29 20 20 20 20 20 2f   + (iIdx))     /
1d10: 2a 20 46 6f 72 20 73 74 72 75 63 74 75 72 65 20  * For structure 
1d20: 72 65 63 6f 72 64 73 20 2a 2f 0a 0a 2f 2a 0a 2a  records */../*.*
1d30: 2a 20 4d 61 63 72 6f 73 20 64 65 74 65 72 6d 69  * Macros determi
1d40: 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 73 20  ning the rowids 
1d50: 75 73 65 64 20 62 79 20 73 65 67 6d 65 6e 74 20  used by segment 
1d60: 6e 6f 64 65 73 2e 20 41 6c 6c 20 6e 6f 64 65 73  nodes. All nodes
1d70: 20 69 6e 20 61 6c 6c 0a 2a 2a 20 73 65 67 6d 65   in all.** segme
1d80: 6e 74 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 65  nts for all inde
1d90: 78 65 73 20 28 74 68 65 20 72 65 67 75 6c 61 72  xes (the regular
1da0: 20 46 54 53 20 69 6e 64 65 78 20 61 6e 64 20 61   FTS index and a
1db0: 6e 79 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  ny prefix indexe
1dc0: 73 29 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  s).** are stored
1dd0: 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74   in the %_data t
1de0: 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67 65 20  able with large 
1df0: 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 73 2e  positive rowids.
1e00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74  .**.** The %_dat
1e10: 61 20 74 61 62 6c 65 20 6d 61 79 20 63 6f 6e 74  a table may cont
1e20: 61 69 6e 20 75 70 20 74 6f 20 28 31 3c 3c 46 54  ain up to (1<<FT
1e30: 53 35 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58  S5_SEGMENT_INDEX
1e40: 5f 42 49 54 53 29 20 0a 2a 2a 20 69 6e 64 65 78  _BITS) .** index
1e50: 65 73 20 2d 20 6f 6e 65 20 72 65 67 75 6c 61 72  es - one regular
1e60: 20 74 65 72 6d 20 69 6e 64 65 78 20 61 6e 64 20   term index and 
1e70: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 72 65  zero or more pre
1e80: 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a  fix indexes..**.
1e90: 2a 2a 20 45 61 63 68 20 73 65 67 6d 65 6e 74 20  ** Each segment 
1ea0: 69 6e 20 61 6e 20 69 6e 64 65 78 20 68 61 73 20  in an index has 
1eb0: 61 20 75 6e 69 71 75 65 20 69 64 20 67 72 65 61  a unique id grea
1ec0: 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a  ter than zero..*
1ed0: 2a 0a 2a 2a 20 45 61 63 68 20 6e 6f 64 65 20 69  *.** Each node i
1ee0: 6e 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  n a segment b-tr
1ef0: 65 65 20 69 73 20 61 73 73 69 67 6e 65 64 20 61  ee is assigned a
1f00: 20 22 70 61 67 65 20 6e 75 6d 62 65 72 22 20 74   "page number" t
1f10: 68 61 74 20 69 73 20 75 6e 69 71 75 65 0a 2a 2a  hat is unique.**
1f20: 20 77 69 74 68 69 6e 20 6e 6f 64 65 73 20 6f 66   within nodes of
1f30: 20 69 74 73 20 68 65 69 67 68 74 20 77 69 74 68   its height with
1f40: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 28  in the segment (
1f50: 6c 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65 20  leaf nodes have 
1f60: 61 20 68 65 69 67 68 74 20 0a 2a 2a 20 6f 66 20  a height .** of 
1f70: 30 2c 20 70 61 72 65 6e 74 73 20 31 2c 20 65 74  0, parents 1, et
1f80: 63 2e 29 2e 20 50 61 67 65 20 6e 75 6d 62 65 72  c.). Page number
1f90: 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  s are allocated 
1fa0: 73 65 71 75 65 6e 74 69 61 6c 6c 79 20 73 6f 20  sequentially so 
1fb0: 74 68 61 74 0a 2a 2a 20 61 20 6e 6f 64 65 73 20  that.** a nodes 
1fc0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 61  page number is a
1fd0: 6c 77 61 79 73 20 6f 6e 65 20 6d 6f 72 65 20 74  lways one more t
1fe0: 68 61 6e 20 69 74 73 20 6c 65 66 74 20 73 69 62  han its left sib
1ff0: 6c 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ling..**.** The 
2000: 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 64 65  rowid for a node
2010: 20 69 73 20 74 68 65 6e 20 66 6f 75 6e 64 20 75   is then found u
2020: 73 69 6e 67 20 74 68 65 20 46 54 53 35 5f 53 45  sing the FTS5_SE
2030: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 6d 61  GMENT_ROWID() ma
2040: 63 72 6f 0a 2a 2a 20 62 65 6c 6f 77 2e 20 54 68  cro.** below. Th
2050: 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 2a  e FTS5_SEGMENT_*
2060: 5f 42 49 54 53 20 6d 61 63 72 6f 73 20 64 65 66  _BITS macros def
2070: 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
2080: 66 20 62 69 74 73 20 75 73 65 64 0a 2a 2a 20 74  f bits used.** t
2090: 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 74 68 72  o encode the thr
20a0: 65 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  ee FTS5_SEGMENT_
20b0: 52 4f 57 49 44 28 29 20 61 72 67 75 6d 65 6e 74  ROWID() argument
20c0: 73 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 72  s. This module r
20d0: 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45  eturns.** SQLITE
20e0: 5f 46 55 4c 4c 20 61 6e 64 20 66 61 69 6c 73 20  _FULL and fails 
20f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65 72  the current oper
2100: 61 74 69 6f 6e 20 69 66 20 74 68 65 79 20 65 76  ation if they ev
2110: 65 72 20 70 72 6f 76 65 20 74 6f 6f 20 73 6d 61  er prove too sma
2120: 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ll..*/.#define F
2130: 54 53 35 5f 44 41 54 41 5f 49 44 58 5f 42 20 20  TS5_DATA_IDX_B  
2140: 20 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78 20     5     /* Max 
2150: 6f 66 20 33 31 20 70 72 65 66 69 78 20 69 6e 64  of 31 prefix ind
2160: 65 78 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  exes */.#define 
2170: 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 20  FTS5_DATA_ID_B  
2180: 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61 78     16     /* Max
2190: 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20 36   seg id number 6
21a0: 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20  5535 */.#define 
21b0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
21c0: 5f 42 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78  _B  5     /* Max
21d0: 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 20 6f   b-tree height o
21e0: 66 20 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20  f 32 */.#define 
21f0: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
2200: 20 20 20 33 31 20 20 20 20 20 2f 2a 20 4d 61 78     31     /* Max
2210: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2220: 32 31 34 37 34 38 33 36 34 38 20 2a 2f 0a 0a 23  2147483648 */..#
2230: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
2240: 45 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73  ENT_ROWID(idx, s
2250: 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67  egid, height, pg
2260: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2280: 20 28 28 69 36 34 29 28 69 64 78 29 20 20 20 20   ((i64)(idx)    
2290: 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 49 44  << (FTS5_DATA_ID
22a0: 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  _B + FTS5_DATA_P
22b0: 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54  AGE_B + FTS5_DAT
22c0: 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20 5c  A_HEIGHT_B)) + \
22d0: 0a 20 28 28 69 36 34 29 28 73 65 67 69 64 29 20  . ((i64)(segid) 
22e0: 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 50   << (FTS5_DATA_P
22f0: 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41 54  AGE_B + FTS5_DAT
2300: 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20 20  A_HEIGHT_B)) +  
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 5c 0a 20 28 28 69 36 34 29 28 68 65 69 67 68 74  \. ((i64)(height
2330: 29 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f  ) << (FTS5_DATA_
2340: 50 41 47 45 5f 42 29 29 20 2b 20 20 20 20 20 20  PAGE_B)) +      
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 20 5c 0a 20 28 28 69 36 34 29 28 70 67 6e 6f 29   \. ((i64)(pgno)
2380: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 5c 0a 29 0a 0a 23 69 66 20 46 54 53 35 5f    \.)..#if FTS5_
23d0: 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58  MAX_PREFIX_INDEX
23e0: 45 53 20 3e 20 28 28 31 3c 3c 46 54 53 35 5f 44  ES > ((1<<FTS5_D
23f0: 41 54 41 5f 49 44 58 5f 42 29 2d 31 29 20 0a 23  ATA_IDX_B)-1) .#
2400: 20 65 72 72 6f 72 20 22 46 54 53 35 5f 4d 41 58   error "FTS5_MAX
2410: 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20  _PREFIX_INDEXES 
2420: 69 73 20 74 6f 6f 20 6c 61 72 67 65 22 0a 23 65  is too large".#e
2430: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
2440: 68 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e  height of segmen
2450: 74 20 62 2d 74 72 65 65 73 20 69 73 20 61 63 74  t b-trees is act
2460: 75 61 6c 6c 79 20 6c 69 6d 69 74 65 64 20 74 6f  ually limited to
2470: 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20 0a   one less than .
2480: 2a 2a 20 28 31 3c 3c 48 45 49 47 48 54 5f 42 49  ** (1<<HEIGHT_BI
2490: 54 53 29 2e 20 54 68 69 73 20 69 73 20 62 65 63  TS). This is bec
24a0: 61 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 61  ause the rowid a
24b0: 64 64 72 65 73 73 20 73 70 61 63 65 20 66 6f 72  ddress space for
24c0: 20 6e 6f 64 65 73 0a 2a 2a 20 77 69 74 68 20 73   nodes.** with s
24d0: 75 63 68 20 61 20 68 65 69 67 68 74 20 69 73 20  uch a height is 
24e0: 75 73 65 64 20 62 79 20 64 6f 63 6c 69 73 74 20  used by doclist 
24f0: 69 6e 64 65 78 65 73 2e 0a 2a 2f 0a 23 64 65 66  indexes..*/.#def
2500: 69 6e 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  ine FTS5_SEGMENT
2510: 5f 4d 41 58 5f 48 45 49 47 48 54 20 28 28 31 20  _MAX_HEIGHT ((1 
2520: 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  << FTS5_DATA_HEI
2530: 47 48 54 5f 42 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a  GHT_B)-1)../*.**
2540: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
2550: 68 65 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  he doclist index
2560: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2570: 20 6c 65 61 66 20 70 61 67 65 20 70 67 6e 6f 20   leaf page pgno 
2580: 6f 66 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 73 65  of segment.** se
2590: 67 69 64 20 69 6e 20 69 6e 64 65 78 20 69 64 78  gid in index idx
25a0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  ..*/.#define FTS
25b0: 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f  5_DOCLIST_IDX_RO
25c0: 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20  WID(idx, segid, 
25d0: 70 67 6e 6f 29 20 5c 0a 20 20 20 20 20 20 20 20  pgno) \.        
25e0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
25f0: 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20 46  ID(idx, segid, F
2600: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f  TS5_SEGMENT_MAX_
2610: 48 45 49 47 48 54 2c 20 70 67 6e 6f 29 0a 0a 23  HEIGHT, pgno)..#
2620: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2630: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  UG.static int ft
2640: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
2650: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2660: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 20 64 65  UPT_VTAB; }.# de
2670: 66 69 6e 65 20 46 54 53 35 5f 43 4f 52 52 55 50  fine FTS5_CORRUP
2680: 54 20 66 74 73 35 43 6f 72 72 75 70 74 28 29 0a  T fts5Corrupt().
2690: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 46  #else.# define F
26a0: 54 53 35 5f 43 4f 52 52 55 50 54 20 53 51 4c 49  TS5_CORRUPT SQLI
26b0: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 0a  TE_CORRUPT_VTAB.
26c0: 23 65 6e 64 69 66 0a 0a 0a 74 79 70 65 64 65 66  #endif...typedef
26d0: 20 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65   struct Fts5Btre
26e0: 65 49 74 65 72 20 46 74 73 35 42 74 72 65 65 49  eIter Fts5BtreeI
26f0: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2700: 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74 65  uct Fts5BtreeIte
2710: 72 4c 65 76 65 6c 20 46 74 73 35 42 74 72 65 65  rLevel Fts5Btree
2720: 49 74 65 72 4c 65 76 65 6c 3b 0a 74 79 70 65 64  IterLevel;.typed
2730: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43 68  ef struct Fts5Ch
2740: 75 6e 6b 49 74 65 72 20 46 74 73 35 43 68 75 6e  unkIter Fts5Chun
2750: 6b 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  kIter;.typedef s
2760: 74 72 75 63 74 20 46 74 73 35 44 61 74 61 20 46  truct Fts5Data F
2770: 74 73 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66  ts5Data;.typedef
2780: 20 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64   struct Fts5Dlid
2790: 78 49 74 65 72 20 46 74 73 35 44 6c 69 64 78 49  xIter Fts5DlidxI
27a0: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
27b0: 75 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67  uct Fts5MultiSeg
27c0: 49 74 65 72 20 46 74 73 35 4d 75 6c 74 69 53 65  Iter Fts5MultiSe
27d0: 67 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  gIter;.typedef s
27e0: 74 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74  truct Fts5NodeIt
27f0: 65 72 20 46 74 73 35 4e 6f 64 65 49 74 65 72 3b  er Fts5NodeIter;
2800: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2810: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 46  Fts5PageWriter F
2820: 74 73 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74  ts5PageWriter;.t
2830: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2840: 73 35 50 6f 73 49 74 65 72 20 46 74 73 35 50 6f  s5PosIter Fts5Po
2850: 73 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  sIter;.typedef s
2860: 74 72 75 63 74 20 46 74 73 35 53 65 67 49 74 65  truct Fts5SegIte
2870: 72 20 46 74 73 35 53 65 67 49 74 65 72 3b 0a 74  r Fts5SegIter;.t
2880: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2890: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 46 74  s5DoclistIter Ft
28a0: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74  s5DoclistIter;.t
28b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
28c0: 73 35 53 65 67 57 72 69 74 65 72 20 46 74 73 35  s5SegWriter Fts5
28d0: 53 65 67 57 72 69 74 65 72 3b 0a 74 79 70 65 64  SegWriter;.typed
28e0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
28f0: 72 75 63 74 75 72 65 20 46 74 73 35 53 74 72 75  ructure Fts5Stru
2900: 63 74 75 72 65 3b 0a 74 79 70 65 64 65 66 20 73  cture;.typedef s
2910: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2920: 75 72 65 4c 65 76 65 6c 20 46 74 73 35 53 74 72  ureLevel Fts5Str
2930: 75 63 74 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70  uctureLevel;.typ
2940: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2950: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2960: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2970: 67 6d 65 6e 74 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  gment;../*.** On
2980: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2990: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
29a0: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
29b0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
29c0: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
29d0: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
29e0: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
29f0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
2a00: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
2a10: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2a20: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
2a30: 2f 0a 20 20 69 6e 74 20 6e 43 72 69 73 69 73 4d  /.  int nCrisisM
2a40: 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  erge;           
2a50: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
2a60: 6c 6c 6f 77 65 64 20 73 65 67 6d 65 6e 74 73 20  llowed segments 
2a70: 70 65 72 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69  per level */.  i
2a80: 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b 20 20 20  nt nWorkUnit;   
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 4c 65 61 66 20 70 61 67 65 73 20 69 6e 20  * Leaf pages in 
2ab0: 61 20 22 75 6e 69 74 22 20 6f 66 20 77 6f 72 6b  a "unit" of work
2ac0: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 56   */..  /*.  ** V
2ad0: 61 72 69 61 62 6c 65 73 20 72 65 6c 61 74 65 64  ariables related
2ae0: 20 74 6f 20 74 68 65 20 61 63 63 75 6d 75 6c 61   to the accumula
2af0: 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 73 20 61  tion of tokens a
2b00: 6e 64 20 64 6f 63 6c 69 73 74 73 20 77 69 74 68  nd doclists with
2b10: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 2d 6d  in the.  ** in-m
2b20: 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
2b30: 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
2b40: 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
2b50: 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73 35 48 61  k..  */.  Fts5Ha
2b60: 73 68 20 2a 2a 61 70 48 61 73 68 3b 20 20 20 20  sh **apHash;    
2b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
2b80: 61 79 20 6f 66 20 68 61 73 68 20 74 61 62 6c 65  ay of hash table
2b90: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50  s */.  int nMaxP
2ba0: 65 6e 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20  endingData;     
2bb0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 65         /* Max pe
2bc0: 6e 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72  nding data befor
2bd0: 65 20 66 6c 75 73 68 20 74 6f 20 64 69 73 6b 20  e flush to disk 
2be0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2bf0: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2c00: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2c10: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2c20: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2c30: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2c50: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2c60: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2c70: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72  n */..  /* Error
2c80: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74   state. */.  int
2c90: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb0: 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f  Current error co
2cc0: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74  de */..  /* Stat
2cd0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 66 74  e used by the ft
2ce0: 73 35 44 61 74 61 58 58 58 28 29 20 66 75 6e 63  s5DataXXX() func
2cf0: 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tions. */.  sqli
2d00: 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65  te3_blob *pReade
2d10: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  r;          /* R
2d20: 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e  O incr-blob open
2d30: 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65   on %_data table
2d40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2d50: 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20  mt *pWriter;    
2d60: 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54        /* "INSERT
2d70: 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55   ... %_data VALU
2d80: 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71  ES(?,?)" */.  sq
2d90: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
2da0: 65 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  eter;         /*
2db0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f   "DELETE FROM %_
2dc0: 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41  data ... id>=? A
2dd0: 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 69  ND id<=?" */.  i
2de0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e00: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2e10: 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f  f blocks read */
2e20: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  .};..struct Fts5
2e30: 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20  DoclistIter {.  
2e40: 69 6e 74 20 62 41 73 63 3b 0a 20 20 75 38 20 2a  int bAsc;.  u8 *
2e50: 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  a;.  int n;.  in
2e60: 74 20 69 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  t i;..  /* Outpu
2e70: 74 20 76 61 72 69 61 62 6c 65 73 2e 20 61 50 6f  t variables. aPo
2e80: 73 6c 69 73 74 3d 3d 30 20 61 74 20 45 4f 46 20  slist==0 at EOF 
2e90: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  */.  i64 iRowid;
2ea0: 0a 20 20 75 38 20 2a 61 50 6f 73 6c 69 73 74 3b  .  u8 *aPoslist;
2eb0: 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b  .  int nPoslist;
2ec0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .};../*.** Each 
2ed0: 69 74 65 72 61 74 6f 72 20 75 73 65 64 20 62 79  iterator used by
2ee0: 20 65 78 74 65 72 6e 61 6c 20 6d 6f 64 75 6c 65   external module
2ef0: 73 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  s is an instance
2f00: 20 6f 66 20 74 68 69 73 20 74 79 70 65 2e 0a 2a   of this type..*
2f10: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e 64  /.struct Fts5Ind
2f20: 65 78 49 74 65 72 20 7b 0a 20 20 46 74 73 35 49  exIter {.  Fts5I
2f30: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
2f40: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2f50: 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 4d 75  Struct;.  Fts5Mu
2f60: 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c  ltiSegIter *pMul
2f70: 74 69 3b 0a 20 20 46 74 73 35 44 6f 63 6c 69 73  ti;.  Fts5Doclis
2f80: 74 49 74 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b  tIter *pDoclist;
2f90: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f  .  Fts5Buffer po
2fa0: 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  slist;          
2fb0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
2fc0: 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20  taining current 
2fd0: 70 6f 73 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f  poslist */.};../
2fe0: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 72 65  *.** A single re
2ff0: 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
3000: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
3010: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44  .*/.struct Fts5D
3020: 61 74 61 20 7b 0a 20 20 75 38 20 2a 70 3b 20 20  ata {.  u8 *p;  
3030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3040: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
3050: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
3060: 74 61 69 6e 69 6e 67 20 72 65 63 6f 72 64 20 2a  taining record *
3070: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
30a0: 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73 20 2a  ecord in bytes *
30b0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 20 20 2f 2a 20 52 65 66 20 63 6f 75 6e 74      /* Ref count
30e0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
30f0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3100: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
3110: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
3120: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
3130: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
3140: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
3150: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
3160: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
3170: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
3180: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
3190: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
31a0: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
31b0: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
31c0: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
31d0: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31f0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
3200: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20    int nHeight;  
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73    /* Height of s
3230: 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f  egment b-tree */
3240: 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74  .  int pgnoFirst
3250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3260: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66     /* First leaf
3270: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
3280: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
3290: 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20   pgnoLast;      
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32b0: 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
32c0: 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
32d0: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
32e0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
32f0: 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b   {.  int nMerge;
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3320: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
3330: 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e  cr-merge */.  in
3340: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3360: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
3370: 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
3380: 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  el */.  Fts5Stru
3390: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53  ctureSegment *aS
33a0: 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  eg;     /* Array
33b0: 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53   of segments. aS
33c0: 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e  eg[0] is oldest.
33d0: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
33e0: 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20  s5Structure {.  
33f0: 75 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65  u64 nWriteCounte
3400: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3410: 2f 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20  /* Total leaves 
3420: 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c  written to level
3430: 20 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76   0 */.  int nLev
3440: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
3450: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3460: 72 20 6f 66 20 6c 65 76 65 6c 73 20 69 6e 20 74  r of levels in t
3470: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46  his index */.  F
3480: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
3490: 6c 20 61 4c 65 76 65 6c 5b 30 5d 3b 20 20 20 2f  l aLevel[0];   /
34a0: 2a 20 41 72 72 61 79 20 6f 66 20 6e 4c 65 76 65  * Array of nLeve
34b0: 6c 20 6c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20  l level objects 
34c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
34d0: 6f 62 6a 65 63 74 20 6f 66 20 74 79 70 65 20 46  object of type F
34e0: 74 73 35 53 65 67 57 72 69 74 65 72 20 69 73 20  ts5SegWriter is 
34f0: 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  used to write to
3500: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74   segments..*/.st
3510: 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69  ruct Fts5PageWri
3520: 74 65 72 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f  ter {.  int pgno
3530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3540: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
3550: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
3560: 70 61 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  page */.  Fts5Bu
3570: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
3580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3590: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
35a0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  age data */.  Ft
35b0: 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35d0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
35e0: 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ng previous term
35f0: 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 73   on page */.};.s
3600: 74 72 75 63 74 20 46 74 73 35 53 65 67 57 72 69  truct Fts5SegWri
3610: 74 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78  ter {.  int iIdx
3620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3630: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3640: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
3650: 20 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20    int iSegid;   
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 20 20 2f 2a 20 53 65 67 69 64 20 74 6f 20 77 72    /* Segid to wr
3680: 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
3690: 6e 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20  nWriter;        
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
36b0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
36c0: 20 69 6e 20 61 57 72 69 74 65 72 20 2a 2f 0a 20   in aWriter */. 
36d0: 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
36e0: 2a 61 57 72 69 74 65 72 3b 20 20 20 20 20 20 20  *aWriter;       
36f0: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 50 61 67   /* Array of Pag
3700: 65 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20  eWriter objects 
3710: 2a 2f 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f  */.  i64 iPrevRo
3720: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
3730: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
3740: 20 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74   docid written t
3750: 6f 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a  o current leaf *
3760: 2f 0a 20 20 75 38 20 62 46 69 72 73 74 52 6f 77  /.  u8 bFirstRow
3770: 69 64 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20  idInDoclist;    
3780: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
3790: 65 78 74 20 72 6f 77 69 64 20 69 73 20 66 69 72  ext rowid is fir
37a0: 73 74 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f  st in doclist */
37b0: 0a 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69  .  u8 bFirstRowi
37c0: 64 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  dInPage;        
37d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
37e0: 78 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73  xt rowid is firs
37f0: 74 20 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69  t in page */.  i
3800: 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b  nt nLeafWritten;
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3820: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
3830: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a   pages written *
3840: 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20  /.  int nEmpty; 
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3870: 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72 6d   contiguous term
3880: 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 20  -less nodes */. 
3890: 20 46 74 73 35 42 75 66 66 65 72 20 64 6c 69 64   Fts5Buffer dlid
38a0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
38b0: 20 2f 2a 20 44 6f 63 6c 69 73 74 20 69 6e 64 65   /* Doclist inde
38c0: 78 20 2a 2f 0a 20 20 69 36 34 20 69 44 6c 69 64  x */.  i64 iDlid
38d0: 78 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  xPrev;          
38e0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
38f0: 75 73 20 72 6f 77 69 64 20 61 70 70 65 6e 64 65  us rowid appende
3900: 64 20 74 6f 20 64 6c 69 64 78 20 2a 2f 0a 20 20  d to dlidx */.  
3910: 69 6e 74 20 62 44 6c 69 64 78 50 72 65 76 56 61  int bDlidxPrevVa
3920: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
3930: 2f 2a 20 54 72 75 65 20 69 66 20 69 44 6c 69 64  /* True if iDlid
3940: 78 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a  xPrev is valid *
3950: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  /.};../*.** Obje
3960: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
3970: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72   through the mer
3980: 67 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f  ged results of o
3990: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
39a0: 6e 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67  nts,.** visiting
39b0: 20 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64   each term/docid
39c0: 20 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72   pair in the mer
39d0: 67 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ged data..**.** 
39e0: 6e 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61  nSeg is always a
39f0: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72   power of two gr
3a00: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
3a10: 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ual to the numbe
3a20: 72 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73  r of.** segments
3a30: 20 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63   that this objec
3a40: 74 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74  t is merging dat
3a50: 61 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65  a from. Both the
3a60: 20 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61   aSeg[] and.** a
3a70: 46 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61  First[] arrays a
3a80: 72 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67  re sized at nSeg
3a90: 20 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53   entries. The aS
3aa0: 65 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61  eg[] array is pa
3ab0: 64 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72  dded.** with zer
3ac0: 6f 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68  oed objects - th
3ad0: 65 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ese are handled 
3ae0: 61 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20  as if they were 
3af0: 69 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64  iterators opened
3b00: 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67  .** on empty seg
3b10: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
3b20: 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
3b30: 61 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61  aring segments a
3b40: 53 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b  Seg[N] and aSeg[
3b50: 4e 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73  N+1], where N is
3b60: 20 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62   an.** even numb
3b70: 65 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  er, is stored in
3b80: 20 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29   aFirst[(nSeg+N)
3b90: 2f 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74  /2]. The "result
3ba0: 22 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d  " of the .** com
3bb0: 70 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20  parison in this 
3bc0: 63 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69  context is the i
3bd0: 6e 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72  ndex of the iter
3be0: 61 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e  ator that curren
3bf0: 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  tly.** points to
3c00: 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72   the smaller ter
3c10: 6d 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74  m/rowid combinat
3c20: 69 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61  ion. Iterators a
3c30: 74 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e  t EOF are.** con
3c40: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72  sidered to be gr
3c50: 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f  eater than all o
3c60: 74 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a  ther iterators..
3c70: 2a 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20  **.** aFirst[1] 
3c80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
3c90: 65 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20  ex in aSeg[] of 
3ca0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61  the iterator tha
3cb0: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
3cc0: 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
3cd0: 6f 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b  overall. aFirst[
3ce0: 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a  0] is unused. .*
3cf0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c  /.struct Fts5Mul
3d00: 74 69 53 65 67 49 74 65 72 20 7b 0a 20 20 69 6e  tiSegIter {.  in
3d10: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
3d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d30: 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20   Size of aSeg[] 
3d40: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
3d50: 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
3d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3d70: 75 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e  ue to iterate in
3d80: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
3d90: 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70  /.  int bSkipEmp
3da0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
3db0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
3dc0: 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72  kip deleted entr
3dd0: 69 65 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ies */.  Fts5Seg
3de0: 49 74 65 72 20 2a 61 53 65 67 3b 20 20 20 20 20  Iter *aSeg;     
3df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
3e00: 79 20 6f 66 20 73 65 67 6d 65 6e 74 20 69 74 65  y of segment ite
3e10: 72 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20  rators */.  u16 
3e20: 2a 61 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *aFirst;        
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3e40: 75 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61  urrent merge sta
3e50: 74 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a  te (see above) *
3e60: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  /.};../*.** Obje
3e70: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
3e80: 20 74 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c   through a singl
3e90: 65 20 73 65 67 6d 65 6e 74 2c 20 76 69 73 69 74  e segment, visit
3ea0: 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 64 6f  ing each term/do
3eb0: 63 69 64 0a 2a 2a 20 70 61 69 72 20 69 6e 20 74  cid.** pair in t
3ec0: 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  he segment..**.*
3ed0: 2a 20 70 53 65 67 3a 0a 2a 2a 20 20 20 54 68 65  * pSeg:.**   The
3ee0: 20 73 65 67 6d 65 6e 74 20 74 6f 20 69 74 65 72   segment to iter
3ef0: 61 74 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a  ate through..**.
3f00: 2a 2a 20 69 4c 65 61 66 50 67 6e 6f 3a 0a 2a 2a  ** iLeafPgno:.**
3f10: 20 20 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20     Current leaf 
3f20: 70 61 67 65 20 6e 75 6d 62 65 72 20 77 69 74 68  page number with
3f30: 69 6e 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  in segment..**.*
3f40: 2a 20 69 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a  * iLeafOffset:.*
3f50: 2a 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20  *   Byte offset 
3f60: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
3f70: 6e 74 20 6c 65 61 66 20 74 68 61 74 20 69 73 20  nt leaf that is 
3f80: 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20 74 68  one byte past th
3f90: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
3fa0: 20 20 72 6f 77 69 64 20 66 69 65 6c 64 20 6f 66    rowid field of
3fb0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
3fc0: 72 79 2e 20 55 73 75 61 6c 6c 79 20 74 68 69 73  ry. Usually this
3fd0: 20 69 73 20 74 68 65 20 73 69 7a 65 20 66 69 65   is the size fie
3fe0: 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 70  ld of the.**   p
3ff0: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
4000: 61 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  a. The exception
4010: 20 69 73 20 69 66 20 74 68 65 20 72 6f 77 69 64   is if the rowid
4020: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
4030: 20 65 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73 20   entry .**   is 
4040: 74 68 65 20 6c 61 73 74 20 74 68 69 6e 67 20 6f  the last thing o
4050: 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e  n the leaf page.
4060: 0a 2a 2a 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a  .**.** pLeaf:.**
4070: 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69     Buffer contai
4080: 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 6c 65 61  ning current lea
4090: 66 20 70 61 67 65 20 64 61 74 61 2e 20 53 65 74  f page data. Set
40a0: 20 74 6f 20 4e 55 4c 4c 20 61 74 20 45 4f 46 2e   to NULL at EOF.
40b0: 0a 2a 2a 0a 2a 2a 20 69 54 65 72 6d 4c 65 61 66  .**.** iTermLeaf
40c0: 50 67 6e 6f 2c 20 69 54 65 72 6d 4c 65 61 66 4f  Pgno, iTermLeafO
40d0: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 4c 65 61 66  ffset:.**   Leaf
40e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 63 6f 6e   page number con
40f0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74  taining the last
4100: 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20   term read from 
4110: 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 41 6e 64  the segment. And
4120: 0a 2a 2a 20 20 20 74 68 65 20 6f 66 66 73 65 74  .**   the offset
4130: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4140: 6c 6f 77 69 6e 67 20 74 68 65 20 74 65 72 6d 20  lowing the term 
4150: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67  data..**.** flag
4160: 73 3a 0a 2a 2a 20 20 20 4d 61 73 6b 20 6f 66 20  s:.**   Mask of 
4170: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 58 58 58  FTS5_SEGITER_XXX
4180: 20 76 61 6c 75 65 73 2e 20 49 6e 74 65 72 70 72   values. Interpr
4190: 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
41a0: 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45  .**.**   FTS5_SE
41b0: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a  GITER_ONETERM:.*
41c0: 2a 20 20 20 20 20 49 66 20 73 65 74 2c 20 73 65  *     If set, se
41d0: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  t the iterator t
41e0: 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20 61  o point to EOF a
41f0: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
4200: 20 64 6f 63 6c 69 73 74 20 0a 2a 2a 20 20 20 20   doclist .**    
4210: 20 68 61 73 20 62 65 65 6e 20 65 78 68 61 75 73   has been exhaus
4220: 74 65 64 2e 20 44 6f 20 6e 6f 74 20 70 72 6f 63  ted. Do not proc
4230: 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  eed to the next 
4240: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
4250: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53  ent..**.**   FTS
4260: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4270: 45 3a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66  E:.**     This f
4280: 6c 61 67 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  lag is only ever
4290: 20 73 65 74 20 69 66 20 46 54 53 35 5f 53 45 47   set if FTS5_SEG
42a0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 69 73 20  ITER_ONETERM is 
42b0: 61 6c 73 6f 20 73 65 74 2e 20 49 66 0a 2a 2a 20  also set. If.** 
42c0: 20 20 20 20 69 74 20 69 73 20 73 65 74 2c 20 69      it is set, i
42d0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64  terate through d
42e0: 6f 63 69 64 73 20 69 6e 20 61 73 63 65 6e 64 69  ocids in ascendi
42f0: 6e 67 20 6f 72 64 65 72 20 69 6e 73 74 65 61 64  ng order instead
4300: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 64   of the.**     d
4310: 65 66 61 75 6c 74 20 64 65 73 63 65 6e 64 69 6e  efault descendin
4320: 67 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 69  g order..**.** i
4330: 52 6f 77 69 64 4f 66 66 73 65 74 2f 6e 52 6f 77  RowidOffset/nRow
4340: 69 64 4f 66 66 73 65 74 2f 61 52 6f 77 69 64 4f  idOffset/aRowidO
4350: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 20 20 54 68  ffset:.**     Th
4360: 65 73 65 20 61 72 65 20 75 73 65 64 20 69 66 20  ese are used if 
4370: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4380: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4390: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   set..**.**     
43a0: 45 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20  Each time a new 
43b0: 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 2c 20  page is loaded, 
43c0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
43d0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
43e0: 74 68 65 0a 2a 2a 20 20 20 20 20 66 69 6e 61 6c  the.**     final
43f0: 20 72 6f 77 69 64 2e 20 41 64 64 69 74 69 6f 6e   rowid. Addition
4400: 61 6c 6c 79 2c 20 74 68 65 20 61 52 6f 77 69 64  ally, the aRowid
4410: 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20 69  Offset[] array i
4420: 73 20 70 6f 70 75 6c 61 74 65 64 20 0a 2a 2a 20  s populated .** 
4430: 20 20 20 20 77 69 74 68 20 74 68 65 20 62 79 74      with the byt
4440: 65 20 6f 66 66 73 65 74 73 20 6f 66 20 61 6c 6c  e offsets of all
4450: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
4460: 66 69 65 6c 64 73 20 6f 6e 20 74 68 65 20 70 61  fields on the pa
4470: 67 65 2e 20 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ge. .*/.struct F
4480: 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20 46  ts5SegIter {.  F
4490: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
44a0: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
44b0: 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74 65  * Segment to ite
44c0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a  rate through */.
44d0: 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20    int iIdx;     
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44f0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
4500: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
4510: 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  leaf */.  int fl
4520: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
4530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
4540: 6b 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69  k of configurati
4550: 6f 6e 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  on flags */.  in
4560: 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20  t iLeafPgno;    
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4580: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   Current leaf pa
4590: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 46  ge number */.  F
45a0: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20  ts5Data *pLeaf; 
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
45c0: 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
45d0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  ata */.  int iLe
45e0: 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  afOffset;       
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
4600: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 63   offset within c
4610: 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a  urrent leaf */..
4620: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e    /* The page an
4630: 64 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68  d offset from wh
4640: 69 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ich the current 
4650: 74 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54  term was read. T
4660: 68 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20  he offset .  ** 
4670: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  is the offset of
4680: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
4690: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
46a0: 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69  doclist.  */.  i
46b0: 6e 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  nt iTermLeafPgno
46c0: 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61  ;.  int iTermLea
46d0: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 54  fOffset;..  /* T
46e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
46f0: 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 68   only used if th
4700: 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  e FTS5_SEGITER_R
4710: 45 56 45 52 53 45 20 66 6c 61 67 20 69 73 20 73  EVERSE flag is s
4720: 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  et. */.  int iRo
4730: 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  widOffset;      
4740: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4750: 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61 52 6f  ent entry in aRo
4760: 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f 0a 20  widOffset[] */. 
4770: 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66 73 65   int nRowidOffse
4780: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4790: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
47a0: 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66 66 73  ze of aRowidOffs
47b0: 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  et[] array */.  
47c0: 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66 73 65  int *aRowidOffse
47d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
47e0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66 66 73  /* Array of offs
47f0: 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69 65 6c  et to rowid fiel
4800: 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44 6c 69  ds */..  Fts5Dli
4810: 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 3b 20  dxIter *pDlidx; 
4820: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
4830: 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
4840: 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a  t-index */..  /*
4850: 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70 75 6c   Variables popul
4860: 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 63 75  ated based on cu
4870: 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a 2f 0a  rrent entry. */.
4880: 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
4890: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
48a0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72    /* Current ter
48b0: 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  m */.  i64 iRowi
48c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
48d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
48e0: 74 20 72 6f 77 69 64 20 2a 2f 0a 7d 3b 0a 0a 23  t rowid */.};..#
48f0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49  define FTS5_SEGI
4900: 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31  TER_ONETERM 0x01
4910: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45  .#define FTS5_SE
4920: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 30 78  GITER_REVERSE 0x
4930: 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  02.../*.** Objec
4940: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
4950: 74 68 72 6f 75 67 68 20 70 61 67 69 6e 61 74 65  through paginate
4960: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63  d data..*/.struc
4970: 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20  t Fts5ChunkIter 
4980: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
4990: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
49a0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
49b0: 65 61 66 20 64 61 74 61 2e 20 4e 55 4c 4c 20 2d  eaf data. NULL -
49c0: 3e 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 36 34 20  > EOF. */.  i64 
49d0: 69 4c 65 61 66 52 6f 77 69 64 3b 20 20 20 20 20  iLeafRowid;     
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
49f0: 62 73 6f 6c 75 74 65 20 72 6f 77 69 64 20 6f 66  bsolute rowid of
4a00: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
4a10: 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20  .  int nRem;    
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20     /* Remaining 
4a40: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 74 6f  bytes of data to
4a50: 20 72 65 61 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   read */..  /* O
4a60: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
4a70: 20 2a 2f 0a 20 20 75 38 20 2a 70 3b 20 20 20 20   */.  u8 *p;    
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a90: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
4aa0: 20 74 6f 20 63 68 75 6e 6b 20 6f 66 20 64 61 74   to chunk of dat
4ab0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  a */.  int n;   
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4ae0: 66 20 62 75 66 66 65 72 20 70 20 69 6e 20 62 79  f buffer p in by
4af0: 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  tes */.};../*.**
4b00: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
4b10: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20  ating through a 
4b20: 73 69 6e 67 6c 65 20 70 6f 73 69 74 69 6f 6e 20  single position 
4b30: 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  list on disk..*/
4b40: 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 49  .struct Fts5PosI
4b50: 74 65 72 20 7b 0a 20 20 46 74 73 35 43 68 75 6e  ter {.  Fts5Chun
4b60: 6b 49 74 65 72 20 63 68 75 6e 6b 3b 20 20 20 20  kIter chunk;    
4b70: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4b80: 6e 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61  nt chunk of data
4b90: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
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 4f 66 66 73 65 74 20        /* Offset 
4bc0: 77 69 74 68 69 6e 20 63 68 75 6e 6b 20 64 61 74  within chunk dat
4bd0: 61 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43 6f 6c  a */..  int iCol
4be0: 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a 7d 3b  ;.  int iPos;.};
4bf0: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66  ../*.** Object f
4c00: 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
4c10: 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e 74 73  ough the conents
4c20: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69 6e 74   of a single int
4c30: 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 0a 2a  ernal node in .*
4c40: 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 72  * memory..*/.str
4c50: 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65 72  uct Fts5NodeIter
4c60: 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e 61 6c   {.  /* Internal
4c70: 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61 67 65  . Set and manage
4c80: 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49 74 65  d by fts5NodeIte
4c90: 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  rXXX() functions
4ca0: 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a 2a 20  . Except, .  ** 
4cb0: 74 68 65 20 45 4f 46 20 74 65 73 74 20 66 6f 72  the EOF test for
4cc0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
4cd0: 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72 2e 61   (Fts5NodeIter.a
4ce0: 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a 20 20  Data==0).  */.  
4cf0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 3b  const u8 *aData;
4d00: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20  .  int nData;.  
4d10: 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f 2a 20  int iOff;..  /* 
4d20: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
4d30: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
4d40: 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 45 6d   term;.  int nEm
4d50: 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68 69 6c  pty;.  int iChil
4d60: 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b  d;.  int bDlidx;
4d70: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
4d80: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
4d90: 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73 20  llowing type is 
4da0: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
4db0: 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74  through the cont
4dc0: 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f 63  ents.** of a doc
4dd0: 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72  list-index recor
4de0: 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a 0a  d..**.** pData:.
4df0: 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e 74  **   Record cont
4e00: 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  aining the docli
4e10: 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a 2a  st-index data..*
4e20: 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20 20  *.** bEof:.**   
4e30: 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63 65  Set to true once
4e40: 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72 65   iterator has re
4e50: 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  ached EOF..**.**
4e60: 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74 20   iOff:.**   Set 
4e70: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  to the current o
4e80: 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65 63  ffset within rec
4e90: 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73 74  ord pData..*/.st
4ea0: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74  ruct Fts5DlidxIt
4eb0: 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  er {.  Fts5Data 
4ec0: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
4ed0: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
4ee0: 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 2c 20   doclist index, 
4ef0: 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
4f00: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
4f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4f20: 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 74 6f  rent offset into
4f30: 20 70 44 6c 69 64 78 20 2a 2f 0a 20 20 69 6e 74   pDlidx */.  int
4f40: 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20   bEof;          
4f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
4f60: 20 45 4f 46 20 61 6c 72 65 61 64 79 20 2a 2f 0a   EOF already */.
4f70: 20 20 69 6e 74 20 69 46 69 72 73 74 4f 66 66 3b    int iFirstOff;
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 2f 2a 20 55 73 65 64 20 62 79 20 72 65 76 65 72  /* Used by rever
4fa0: 73 65 20 69 74 65 72 61 74 6f 72 73 20 6f 6e 6c  se iterators onl
4fb0: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  y */..  /* Outpu
4fc0: 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  t variables */. 
4fd0: 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20   int iLeafPgno; 
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4ff0: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
5000: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
5010: 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ge */.  i64 iRow
5020: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
5030: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
5040: 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65  owid on leaf iLe
5050: 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  afPgno */.};.../
5060: 2a 0a 2a 2a 20 41 6e 20 46 74 73 35 42 74 72 65  *.** An Fts5Btre
5070: 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20  eIter object is 
5080: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
5090: 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72  through all entr
50a0: 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d  ies in the.** b-
50b0: 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20 62  tree hierarchy b
50c0: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 73 69  elonging to a si
50d0: 6e 67 6c 65 20 66 74 73 35 20 73 65 67 6d 65 6e  ngle fts5 segmen
50e0: 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
50f0: 74 68 65 0a 2a 2a 20 22 62 2d 74 72 65 65 20 68  the.** "b-tree h
5100: 69 65 72 61 72 63 68 79 22 20 69 73 20 61 6c 6c  ierarchy" is all
5110: 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 65 78   b-tree nodes ex
5120: 63 65 70 74 20 6c 65 61 76 65 73 2e 20 45 61 63  cept leaves. Eac
5130: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  h entry in the.*
5140: 2a 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  * b-tree hierarc
5150: 68 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  hy consists of t
5160: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
5170: 0a 2a 2a 20 20 20 69 4c 65 61 66 3a 20 20 54 68  .**   iLeaf:  Th
5180: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
5190: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 74   the leaf page t
51a0: 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 20  he entry points 
51b0: 74 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72 6d  to..**.**   term
51c0: 3a 20 20 20 41 20 73 70 6c 69 74 2d 6b 65 79 20  :   A split-key 
51d0: 74 68 61 74 20 61 6c 6c 20 74 65 72 6d 73 20 6f  that all terms o
51e0: 6e 20 6c 65 61 66 20 70 61 67 65 20 24 69 4c 65  n leaf page $iLe
51f0: 61 66 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  af must be great
5200: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
5210: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
5220: 2e 20 54 68 65 20 22 74 65 72 6d 22 20 61 73 73  . The "term" ass
5230: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
5240: 20 66 69 72 73 74 20 62 2d 74 72 65 65 0a 2a 2a   first b-tree.**
5250: 20 20 20 20 20 20 20 20 20 20 20 68 69 65 72 61             hiera
5260: 72 63 68 79 20 65 6e 74 72 79 20 28 74 68 65 20  rchy entry (the 
5270: 6f 6e 65 20 74 68 61 74 20 70 6f 69 6e 74 73 20  one that points 
5280: 74 6f 20 6c 65 61 66 20 70 61 67 65 20 31 29 20  to leaf page 1) 
5290: 69 73 20 61 6c 77 61 79 73 20 0a 2a 2a 20 20 20  is always .**   
52a0: 20 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79          an empty
52b0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20   string..**.**  
52c0: 20 6e 45 6d 70 74 79 3a 20 54 68 65 20 6e 75 6d   nEmpty: The num
52d0: 62 65 72 20 6f 66 20 65 6d 70 74 79 20 28 74 65  ber of empty (te
52e0: 72 6d 6c 65 73 73 29 20 6c 65 61 66 20 70 61 67  rmless) leaf pag
52f0: 65 73 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74  es that immediat
5300: 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ely.**          
5310: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65 61 66   following iLeaf
5320: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
5330: 42 74 72 65 65 49 74 65 72 20 6f 62 6a 65 63 74  BtreeIter object
5340: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
5350: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 74   part of the int
5360: 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63 6f 64  egrity-check cod
5370: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  e..*/.struct Fts
5380: 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20  5BtreeIterLevel 
5390: 7b 0a 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72  {.  Fts5NodeIter
53a0: 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
53b0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
53c0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
53d0: 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  node */.  Fts5Da
53e0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
53f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5400: 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  a for the curren
5410: 74 20 6e 6f 64 65 20 2a 2f 0a 7d 3b 0a 73 74 72  t node */.};.str
5420: 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74 65  uct Fts5BtreeIte
5430: 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r {.  Fts5Index 
5440: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
5450: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
5460: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
5470: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
5480: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
5490: 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
54a0: 6f 75 67 68 20 74 68 69 73 20 73 65 67 6d 65 6e  ough this segmen
54b0: 74 27 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  t's b-tree */.  
54c0: 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 2f 2a 20 49 6e 64 65 78 20 70 53 65 67 20 62 65  /* Index pSeg be
54f0: 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  longs to */.  in
5500: 74 20 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t nLvl;         
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5520: 20 53 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d 20   Size of aLvl[] 
5530: 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 42  array */.  Fts5B
5540: 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 61  treeIterLevel *a
5550: 4c 76 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65  Lvl;       /* Le
5560: 76 65 6c 20 66 6f 72 20 65 61 63 68 20 74 69 65  vel for each tie
5570: 72 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  r of b-tree */..
5580: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
5590: 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  ables */.  Fts5B
55a0: 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
55b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
55c0: 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  rrent term */.  
55d0: 69 6e 74 20 69 4c 65 61 66 3b 20 20 20 20 20 20  int iLeaf;      
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 2f 2a 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e 69  /* Leaf containi
5600: 6e 67 20 74 65 72 6d 73 20 3e 3d 20 63 75 72 72  ng terms >= curr
5610: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ent term */.  in
5620: 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20  t nEmpty;       
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5640: 20 4e 75 6d 62 65 72 20 6f 66 20 22 65 6d 70 74   Number of "empt
5650: 79 22 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  y" leaves follow
5660: 69 6e 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20 69  ing iLeaf */.  i
5670: 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20  nt bEof;        
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5690: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 61 74  * Set to true at
56a0: 20 45 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62 44   EOF */.  int bD
56b0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  lidx;           
56c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
56d0: 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
56e0: 73 20 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b 0a  s a dlidx */.};.
56f0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
5700: 73 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75  s5PutU16(u8 *aOu
5710: 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20  t, u16 iVal){.  
5720: 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e  aOut[0] = (iVal>
5730: 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d  >8);.  aOut[1] =
5740: 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a   (iVal&0xFF);.}.
5750: 0a 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35  .static u16 fts5
5760: 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20  GetU16(const u8 
5770: 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  *aIn){.  return 
5780: 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20  ((u16)aIn[0] << 
5790: 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a  8) + aIn[1];.}..
57a0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
57b0: 6e 64 20 72 65 74 75 72 6e 20 61 20 62 75 66 66  nd return a buff
57c0: 65 72 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74  er at least nByt
57d0: 65 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  e bytes in size.
57e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d  .**.** If an OOM
57f0: 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
5800: 74 65 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55  tered, return NU
5810: 4c 4c 20 61 6e 64 20 73 65 74 20 74 68 65 20 65  LL and set the e
5820: 72 72 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20  rror code in.** 
5830: 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 68 61  the Fts5Index ha
5840: 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74  ndle passed as t
5850: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
5860: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5870: 64 20 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  d *fts5IdxMalloc
5880: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
5890: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69  nt nByte){.  voi
58a0: 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  d *pRet = 0;.  i
58b0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
58c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20  _OK ){.    pRet 
58d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
58e0: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
58f0: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
5900: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
5910: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
5920: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
5930: 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b  pRet, 0, nByte);
5940: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5950: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
5960: 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63  ** Compare the c
5970: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
5980: 4c 65 66 74 20 62 75 66 66 65 72 20 77 69 74 68  Left buffer with
5990: 20 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67   the pRight/nRig
59a0: 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52  ht blob..**.** R
59b0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
59c0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
59d0: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
59e0: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
59f0: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
5a00: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
5a10: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
5a20: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
5a30: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
5a40: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
5a50: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
5a60: 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a  ferCompareBlob(.
5a70: 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c    Fts5Buffer *pL
5a80: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
5a90: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73    /* Left hand s
5aa0: 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ide of compariso
5ab0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
5ac0: 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69  *pRight, int nRi
5ad0: 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ght    /* Right 
5ae0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d  hand side of com
5af0: 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  parison */.){.  
5b00: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
5b10: 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29  Left->n, nRight)
5b20: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
5b30: 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70  mcmp(pLeft->p, p
5b40: 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20  Right, nCmp);.  
5b50: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f  return (res==0 ?
5b60: 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69   (pLeft->n - nRi
5b70: 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a  ght) : res);.}..
5b80: 23 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74  #if 0.static int
5b90: 20 66 74 73 35 43 6f 6d 70 61 72 65 42 6c 6f 62   fts5CompareBlob
5ba0: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c  (.  const u8 *pL
5bb0: 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 0a  eft, int nLeft,.
5bc0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67    const u8 *pRig
5bd0: 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29  ht, int nRight.)
5be0: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
5bf0: 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74  IN(nLeft, nRight
5c00: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
5c10: 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69  emcmp(pLeft, pRi
5c20: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
5c30: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
5c40: 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20  nLeft - nRight) 
5c50: 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66  : res);.}.#endif
5c60: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
5c70: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
5c80: 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73 20  the two buffers 
5c90: 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20  using memcmp(). 
5ca0: 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a  If one buffer.**
5cb0: 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
5cc0: 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73  the other, it is
5cd0: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20   considered the 
5ce0: 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  lesser..**.** Re
5cf0: 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66  turn -ve if pLef
5d00: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
5d10: 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74  n pRight, 0 if t
5d20: 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72  hey are equal or
5d30: 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68  .** +ve if pRigh
5d40: 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  t is smaller tha
5d50: 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65  n pLeft. In othe
5d60: 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20  r words:.**.**  
5d70: 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20     res = *pLeft 
5d80: 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61  - *pRight.*/.sta
5d90: 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66  tic int fts5Buff
5da0: 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75  erCompare(Fts5Bu
5db0: 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73  ffer *pLeft, Fts
5dc0: 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74 29  5Buffer *pRight)
5dd0: 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d  {.  int nCmp = M
5de0: 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69  IN(pLeft->n, pRi
5df0: 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72  ght->n);.  int r
5e00: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66  es = memcmp(pLef
5e10: 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c  t->p, pRight->p,
5e20: 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e   nCmp);.  return
5e30: 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66   (res==0 ? (pLef
5e40: 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e  t->n - pRight->n
5e50: 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a  ) : res);.}.../*
5e60: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65  .** Close the re
5e70: 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e  ad-only blob han
5e80: 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70  dle, if it is op
5e90: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  en..*/.static vo
5ea0: 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  id fts5CloseRead
5eb0: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  er(Fts5Index *p)
5ec0: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64  {.  if( p->pRead
5ed0: 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
5ee0: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20  3_blob *pReader 
5ef0: 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20  = p->pReader;.  
5f00: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
5f10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  ;.    sqlite3_bl
5f20: 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72  ob_close(pReader
5f30: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
5f40: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
5f50: 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28  ataReadOrBuffer(
5f60: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
5f70: 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a   .  Fts5Buffer *
5f80: 70 42 75 66 2c 20 0a 20 20 69 36 34 20 69 52 6f  pBuf, .  i64 iRo
5f90: 77 69 64 0a 29 7b 0a 20 20 46 74 73 35 44 61 74  wid.){.  Fts5Dat
5fa0: 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  a *pRet = 0;.  i
5fb0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
5fc0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
5fd0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
5fe0: 23 69 66 20 30 0a 46 74 73 35 42 75 66 66 65 72  #if 0.Fts5Buffer
5ff0: 20 62 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a   buf = {0,0,0};.
6000: 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26  fts5DebugRowid(&
6010: 72 63 2c 20 26 62 75 66 2c 20 69 52 6f 77 69 64  rc, &buf, iRowid
6020: 29 3b 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75  );.fprintf(stdou
6030: 74 2c 20 22 72 65 61 64 3a 20 25 73 5c 6e 22 2c  t, "read: %s\n",
6040: 20 62 75 66 2e 70 29 3b 0a 66 66 6c 75 73 68 28   buf.p);.fflush(
6050: 73 74 64 6f 75 74 29 3b 0a 73 71 6c 69 74 65 33  stdout);.sqlite3
6060: 5f 66 72 65 65 28 62 75 66 2e 70 29 3b 0a 23 65  _free(buf.p);.#e
6070: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
6080: 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  pReader ){.     
6090: 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
60a0: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
60b0: 41 42 4f 52 54 20 69 66 20 74 68 65 72 65 20 68  ABORT if there h
60c0: 61 73 20 62 65 65 6e 20 61 20 73 61 76 65 70 6f  as been a savepo
60d0: 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  int.      ** rol
60e0: 6c 62 61 63 6b 20 73 69 6e 63 65 20 69 74 20 77  lback since it w
60f0: 61 73 20 6c 61 73 74 20 75 73 65 64 2e 20 49 6e  as last used. In
6100: 20 74 68 69 73 20 63 61 73 65 20 61 20 6e 65 77   this case a new
6110: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20   blob handle.   
6120: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
6130: 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  d.  */.      rc 
6140: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
6150: 65 6f 70 65 6e 28 70 2d 3e 70 52 65 61 64 65 72  eopen(p->pReader
6160: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
6170: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6180: 41 42 4f 52 54 20 29 7b 0a 20 20 20 20 20 20 20  ABORT ){.       
6190: 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
61a0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (p);.        rc 
61b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
61c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
61d0: 2f 2a 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68  /* If the blob h
61e0: 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20 79 65 74  andle is not yet
61f0: 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20   open, open and 
6200: 73 65 65 6b 20 69 74 2e 20 4f 74 68 65 72 77 69  seek it. Otherwi
6210: 73 65 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74  se, use.    ** t
6220: 68 65 20 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29  he blob_reopen()
6230: 20 41 50 49 20 74 6f 20 72 65 73 65 65 6b 20 74   API to reseek t
6240: 68 65 20 65 78 69 73 74 69 6e 67 20 62 6c 6f 62  he existing blob
6250: 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20   handle.  */.   
6260: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d   if( p->pReader=
6270: 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  =0 ){.      Fts5
6280: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
6290: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
62a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
62b0: 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66  _blob_open(pConf
62c0: 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20  ig->db, .       
62d0: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
62e0: 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62   p->zDataTbl, "b
62f0: 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30  lock", iRowid, 0
6300: 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20  , &p->pReader.  
6310: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
6320: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6330: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
6340: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
6350: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
6360: 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69  Reader);.      i
6370: 66 28 20 70 42 75 66 20 29 7b 0a 20 20 20 20 20  f( pBuf ){.     
6380: 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
6390: 6f 28 70 42 75 66 29 3b 0a 20 20 20 20 20 20 20  o(pBuf);.       
63a0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
63b0: 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
63c0: 72 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29  rc, pBuf, nByte)
63d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
63e0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
63f0: 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72 2c  read(p->pReader,
6400: 20 70 42 75 66 2d 3e 70 2c 20 6e 42 79 74 65 2c   pBuf->p, nByte,
6410: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
6420: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6430: 20 29 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79   ) pBuf->n = nBy
6440: 74 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  te;.        }.  
6450: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6460: 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 44     pRet = (Fts5D
6470: 61 74 61 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c  ata*)fts5IdxMall
6480: 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
6490: 35 44 61 74 61 29 20 2b 20 6e 42 79 74 65 29 3b  5Data) + nByte);
64a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 52  .        if( !pR
64b0: 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  et ) return 0;..
64c0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 20          pRet->n 
64d0: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  = nByte;.       
64e0: 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29   pRet->p = (u8*)
64f0: 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20  &pRet[1];.      
6500: 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31    pRet->nRef = 1
6510: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
6520: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
6530: 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 70 52 65  (p->pReader, pRe
6540: 74 2d 3e 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b  t->p, nByte, 0);
6550: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
6560: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6570: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6580: 66 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20  free(pRet);.    
6590: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
65a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
65b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72  }.    }.    p->r
65c0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e  c = rc;.    p->n
65d0: 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72  Read++;.  }..  r
65e0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
65f0: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
6600: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
6610: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a  %_data table..**
6620: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
6630: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
6640: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
6650: 65 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68  error left in th
6660: 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20  e .** Fts5Index 
6670: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  object..*/.stati
6680: 63 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35  c Fts5Data *fts5
6690: 44 61 74 61 52 65 61 64 28 46 74 73 35 49 6e 64  DataRead(Fts5Ind
66a0: 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
66b0: 64 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  d){.  Fts5Data *
66c0: 70 52 65 74 20 3d 20 66 74 73 35 44 61 74 61 52  pRet = fts5DataR
66d0: 65 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20 30  eadOrBuffer(p, 0
66e0: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 61 73 73  , iRowid);.  ass
66f0: 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d  ert( (pRet==0)==
6700: 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (p->rc!=SQLITE_O
6710: 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  K) );.  return p
6720: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
6730: 61 64 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ad a record from
6740: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
6750: 65 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65  e into the buffe
6760: 72 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68  r supplied as th
6770: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75  e.** second argu
6780: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
6790: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
67a0: 61 6e 20 65 72 72 6f 72 20 69 73 20 6c 65 66 74  an error is left
67b0: 20 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65   in the Fts5Inde
67c0: 78 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a  x object. If an.
67d0: 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  ** error has alr
67e0: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
67f0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
6800: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
6810: 73 20 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a  s a .** no-op..*
6820: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
6830: 73 35 44 61 74 61 42 75 66 66 65 72 28 46 74 73  s5DataBuffer(Fts
6840: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42  5Index *p, Fts5B
6850: 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34  uffer *pBuf, i64
6860: 20 69 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69   iRowid){.  (voi
6870: 64 29 66 74 73 35 44 61 74 61 52 65 61 64 4f 72  d)fts5DataReadOr
6880: 42 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20  Buffer(p, pBuf, 
6890: 69 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iRowid);.}../*.*
68a0: 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
68b0: 72 65 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65  rence to data re
68c0: 63 6f 72 64 20 72 65 74 75 72 6e 65 64 20 62 79  cord returned by
68d0: 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
68e0: 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52   to.** fts5DataR
68f0: 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ead()..*/.static
6900: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
6910: 6c 65 61 73 65 28 46 74 73 35 44 61 74 61 20 2a  lease(Fts5Data *
6920: 70 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 44  pData){.  if( pD
6930: 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ata ){.    asser
6940: 74 28 20 70 44 61 74 61 2d 3e 6e 52 65 66 3e 30  t( pData->nRef>0
6950: 20 29 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e   );.    pData->n
6960: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
6970: 44 61 74 61 2d 3e 6e 52 65 66 3d 3d 30 20 29 20  Data->nRef==0 ) 
6980: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61  sqlite3_free(pDa
6990: 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ta);.  }.}..stat
69a0: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
69b0: 52 65 66 65 72 65 6e 63 65 28 46 74 73 35 44 61  Reference(Fts5Da
69c0: 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 70 44  ta *pData){.  pD
69d0: 61 74 61 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a  ata->nRef++;.}..
69e0: 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20  /*.** INSERT OR 
69f0: 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64  REPLACE a record
6a00: 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61   into the %_data
6a10: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
6a20: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 57  c void fts5DataW
6a30: 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  rite(Fts5Index *
6a40: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63  p, i64 iRowid, c
6a50: 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
6a60: 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66  int nData){.  if
6a70: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
6a80: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
6a90: 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d  if( p->pWriter==
6aa0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  0 ){.    int rc;
6ab0: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
6ac0: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
6ad0: 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20  onfig;.    char 
6ae0: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
6af0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
6b00: 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27   "REPLACE INTO '
6b10: 25 71 27 2e 25 51 28 69 64 2c 20 62 6c 6f 63 6b  %q'.%Q(id, block
6b20: 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20  ) VALUES(?,?)", 
6b30: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d  pConfig->zDb, p-
6b40: 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 29 3b  >zDataTbl.    );
6b50: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
6b60: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
6b70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6b80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
6b90: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
6ba0: 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64  re_v2(pConfig->d
6bb0: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d  b, zSql, -1, &p-
6bc0: 3e 70 57 72 69 74 65 72 2c 20 30 29 3b 0a 20 20  >pWriter, 0);.  
6bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6be0: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zSql);.    }.  
6bf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6c00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
6c10: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
6c20: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
6c30: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ..  sqlite3_bind
6c40: 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65  _int64(p->pWrite
6c50: 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20  r, 1, iRowid);. 
6c60: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
6c70: 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32  ob(p->pWriter, 2
6c80: 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
6c90: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
6ca0: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6cb0: 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d  ->pWriter);.  p-
6cc0: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
6cd0: 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  set(p->pWriter);
6ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
6cf0: 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
6d00: 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44  SQL:.**.**     D
6d10: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
6d20: 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45  a WHERE id BETWE
6d30: 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24  EN $iFirst AND $
6d40: 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20  iLast.*/.static 
6d50: 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c  void fts5DataDel
6d60: 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ete(Fts5Index *p
6d70: 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36  , i64 iFirst, i6
6d80: 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20  4 iLast){.  if( 
6d90: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
6da0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
6db0: 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30  ( p->pDeleter==0
6dc0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
6dd0: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
6de0: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
6df0: 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  nfig;.    char *
6e00: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
6e10: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
6e20: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71  "DELETE FROM '%q
6e30: 27 2e 25 51 20 57 48 45 52 45 20 69 64 3e 3d 3f  '.%Q WHERE id>=?
6e40: 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f   AND id<=?", pCo
6e50: 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44  nfig->zDb, p->zD
6e60: 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20  ataTbl.    );.  
6e70: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
6e80: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6e90: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
6ea0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
6eb0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
6ec0: 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  v2(pConfig->db, 
6ed0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44  zSql, -1, &p->pD
6ee0: 65 6c 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  eleter, 0);.    
6ef0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
6f00: 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
6f10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6f20: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  K ){.      p->rc
6f30: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
6f40: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
6f50: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
6f60: 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72  nt64(p->pDeleter
6f70: 2c 20 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  , 1, iFirst);.  
6f80: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6f90: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
6fa0: 32 2c 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c  2, iLast);.  sql
6fb0: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65  ite3_step(p->pDe
6fc0: 6c 65 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  leter);.  p->rc 
6fd0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
6fe0: 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a  p->pDeleter);.}.
6ff0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
7000: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 68 61   sqlite3_blob ha
7010: 6e 64 6c 65 20 75 73 65 64 20 74 6f 20 72 65 61  ndle used to rea
7020: 64 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  d records from t
7030: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
7040: 0a 2a 2a 20 41 6e 64 20 64 69 73 63 61 72 64 20  .** And discard 
7050: 61 6e 79 20 63 61 63 68 65 64 20 72 65 61 64 73  any cached reads
7060: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
7070: 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  is called at the
7080: 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 72 65 61   end of.** a rea
7090: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  d transaction or
70a0: 20 77 68 65 6e 20 61 6e 79 20 73 75 62 2d 74 72   when any sub-tr
70b0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
70c0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66  led back..*/.#if
70d0: 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66   0.static void f
70e0: 74 73 35 44 61 74 61 52 65 73 65 74 28 46 74 73  ts5DataReset(Fts
70f0: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66  5Index *p){.  if
7100: 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a  ( p->pReader ){.
7110: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
7120: 5f 63 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64 65  _close(p->pReade
7130: 72 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64  r);.    p->pRead
7140: 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  er = 0;.  }.}.#e
7150: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  ndif../*.** Remo
7160: 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61  ve all records a
7170: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
7180: 65 67 6d 65 6e 74 20 69 53 65 67 69 64 20 69 6e  egment iSegid in
7190: 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2f 0a   index iIdx..*/.
71a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
71b0: 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e  DataRemoveSegmen
71c0: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
71d0: 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53  int iIdx, int iS
71e0: 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69  egid){.  i64 iFi
71f0: 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  rst = FTS5_SEGME
7200: 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69  NT_ROWID(iIdx, i
7210: 53 65 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20  Segid, 0, 0);.  
7220: 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35  i64 iLast = FTS5
7230: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
7240: 49 64 78 2c 20 69 53 65 67 69 64 2b 31 2c 20 30  Idx, iSegid+1, 0
7250: 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61  , 0)-1;.  fts5Da
7260: 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72  taDelete(p, iFir
7270: 73 74 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a 0a 2f  st, iLast);.}../
7280: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
7290: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46  eference to an F
72a0: 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a  ts5Structure obj
72b0: 65 63 74 20 72 65 74 75 72 6e 65 64 20 62 79 20  ect returned by 
72c0: 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63  an earlier .** c
72d0: 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63  all to fts5Struc
72e0: 74 75 72 65 52 65 61 64 28 29 20 6f 72 20 66 74  tureRead() or ft
72f0: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
7300: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
7310: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
7320: 65 52 65 6c 65 61 73 65 28 46 74 73 35 53 74 72  eRelease(Fts5Str
7330: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
7340: 7b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  {.  if( pStruct 
7350: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
7360: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74    for(i=0; i<pSt
7370: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  ruct->nLevel; i+
7380: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
7390: 33 5f 66 72 65 65 28 70 53 74 72 75 63 74 2d 3e  3_free(pStruct->
73a0: 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29 3b  aLevel[i].aSeg);
73b0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
73c0: 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74 29  e3_free(pStruct)
73d0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
73e0: 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72  eserialize and r
73f0: 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74  eturn the struct
7400: 75 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65  ure record curre
7410: 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73  ntly stored in s
7420: 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72  erialized.** for
7430: 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20  m within buffer 
7440: 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a  pData/nData..**.
7450: 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63  ** The Fts5Struc
7460: 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e  ture.aLevel[] an
7470: 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63  d each Fts5Struc
7480: 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d  tureLevel.aSeg[]
7490: 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76   array.** are ov
74a0: 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  er-allocated by 
74b0: 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61  one slot. This a
74c0: 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74  llows the struct
74d0: 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  ure contents.** 
74e0: 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c  to be more easil
74f0: 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  y edited..**.** 
7500: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
7510: 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65  rs, *ppOut is se
7520: 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e  t to NULL and an
7530: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
7540: 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  de.** returned. 
7550: 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75  Otherwise, *ppOu
7560: 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  t is set to poin
7570: 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
7580: 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  ect and.** SQLIT
7590: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
75a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
75b0: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
75c0: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  (.  const u8 *pD
75d0: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
75e0: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
75f0: 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69  ntaining seriali
7600: 7a 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f  zed structure */
7610: 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20  .  int nData,   
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
7640: 66 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79  ffer pData in by
7650: 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  tes */.  int *pi
7660: 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20  Cookie,         
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
7680: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
7690: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35   value */.  Fts5
76a0: 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75  Structure **ppOu
76b0: 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t           /* O
76c0: 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64  UT: Deserialized
76d0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
76e0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
76f0: 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b  OK;.  int i = 0;
7700: 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69  .  int iLvl;.  i
7710: 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20  nt nLevel = 0;. 
7720: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
7730: 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  0;.  int nByte; 
7740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7750: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
7760: 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
7770: 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20  te at pRet */.  
7780: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7790: 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ret = 0;        
77a0: 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a  /* Structure obj
77b0: 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ect to return */
77c0: 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20  ..  /* Grab the 
77d0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a  cookie value */.
77e0: 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29    if( piCookie )
77f0: 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c   *piCookie = sql
7800: 69 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44  ite3Fts5Get32(pD
7810: 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a  ata);.  i = 4;..
7820: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f    /* Read the to
7830: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  tal number of le
7840: 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74  vels and segment
7850: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  s from the start
7860: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72   of the.  ** str
7870: 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20  ucture record.  
7880: 2a 2f 0a 20 20 69 20 2b 3d 20 67 65 74 56 61 72  */.  i += getVar
7890: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
78a0: 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d   nLevel);.  i +=
78b0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44   getVarint32(&pD
78c0: 61 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74  ata[i], nSegment
78d0: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20  );.  nByte = (. 
78e0: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
78f0: 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20  Structure) +    
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72  /* Main structur
7920: 65 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f  e */.      sizeo
7930: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7940: 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 29  evel) * (nLevel)
7950: 20 20 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b        /* aLevel[
7960: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a  ] array */.  );.
7970: 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 53 74    pRet = (Fts5St
7980: 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33  ructure*)sqlite3
7990: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
79a0: 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69  rc, nByte);..  i
79b0: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70  f( pRet ){.    p
79c0: 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c  Ret->nLevel = nL
79d0: 65 76 65 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73  evel;.    i += s
79e0: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
79f0: 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74  &pData[i], &pRet
7a00: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
7a10: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  ;..    for(iLvl=
7a20: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
7a30: 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b   && iLvl<nLevel;
7a40: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
7a50: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7a60: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74  el *pLvl = &pRet
7a70: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
7a80: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c        int nTotal
7a90: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
7aa0: 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 67 65  ;..      i += ge
7ab0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
7ac0: 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  [i], pLvl->nMerg
7ad0: 65 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 67  e);.      i += g
7ae0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7af0: 61 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20  a[i], nTotal);. 
7b00: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f       assert( nTo
7b10: 74 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67  tal>=pLvl->nMerg
7b20: 65 20 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  e );.      pLvl-
7b30: 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 74 72  >aSeg = (Fts5Str
7b40: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73  uctureSegment*)s
7b50: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
7b60: 5a 65 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20  Zero(&rc, .     
7b70: 20 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69       nTotal * si
7b80: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7b90: 72 65 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20  reSegment).     
7ba0: 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72   );..      if( r
7bb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7bc0: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53          pLvl->nS
7bd0: 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20  eg = nTotal;.   
7be0: 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
7bf0: 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53   iSeg<nTotal; iS
7c00: 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
7c10: 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   i += getVarint3
7c20: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
7c30: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l->aSeg[iSeg].iS
7c40: 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  egid);.         
7c50: 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   i += getVarint3
7c60: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
7c70: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48  l->aSeg[iSeg].nH
7c80: 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  eight);.        
7c90: 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    i += getVarint
7ca0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c  32(&pData[i], pL
7cb0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
7cc0: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
7cd0: 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72       i += getVar
7ce0: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
7cf0: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
7d00: 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20  ].pgnoLast);.   
7d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
7d20: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
7d30: 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
7d40: 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  (pRet);.        
7d50: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
7d60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  }.    }.  }..  *
7d70: 70 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20 20  ppOut = pRet;.  
7d80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7d90: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
7da0: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
7db0: 41 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52  AddLevel(int *pR
7dc0: 63 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  c, Fts5Structure
7dd0: 20 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a 20 20   **ppStruct){.  
7de0: 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
7df0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
7e00: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7e10: 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
7e20: 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20     int nLevel = 
7e30: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
7e40: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
7e50: 20 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f   (.        sizeo
7e60: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
7e70: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
7e80: 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75      /* Main stru
7e90: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 20  cture */.       
7ea0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7eb0: 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e  ctureLevel) * (n
7ec0: 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65  Level+1)  /* aLe
7ed0: 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  vel[] array */. 
7ee0: 20 20 20 29 3b 0a 0a 20 20 20 20 70 53 74 72 75     );..    pStru
7ef0: 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ct = sqlite3_rea
7f00: 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c 20 6e 42  lloc(pStruct, nB
7f10: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53  yte);.    if( pS
7f20: 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 6d  truct ){.      m
7f30: 65 6d 73 65 74 28 26 70 53 74 72 75 63 74 2d 3e  emset(&pStruct->
7f40: 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20  aLevel[nLevel], 
7f50: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
7f60: 72 75 63 74 75 72 65 4c 65 76 65 6c 29 29 3b 0a  ructureLevel));.
7f70: 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e        pStruct->n
7f80: 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a  Level++;.      *
7f90: 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
7fa0: 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ct;.    }else{. 
7fb0: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
7fc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
7fd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74    }.}../*.** Ext
7fe0: 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20 73  end level iLvl s
7ff0: 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  o that there is 
8000: 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73  room for at leas
8010: 74 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a 2a  t nExtra more.**
8020: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74   segments..*/.st
8030: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
8040: 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
8050: 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  el(.  int *pRc, 
8060: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
8070: 20 2a 70 53 74 72 75 63 74 2c 20 0a 20 20 69 6e   *pStruct, .  in
8080: 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20 6e  t iLvl, .  int n
8090: 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 49  Extra, .  int bI
80a0: 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66 28 20 2a  nsert.){.  if( *
80b0: 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  pRc==SQLITE_OK )
80c0: 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
80d0: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
80e0: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
80f0: 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74 73  l[iLvl];.    Fts
8100: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
8110: 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e 74  t *aNew;.    int
8120: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79   nByte;..    nBy
8130: 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67  te = (pLvl->nSeg
8140: 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73 69 7a   + nExtra) * siz
8150: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8160: 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61  eSegment);.    a
8170: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  New = sqlite3_re
8180: 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65 67  alloc(pLvl->aSeg
8190: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
81a0: 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( aNew ){.      
81b0: 69 66 28 20 62 49 6e 73 65 72 74 3d 3d 30 20 29  if( bInsert==0 )
81c0: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
81d0: 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65  (&aNew[pLvl->nSe
81e0: 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  g], 0, sizeof(Ft
81f0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8200: 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20  nt) * nExtra);. 
8210: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8220: 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20      int nMove = 
8230: 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a  pLvl->nSeg * siz
8240: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8250: 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20  eSegment);.     
8260: 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77     memmove(&aNew
8270: 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20  [nExtra], aNew, 
8280: 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  nMove);.        
8290: 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20  memset(aNew, 0, 
82a0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
82b0: 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e  tureSegment) * n
82c0: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a  Extra);.      }.
82d0: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67        pLvl->aSeg
82e0: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c   = aNew;.    }el
82f0: 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d  se{.      *pRc =
8300: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
8310: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
8320: 2a 20 52 65 61 64 2c 20 64 65 73 65 72 69 61 6c  * Read, deserial
8330: 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ize and return t
8340: 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65 63  he structure rec
8350: 6f 72 64 20 66 6f 72 20 69 6e 64 65 78 20 69 49  ord for index iI
8360: 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74  dx..**.** The Ft
8370: 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76  s5Structure.aLev
8380: 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74  el[] and each Ft
8390: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
83a0: 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a  .aSeg[] array.**
83b0: 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61   are over-alloca
83c0: 74 65 64 20 61 73 20 64 65 73 63 72 69 62 65 64  ted as described
83d0: 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74   for function ft
83e0: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
83f0: 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a  e() .** above..*
8400: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
8410: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
8420: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
8430: 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74   error code left
8440: 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49   in the.** Fts5I
8450: 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20  ndex handle. If 
8460: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
8470: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
8480: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
8490: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  .** is called, i
84a0: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
84b0: 0a 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75  .static Fts5Stru
84c0: 63 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63  cture *fts5Struc
84d0: 74 75 72 65 52 65 61 64 28 46 74 73 35 49 6e 64  tureRead(Fts5Ind
84e0: 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 29  ex *p, int iIdx)
84f0: 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
8500: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
8510: 6e 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75  nfig;.  Fts5Stru
8520: 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b  cture *pRet = 0;
8530: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
8540: 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  t to return */. 
8550: 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
8560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8570: 20 2f 2a 20 25 5f 64 61 74 61 20 65 6e 74 72 79   /* %_data entry
8580: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 74 72 75   containing stru
8590: 63 74 75 72 65 20 72 65 63 6f 72 64 20 2a 2f 0a  cture record */.
85a0: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20    int iCookie;  
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85c0: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
85d0: 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 0a 20 20  on cookie */..  
85e0: 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43  assert( iIdx<=pC
85f0: 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29  onfig->nPrefix )
8600: 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35  ;.  pData = fts5
8610: 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
8620: 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
8630: 28 69 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21  (iIdx));.  if( !
8640: 70 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 30  pData ) return 0
8650: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35  ;.  p->rc = fts5
8660: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
8670: 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d  pData->p, pData-
8680: 3e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70  >n, &iCookie, &p
8690: 52 65 74 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  Ret);..  if( p->
86a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
86b0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f   p->pConfig->iCo
86c0: 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b  okie!=iCookie ){
86d0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
86e0: 69 74 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f  ite3Fts5ConfigLo
86f0: 61 64 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 69  ad(p->pConfig, i
8700: 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 0a 20 20  Cookie);.  }..  
8710: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
8720: 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 2d  pData);.  if( p-
8730: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
8740: 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  {.    fts5Struct
8750: 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29  ureRelease(pRet)
8760: 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  ;.    pRet = 0;.
8770: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
8780: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
8790: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
87a0: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
87b0: 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  in index structu
87c0: 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2f 0a 73  re pStruct..*/.s
87d0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74  tatic int fts5St
87e0: 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
87f0: 65 6e 74 73 28 46 74 73 35 53 74 72 75 63 74 75  ents(Fts5Structu
8800: 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20  re *pStruct){.  
8810: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
8820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8830: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
8840: 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  of segments */. 
8850: 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20   int iLvl;      
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8870: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
8880: 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
8890: 6c 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76  ls */..  for(iLv
88a0: 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
88b0: 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
88c0: 2b 29 7b 0a 20 20 20 20 6e 53 65 67 6d 65 6e 74  +){.    nSegment
88d0: 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   += pStruct->aLe
88e0: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a  vel[iLvl].nSeg;.
88f0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53    }..  return nS
8900: 65 67 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  egment;.}../*.**
8910: 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 73   Serialize and s
8920: 74 6f 72 65 20 74 68 65 20 22 73 74 72 75 63 74  tore the "struct
8930: 75 72 65 22 20 72 65 63 6f 72 64 20 66 6f 72 20  ure" record for 
8940: 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2a 0a 2a  index iIdx..**.*
8950: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8960: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
8970: 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68 65  rror code in the
8980: 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63   Fts5Index objec
8990: 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f  t. If an.** erro
89a0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
89b0: 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
89c0: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
89d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
89e0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
89f0: 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ite(Fts5Index *p
8a00: 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74 73 35  , int iIdx, Fts5
8a10: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8a20: 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ct){.  if( p->rc
8a30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8a40: 20 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b     int nSegment;
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a60: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
8a70: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a   of segments */.
8a80: 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62      Fts5Buffer b
8a90: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
8aa0: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73    /* Buffer to s
8ab0: 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20  erialize record 
8ac0: 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20  into */.    int 
8ad0: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
8ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8af0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8b00: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
8b10: 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20     int iCookie; 
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65   /* Cookie value
8b40: 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20   to store */..  
8b50: 20 20 6e 53 65 67 6d 65 6e 74 20 3d 20 66 74 73    nSegment = fts
8b60: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8b70: 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
8b80: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75  ;.    memset(&bu
8b90: 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
8ba0: 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
8bb0: 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 75  /* Append the cu
8bc0: 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74  rrent configurat
8bd0: 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20  ion cookie */.  
8be0: 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70    iCookie = p->p
8bf0: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b  Config->iCookie;
8c00: 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69 65  .    if( iCookie
8c10: 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20 30  <0 ) iCookie = 0
8c20: 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
8c30: 41 70 70 65 6e 64 33 32 28 26 70 2d 3e 72 63 2c  Append32(&p->rc,
8c40: 20 26 62 75 66 2c 20 69 43 6f 6f 6b 69 65 29 3b   &buf, iCookie);
8c50: 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
8c60: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
8c70: 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75  >rc, &buf, pStru
8c80: 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20  ct->nLevel);.   
8c90: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8ca0: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8cb0: 26 62 75 66 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  &buf, nSegment);
8cc0: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
8cd0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
8ce0: 72 63 2c 20 26 62 75 66 2c 20 28 69 36 34 29 70  rc, &buf, (i64)p
8cf0: 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
8d00: 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72  unter);..    for
8d10: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
8d20: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
8d30: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  Lvl++){.      in
8d40: 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
8d60: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
8d70: 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
8d80: 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  */.      Fts5Str
8d90: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
8da0: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
8db0: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
8dc0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8dd0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8de0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65   &buf, pLvl->nMe
8df0: 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  rge);.      fts5
8e00: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8e10: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8e20: 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20   pLvl->nSeg);.  
8e30: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
8e40: 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e  ->nMerge<=pLvl->
8e50: 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66  nSeg );..      f
8e60: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
8e70: 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67  pLvl->nSeg; iSeg
8e80: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  ++){.        fts
8e90: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
8ea0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
8eb0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
8ec0: 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g].iSegid);.    
8ed0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
8ee0: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
8ef0: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61  c, &buf, pLvl->a
8f00: 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68  Seg[iSeg].nHeigh
8f10: 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t);.        fts5
8f20: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8f30: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8f40: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
8f50: 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20  ].pgnoFirst);.  
8f60: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
8f70: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
8f80: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
8f90: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
8fa0: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Last);.      }. 
8fb0: 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44 61     }..    fts5Da
8fc0: 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
8fd0: 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28  STRUCTURE_ROWID(
8fe0: 69 49 64 78 29 2c 20 62 75 66 2e 70 2c 20 62 75  iIdx), buf.p, bu
8ff0: 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75  f.n);.    fts5Bu
9000: 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
9010: 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61    }.}..#if 0.sta
9020: 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 72 69  tic void fts5Pri
9030: 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73  ntStructure(cons
9040: 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e  t char *zCaption
9050: 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
9060: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
9070: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9080: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
9090: 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66  f;.  memset(&buf
90a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  , 0, sizeof(buf)
90b0: 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53 74  );.  fts5DebugSt
90c0: 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 62 75  ructure(&rc, &bu
90d0: 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66  f, pStruct);.  f
90e0: 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
90f0: 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74  %s: %s\n", zCapt
9100: 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66  ion, buf.p);.  f
9110: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
9120: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
9130: 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  &buf);.}.#else.#
9140: 20 64 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e   define fts5Prin
9150: 74 53 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a  tStructure(x,y).
9160: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
9170: 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69  nt fts5SegmentSi
9180: 7a 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65  ze(Fts5Structure
9190: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a  Segment *pSeg){.
91a0: 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65    return 1 + pSe
91b0: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53  g->pgnoLast - pS
91c0: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d  eg->pgnoFirst;.}
91d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
91e0: 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73   copy of index s
91f0: 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
9200: 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74  . Except, promot
9210: 65 20 61 73 20 6d 61 6e 79 20 73 65 67 6d 65 6e  e as many segmen
9220: 74 73 0a 2a 2a 20 61 73 20 70 6f 73 73 69 62 6c  ts.** as possibl
9230: 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d  e to level iProm
9240: 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f  ote. If an OOM o
9250: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
9260: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
9270: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
9280: 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a  cturePromoteTo(.
9290: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
92a0: 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a    int iPromote,.
92b0: 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c    int szPromote,
92c0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
92d0: 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20 69   *pStruct.){.  i
92e0: 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46 74 73  nt il, is;.  Fts
92f0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9300: 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  *pOut = &pStruct
9310: 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f 74  ->aLevel[iPromot
9320: 65 5d 3b 0a 0a 20 20 66 6f 72 28 69 6c 3d 69 50  e];..  for(il=iP
9330: 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74  romote+1; il<pSt
9340: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c  ruct->nLevel; il
9350: 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  ++){.    Fts5Str
9360: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
9370: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
9380: 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 66 6f  evel[il];.    fo
9390: 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d  r(is=pLvl->nSeg-
93a0: 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b  1; is>=0; is--){
93b0: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
93c0: 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28  fts5SegmentSize(
93d0: 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29  &pLvl->aSeg[is])
93e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73  ;.      if( sz>s
93f0: 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72  zPromote ) retur
9400: 6e 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  n;.      fts5Str
9410: 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
9420: 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
9430: 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20  t, iPromote, 1, 
9440: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  1);.      if( p-
9450: 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
9460: 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d      memcpy(pOut-
9470: 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53  >aSeg, &pLvl->aS
9480: 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46  eg[is], sizeof(F
9490: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
94a0: 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 70 4f 75  ent));.      pOu
94b0: 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20  t->nSeg++;.     
94c0: 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20   pLvl->nSeg--;. 
94d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
94e0: 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  * A new segment 
94f0: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72  has just been wr
9500: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69  itten to level i
9510: 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72  Lvl of index str
9520: 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63  ucture.** pStruc
9530: 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
9540: 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
9550: 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75  ny segments shou
9560: 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a  ld be promoted.*
9570: 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53  * as a result. S
9580: 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d  egments are prom
9590: 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e  oted in two scen
95a0: 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  arios:.**.**   a
95b0: 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74  ) If the segment
95c0: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73   just written is
95d0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e   smaller than on
95e0: 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e  e or more segmen
95f0: 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69  ts.**      withi
9600: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  n the previous p
9610: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20  opulated level, 
9620: 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74  it is promoted t
9630: 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a  o the previous.*
9640: 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64  *      populated
9650: 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20   level..**.**   
9660: 62 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e  b) If the segmen
9670: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69  t just written i
9680: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
9690: 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74  e newest segment
96a0: 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20   on.**      the 
96b0: 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c  next populated l
96c0: 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20  evel, then that 
96d0: 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79  segment, and any
96e0: 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a   other adjacent.
96f0: 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73  **      segments
9700: 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73   that are also s
9710: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
9720: 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e  one just written
9730: 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70  , are .**      p
9740: 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  romoted. .**.** 
9750: 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  If one or more s
9760: 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d  egments are prom
9770: 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75 63 74  oted, the struct
9780: 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70  ure object is up
9790: 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c  dated.** to refl
97a0: 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61  ect this..*/.sta
97b0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
97c0: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20  ucturePromote(. 
97d0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
9800: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
9810: 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20   iLvl,          
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9830: 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74  Index level just
9840: 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74   updated */.  Ft
9850: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9860: 72 75 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a  ruct          /*
9870: 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
9880: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
9890: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
98a0: 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20  .    int iTst;. 
98b0: 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20     int iPromote 
98c0: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a  = -1;.    int sz
98d0: 50 72 6f 6d 6f 74 65 3b 20 20 20 20 20 20 20 20  Promote;        
98e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f          /* Promo
98f0: 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73  te anything this
9900: 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72   size or smaller
9910: 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75   */.    Fts5Stru
9920: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
9930: 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74  eg;   /* Segment
9940: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
9950: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
9960: 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 3b 0a 20  reLevel *pTst;. 
9970: 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20     int szSeg;   
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9990: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d   /* Size of segm
99a0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
99b0: 20 2a 2f 0a 0a 0a 20 20 20 20 70 53 65 67 20 3d   */...    pSeg =
99c0: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
99d0: 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74  l[iLvl].aSeg[pSt
99e0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
99f0: 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20  l].nSeg-1];.    
9a00: 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65  szSeg = (1 + pSe
9a10: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53  g->pgnoLast - pS
9a20: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg->pgnoFirst);.
9a30: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
9a40: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  r condition (a) 
9a50: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d  */.    for(iTst=
9a60: 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20  iLvl-1; iTst>=0 
9a70: 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
9a80: 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30  el[iTst].nSeg==0
9a90: 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 70  ; iTst--);.    p
9aa0: 54 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Tst = &pStruct->
9ab0: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20  aLevel[iTst];.  
9ac0: 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 26 26    if( iTst>=0 &&
9ad0: 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30   pTst->nMerge==0
9ae0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
9af0: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78  .      int szMax
9b00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
9b10: 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53 65  i=0; i<pTst->nSe
9b20: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
9b30: 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d 3e   int sz = pTst->
9b40: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73 74  aSeg[i].pgnoLast
9b50: 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   - pTst->aSeg[i]
9b60: 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a  .pgnoFirst + 1;.
9b70: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
9b80: 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20 73  zMax ) szMax = s
9b90: 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  z;.      }.     
9ba0: 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53 65   if( szMax>=szSe
9bb0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g ){.        /* 
9bc0: 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  Condition (a) is
9bd0: 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20 74   true. Promote t
9be0: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
9bf0: 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20 20  t on level .    
9c00: 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20 6c      ** iLvl to l
9c10: 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a 20  evel iTst.  */. 
9c20: 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20         iPromote 
9c30: 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20 20  = iTst;.        
9c40: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d 61  szPromote = szMa
9c50: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
9c60: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
9c70: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 62 29  or condition (b)
9c80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f   */.    if( iPro
9c90: 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  mote<0 ){.      
9ca0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
9cb0: 65 6c 20 2a 70 54 73 74 3b 0a 20 20 20 20 20 20  el *pTst;.      
9cc0: 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2b 31 3b  for(iTst=iLvl+1;
9cd0: 20 69 54 73 74 3c 70 53 74 72 75 63 74 2d 3e 6e   iTst<pStruct->n
9ce0: 4c 65 76 65 6c 3b 20 69 54 73 74 2b 2b 29 7b 0a  Level; iTst++){.
9cf0: 20 20 20 20 20 20 20 20 70 54 73 74 20 3d 20 26          pTst = &
9d00: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9d10: 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 69  iTst];.        i
9d20: 66 28 20 70 54 73 74 2d 3e 6e 53 65 67 20 29 20  f( pTst->nSeg ) 
9d30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9d40: 20 20 20 20 20 69 66 28 20 69 54 73 74 3c 70 53       if( iTst<pS
9d50: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 26 26  truct->nLevel &&
9d60: 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30   pTst->nMerge==0
9d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
9d80: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
9d90: 20 2a 70 53 65 67 32 20 3d 20 26 70 54 73 74 2d   *pSeg2 = &pTst-
9da0: 3e 61 53 65 67 5b 70 54 73 74 2d 3e 6e 53 65 67  >aSeg[pTst->nSeg
9db0: 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  -1];.        int
9dc0: 20 73 7a 20 3d 20 70 53 65 67 32 2d 3e 70 67 6e   sz = pSeg2->pgn
9dd0: 6f 4c 61 73 74 20 2d 20 70 53 65 67 32 2d 3e 70  oLast - pSeg2->p
9de0: 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a 20 20  gnoFirst + 1;.  
9df0: 20 20 20 20 20 20 69 66 28 20 73 7a 3c 3d 73 7a        if( sz<=sz
9e00: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Seg ){.         
9e10: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c   iPromote = iLvl
9e20: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 72  ;.          szPr
9e30: 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20  omote = szSeg;. 
9e40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9e50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
9e60: 66 20 69 50 72 6f 6d 6f 74 65 20 69 73 20 67 72  f iPromote is gr
9e70: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
9e80: 75 61 6c 20 74 6f 20 7a 65 72 6f 20 61 74 20 74  ual to zero at t
9e90: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
9ea0: 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65  it.    ** is the
9eb0: 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20 6f 66   level number of
9ec0: 20 61 20 6c 65 76 65 6c 20 74 6f 20 77 68 69 63   a level to whic
9ed0: 68 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20  h segments that 
9ee0: 63 6f 6e 73 69 73 74 20 6f 66 0a 20 20 20 20 2a  consist of.    *
9ef0: 2a 20 73 7a 50 72 6f 6d 6f 74 65 20 6f 72 20 66  * szPromote or f
9f00: 65 77 65 72 20 70 61 67 65 73 20 73 68 6f 75 6c  ewer pages shoul
9f10: 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 2e 20 2a  d be promoted. *
9f20: 2f 20 0a 20 20 20 20 69 66 28 20 69 50 72 6f 6d  / .    if( iProm
9f30: 6f 74 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ote>=0 ){.      
9f40: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
9f50: 72 65 28 22 42 45 46 4f 52 45 22 2c 20 70 53 74  re("BEFORE", pSt
9f60: 72 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73  ruct);.      fts
9f70: 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
9f80: 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c  eTo(p, iPromote,
9f90: 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72   szPromote, pStr
9fa0: 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  uct);.      fts5
9fb0: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 22  PrintStructure("
9fc0: 41 46 54 45 52 22 2c 20 70 53 74 72 75 63 74 29  AFTER", pStruct)
9fd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
9fe0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 49 74  /*.** If the pIt
9ff0: 65 72 2d 3e 69 4f 66 66 20 6f 66 66 73 65 74 20  er->iOff offset 
a000: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
a010: 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 69 6e 64   to an entry ind
a020: 69 63 61 74 69 6e 67 20 6f 6e 65 0a 2a 2a 20 6f  icating one.** o
a030: 72 20 6d 6f 72 65 20 74 65 72 6d 2d 6c 65 73 73  r more term-less
a040: 20 6e 6f 64 65 73 2c 20 61 64 76 61 6e 63 65 20   nodes, advance 
a050: 70 61 73 74 20 69 74 20 61 6e 64 20 73 65 74 20  past it and set 
a060: 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 74 6f  pIter->nEmpty to
a070: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
a080: 66 20 65 6d 70 74 79 20 63 68 69 6c 64 20 6e 6f  f empty child no
a090: 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  des..*/.static v
a0a0: 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72  oid fts5NodeIter
a0b0: 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 46 74 73  GobbleNEmpty(Fts
a0c0: 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72  5NodeIter *pIter
a0d0: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ){.  if( pIter->
a0e0: 69 4f 66 66 3c 70 49 74 65 72 2d 3e 6e 44 61 74  iOff<pIter->nDat
a0f0: 61 20 26 26 20 30 3d 3d 28 70 49 74 65 72 2d 3e  a && 0==(pIter->
a100: 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66  aData[pIter->iOf
a110: 66 5d 20 26 20 30 78 66 65 29 20 29 7b 0a 20 20  f] & 0xfe) ){.  
a120: 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20    pIter->bDlidx 
a130: 3d 20 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70  = pIter->aData[p
a140: 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78  Iter->iOff] & 0x
a150: 30 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  01;.    pIter->i
a160: 4f 66 66 2b 2b 3b 0a 20 20 20 20 70 49 74 65 72  Off++;.    pIter
a170: 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72  ->iOff += getVar
a180: 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44  int32(&pIter->aD
a190: 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d  ata[pIter->iOff]
a1a0: 2c 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29  , pIter->nEmpty)
a1b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
a1c0: 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30  Iter->nEmpty = 0
a1d0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c  ;.    pIter->bDl
a1e0: 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  idx = 0;.  }.}..
a1f0: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f  /*.** Advance to
a200: 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
a210: 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 2e  within the node.
a220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a230: 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74  fts5NodeIterNext
a240: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 4e  (int *pRc, Fts5N
a250: 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b  odeIter *pIter){
a260: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f  .  if( pIter->iO
a270: 66 66 3e 3d 70 49 74 65 72 2d 3e 6e 44 61 74 61  ff>=pIter->nData
a280: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   ){.    pIter->a
a290: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 49  Data = 0;.    pI
a2a0: 74 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 70  ter->iChild += p
a2b0: 49 74 65 72 2d 3e 6e 45 6d 70 74 79 3b 0a 20 20  Iter->nEmpty;.  
a2c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
a2d0: 50 72 65 2c 20 6e 4e 65 77 3b 0a 20 20 20 20 70  Pre, nNew;.    p
a2e0: 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65  Iter->iOff += ge
a2f0: 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72  tVarint32(&pIter
a300: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
a310: 4f 66 66 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20  Off], nPre);.   
a320: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20   pIter->iOff += 
a330: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  getVarint32(&pIt
a340: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
a350: 3e 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20  >iOff], nNew);. 
a360: 20 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e     pIter->term.n
a370: 20 3d 20 6e 50 72 65 2d 32 3b 0a 20 20 20 20 66   = nPre-2;.    f
a380: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
a390: 6c 6f 62 28 70 52 63 2c 20 26 70 49 74 65 72 2d  lob(pRc, &pIter-
a3a0: 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 70 49 74  >term, nNew, pIt
a3b0: 65 72 2d 3e 61 44 61 74 61 2b 70 49 74 65 72 2d  er->aData+pIter-
a3c0: 3e 69 4f 66 66 29 3b 0a 20 20 20 20 70 49 74 65  >iOff);.    pIte
a3d0: 72 2d 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  r->iOff += nNew;
a3e0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68 69  .    pIter->iChi
a3f0: 6c 64 20 2b 3d 20 28 31 20 2b 20 70 49 74 65 72  ld += (1 + pIter
a400: 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 66  ->nEmpty);.    f
a410: 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c  ts5NodeIterGobbl
a420: 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29 3b 0a  eNEmpty(pIter);.
a430: 20 20 20 20 69 66 28 20 2a 70 52 63 20 29 20 70      if( *pRc ) p
a440: 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30 3b  Iter->aData = 0;
a450: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
a460: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74  nitialize the it
a470: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49  erator object pI
a480: 74 65 72 20 74 6f 20 69 74 65 72 61 74 65 20 74  ter to iterate t
a490: 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74 65 72  hrough the inter
a4a0: 6e 61 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6e  nal.** segment n
a4b0: 6f 64 65 20 69 6e 20 70 44 61 74 61 2e 0a 2a 2f  ode in pData..*/
a4c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
a4d0: 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 63 6f  5NodeIterInit(co
a4e0: 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 69  nst u8 *aData, i
a4f0: 6e 74 20 6e 44 61 74 61 2c 20 46 74 73 35 4e 6f  nt nData, Fts5No
a500: 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  deIter *pIter){.
a510: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
a520: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
a530: 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 44 61  ));.  pIter->aDa
a540: 74 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 70 49  ta = aData;.  pI
a550: 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e 44 61  ter->nData = nDa
a560: 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4f 66  ta;.  pIter->iOf
a570: 66 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  f = getVarint32(
a580: 61 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 69 43  aData, pIter->iC
a590: 68 69 6c 64 29 3b 0a 20 20 66 74 73 35 4e 6f 64  hild);.  fts5Nod
a5a0: 65 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74  eIterGobbleNEmpt
a5b0: 79 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  y(pIter);.}../*.
a5c0: 2a 2a 20 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f  ** Free any memo
a5d0: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  ry allocated by 
a5e0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  the iterator obj
a5f0: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
a600: 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72  oid fts5NodeIter
a610: 46 72 65 65 28 46 74 73 35 4e 6f 64 65 49 74 65  Free(Fts5NodeIte
a620: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73  r *pIter){.  fts
a630: 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
a640: 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a  er->term);.}../*
a650: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
a660: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
a670: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 68 61  irst argument ha
a680: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
a690: 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20 61 73  fields set.** as
a6a0: 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73 20 66   follows. This f
a6b0: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 75 70 20  unction sets up 
a6c0: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
a6d0: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
a6e0: 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f   it.** points to
a6f0: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
a700: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 2d   in the doclist-
a710: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70  index..**.**   p
a720: 44 61 74 61 3a 20 70 6f 69 6e 74 65 72 20 74 6f  Data: pointer to
a730: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
a740: 65 63 6f 72 64 2c 20 0a 2a 2a 20 20 20 69 4c 65  ecord, .**   iLe
a750: 61 66 50 67 6e 6f 3a 20 70 61 67 65 20 6e 75 6d  afPgno: page num
a760: 62 65 72 20 74 68 61 74 20 74 68 69 73 20 64 6f  ber that this do
a770: 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 61  clist-index is a
a780: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 2e 0a  ssociated with..
a790: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
a7a0: 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74  s5DlidxIterFirst
a7b0: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
a7c0: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 61  pIter){.  Fts5Da
a7d0: 74 61 20 2a 70 44 61 74 61 20 3d 20 70 49 74 65  ta *pData = pIte
a7e0: 72 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e 74 20  r->pData;.  int 
a7f0: 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  i;..  assert( pI
a800: 74 65 72 2d 3e 70 44 61 74 61 20 29 3b 0a 20 20  ter->pData );.  
a810: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69  assert( pIter->i
a820: 4c 65 61 66 50 67 6e 6f 3e 30 20 29 3b 0a 0a 20  LeafPgno>0 );.. 
a830: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
a840: 6d 62 65 72 20 6f 66 20 6c 65 61 64 69 6e 67 20  mber of leading 
a850: 30 78 30 30 20 62 79 74 65 73 2e 20 54 68 65 6e  0x00 bytes. Then
a860: 20 73 65 74 20 69 4c 65 61 66 50 67 6e 6f 2e 20   set iLeafPgno. 
a870: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
a880: 70 44 61 74 61 2d 3e 6e 3b 20 69 2b 2b 29 7b 20  pData->n; i++){ 
a890: 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
a8a0: 70 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  p[i] ) break;.  
a8b0: 7d 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  }.  pIter->iLeaf
a8c0: 50 67 6e 6f 20 2b 3d 20 28 69 2b 31 29 3b 0a 20  Pgno += (i+1);. 
a8d0: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 69   pIter->iOff = i
a8e0: 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 77  ;..  /* Unless w
a8f0: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 74  e are already at
a900: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a910: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 6c  doclist-index, l
a920: 6f 61 64 20 74 68 65 20 66 69 72 73 74 0a 20 20  oad the first.  
a930: 2a 2a 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20  ** rowid value. 
a940: 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d   */.  if( pIter-
a950: 3e 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 20 29  >iOff<pData->n )
a960: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66  {.    pIter->iOf
a970: 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  f += getVarint(&
a980: 70 44 61 74 61 2d 3e 70 5b 70 49 74 65 72 2d 3e  pData->p[pIter->
a990: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
a9a0: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
a9b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
a9c0: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 0a  ->bEof = 1;.  }.
a9d0: 20 20 70 49 74 65 72 2d 3e 69 46 69 72 73 74 4f    pIter->iFirstO
a9e0: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4f 66 66  ff = pIter->iOff
a9f0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ;.  return pIter
aa00: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->bEof;.}../*.**
aa10: 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
aa20: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
aa30: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
aa40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
aa50: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
aa60: 78 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  xt(Fts5DlidxIter
aa70: 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
aa80: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70 49  Data *pData = pI
aa90: 74 65 72 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e  ter->pData;.  in
aaa0: 74 20 69 4f 66 66 3b 0a 0a 20 20 66 6f 72 28 69  t iOff;..  for(i
aab0: 4f 66 66 3d 70 49 74 65 72 2d 3e 69 4f 66 66 3b  Off=pIter->iOff;
aac0: 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 3b 20   iOff<pData->n; 
aad0: 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 69 66 28  iOff++){.    if(
aae0: 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 20   pData->p[iOff] 
aaf0: 29 20 62 72 65 61 6b 3b 20 0a 20 20 7d 0a 0a 20  ) break; .  }.. 
ab00: 20 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d   if( iOff<pData-
ab10: 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 56  >n ){.    i64 iV
ab20: 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  al;.    pIter->i
ab30: 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66  LeafPgno += (iOf
ab40: 66 20 2d 20 70 49 74 65 72 2d 3e 69 4f 66 66 29  f - pIter->iOff)
ab50: 20 2b 20 31 3b 0a 20 20 20 20 69 4f 66 66 20 2b   + 1;.    iOff +
ab60: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 44 61  = getVarint(&pDa
ab70: 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  ta->p[iOff], (u6
ab80: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70  4*)&iVal);.    p
ab90: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20  Iter->iRowid -= 
aba0: 69 56 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d  iVal;.    pIter-
abb0: 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20  >iOff = iOff;.  
abc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
abd0: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 0a  ->bEof = 1;.  }.
abe0: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
abf0: 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63  >bEof;.}..static
ac00: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
ac10: 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20  erEof(Fts5Index 
ac20: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
ac30: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
ac40: 75 72 6e 20 28 70 2d 3e 72 63 21 3d 53 51 4c 49  urn (p->rc!=SQLI
ac50: 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  TE_OK || pIter->
ac60: 62 45 6f 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  bEof);.}..static
ac70: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
ac80: 74 65 72 4c 61 73 74 28 46 74 73 35 44 6c 69 64  terLast(Fts5Dlid
ac90: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
aca0: 20 69 66 28 20 66 74 73 35 44 6c 69 64 78 49 74   if( fts5DlidxIt
acb0: 65 72 46 69 72 73 74 28 70 49 74 65 72 29 3d 3d  erFirst(pIter)==
acc0: 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
acd0: 30 3d 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  0==fts5DlidxIter
ace0: 4e 65 78 74 28 70 49 74 65 72 29 20 29 3b 0a 20  Next(pIter) );. 
acf0: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
ad00: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   0;.  }.}..stati
ad10: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
ad20: 74 65 72 50 72 65 76 28 46 74 73 35 44 6c 69 64  terPrev(Fts5Dlid
ad30: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
ad40: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
ad50: 72 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  r->iOff;..  asse
ad60: 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f 66 3d  rt( pIter->bEof=
ad70: 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66  =0 );.  if( iOff
ad80: 3c 3d 70 49 74 65 72 2d 3e 69 46 69 72 73 74 4f  <=pIter->iFirstO
ad90: 66 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  ff ){.    pIter-
ada0: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >bEof = 1;.  }el
adb0: 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20  se{.    u8 *a = 
adc0: 70 49 74 65 72 2d 3e 70 44 61 74 61 2d 3e 70 3b  pIter->pData->p;
add0: 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20  .    i64 iVal;. 
ade0: 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 0a     int iLimit;..
adf0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79      /* Currently
ae00: 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20   iOff points to 
ae10: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
ae20: 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73  f a varint. This
ae30: 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64   block .    ** d
ae40: 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75  ecrements iOff u
ae50: 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
ae60: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
ae70: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
ae80: 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e   .    ** varint.
ae90: 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74   Taking care not
aea0: 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d   to read any mem
aeb0: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68  ory locations th
aec0: 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20  at occur.    ** 
aed0: 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65  before the buffe
aee0: 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f  r in memory.  */
aef0: 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69  .    iLimit = (i
af00: 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a  Off>9 ? iOff-9 :
af10: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66   0);.    for(iOf
af20: 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74  f--; iOff>iLimit
af30: 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20  ; iOff--){.     
af40: 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20   if( (a[iOff-1] 
af50: 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65  & 0x80)==0 ) bre
af60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 67  ak;.    }..    g
af70: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
af80: 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b  ], (u64*)&iVal);
af90: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
afa0: 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20  id += iVal;.    
afb0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
afc0: 2d 2d 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  --;..    while( 
afd0: 69 4f 66 66 3e 70 49 74 65 72 2d 3e 69 46 69 72  iOff>pIter->iFir
afe0: 73 74 4f 66 66 20 0a 20 20 20 20 20 20 20 20 26  stOff .        &
aff0: 26 20 61 5b 69 4f 66 66 2d 31 5d 3d 3d 30 78 30  & a[iOff-1]==0x0
b000: 30 20 26 26 20 28 61 5b 69 4f 66 66 2d 32 5d 20  0 && (a[iOff-2] 
b010: 26 20 30 78 38 30 29 3d 3d 30 20 0a 20 20 20 20  & 0x80)==0 .    
b020: 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 2d 2d 3b  ){.      iOff--;
b030: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
b040: 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 7d  eafPgno--;.    }
b050: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
b060: 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20   = iOff;.  }..  
b070: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45  return pIter->bE
b080: 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  of;.}..static vo
b090: 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  id fts5DlidxIter
b0a0: 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
b0b0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
b0c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20          /* Fts5 
b0d0: 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  Backend to itera
b0e0: 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
b0f0: 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b110: 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52  * True for ORDER
b120: 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74   BY ASC */.  int
b130: 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65 67 69   iIdx, int iSegi
b140: 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d,           /* 
b150: 53 65 67 6d 65 6e 74 20 69 53 65 67 69 64 20 77  Segment iSegid w
b160: 69 74 68 69 6e 20 69 6e 64 65 78 20 69 49 64 78  ithin index iIdx
b170: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
b180: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
b190: 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61        /* Leaf pa
b1a0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61  ge number to loa
b1b0: 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 20  d dlidx for */. 
b1c0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
b1d0: 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
b1e0: 20 2f 2a 20 4f 55 54 3a 20 50 6f 70 75 6c 61 74   /* OUT: Populat
b1f0: 65 64 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29  ed iterator */.)
b200: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
b210: 72 20 2a 70 49 74 65 72 20 3d 20 2a 70 70 49 74  r *pIter = *ppIt
b220: 65 72 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  er;.  Fts5Data *
b230: 70 44 6c 69 64 78 3b 0a 0a 20 20 70 44 6c 69 64  pDlidx;..  pDlid
b240: 78 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  x = fts5DataRead
b250: 28 70 2c 20 46 54 53 35 5f 44 4f 43 4c 49 53 54  (p, FTS5_DOCLIST
b260: 5f 49 44 58 5f 52 4f 57 49 44 28 69 49 64 78 2c  _IDX_ROWID(iIdx,
b270: 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 50 67   iSegid, iLeafPg
b280: 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 44 6c 69  no));.  if( pDli
b290: 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  dx==0 ) return;.
b2a0: 20 20 69 66 28 20 70 49 74 65 72 3d 3d 30 20 29    if( pIter==0 )
b2b0: 7b 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20  {.    *ppIter = 
b2c0: 70 49 74 65 72 20 3d 20 28 46 74 73 35 44 6c 69  pIter = (Fts5Dli
b2d0: 64 78 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d  dxIter*)fts5IdxM
b2e0: 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
b2f0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b  Fts5DlidxIter));
b300: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 3d 3d  .    if( pIter==
b310: 30 20 29 7b 20 0a 20 20 20 20 20 20 66 74 73 35  0 ){ .      fts5
b320: 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 6c 69  DataRelease(pDli
b330: 64 78 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  dx);.      retur
b340: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
b350: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  {.    memset(pIt
b360: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
b370: 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b 0a 20  s5DlidxIter));. 
b380: 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 61   }..  pIter->pDa
b390: 74 61 20 3d 20 70 44 6c 69 64 78 3b 0a 20 20 70  ta = pDlidx;.  p
b3a0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
b3b0: 3d 20 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69  = iLeafPgno;.  i
b3c0: 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20  f( bRev==0 ){.  
b3d0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
b3e0: 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20 7d  irst(pIter);.  }
b3f0: 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44 6c  else{.    fts5Dl
b400: 69 64 78 49 74 65 72 4c 61 73 74 28 70 49 74 65  idxIterLast(pIte
b410: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
b420: 20 46 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d   Free a doclist-
b430: 69 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f  index iterator o
b440: 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20  bject allocated 
b450: 62 79 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  by fts5DlidxIter
b460: 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Init()..*/.stati
b470: 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78  c void fts5Dlidx
b480: 49 74 65 72 46 72 65 65 28 46 74 73 35 44 6c 69  IterFree(Fts5Dli
b490: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
b4a0: 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20    if( pIter ){. 
b4b0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
b4c0: 73 65 28 70 49 74 65 72 2d 3e 70 44 61 74 61 29  se(pIter->pData)
b4d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
b4e0: 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  ee(pIter);.  }.}
b4f0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65  ../*.** Load the
b500: 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65 20   next leaf page 
b510: 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  into the segment
b520: 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74   iterator..*/.st
b530: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
b540: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20  gIterNextPage(. 
b550: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
b580: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
b590: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b5b0: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
b5c0: 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65  nce to next page
b5d0: 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72   */.){.  Fts5Str
b5e0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
b5f0: 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  Seg = pIter->pSe
b600: 67 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  g;.  if( pIter->
b610: 70 4c 65 61 66 20 29 20 66 74 73 35 44 61 74 61  pLeaf ) fts5Data
b620: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
b630: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
b640: 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69  iLeafPgno++;.  i
b650: 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  f( pIter->iLeafP
b660: 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  gno<=pSeg->pgnoL
b670: 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ast ){.    pIter
b680: 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61  ->pLeaf = fts5Da
b690: 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20  taRead(p, .     
b6a0: 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f     FTS5_SEGMENT_
b6b0: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 49 64  ROWID(pIter->iId
b6c0: 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  x, pSeg->iSegid,
b6d0: 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   0, pIter->iLeaf
b6e0: 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d  Pgno).    );.  }
b6f0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
b700: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a  >pLeaf = 0;.  }.
b710: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 65 61 76 65 20 70  }../*.** Leave p
b720: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
b730: 74 20 61 73 20 74 68 65 20 6f 66 66 73 65 74 20  t as the offset 
b740: 74 6f 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c  to the size fiel
b750: 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 0a 2a  d of the first.*
b760: 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e  * position list.
b770: 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   The position li
b780: 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  st belonging to 
b790: 64 6f 63 75 6d 65 6e 74 20 70 49 74 65 72 2d 3e  document pIter->
b7a0: 69 52 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69  iRowid..*/.stati
b7b0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
b7c0: 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49  erLoadTerm(Fts5I
b7d0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
b7e0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
b7f0: 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61   nKeep){.  u8 *a
b800: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
b810: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
b820: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
b830: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
b840: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
b850: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
b860: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
b870: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b890: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
b8a0: 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20  f new data */.. 
b8b0: 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69   iOff += getVari
b8c0: 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
b8d0: 4e 65 77 29 3b 0a 20 20 70 49 74 65 72 2d 3e 74  New);.  pIter->t
b8e0: 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20  erm.n = nKeep;. 
b8f0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
b900: 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
b910: 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77  Iter->term, nNew
b920: 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69  , &a[iOff]);.  i
b930: 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70  Off += nNew;.  p
b940: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
b950: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
b960: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
b970: 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c  Pgno = pIter->iL
b980: 65 61 66 50 67 6e 6f 3b 0a 20 20 69 66 28 20 69  eafPgno;.  if( i
b990: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
b9a0: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 66 74 73 35  f->n ){.    fts5
b9b0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
b9c0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69  p, pIter);.    i
b9d0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
b9e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
b9f0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
ba00: 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
ba10: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72  CORRUPT;.      r
ba20: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
ba30: 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61   iOff = 4;.    a
ba40: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
ba50: 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b  >p;.  }.  iOff +
ba60: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
ba70: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
ba80: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
ba90: 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  d);.  pIter->iLe
baa0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
bab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
bac0: 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f  lize the iterato
bad0: 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  r object pIter t
bae0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
baf0: 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  h the entries in
bb00: 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67  .** segment pSeg
bb10: 20 77 69 74 68 69 6e 20 69 6e 64 65 78 20 69 49   within index iI
bb20: 64 78 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72  dx. The iterator
bb30: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
bb40: 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72  g to the .** fir
bb50: 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20 74 68  st entry when th
bb60: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
bb70: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  rns..**.** If an
bb80: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
bb90: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
bba0: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
bbb0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
bbc0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
bbd0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
bbe0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
bbf0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
bc00: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
bc10: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
bc20: 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69  d fts5SegIterIni
bc30: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
bc40: 70 2c 20 20 20 20 20 20 20 20 20 20 0a 20 20 69  p,          .  i
bc50: 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc70: 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d  * Config.aHash[]
bc80: 20 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e   index of FTS in
bc90: 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  dex */.  Fts5Str
bca0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
bcb0: 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
bcc0: 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
bcd0: 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
bce0: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
bcf0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
bd00: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
bd10: 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  .){.  if( pSeg->
bd20: 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a  pgnoFirst==0 ){.
bd30: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
bd40: 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65  ens if the segme
bd50: 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  nt is being used
bd60: 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20   as an input to 
bd70: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20  an incremental. 
bd80: 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20     ** merge and 
bd90: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72  all data has alr
bda0: 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d  eady been "trimm
bdb0: 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f  ed". See functio
bdc0: 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69  n.    ** fts5Tri
bdd0: 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20  mSegments() for 
bde0: 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  details. In this
bdf0: 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20   case leave the 
be00: 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a  iterator empty..
be10: 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
be20: 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28  r will see the (
be30: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
be40: 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20   and assume the 
be50: 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  iterator is.    
be60: 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64  ** at EOF alread
be70: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
be80: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
be90: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
bea0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
beb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bec0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72      memset(pIter
bed0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
bee0: 65 72 29 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  er));.    pIter-
bef0: 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20  >pSeg = pSeg;.  
bf00: 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20    pIter->iIdx = 
bf10: 69 49 64 78 3b 0a 20 20 20 20 70 49 74 65 72 2d  iIdx;.    pIter-
bf20: 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65  >iLeafPgno = pSe
bf30: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a  g->pgnoFirst-1;.
bf40: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
bf50: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
bf60: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
bf70: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
bf80: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49  {.    u8 *a = pI
bf90: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
bfa0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
bfb0: 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 55  ffset = fts5GetU
bfc0: 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 66  16(&a[2]);.    f
bfd0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
bfe0: 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b  rm(p, pIter, 0);
bff0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
c000: 6f 69 64 20 66 74 73 35 4c 65 61 66 48 65 61 64  oid fts5LeafHead
c010: 65 72 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65  er(Fts5Data *pLe
c020: 61 66 2c 20 69 6e 74 20 2a 70 69 52 6f 77 69 64  af, int *piRowid
c030: 2c 20 69 6e 74 20 2a 70 69 54 65 72 6d 29 7b 0a  , int *piTerm){.
c040: 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 28 69 6e    *piRowid = (in
c050: 74 29 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  t)fts5GetU16(&pL
c060: 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 2a 70  eaf->p[0]);.  *p
c070: 69 54 65 72 6d 20 3d 20 28 69 6e 74 29 66 74 73  iTerm = (int)fts
c080: 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
c090: 70 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p[2]);.}../*.** 
c0a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
c0b0: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
c0c0: 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63  d on iterators c
c0d0: 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20  reated by calls 
c0e0: 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51  to.** Fts5IndexQ
c0f0: 75 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20  uery() with the 
c100: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
c110: 41 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ASC flag set..**
c120: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
c130: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
c140: 2c 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  , iterator pIter
c150: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
c160: 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 20 6f 6e  irst rowid.** on
c170: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
c180: 66 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  f associated wit
c190: 68 20 74 68 65 20 74 65 72 6d 20 62 65 69 6e 67  h the term being
c1a0: 20 71 75 65 72 69 65 64 2e 20 54 68 69 73 20 66   queried. This f
c1b0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 64 76 61 6e  unction.** advan
c1c0: 63 65 73 20 69 74 20 74 6f 20 70 6f 69 6e 74 20  ces it to point 
c1d0: 74 6f 20 74 68 65 20 6c 61 73 74 20 73 75 63 68  to the last such
c1e0: 20 72 6f 77 69 64 20 61 6e 64 2c 20 69 66 20 6e   rowid and, if n
c1f0: 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61  ecessary, initia
c200: 6c 69 7a 65 73 0a 2a 2a 20 74 68 65 20 61 52 6f  lizes.** the aRo
c210: 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20  widOffset[] and 
c220: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72  iRowidOffset var
c230: 69 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  iables..*/.stati
c240: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c250: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
c260: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
c270: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
c280: 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  er){.  int n = p
c290: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a  Iter->pLeaf->n;.
c2a0: 20 20 69 6e 74 20 69 20 3d 20 70 49 74 65 72 2d    int i = pIter-
c2b0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
c2c0: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
c2d0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69  Leaf->p;.  int i
c2e0: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 30 3b  RowidOffset = 0;
c2f0: 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ..  while( p->rc
c300: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
c310: 3c 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 44  <n ){.    i64 iD
c320: 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e  elta = 0;.    in
c330: 74 20 6e 50 6f 73 3b 0a 0a 20 20 20 20 69 20 2b  t nPos;..    i +
c340: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
c350: 5b 69 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20  [i], nPos);.    
c360: 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 69  i += nPos;.    i
c370: 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b  f( i>=n ) break;
c380: 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72  .    i += getVar
c390: 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a  int(&a[i], (u64*
c3a0: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 69  )&iDelta);.    i
c3b0: 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62  f( iDelta==0 ) b
c3c0: 72 65 61 6b 3b 0a 20 20 20 20 70 49 74 65 72 2d  reak;.    pIter-
c3d0: 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74  >iRowid -= iDelt
c3e0: 61 3b 0a 0a 20 20 20 20 69 66 28 20 69 52 6f 77  a;..    if( iRow
c3f0: 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d  idOffset>=pIter-
c400: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b  >nRowidOffset ){
c410: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  .      int nNew 
c420: 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  = pIter->nRowidO
c430: 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20  ffset + 8;.     
c440: 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e   int *aNew = (in
c450: 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  t*)sqlite3_reall
c460: 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64  oc(pIter->aRowid
c470: 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a  Offset, nNew*siz
c480: 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  eof(int));.     
c490: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
c4a0: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
c4b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c4c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c4d0: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72     }.      pIter
c4e0: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d  ->aRowidOffset =
c4f0: 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74   aNew;.      pIt
c500: 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74  er->nRowidOffset
c510: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a   = nNew;.    }..
c520: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
c530: 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66  dOffset[iRowidOf
c540: 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d  fset++] = pIter-
c550: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
c560: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
c570: 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20  fset = i;.  }.  
c580: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
c590: 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73  set = iRowidOffs
c5a0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  et;.}../*.**.*/.
c5b0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c5c0: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
c5d0: 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20  wPage(Fts5Index 
c5e0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
c5f0: 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
c600: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
c610: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
c620: 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65  EVERSE );.  asse
c630: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
c640: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
c650: 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74  ONETERM );..  ft
c660: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
c670: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
c680: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
c690: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
c6a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
c6b0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70  ter->iLeafPgno>p
c6c0: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
c6d0: 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44  gno ){.    Fts5D
c6e0: 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ata *pNew;.    p
c6f0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
c700: 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74  -;.    pNew = ft
c710: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
c720: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
c730: 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  (.          pIte
c740: 72 2d 3e 69 49 64 78 2c 20 70 49 74 65 72 2d 3e  r->iIdx, pIter->
c750: 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c  pSeg->iSegid, 0,
c760: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
c770: 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66  o.    ));.    if
c780: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
c790: 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  if( pIter->iLeaf
c7a0: 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65  Pgno==pIter->iTe
c7b0: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
c7c0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
c7d0: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
c7e0: 3c 70 4e 65 77 2d 3e 6e 20 29 7b 0a 20 20 20 20  <pNew->n ){.    
c7f0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
c800: 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  af = pNew;.     
c810: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
c820: 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d  fOffset = pIter-
c830: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
c840: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c860: 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 2c 20   int iRowidOff, 
c870: 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 66  dummy;.        f
c880: 74 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4e  ts5LeafHeader(pN
c890: 65 77 2c 20 26 69 52 6f 77 69 64 4f 66 66 2c 20  ew, &iRowidOff, 
c8a0: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  &dummy);.       
c8b0: 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
c8c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
c8d0: 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b  r->pLeaf = pNew;
c8e0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
c8f0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
c900: 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20  iRowidOff;.     
c910: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
c920: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
c930: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
c940: 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e  u8 *a = &pIter->
c950: 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e  pLeaf->p[pIter->
c960: 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
c970: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
c980: 61 66 4f 66 66 73 65 74 20 2b 3d 20 67 65 74 56  afOffset += getV
c990: 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26  arint(a, (u64*)&
c9a0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
c9b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c9c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c9d0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
c9e0: 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ase(pNew);.     
c9f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
ca00: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
ca10: 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49   ){.    fts5SegI
ca20: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
ca30: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
ca40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
ca50: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
ca60: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
ca70: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
ca80: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a  ment currently.*
ca90: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65  * points to a de
caa0: 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20 64  lete marker. A d
cab0: 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73 20  elete marker is 
cac0: 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
cad0: 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69  0 byte.** positi
cae0: 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  on-list..*/.stat
caf0: 69 63 20 69 6e 74 20 66 74 73 35 53 65 67 49 74  ic int fts5SegIt
cb00: 65 72 49 73 44 65 6c 65 74 65 28 0a 20 20 46 74  erIsDelete(.  Ft
cb10: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb30: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
cb40: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
cb50: 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
cb60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
cb70: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
cb80: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65   */.){.  int bRe
cb90: 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 44 61 74  t = 0;.  Fts5Dat
cba0: 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
cbb0: 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 66 28 20 70  ->pLeaf;.  if( p
cbc0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
cbd0: 26 26 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  && pLeaf ){.    
cbe0: 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  if( pIter->iLeaf
cbf0: 4f 66 66 73 65 74 3c 70 4c 65 61 66 2d 3e 6e 20  Offset<pLeaf->n 
cc00: 29 7b 0a 20 20 20 20 20 20 62 52 65 74 20 3d 20  ){.      bRet = 
cc10: 28 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d  (pLeaf->p[pIter-
cc20: 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3d 3d 30  >iLeafOffset]==0
cc30: 78 30 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  x00);.    }else{
cc40: 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20  .      Fts5Data 
cc50: 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61  *pNew = fts5Data
cc60: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
cc70: 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20  MENT_ROWID(.    
cc80: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
cc90: 49 64 78 2c 20 70 49 74 65 72 2d 3e 70 53 65 67  Idx, pIter->pSeg
cca0: 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74  ->iSegid, 0, pIt
ccb0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20  er->iLeafPgno.  
ccc0: 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 69 66      ));.      if
ccd0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
cce0: 20 20 62 52 65 74 20 3d 20 28 70 4e 65 77 2d 3e    bRet = (pNew->
ccf0: 70 5b 34 5d 3d 3d 30 78 30 30 29 3b 0a 20 20 20  p[4]==0x00);.   
cd00: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
cd10: 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
cd20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
cd30: 72 65 74 75 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a  return bRet;.}..
cd40: 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74  /*.** Advance it
cd50: 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20  erator pIter to 
cd60: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
cd70: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
cd80: 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
cd90: 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
cda0: 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
cdb0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20   error code. It 
cdc0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69  .** is not consi
cdd0: 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
cde0: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  f the iterator r
cdf0: 65 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61  eaches EOF. If a
ce00: 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
ce10: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
ce20: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
ce30: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
ce40: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
ce50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ce60: 35 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20  5SegIterNext(.  
ce70: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
cea0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
ceb0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
cec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ced0: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
cee0: 63 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ce */.){.  if( p
cef0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
cf00: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  ){.    if( pIter
cf10: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
cf20: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29  EGITER_REVERSE )
cf30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
cf40: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e  r->iRowidOffset>
cf50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  0 ){.        u8 
cf60: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
cf70: 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  f->p;.        in
cf80: 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  t iOff;.        
cf90: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
cfa0: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
cfb0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
cfc0: 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 0a 20 20  widOffset--;..  
cfd0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
cfe0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20  afOffset = iOff 
cff0: 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  = pIter->aRowidO
d000: 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f  ffset[pIter->iRo
d010: 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  widOffset];.    
d020: 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56      iOff += getV
d030: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
d040: 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  , nPos);.       
d050: 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20   iOff += nPos;. 
d060: 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
d070: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
d080: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
d090: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
d0a0: 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
d0b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d0c0: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
d0d0: 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49  rseNewPage(p, pI
d0e0: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
d0f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46    }else{.      F
d100: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
d110: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
d120: 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20       int iOff;. 
d130: 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72       int bNewTer
d140: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  m = 0;.      int
d150: 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20   nKeep = 0;..   
d160: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
d170: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
d180: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69  position list wi
d190: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
d1a0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
d1b0: 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70  u8 *a = pLeaf->p
d1c0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
d1d0: 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20  pLeaf->n;..     
d1e0: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
d1f0: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
d200: 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
d210: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73          int nPos
d220: 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 4f  list;.        iO
d230: 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ff += getVarint3
d240: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73  2(&a[iOff], nPos
d250: 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69  list);.        i
d260: 4f 66 66 20 2b 3d 20 6e 50 6f 73 6c 69 73 74 3b  Off += nPoslist;
d270: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d280: 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
d290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
d2a0: 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68  t entry is on th
d2b0: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a  e current page *
d2c0: 2f 0a 20 20 20 20 20 20 20 20 75 36 34 20 69 44  /.        u64 iD
d2d0: 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 69 4f  elta;.        iO
d2e0: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74  ff += sqlite3Get
d2f0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
d300: 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20   &iDelta);.     
d310: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
d320: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
d330: 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61        if( iDelta
d340: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
d350: 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20   bNewTerm = 1;. 
d360: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66           if( iOf
d370: 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  f>=n ){.        
d380: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
d390: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
d3a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
d3b0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d3c0: 74 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  t = 4;.         
d3d0: 20 7d 65 6c 73 65 20 69 66 28 20 69 4f 66 66 21   }else if( iOff!
d3e0: 3d 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32  =fts5GetU16(&a[2
d3f0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
d400: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d410: 66 73 65 74 20 2b 3d 20 67 65 74 56 61 72 69 6e  fset += getVarin
d420: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
d430: 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eep);.          
d440: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
d450: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
d460: 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c  ->iRowid -= iDel
d470: 74 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ta;.        }.  
d480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d490: 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20     iOff = 0;.   
d4a0: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74       /* Next ent
d4b0: 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  ry is not on the
d4c0: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f   current page */
d4d0: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
d4e0: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
d4f0: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
d500: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
d510: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  r);.          pL
d520: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
d530: 61 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  af;.          if
d540: 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ( pLeaf==0 ) bre
d550: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
d560: 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35 47 65  ( (iOff = fts5Ge
d570: 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30  tU16(&pLeaf->p[0
d580: 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ])) ){.         
d590: 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
d5a0: 65 33 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  e3GetVarint(&pLe
d5b0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  af->p[iOff], (u6
d5c0: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
d5d0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
d5e0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d5f0: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
d600: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d610: 20 65 6c 73 65 20 69 66 28 20 28 69 4f 66 66 20   else if( (iOff 
d620: 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  = fts5GetU16(&pL
d630: 65 61 66 2d 3e 70 5b 32 5d 29 29 20 29 7b 0a 20  eaf->p[2])) ){. 
d640: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
d650: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d660: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
d670: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
d680: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d690: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
d6a0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66       /* Check if
d6b0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
d6c0: 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49 66 20   now at EOF. If 
d6d0: 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79  so, return early
d6e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
d6f0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 26 26 20 62  Iter->pLeaf && b
d700: 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  NewTerm ){.     
d710: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c     if( pIter->fl
d720: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
d730: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20  ER_ONETERM ){.  
d740: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
d750: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
d760: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
d770: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
d780: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
d790: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
d7a0: 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28  SegIterLoadTerm(
d7b0: 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29  p, pIter, nKeep)
d7c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d7d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
d7e0: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
d7f0: 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
d800: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
d810: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64  rst rowid in a d
d820: 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20  oclist. This.** 
d830: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
d840: 65 20 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f  e iterator up so
d850: 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20 69   that iterates i
d860: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
d870: 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64  through.** the d
d880: 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  oclist..*/.stati
d890: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
d8a0: 65 72 52 65 76 65 72 73 65 28 46 74 73 35 49 6e  erReverse(Fts5In
d8b0: 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78  dex *p, int iIdx
d8c0: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
d8d0: 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 61 74  Iter){.  Fts5Dat
d8e0: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
d8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
d900: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
d910: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49  .  int iOff = pI
d920: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d930: 3b 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65  ;  /* Byte offse
d940: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
d950: 20 6c 65 61 66 20 2a 2f 0a 20 20 46 74 73 35 44   leaf */.  Fts5D
d960: 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a  ata *pLast = 0;.
d970: 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d    int pgnoLast =
d980: 20 30 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74   0;..  /* Move t
d990: 6f 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  o the page that 
d9a0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73  contains the las
d9b0: 74 20 72 6f 77 69 64 20 69 6e 20 74 68 69 73 20  t rowid in this 
d9c0: 64 6f 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 4c  doclist. */.  pL
d9d0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
d9e0: 61 66 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72  af;..  if( pIter
d9f0: 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ->pDlidx ){.    
da00: 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74  int iSegid = pIt
da10: 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
da20: 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d  ;.    pgnoLast =
da30: 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 2d 3e   pIter->pDlidx->
da40: 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 70  iLeafPgno;.    p
da50: 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52  Last = fts5DataR
da60: 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
da70: 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20  ENT_ROWID(iIdx, 
da80: 69 53 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f 4c  iSegid, 0, pgnoL
da90: 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ast));.  }else{.
daa0: 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c      while( iOff<
dab0: 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20  pLeaf->n ){.    
dac0: 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
dad0: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20    i64 iDelta;.. 
dae0: 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
daf0: 20 6c 69 73 74 20 73 69 7a 65 20 69 6e 20 62 79   list size in by
db00: 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66  tes */.      iOf
db10: 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
db20: 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
db30: 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 69  , nPos);.      i
db40: 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  Off += nPos;.   
db50: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
db60: 61 66 2d 3e 6e 20 29 20 62 72 65 61 6b 3b 0a 0a  af->n ) break;..
db70: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 64        /* Rowid d
db80: 65 6c 74 61 2e 20 4f 72 2c 20 69 66 20 30 78 30  elta. Or, if 0x0
db90: 30 2c 20 74 68 65 20 65 6e 64 20 6f 66 20 64 6f  0, the end of do
dba0: 63 6c 69 73 74 20 6d 61 72 6b 65 72 2e 20 2a 2f  clist marker. */
dbb0: 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 67 65  .      nPos = ge
dbc0: 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
dbd0: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
dbe0: 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69  iDelta);.      i
dbf0: 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62  f( iDelta==0 ) b
dc00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 4f 66 66  reak;.      iOff
dc10: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a   += nPos;.    }.
dc20: 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  .    if( iOff>=p
dc30: 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Leaf->n ){.     
dc40: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
dc50: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
dc60: 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 20 20 20  ter->pSeg;.     
dc70: 20 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35   i64 iAbs = FTS5
dc80: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
dc90: 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  Idx, pSeg->iSegi
dca0: 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65  d, 0, pIter->iLe
dcb0: 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  afPgno);.      i
dcc0: 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f  64 iLast = FTS5_
dcd0: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
dce0: 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  dx, pSeg->iSegid
dcf0: 2c 20 30 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  , 0, pSeg->pgnoL
dd00: 61 73 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ast);..      /* 
dd10: 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69  The last rowid i
dd20: 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61  n the doclist ma
dd30: 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20  y not be on the 
dd40: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65  current page. Se
dd50: 61 72 63 68 0a 20 20 20 20 20 20 20 2a 2a 20 66  arch.       ** f
dd60: 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20 74  orward to find t
dd70: 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69  he page containi
dd80: 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69  ng the last rowi
dd90: 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  d.  */.      for
dda0: 28 69 41 62 73 2b 2b 3b 20 70 2d 3e 72 63 3d 3d  (iAbs++; p->rc==
ddb0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 41 62  SQLITE_OK && iAb
ddc0: 73 3c 3d 69 4c 61 73 74 3b 20 69 41 62 73 2b 2b  s<=iLast; iAbs++
ddd0: 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44  ){.        Fts5D
dde0: 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35  ata *pNew = fts5
ddf0: 44 61 74 61 52 65 61 64 28 70 2c 20 69 41 62 73  DataRead(p, iAbs
de00: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
de10: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
de20: 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 69 54 65   int iRowid, iTe
de30: 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  rm;.          ft
de40: 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4e 65  s5LeafHeader(pNe
de50: 77 2c 20 26 69 52 6f 77 69 64 2c 20 26 69 54 65  w, &iRowid, &iTe
de60: 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rm);.          i
de70: 66 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  f( iRowid ){.   
de80: 20 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74           Fts5Dat
de90: 61 20 2a 70 54 6d 70 20 3d 20 70 4c 61 73 74 3b  a *pTmp = pLast;
dea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 61  .            pLa
deb0: 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  st = pNew;.     
dec0: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 54         pNew = pT
ded0: 6d 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  mp;.            
dee0: 70 67 6e 6f 4c 61 73 74 20 3d 20 69 41 62 73 20  pgnoLast = iAbs 
def0: 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
df00: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20  S5_DATA_PAGE_B) 
df10: 2d 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  - 1);.          
df20: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
df30: 69 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  iTerm ){.       
df40: 20 20 20 20 20 69 41 62 73 20 3d 20 69 4c 61 73       iAbs = iLas
df50: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
df60: 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
df70: 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a  aRelease(pNew);.
df80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
df90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
dfa0: 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55  * If pLast is NU
dfb0: 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  LL at this point
dfc0: 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
dfd0: 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 64  rowid for this d
dfe0: 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73  oclist.  ** lies
dff0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75 72   on the page cur
e000: 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64  rently indicated
e010: 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72   by the iterator
e020: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a  . In this case .
e030: 20 20 2a 2a 20 69 4c 61 73 74 4f 66 66 20 69 73    ** iLastOff is
e040: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
e050: 65 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69 4c  e that pIter->iL
e060: 65 61 66 4f 66 66 73 65 74 20 77 69 6c 6c 20 74  eafOffset will t
e070: 61 6b 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68  ake when.  ** th
e080: 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
e090: 73 20 74 6f 20 74 68 61 74 20 72 6f 77 69 64 2e  s to that rowid.
e0a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69  .  **.  ** Or, i
e0b0: 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e  f pLast is non-N
e0c0: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
e0d0: 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  the page that co
e0e0: 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 0a  ntains the last.
e0f0: 20 20 2a 2a 20 72 6f 77 69 64 2e 0a 20 20 2a 2f    ** rowid..  */
e100: 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b 0a  .  if( pLast ){.
e110: 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20      int dummy;. 
e120: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
e130: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
e140: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  ;.    pIter->pLe
e150: 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  af = pLast;.    
e160: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
e170: 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
e180: 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28   fts5LeafHeader(
e190: 70 4c 61 73 74 2c 20 26 69 4f 66 66 2c 20 26 64  pLast, &iOff, &d
e1a0: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20  ummy);.    iOff 
e1b0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c  += getVarint(&pL
e1c0: 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ast->p[iOff], (u
e1d0: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
e1e0: 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  id);.    pIter->
e1f0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
e200: 66 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53  ff;.  }..  fts5S
e210: 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
e220: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
e230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74  .}../*.** Iterat
e240: 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  or pIter current
e250: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
e260: 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20   first rowid of 
e270: 61 20 64 6f 63 6c 69 73 74 20 77 69 74 68 69 6e  a doclist within
e280: 0a 2a 2a 20 69 6e 64 65 78 20 69 49 64 78 2e 20  .** index iIdx. 
e290: 54 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  There is a docli
e2a0: 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63 69 61  st-index associa
e2b0: 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 6e  ted with the fin
e2c0: 61 6c 20 74 65 72 6d 20 6f 6e 0a 2a 2a 20 74 68  al term on.** th
e2d0: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
e2e0: 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  If the current t
e2f0: 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20  erm is the last 
e300: 74 65 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65  term on the page
e310: 2c 20 0a 2a 2a 20 6c 6f 61 64 20 74 68 65 20 64  , .** load the d
e320: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f  oclist-index fro
e330: 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69  m disk and initi
e340: 61 6c 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f  alize an iterato
e350: 72 20 61 74 20 0a 2a 2a 20 28 70 49 74 65 72 2d  r at .** (pIter-
e360: 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61  >pDlidx)..*/.sta
e370: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
e380: 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74  IterLoadDlidx(Ft
e390: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
e3a0: 69 49 64 78 2c 20 46 74 73 35 53 65 67 49 74 65  iIdx, Fts5SegIte
e3b0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
e3c0: 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d   iSegid = pIter-
e3d0: 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
e3e0: 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74   int bRev = (pIt
e3f0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
e400: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
e410: 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  );.  Fts5Data *p
e420: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
e430: 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  eaf; /* Current 
e440: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 69  leaf data */.  i
e450: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
e460: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f  >iLeafOffset;  /
e470: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69  * Byte offset wi
e480: 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61  thin current lea
e490: 66 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  f */..  assert( 
e4a0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
e4b0: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
e4c0: 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ERM );.  assert(
e4d0: 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d   pIter->pDlidx==
e4e0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  0 );..  /* Check
e4f0: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
e500: 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20  doclist ends on 
e510: 74 68 69 73 20 70 61 67 65 2e 20 49 66 20 69 74  this page. If it
e520: 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20 20   does, return.  
e530: 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74  ** early without
e540: 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f 63   loading the doc
e550: 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20 69  list-index (as i
e560: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64  t belongs to a d
e570: 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65  ifferent.  ** te
e580: 72 6d 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rm. */.  while( 
e590: 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b  iOff<pLeaf->n ){
e5a0: 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b  .    i64 iDelta;
e5b0: 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73  .    int nPoslis
e5c0: 74 3b 0a 0a 20 20 20 20 2f 2a 20 69 4f 66 66 20  t;..    /* iOff 
e5d0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65  is currently the
e5e0: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
e5f0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 61 20 70  ize field of a p
e600: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 2a 2f  osition list. */
e610: 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74  .    iOff += get
e620: 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
e630: 3e 70 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69  >p[iOff], nPosli
e640: 73 74 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  st);.    iOff +=
e650: 20 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20   nPoslist;..    
e660: 69 66 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e  if( iOff<pLeaf->
e670: 6e 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  n ){.      iOff 
e680: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c  += getVarint(&pL
e690: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
e6a0: 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
e6b0: 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d      if( iDelta==
e6c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
e6d0: 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 6c 69  }.  }..  fts5Dli
e6e0: 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52  dxIterInit(p, bR
e6f0: 65 76 2c 20 69 49 64 78 2c 20 69 53 65 67 69 64  ev, iIdx, iSegid
e700: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  , pIter->iLeafPg
e710: 6e 6f 2c 20 26 70 49 74 65 72 2d 3e 70 44 6c 69  no, &pIter->pDli
e720: 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  dx);.}../*.** In
e730: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a  itialize the obj
e740: 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ect pIter to poi
e750: 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d  nt to term pTerm
e760: 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65  /nTerm within se
e770: 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2c 20 69  gment.** pSeg, i
e780: 6e 64 65 78 20 69 49 64 78 2e 20 49 66 20 74 68  ndex iIdx. If th
e790: 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74  ere is no such t
e7a0: 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78  erm in the index
e7b0: 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a  , the iterator.*
e7c0: 2a 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e  * is set to EOF.
e7d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
e7e0: 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
e7f0: 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
e800: 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
e810: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
e820: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73  .** an error has
e830: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
e840: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
e850: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
e860: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
e870: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
e880: 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69  s5SegIterSeekIni
e890: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
e8a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
e8b0: 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
e8c0: 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  kend */.  int iI
e8d0: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
e8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
e8f0: 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65  fig.aHash[] inde
e900: 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a  x of FTS index *
e910: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
e920: 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
e930: 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
e940: 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
e950: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
e960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
e970: 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
e980: 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
e990: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
e9a0: 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
e9b0: 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
e9c0: 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  f segment */.  F
e9d0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
e9e0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
e9f0: 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  * Object to popu
ea00: 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  late */.){.  int
ea10: 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20   iPg = 1;.  int 
ea20: 68 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28  h;.  int bGe = (
ea30: 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
ea40: 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29  EX_QUERY_PREFIX)
ea50: 20 26 26 20 69 49 64 78 3d 3d 30 29 3b 0a 20 20   && iIdx==0);.  
ea60: 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b 20  int bDlidx = 0; 
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65  /* True if there
ea90: 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
eaa0: 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dex */..  assert
eab0: 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61  ( bGe==0 || (fla
eac0: 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
ead0: 55 45 52 59 5f 41 53 43 29 3d 3d 30 20 29 3b 0a  UERY_ASC)==0 );.
eae0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 20    assert( pTerm 
eaf0: 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65  && nTerm );.  me
eb00: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
eb10: 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a  izeof(*pIter));.
eb20: 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
eb30: 70 53 65 67 3b 0a 20 20 70 49 74 65 72 2d 3e 69  pSeg;.  pIter->i
eb40: 49 64 78 20 3d 20 69 49 64 78 3b 0a 0a 20 20 2f  Idx = iIdx;..  /
eb50: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 74  * This block set
eb60: 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
eb70: 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65 61 66   iPg to the leaf
eb80: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
eb90: 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61  t may.  ** conta
eba0: 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e  in term (pTerm/n
ebb0: 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69 73 20  Term), if it is 
ebc0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73  present in the s
ebd0: 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 66 6f 72  egment. */.  for
ebe0: 28 68 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  (h=pSeg->nHeight
ebf0: 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d 29 7b 0a 20  -1; h>0; h--){. 
ec00: 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20     Fts5NodeIter 
ec10: 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  node;           
ec20: 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74     /* For iterat
ec30: 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 74 65  ing through inte
ec40: 72 6e 61 6c 20 6e 6f 64 65 73 20 2a 2f 0a 20 20  rnal nodes */.  
ec50: 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46    i64 iRowid = F
ec60: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
ec70: 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53  D(iIdx, pSeg->iS
ec80: 65 67 69 64 2c 20 68 2c 20 69 50 67 29 3b 0a 20  egid, h, iPg);. 
ec90: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 6f     Fts5Data *pNo
eca0: 64 65 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  de = fts5DataRea
ecb0: 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  d(p, iRowid);.  
ecc0: 20 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29    if( pNode==0 )
ecd0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 66 74 73   break;..    fts
ece0: 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70 4e  5NodeIterInit(pN
ecf0: 6f 64 65 2d 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e  ode->p, pNode->n
ed00: 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20 20 61 73  , &node);.    as
ed10: 73 65 72 74 28 20 6e 6f 64 65 2e 74 65 72 6d 2e  sert( node.term.
ed20: 6e 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69 50 67  n==0 );..    iPg
ed30: 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a   = node.iChild;.
ed40: 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64      bDlidx = nod
ed50: 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20 66 6f  e.bDlidx;.    fo
ed60: 72 28 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65  r(fts5NodeIterNe
ed70: 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65  xt(&p->rc, &node
ed80: 29 3b 0a 20 20 20 20 20 20 20 20 6e 6f 64 65 2e  );.        node.
ed90: 61 44 61 74 61 20 26 26 20 66 74 73 35 42 75 66  aData && fts5Buf
eda0: 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
edb0: 6e 6f 64 65 2e 74 65 72 6d 2c 20 70 54 65 72 6d  node.term, pTerm
edc0: 2c 20 6e 54 65 72 6d 29 3c 3d 30 3b 0a 20 20 20  , nTerm)<=0;.   
edd0: 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65       fts5NodeIte
ede0: 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e  rNext(&p->rc, &n
edf0: 6f 64 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ode).    ){.    
ee00: 20 20 69 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68    iPg = node.iCh
ee10: 69 6c 64 3b 0a 20 20 20 20 20 20 62 44 6c 69 64  ild;.      bDlid
ee20: 78 20 3d 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b  x = node.bDlidx;
ee30: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4e  .    }.    fts5N
ee40: 6f 64 65 49 74 65 72 46 72 65 65 28 26 6e 6f 64  odeIterFree(&nod
ee50: 65 29 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61  e);.    fts5Data
ee60: 52 65 6c 65 61 73 65 28 70 4e 6f 64 65 29 3b 0a  Release(pNode);.
ee70: 20 20 7d 0a 0a 20 20 69 66 28 20 69 50 67 3c 70    }..  if( iPg<p
ee80: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  Seg->pgnoFirst )
ee90: 7b 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65 67  {.    iPg = pSeg
eea0: 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20  ->pgnoFirst;.   
eeb0: 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d   bDlidx = 0;.  }
eec0: 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ..  pIter->iLeaf
eed0: 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a  Pgno = iPg - 1;.
eee0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
eef0: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
ef00: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ..  if( pIter->p
ef10: 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  Leaf ){.    int 
ef20: 72 65 73 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  res;.    pIter->
ef30: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
ef40: 73 35 47 65 74 55 31 36 28 26 70 49 74 65 72 2d  s5GetU16(&pIter-
ef50: 3e 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20  >pLeaf->p[2]);. 
ef60: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
ef70: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
ef80: 20 30 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20   0);.    do {.  
ef90: 20 20 20 20 72 65 73 20 3d 20 66 74 73 35 42 75      res = fts5Bu
efa0: 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28  fferCompareBlob(
efb0: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54  &pIter->term, pT
efc0: 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20  erm, nTerm);.   
efd0: 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20     if( res>=0 ) 
efe0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 74 73  break;.      fts
eff0: 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20  5SegIterNext(p, 
f000: 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 77 68 69  pIter);.    }whi
f010: 6c 65 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  le( pIter->pLeaf
f020: 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
f030: 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 69 66 28  E_OK );..    if(
f040: 20 62 47 65 3d 3d 30 20 26 26 20 72 65 73 20 29   bGe==0 && res )
f050: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 69  {.      /* Set i
f060: 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74  terator to point
f070: 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20 20 20 20   to EOF */.     
f080: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
f090: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
f0a0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
f0b0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  af = 0;.    }.  
f0c0: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
f0d0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65  SQLITE_OK && bGe
f0e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ==0 ){.    pIter
f0f0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f  ->flags |= FTS5_
f100: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b  SEGITER_ONETERM;
f110: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
f120: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69  pLeaf ){.      i
f130: 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  f( flags & FTS5I
f140: 4e 44 45 58 5f 51 55 45 52 59 5f 41 53 43 20 29  NDEX_QUERY_ASC )
f150: 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
f160: 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
f170: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a  EGITER_REVERSE;.
f180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
f190: 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( bDlidx ){.    
f1a0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
f1b0: 6f 61 64 44 6c 69 64 78 28 70 2c 20 69 49 64 78  oadDlidx(p, iIdx
f1c0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
f1d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  }.      if( flag
f1e0: 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
f1f0: 45 52 59 5f 41 53 43 20 29 7b 0a 20 20 20 20 20  ERY_ASC ){.     
f200: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
f210: 76 65 72 73 65 28 70 2c 20 69 49 64 78 2c 20 70  verse(p, iIdx, p
f220: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
f230: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
f240: 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61  * Zero the itera
f250: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
f260: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
f270: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f280: 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
f290: 28 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49  (Fts5SegIter *pI
f2a0: 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66  ter){.  fts5Buff
f2b0: 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74  erFree(&pIter->t
f2c0: 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61  erm);.  fts5Data
f2d0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
f2e0: 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69  Leaf);.  fts5Dli
f2f0: 64 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72  dxIterFree(pIter
f300: 2d 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c  ->pDlidx);.  sql
f310: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
f320: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a  >aRowidOffset);.
f330: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
f340: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
f350: 67 49 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  gIter));.}../*.*
f360: 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
f370: 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f  son necessary to
f380: 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d   populate pIter-
f390: 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a  >aFirst[iOut]..*
f3a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75  *.** If the retu
f3b0: 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f  rned value is no
f3c0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
f3d0: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
f3e0: 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74  an entry.** in t
f3f0: 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d  he pIter->aSeg[]
f400: 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20 28   array that is (
f410: 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61  a) not at EOF, a
f420: 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a  nd (b) pointing.
f430: 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74  ** to a key that
f440: 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
f450: 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68  of another, high
f460: 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a  er priority, .**
f470: 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f   segment-iterato
f480: 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61  r in the pSeg->a
f490: 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Seg[] array..*/.
f4a0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
f4b0: 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72  ultiIterDoCompar
f4c0: 65 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  e(Fts5MultiSegIt
f4d0: 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69  er *pIter, int i
f4e0: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20  Out){.  int i1; 
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
f510: 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74   of left-hand Ft
f520: 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69  s5SegIter */.  i
f530: 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20  nt i2;          
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f550: 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74  * Index of right
f560: 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
f570: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b  r */.  int iRes;
f580: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
f590: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
f5a0: 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20     /* Left-hand 
f5b0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
f5c0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32   Fts5SegIter *p2
f5d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f5e0: 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46   /* Right-hand F
f5f0: 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 0a 20  ts5SegIter */.. 
f600: 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49   assert( iOut<pI
f610: 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75  ter->nSeg && iOu
f620: 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
f630: 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20   pIter->bRev==0 
f640: 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  || pIter->bRev==
f650: 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74  1 );..  if( iOut
f660: 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32  >=(pIter->nSeg/2
f670: 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69  ) ){.    i1 = (i
f680: 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65  Out - pIter->nSe
f690: 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32  g/2) * 2;.    i2
f6a0: 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c   = i1 + 1;.  }el
f6b0: 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74  se{.    i1 = pIt
f6c0: 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
f6d0: 32 5d 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74  2];.    i2 = pIt
f6e0: 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
f6f0: 32 2b 31 5d 3b 0a 20 20 7d 0a 20 20 70 31 20 3d  2+1];.  }.  p1 =
f700: 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31   &pIter->aSeg[i1
f710: 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72  ];.  p2 = &pIter
f720: 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 69  ->aSeg[i2];..  i
f730: 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p1->pLeaf==0 
f740: 29 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){           /* 
f750: 49 66 20 70 31 20 69 73 20 61 74 20 45 4f 46 20  If p1 is at EOF 
f760: 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32  */.    iRes = i2
f770: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32  ;.  }else if( p2
f780: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20  ->pLeaf==0 ){   
f790: 20 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74    /* If p2 is at
f7a0: 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73   EOF */.    iRes
f7b0: 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = i1;.  }else{.
f7c0: 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74      int res = ft
f7d0: 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
f7e0: 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e  &p1->term, &p2->
f7f0: 74 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  term);.    if( r
f800: 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  es==0 ){.      a
f810: 73 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a  ssert( i2>i1 );.
f820: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32        assert( i2
f830: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
f840: 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d   p1->iRowid==p2-
f850: 3e 69 52 6f 77 69 64 20 29 20 72 65 74 75 72 6e  >iRowid ) return
f860: 20 69 32 3b 0a 20 20 20 20 20 20 72 65 73 20 3d   i2;.      res =
f870: 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3c 20   ((p1->iRowid < 
f880: 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74  p2->iRowid)==pIt
f890: 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a  er->bRev) ? -1 :
f8a0: 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   +1;.    }.    a
f8b0: 73 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b  ssert( res!=0 );
f8c0: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
f8d0: 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
f8e0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
f8f0: 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
f900: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65     }.  }..  pIte
f910: 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 20  r->aFirst[iOut] 
f920: 3d 20 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e  = iRes;.  return
f930: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   0;.}../*.** Fre
f940: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
f950: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
f960: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
f970: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
f980: 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
f990: 72 46 72 65 65 28 46 74 73 35 49 6e 64 65 78 20  rFree(Fts5Index 
f9a0: 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
f9b0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
f9c0: 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
f9d0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
f9e0: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
f9f0: 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
fa00: 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
fa10: 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d  (&pIter->aSeg[i]
fa20: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
fa30: 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29  ite3_free(pIter)
fa40: 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
fa50: 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
fa60: 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74  erAdvanced(.  Ft
fa70: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa90: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
faa0: 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
fab0: 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  */.  Fts5MultiSe
fac0: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
fad0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
fae0: 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73   to update aFirs
faf0: 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f  t[] array for */
fb00: 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c  .  int iChanged,
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb20: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73     /* Index of s
fb30: 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74  ub-iterator just
fb40: 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69   advanced */.  i
fb50: 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20  nt iMinset      
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb70: 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20  * Minimum entry 
fb80: 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73  in aFirst[] to s
fb90: 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  et */.){.  int i
fba0: 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72  ;.  for(i=(pIter
fbb0: 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29  ->nSeg+iChanged)
fbc0: 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26  /2; i>=iMinset &
fbd0: 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
fbe0: 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20  OK; i=i/2){.    
fbf0: 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28  int iEq;.    if(
fc00: 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74   (iEq = fts5Mult
fc10: 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70  iIterDoCompare(p
fc20: 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20  Iter, i)) ){.   
fc30: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
fc40: 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53  xt(p, &pIter->aS
fc50: 65 67 5b 69 45 71 5d 29 3b 0a 20 20 20 20 20 20  eg[iEq]);.      
fc60: 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20  i = pIter->nSeg 
fc70: 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  + iEq;.    }.  }
fc80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
fc90: 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74  he seg-iter so t
fca0: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
fcb0: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
fcc0: 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67   on page iLeafPg
fcd0: 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20  no..** It is an 
fce0: 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c  error if leaf iL
fcf0: 65 61 66 50 67 6e 6f 20 63 6f 6e 74 61 69 6e 73  eafPgno contains
fd00: 20 6e 6f 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74   no rowid..*/.st
fd10: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
fd20: 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20  gIterGotoPage(. 
fd30: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
fd60: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
fd70: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fd90: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
fda0: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  nce */.  int iLe
fdb0: 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65  afPgno.){.  asse
fdc0: 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  rt( iLeafPgno>pI
fdd0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
fde0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
fdf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fe00: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
fe10: 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a   = iLeafPgno-1;.
fe20: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
fe30: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
fe40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
fe50: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
fe60: 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  || pIter->iLeafP
fe70: 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29  gno==iLeafPgno )
fe80: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
fe90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
fea0: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
feb0: 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72     u8 *a = pIter
fec0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
fed0: 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70  int n = pIter->p
fee0: 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20 69 4f  Leaf->n;..    iO
fef0: 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
ff00: 26 61 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  &a[0]);.    if( 
ff10: 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d  iOff<4 || iOff>=
ff20: 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  n ){.      p->rc
ff30: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
ff40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ff50: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
ff60: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
ff70: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
ff80: 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  id);.      pIter
ff90: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
ffa0: 69 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iOff;.    }.  }.
ffb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
ffc0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
ffd0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
ffe0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69  nd argument unti
fff0: 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a  l it is at or .*
10000 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72  * past rowid iFr
10010 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  om. Regardless o
10020 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  f the value of i
10030 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74  From, the iterat
10040 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  or is.** always 
10050 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73  advanced at leas
10060 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  t once..*/.stati
10070 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
10080 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
10090 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
100b0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
100c0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
100d0 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
100e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
100f0 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
10100 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68   */.  i64 iMatch
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
10130 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61   iterator at lea
10140 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29  st this far */.)
10150 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28  {.  int bRev = (
10160 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
10170 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
10180 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64  RSE);.  Fts5Dlid
10190 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
101a0 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20  pIter->pDlidx;. 
101b0 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d   int iLeafPgno =
101c0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
101d0 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d  o;.  int bMove =
101e0 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   1;..  assert( p
101f0 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
10200 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
10210 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RM );.  assert( 
10220 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b  pIter->pDlidx );
10230 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
10240 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66  ->pLeaf );..  if
10250 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
10260 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
10270 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
10280 64 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68  dx)==0 && iMatch
10290 3c 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  <pDlidx->iRowid 
102a0 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67  ){.      iLeafPg
102b0 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65  no = pDlidx->iLe
102c0 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74  afPgno;.      ft
102d0 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
102e0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20  pDlidx);.    }. 
102f0 20 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66     assert( iLeaf
10300 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno>=pIter->iLe
10310 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20  afPgno || p->rc 
10320 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66  );.    if( iLeaf
10330 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
10340 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66  fPgno ){.      f
10350 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
10360 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65  ge(p, pIter, iLe
10370 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62  afPgno);.      b
10380 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
10390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
103a0 65 72 74 28 20 69 4d 61 74 63 68 3e 70 49 74 65  ert( iMatch>pIte
103b0 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  r->iRowid );.   
103c0 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
103d0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
103e0 64 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68  dx)==0 && iMatch
103f0 3e 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  >pDlidx->iRowid 
10400 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
10410 64 78 49 74 65 72 50 72 65 76 28 70 44 6c 69 64  dxIterPrev(pDlid
10420 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c  x);.    }.    iL
10430 65 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64 78  eafPgno = pDlidx
10440 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20  ->iLeafPgno;..  
10450 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c    assert( fts5Dl
10460 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
10470 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67  lidx) || iLeafPg
10480 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no<=pIter->iLeaf
10490 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28  Pgno );..    if(
104a0 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72   iLeafPgno<pIter
104b0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
104c0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
104d0 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
104e0 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53  o+1;.      fts5S
104f0 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
10500 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
10510 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b        bMove = 0;
10520 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68  .    }.  }..  wh
10530 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66  ile( 1 ){.    if
10540 28 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65  ( bMove ) fts5Se
10550 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  gIterNext(p, pIt
10560 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
10570 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62  er->pLeaf==0 ) b
10580 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52  reak;.    if( bR
10590 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  ev==0 && pIter->
105a0 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29  iRowid<=iMatch )
105b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
105c0 62 52 65 76 21 3d 30 20 26 26 20 70 49 74 65 72  bRev!=0 && pIter
105d0 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68  ->iRowid>=iMatch
105e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d   ) break;.    bM
105f0 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  ove = 1;.  }.}..
10600 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
10610 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
10620 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a  ext entry. .**.*
10630 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
10640 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
10650 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
10660 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20  ts5Index.rc. It 
10670 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69  is not .** consi
10680 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
10690 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  f the iterator r
106a0 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69  eaches EOF, or i
106b0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
106c0 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20  at .** EOF when 
106d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
106e0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
106f0 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
10700 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  iIterNext(.  Fts
10710 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
10720 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
10730 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72  pIter,.  int bFr
10740 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
10750 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
10760 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72   if argument iFr
10770 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  om is valid */. 
10780 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20   i64 iFrom      
10790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107a0 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c   /* Advance at l
107b0 65 61 73 74 20 61 73 20 66 61 72 20 61 73 20 74  east as far as t
107c0 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  his */.){.  if( 
107d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
107e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55 73 65   ){.    int bUse
107f0 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20  From = bFrom;.  
10800 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74    do {.      int
10810 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
10820 3e 61 46 69 72 73 74 5b 31 5d 3b 0a 20 20 20 20  >aFirst[1];.    
10830 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
10840 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
10850 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  eg[iFirst];.    
10860 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26    if( bUseFrom &
10870 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29  & pSeg->pDlidx )
10880 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
10890 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c  gIterNextFrom(p,
108a0 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20   pSeg, iFrom);. 
108b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
108c0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
108d0 65 78 74 28 70 2c 20 70 53 65 67 29 3b 0a 20 20  ext(p, pSeg);.  
108e0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
108f0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
10900 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
10910 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 55  st, 1);.      bU
10920 73 65 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 20 20  seFrom = 0;.    
10930 7d 77 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 62  }while( pIter->b
10940 53 6b 69 70 45 6d 70 74 79 20 0a 20 20 20 20 20  SkipEmpty .     
10950 20 20 20 20 26 26 20 66 74 73 35 53 65 67 49 74      && fts5SegIt
10960 65 72 49 73 44 65 6c 65 74 65 28 70 2c 20 26 70  erIsDelete(p, &p
10970 49 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72  Iter->aSeg[pIter
10980 2d 3e 61 46 69 72 73 74 5b 31 5d 5d 29 0a 20 20  ->aFirst[1]]).  
10990 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a    );.  }.}../*.*
109a0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
109b0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
109c0 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  r object..**.** 
109d0 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77  The new object w
109e0 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69  ill be used to i
109f0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64  terate through d
10a00 61 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65  ata in structure
10a10 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20   pStruct..** If 
10a20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74  iLevel is -ve, t
10a30 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20  hen all data in 
10a40 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20  all segments is 
10a50 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69  merged. Or, if i
10a60 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f  Level.** is zero
10a70 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74   or greater, dat
10a80 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  a from the first
10a90 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e   nSegment segmen
10aa0 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76  ts on level iLev
10ab0 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e  el.** is merged.
10ac0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61  .**.** The itera
10ad0 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f  tor initially po
10ae0 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
10af0 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74  t term/rowid ent
10b00 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74  ry in the .** it
10b10 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  erated data..*/.
10b20 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
10b30 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20  MultiIterNew(.  
10b40 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
10b70 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
10b80 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  n */.  Fts5Struc
10b90 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20  ture *pStruct,  
10ba0 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
10bb0 75 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20  ure of specific 
10bc0 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
10bd0 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
10be0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10bf0 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64  nfig.aHash[] ind
10c00 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20  ex of FTS index 
10c10 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d  */.  int bSkipEm
10c20 70 74 79 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73  pty,.  int flags
10c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10c40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
10c50 6f 72 20 3e 3d 20 2a 2f 0a 20 20 63 6f 6e 73 74  or >= */.  const
10c60 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
10c70 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
10c80 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
10c90 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
10ca0 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10cc0 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
10cd0 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
10ce0 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
10cf0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
10d00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10d10 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
10d20 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
10d30 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  */.  Fts5MultiSe
10d40 67 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  gIter **ppOut   
10d50 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
10d60 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
10d70 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
10d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10d90 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
10da0 20 6d 65 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74   merged */.  int
10db0 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10dd0 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20  Power of two >= 
10de0 6e 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nSeg */.  int iI
10df0 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ter = 0;        
10e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a            /* */.
10e10 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
10e40 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67  rate through seg
10e50 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53  ments */.  Fts5S
10e60 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
10e70 4c 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69  Lvl;.  Fts5Multi
10e80 53 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  SegIter *pNew;..
10e90 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
10ea0 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
10eb0 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
10ec0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
10ed0 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
10ee0 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
10ef0 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c  tor. */.  if( iL
10f00 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 6e 53  evel<0 ){.    nS
10f10 65 67 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  eg = fts5Structu
10f20 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
10f30 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 65 6c 73  pStruct);.  }els
10f40 65 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 4d 49  e{.    nSeg = MI
10f50 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  N(pStruct->aLeve
10f60 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20  l[iLevel].nSeg, 
10f70 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20  nSegment);.  }. 
10f80 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53   for(nSlot=2; nS
10f90 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d  lot<nSeg; nSlot=
10fa0 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 2a 70 70 4f  nSlot*2);.  *ppO
10fb0 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73 35  ut = pNew = fts5
10fc0 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20  IdxMalloc(p, .  
10fd0 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 4d      sizeof(Fts5M
10fe0 75 6c 74 69 53 65 67 49 74 65 72 29 20 2b 20 20  ultiSegIter) +  
10ff0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20          /* pNew 
11000 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
11010 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 6e  Fts5SegIter) * n
11020 53 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a 20  Slot +       /* 
11030 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a  pNew->aSeg[] */.
11040 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 31 36        sizeof(u16
11050 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20  ) * nSlot       
11060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
11070 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20  w->aFirst[] */. 
11080 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
11090 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e  0 ) return;.  pN
110a0 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74  ew->nSeg = nSlot
110b0 3b 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67 20 3d  ;.  pNew->aSeg =
110c0 20 28 46 74 73 35 53 65 67 49 74 65 72 2a 29 26   (Fts5SegIter*)&
110d0 70 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77 2d  pNew[1];.  pNew-
110e0 3e 61 46 69 72 73 74 20 3d 20 28 75 31 36 2a 29  >aFirst = (u16*)
110f0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f  &pNew->aSeg[nSlo
11100 74 5d 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76  t];.  pNew->bRev
11110 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20   = (0!=(flags & 
11120 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
11130 41 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62  ASC));.  pNew->b
11140 53 6b 69 70 45 6d 70 74 79 20 3d 20 62 53 6b 69  SkipEmpty = bSki
11150 70 45 6d 70 74 79 3b 0a 0a 20 20 2f 2a 20 49 6e  pEmpty;..  /* In
11160 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66  itialize each of
11170 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73   the component s
11180 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
11190 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65  . */.  if( iLeve
111a0 6c 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53  l<0 ){.    Fts5S
111b0 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
111c0 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  End = &pStruct->
111d0 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e  aLevel[pStruct->
111e0 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72  nLevel];.    for
111f0 28 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e  (pLvl=&pStruct->
11200 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c  aLevel[0]; pLvl<
11210 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20  pEnd; pLvl++){. 
11220 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c       for(iSeg=pL
11230 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67  vl->nSeg-1; iSeg
11240 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20  >=0; iSeg--){.  
11250 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
11260 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
11270 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69   = &pLvl->aSeg[i
11280 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74  Seg];.        Ft
11290 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
112a0 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69   = &pNew->aSeg[i
112b0 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20  Iter++];.       
112c0 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b   if( pTerm==0 ){
112d0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
112e0 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49  egIterInit(p, iI
112f0 64 78 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  dx, pSeg, pIter)
11300 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11310 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
11320 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70  egIterSeekInit(p
11330 2c 20 69 49 64 78 2c 20 70 54 65 72 6d 2c 20 6e  , iIdx, pTerm, n
11340 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65  Term, flags, pSe
11350 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  g, pIter);.     
11360 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11370 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
11380 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
11390 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b  >aLevel[iLevel];
113a0 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53  .    for(iSeg=nS
113b0 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
113c0 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74  Seg--){.      ft
113d0 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c  s5SegIterInit(p,
113e0 20 69 49 64 78 2c 20 26 70 4c 76 6c 2d 3e 61 53   iIdx, &pLvl->aS
113f0 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d  eg[iSeg], &pNew-
11400 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b  >aSeg[iIter++]);
11410 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
11420 65 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67  ert( iIter==nSeg
11430 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
11440 20 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65   above was succe
11450 73 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70  ssful, each comp
11460 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  onent iterators 
11470 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a  now points .  **
11480 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
11490 74 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65  try in its segme
114a0 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  nt. In this case
114b0 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
114c0 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61  .  ** aFirst[] a
114d0 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20  rray. Or, if an 
114e0 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
114f0 65 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65  ed, free the ite
11500 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63  rator.  ** objec
11510 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75  t and set the ou
11520 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
11530 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28   NULL.  */.  if(
11540 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11550 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74  K ){.    for(iIt
11560 65 72 3d 6e 53 6c 6f 74 2d 31 3b 20 69 49 74 65  er=nSlot-1; iIte
11570 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20  r>0; iIter--){. 
11580 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20       int iEq;.  
11590 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66      if( (iEq = f
115a0 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f  ts5MultiIterDoCo
115b0 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65  mpare(pNew, iIte
115c0 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  r)) ){.        f
115d0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
115e0 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45  , &pNew->aSeg[iE
115f0 71 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  q]);.        fts
11600 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
11610 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c  ed(p, pNew, iEq,
11620 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   iIter);.      }
11630 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
11640 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79  pNew->bSkipEmpty
11650 20 0a 20 20 20 20 20 26 26 20 66 74 73 35 53 65   .     && fts5Se
11660 67 49 74 65 72 49 73 44 65 6c 65 74 65 28 70 2c  gIterIsDelete(p,
11670 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 70 4e 65   &pNew->aSeg[pNe
11680 77 2d 3e 61 46 69 72 73 74 5b 31 5d 5d 29 20 0a  w->aFirst[1]]) .
11690 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 74 73      ){.      fts
116a0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
116b0 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20  , pNew, 0, 0);. 
116c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
116d0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
116e0 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ree(p, pNew);.  
116f0 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20    *ppOut = 0;.  
11700 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
11710 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
11720 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46  erator is at EOF
11730 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
11740 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a  has occurred. .*
11750 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73  * False otherwis
11760 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11770 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
11780 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  f(Fts5Index *p, 
11790 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
117a0 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
117b0 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74  rn (p->rc || pIt
117c0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
117d0 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e 70 4c 65  >aFirst[1] ].pLe
117e0 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  af==0);.}../*.**
117f0 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69   Return the rowi
11800 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
11810 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
11820 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
11830 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20  s.** to. If the 
11840 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
11850 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  to EOF when this
11860 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11870 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  led the.** resul
11880 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
11890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
118a0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
118b0 69 64 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49  id(Fts5MultiSegI
118c0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61  ter *pIter){.  a
118d0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53  ssert( pIter->aS
118e0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
118f0 74 5b 31 5d 20 5d 2e 70 4c 65 61 66 20 29 3b 0a  t[1] ].pLeaf );.
11900 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
11910 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
11920 72 73 74 5b 31 5d 20 5d 2e 69 52 6f 77 69 64 3b  rst[1] ].iRowid;
11930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
11940 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
11950 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74  he next entry at
11960 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d   or following iM
11970 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  atch..*/.static 
11980 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
11990 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
119a0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
119b0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
119c0 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69  *pIter, .  i64 i
119d0 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65  Match.){.  while
119e0 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ( 1 ){.    i64 i
119f0 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d  Rowid;.    fts5M
11a00 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
11a10 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68  pIter, 1, iMatch
11a20 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d  );.    if( fts5M
11a30 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
11a40 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20  Iter) ) break;. 
11a50 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35     iRowid = fts5
11a60 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
11a70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
11a80 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26  Iter->bRev==0 &&
11a90 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20   iRowid<=iMatch 
11aa0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
11ab0 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20   pIter->bRev!=0 
11ac0 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  && iRowid>=iMatc
11ad0 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d  h ) break;.  }.}
11ae0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
11af0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
11b00 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
11b10 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61  the term associa
11b20 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  ted with the .**
11b30 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
11b40 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74  iterator current
11b50 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  ly points to..*/
11b60 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38  .static const u8
11b70 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54   *fts5MultiIterT
11b80 65 72 6d 28 46 74 73 35 4d 75 6c 74 69 53 65 67  erm(Fts5MultiSeg
11b90 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
11ba0 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67   *pn){.  Fts5Seg
11bb0 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72  Iter *p = &pIter
11bc0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
11bd0 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20 2a 70  First[1] ];.  *p
11be0 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20  n = p->term.n;. 
11bf0 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e   return p->term.
11c00 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
11c10 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 63  rn true if the c
11c20 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20 70 61  hunk iterator pa
11c30 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
11c40 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a  nd argument is.*
11c50 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20  * at EOF. Or if 
11c60 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
11c70 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f  eady occurred. O
11c80 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
11c90 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   false..*/.stati
11ca0 63 20 69 6e 74 20 66 74 73 35 43 68 75 6e 6b 49  c int fts5ChunkI
11cb0 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
11cc0 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b 49 74   *p, Fts5ChunkIt
11cd0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
11ce0 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
11cf0 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 3b  Iter->pLeaf==0);
11d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
11d10 65 20 74 68 65 20 63 68 75 6e 6b 2d 69 74 65 72  e the chunk-iter
11d20 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
11d30 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61 20 74   chunk of data t
11d40 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69  o read..*/.stati
11d50 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
11d60 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
11d70 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b  ex *p, Fts5Chunk
11d80 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
11d90 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 6e  assert( pIter->n
11da0 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20 29 3b  Rem>=pIter->n );
11db0 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20 2d  .  pIter->nRem -
11dc0 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20 20 66 74  = pIter->n;.  ft
11dd0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
11de0 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
11df0 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
11e00 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 30 3b  .  pIter->p = 0;
11e10 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 52  .  if( pIter->nR
11e20 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35  em>0 ){.    Fts5
11e30 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20  Data *pLeaf;.   
11e40 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77   pIter->iLeafRow
11e50 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66 20  id++;.    pLeaf 
11e60 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d  = pIter->pLeaf =
11e70 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
11e80 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77   pIter->iLeafRow
11e90 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  id);.    if( pLe
11ea0 61 66 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  af ){.      pIte
11eb0 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49 74 65 72  r->n = MIN(pIter
11ec0 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66 2d 3e 6e  ->nRem, pLeaf->n
11ed0 2d 34 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  -4);.      pIter
11ee0 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70 2b 34  ->p = pLeaf->p+4
11ef0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
11f00 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a 65 20 74  *.** Intialize t
11f10 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f  he chunk iterato
11f20 72 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 6f  r to read the po
11f30 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61  sition list data
11f40 20 66 6f 72 20 77 68 69 63 68 20 0a 2a 2a 20 74   for which .** t
11f50 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 69 73  he size field is
11f60 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66 66 20   at offset iOff 
11f70 6f 66 20 6c 65 61 66 20 70 4c 65 61 66 2e 20 0a  of leaf pLeaf. .
11f80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11f90 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74  ts5ChunkIterInit
11fa0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
11fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11fc0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
11fd0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
11fe0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
11ff0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
12000 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74 65 72 61  /* Segment itera
12010 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73 6c  tor to read posl
12020 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 74  ist from */.  Ft
12030 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74  s5ChunkIter *pIt
12040 65 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er            /*
12050 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
12060 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
12070 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e  int iId = pSeg->
12080 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
12090 69 36 34 20 72 6f 77 69 64 20 3d 20 46 54 53 35  i64 rowid = FTS5
120a0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
120b0 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20  Seg->iIdx, iId, 
120c0 30 2c 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67  0, pSeg->iLeafPg
120d0 6e 6f 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20  no);.  Fts5Data 
120e0 2a 70 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  *pLeaf = pSeg->p
120f0 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Leaf;.  int iOff
12100 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66   = pSeg->iLeafOf
12110 66 73 65 74 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  fset;..  memset(
12120 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
12130 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
12140 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 20 3d  er->iLeafRowid =
12150 20 72 6f 77 69 64 3b 0a 20 20 69 66 28 20 69 4f   rowid;.  if( iO
12160 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  ff<pLeaf->n ){. 
12170 20 20 20 66 74 73 35 44 61 74 61 52 65 66 65 72     fts5DataRefer
12180 65 6e 63 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ence(pLeaf);.   
12190 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
121a0 70 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pLeaf;.  }else{.
121b0 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20      pIter->nRem 
121c0 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 43 68 75  = 1;.    fts5Chu
121d0 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  nkIterNext(p, pI
121e0 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ter);.    if( p-
121f0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
12200 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20    iOff = 4;.    
12210 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
12220 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 69 4f 66  Leaf;.  }..  iOf
12230 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
12240 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
12250 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b 0a  , pIter->nRem);.
12260 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e    pIter->n = MIN
12270 28 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f 66 66  (pLeaf->n - iOff
12280 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b 0a  , pIter->nRem);.
12290 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 4c 65    pIter->p = pLe
122a0 61 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a 0a 20  af->p + iOff;.. 
122b0 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 3d 3d 30   if( pIter->n==0
122c0 20 29 7b 0a 20 20 20 20 66 74 73 35 43 68 75 6e   ){.    fts5Chun
122d0 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  kIterNext(p, pIt
122e0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  er);.  }.}..stat
122f0 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e  ic void fts5Chun
12300 6b 49 74 65 72 52 65 6c 65 61 73 65 28 46 74 73  kIterRelease(Fts
12310 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74 65  5ChunkIter *pIte
12320 72 29 7b 0a 20 20 66 74 73 35 44 61 74 61 52 65  r){.  fts5DataRe
12330 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
12340 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c  af);.  pIter->pL
12350 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eaf = 0;.}../*.*
12360 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74 75 72  * Read and retur
12370 6e 20 74 68 65 20 6e 65 78 74 20 33 32 2d 62 69  n the next 32-bi
12380 74 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 74 68  t varint from th
12390 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
123a0 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70 61 73  iterator .** pas
123b0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
123c0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
123d0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
123e0 63 75 72 73 2c 20 7a 65 72 6f 20 69 73 20 72 65  curs, zero is re
123f0 74 75 72 6e 65 64 20 61 6e 20 61 6e 20 65 72 72  turned an an err
12400 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20  or code left in 
12410 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 2e 72 63  .** Fts5Index.rc
12420 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
12430 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
12440 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
12450 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c 6c  ction is.** call
12460 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
12470 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
12480 20 66 74 73 35 50 6f 73 49 74 65 72 52 65 61 64   fts5PosIterRead
12490 56 61 72 69 6e 74 28 46 74 73 35 49 6e 64 65 78  Varint(Fts5Index
124a0 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74 65 72   *p, Fts5PosIter
124b0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
124c0 69 56 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  iVal = 0;.  if( 
124d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
124e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65   ){.    if( pIte
124f0 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  r->iOff>=pIter->
12500 63 68 75 6e 6b 2e 6e 20 29 7b 0a 20 20 20 20 20  chunk.n ){.     
12510 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65   fts5ChunkIterNe
12520 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68  xt(p, &pIter->ch
12530 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unk);.      if( 
12540 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
12550 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e  (p, &pIter->chun
12560 6b 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  k) ) return 0;. 
12570 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66       pIter->iOff
12580 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
12590 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67  pIter->iOff += g
125a0 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
125b0 72 2d 3e 63 68 75 6e 6b 2e 70 5b 70 49 74 65 72  r->chunk.p[pIter
125c0 2d 3e 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a  ->iOff], iVal);.
125d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 56 61    }.  return iVa
125e0 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  l;.}../*.** Adva
125f0 6e 63 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  nce the position
12600 20 6c 69 73 74 20 69 74 65 72 61 74 6f 72 20 74   list iterator t
12610 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
12620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12630 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74   fts5PosIterNext
12640 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
12650 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74 65  ts5PosIter *pIte
12660 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a  r){.  int iVal;.
12670 20 20 61 73 73 65 72 74 28 20 66 74 73 35 43 68    assert( fts5Ch
12680 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 70  unkIterEof(p, &p
12690 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30 20  Iter->chunk)==0 
126a0 29 3b 0a 20 20 69 56 61 6c 20 3d 20 66 74 73 35  );.  iVal = fts5
126b0 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69 6e  PosIterReadVarin
126c0 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 69  t(p, pIter);.  i
126d0 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  f( fts5ChunkIter
126e0 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63  Eof(p, &pIter->c
126f0 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hunk)==0 ){.    
12700 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20  if( iVal==1 ){. 
12710 20 20 20 20 20 70 49 74 65 72 2d 3e 69 43 6f 6c       pIter->iCol
12720 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52 65   = fts5PosIterRe
12730 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74 65  adVarint(p, pIte
12740 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  r);.      pIter-
12750 3e 69 50 6f 73 20 3d 20 66 74 73 35 50 6f 73 49  >iPos = fts5PosI
12760 74 65 72 52 65 61 64 56 61 72 69 6e 74 28 70 2c  terReadVarint(p,
12770 20 70 49 74 65 72 29 20 2d 20 32 3b 0a 20 20 20   pIter) - 2;.   
12780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
12790 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28 69 56  ter->iPos += (iV
127a0 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 7d 0a 20  al - 2);.    }. 
127b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
127c0 69 61 6c 69 7a 65 20 74 68 65 20 46 74 73 35 50  ialize the Fts5P
127d0 6f 73 49 74 65 72 20 6f 62 6a 65 63 74 20 70 61  osIter object pa
127e0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 6e 61  ssed as the fina
127f0 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  l argument to it
12800 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68  erate.** through
12810 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
12820 73 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  st associated wi
12830 74 68 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  th the index ent
12840 72 79 20 74 68 61 74 20 69 74 65 72 61 74 6f 72  ry that iterator
12850 20 0a 2a 2a 20 70 4d 75 6c 74 69 20 63 75 72 72   .** pMulti curr
12860 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
12870 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12880 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69 74 28  fts5PosIterInit(
12890 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
128c0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
128d0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
128e0 2a 70 4d 75 6c 74 69 2c 20 20 20 20 20 20 20 2f  *pMulti,       /
128f0 2a 20 4d 75 6c 74 69 2d 73 65 67 20 69 74 65 72  * Multi-seg iter
12900 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73  ator to read pos
12910 2d 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  -list from */.  
12920 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74  Fts5PosIter *pIt
12930 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
12940 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
12950 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
12960 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
12970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
12980 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
12990 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b  = &pMulti->aSeg[
129a0 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b   pMulti->aFirst[
129b0 31 5d 20 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  1] ];.    memset
129c0 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
129d0 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20  f(*pIter));.    
129e0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69  fts5ChunkIterIni
129f0 74 28 70 2c 20 70 53 65 67 2c 20 26 70 49 74 65  t(p, pSeg, &pIte
12a00 72 2d 3e 63 68 75 6e 6b 29 3b 0a 20 20 20 20 69  r->chunk);.    i
12a10 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  f( fts5ChunkIter
12a20 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63  Eof(p, &pIter->c
12a30 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  hunk)==0 ){.    
12a40 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78    fts5PosIterNex
12a50 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
12a60 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12a70 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
12a80 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 65 72  he position iter
12a90 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
12aa0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12ab0 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45 4f 46 2e  nt is.** at EOF.
12ac0 20 4f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   Or if an error 
12ad0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
12ae0 72 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rred. Otherwise,
12af0 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a   return false..*
12b00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
12b10 35 50 6f 73 49 74 65 72 45 6f 66 28 46 74 73 35  5PosIterEof(Fts5
12b20 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 50 6f  Index *p, Fts5Po
12b30 73 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  sIter *pIter){. 
12b40 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c   return (p->rc |
12b50 7c 20 70 49 74 65 72 2d 3e 63 68 75 6e 6b 2e 70  | pIter->chunk.p
12b60 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Leaf==0);.}../*.
12b70 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  ** Add an entry 
12b80 66 6f 72 20 28 69 52 6f 77 69 64 2f 69 43 6f 6c  for (iRowid/iCol
12b90 2f 69 50 6f 73 29 20 74 6f 20 74 68 65 20 64 6f  /iPos) to the do
12ba0 63 6c 69 73 74 20 66 6f 72 20 28 70 54 6f 6b 65  clist for (pToke
12bb0 6e 2f 6e 54 6f 6b 65 6e 29 0a 2a 2a 20 69 6e 20  n/nToken).** in 
12bc0 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  hash table for i
12bd0 6e 64 65 78 20 69 49 64 78 2e 20 49 66 20 69 49  ndex iIdx. If iI
12be0 64 78 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  dx is zero, this
12bf0 20 69 73 20 74 68 65 20 6d 61 69 6e 20 74 65 72   is the main ter
12c00 6d 73 20 0a 2a 2a 20 69 6e 64 65 78 2e 20 56 61  ms .** index. Va
12c10 6c 75 65 73 20 6f 66 20 31 20 61 6e 64 20 67 72  lues of 1 and gr
12c20 65 61 74 65 72 20 66 6f 72 20 69 49 64 78 20 61  eater for iIdx a
12c30 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  re prefix indexe
12c40 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  s..**.** If an O
12c50 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  OM error is enco
12c60 75 6e 74 65 72 65 64 2c 20 73 65 74 20 74 68 65  untered, set the
12c70 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
12c80 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 61 63 63  ror code .** acc
12c90 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61  ordingly..*/.sta
12ca0 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 64 64  tic void fts5Add
12cb0 54 65 72 6d 54 6f 48 61 73 68 28 0a 20 20 46 74  TermToHash(.  Ft
12cc0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12ce0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
12cf0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
12d00 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
12d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d20 2a 20 45 6e 74 72 79 20 69 6e 20 70 2d 3e 61 48  * Entry in p->aH
12d30 61 73 68 5b 5d 20 74 6f 20 75 70 64 61 74 65 20  ash[] to update 
12d40 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
12d70 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
12d80 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
12d90 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
12dc0 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
12dd0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
12de0 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
12df0 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
12e00 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
12e10 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
12e20 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  m index */.){.  
12e30 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
12e40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
12e50 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
12e60 61 73 68 57 72 69 74 65 28 0a 20 20 20 20 20 20  ashWrite(.      
12e70 20 20 70 2d 3e 61 70 48 61 73 68 5b 69 49 64 78    p->apHash[iIdx
12e80 5d 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  ], p->iWriteRowi
12e90 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70  d, iCol, iPos, p
12ea0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20  Token, nToken.  
12eb0 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a    );.  }.}../*.*
12ec0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
12ed0 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20   segment-id for 
12ee0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 53  the structure pS
12ef0 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  truct..**.** If 
12f00 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
12f10 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
12f20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
12f30 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a  a no-op. 0 is .*
12f40 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  * returned in th
12f50 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
12f60 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63  ic int fts5Alloc
12f70 61 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64  ateSegid(Fts5Ind
12f80 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
12f90 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
12fa0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
12fb0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
12fc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 66  ) return 0;..  f
12fd0 6f 72 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20 69  or(i=0; i<100; i
12fe0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  ++){.    int iSe
12ff0 67 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  gid;.    sqlite3
13000 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
13010 6f 66 28 69 6e 74 29 2c 20 28 76 6f 69 64 2a 29  of(int), (void*)
13020 26 69 53 65 67 69 64 29 3b 0a 20 20 20 20 69 53  &iSegid);.    iS
13030 65 67 69 64 20 3d 20 69 53 65 67 69 64 20 26 20  egid = iSegid & 
13040 28 28 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  ((1 << FTS5_DATA
13050 5f 49 44 5f 42 29 2d 31 29 3b 0a 20 20 20 20 69  _ID_B)-1);.    i
13060 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20  f( iSegid ){.   
13070 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65     int iLvl, iSe
13080 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76  g;.      for(iLv
13090 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
130a0 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
130b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +){.        for(
130c0 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74  iSeg=0; iSeg<pSt
130d0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
130e0 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l].nSeg; iSeg++)
130f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13100 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74 2d  iSegid==pStruct-
13110 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
13120 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20  eg[iSeg].iSegid 
13130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
13140 53 65 67 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Segid = 0;.     
13150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13170 20 20 20 69 66 28 20 69 53 65 67 69 64 20 29 20     if( iSegid ) 
13180 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 20  return iSegid;. 
13190 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51   }..  p->rc = SQ
131a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72 65  LITE_ERROR;.  re
131b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
131c0 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74   Discard all dat
131d0 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68  a currently cach
131e0 65 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74  ed in the hash-t
131f0 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
13200 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44   void fts5IndexD
13210 69 73 63 61 72 64 44 61 74 61 28 46 74 73 35 49  iscardData(Fts5I
13220 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65  ndex *p){.  asse
13230 72 74 28 20 70 2d 3e 61 70 48 61 73 68 20 7c 7c  rt( p->apHash ||
13240 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
13250 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
13260 61 70 48 61 73 68 20 29 7b 0a 20 20 20 20 46 74  apHash ){.    Ft
13270 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
13280 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
13290 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
132a0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66  or(i=0; i<=pConf
132b0 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b  ig->nPrefix; i++
132c0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
132d0 61 70 48 61 73 68 5b 69 5d 20 29 20 73 71 6c 69  apHash[i] ) sqli
132e0 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72  te3Fts5HashClear
132f0 28 70 2d 3e 61 70 48 61 73 68 5b 69 5d 29 3b 0a  (p->apHash[i]);.
13300 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 50 65      }.    p->nPe
13310 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
13320 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
13330 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
13340 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79  he prefix, in by
13350 74 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72  tes, that buffer
13360 20 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61   (nNew/pNew) sha
13370 72 65 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66  res.** with buff
13380 65 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a  er (nOld/pOld)..
13390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
133a0 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
133b0 28 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f  (.  int nOld, co
133c0 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20  nst u8 *pOld,.  
133d0 69 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20  int nNew, const 
133e0 75 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e  u8 *pNew.){.  in
133f0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
13400 69 3c 6e 4e 65 77 20 26 26 20 69 3c 6e 4f 6c 64  i<nNew && i<nOld
13410 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13420 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d  pOld[i]!=pNew[i]
13430 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
13440 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
13450 2a 2a 20 49 66 20 61 6e 20 22 6e 45 6d 70 74 79  ** If an "nEmpty
13460 22 20 72 65 63 6f 72 64 20 6d 75 73 74 20 62 65  " record must be
13470 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
13480 62 2d 74 72 65 65 20 62 65 66 6f 72 65 20 74 68  b-tree before th
13490 65 20 6e 65 78 74 0a 2a 2a 20 74 65 72 6d 2c 20  e next.** term, 
134a0 77 72 69 74 65 20 69 74 20 6e 6f 77 2e 0a 2a 2f  write it now..*/
134b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
134c0 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74  5WriteBtreeNEmpt
134d0 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  y(Fts5Index *p, 
134e0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
134f0 57 72 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70  Writer){.  if( p
13500 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 29  Writer->nEmpty )
13510 7b 0a 20 20 20 20 69 6e 74 20 62 46 6c 61 67 20  {.    int bFlag 
13520 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 50 61 67  = 0;.    Fts5Pag
13530 65 57 72 69 74 65 72 20 2a 70 50 67 3b 0a 20 20  eWriter *pPg;.  
13540 20 20 70 50 67 20 3d 20 26 70 57 72 69 74 65 72    pPg = &pWriter
13550 2d 3e 61 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20  ->aWriter[1];.  
13560 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
13570 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f  Empty>=FTS5_MIN_
13580 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20  DLIDX_SIZE ){.  
13590 20 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20 46      i64 iKey = F
135a0 54 53 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f  TS5_DOCLIST_IDX_
135b0 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20  ROWID(.         
135c0 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20   pWriter->iIdx, 
135d0 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c  pWriter->iSegid,
135e0 20 0a 20 20 20 20 20 20 20 20 20 20 70 57 72 69   .          pWri
135f0 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e  ter->aWriter[0].
13600 70 67 6e 6f 20 2d 20 31 20 2d 20 70 57 72 69 74  pgno - 1 - pWrit
13610 65 72 2d 3e 6e 45 6d 70 74 79 0a 20 20 20 20 20  er->nEmpty.     
13620 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
13630 28 20 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78  ( pWriter->dlidx
13640 2e 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 74  .n>0 );.      ft
13650 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69  s5DataWrite(p, i
13660 4b 65 79 2c 20 70 57 72 69 74 65 72 2d 3e 64 6c  Key, pWriter->dl
13670 69 64 78 2e 70 2c 20 70 57 72 69 74 65 72 2d 3e  idx.p, pWriter->
13680 64 6c 69 64 78 2e 6e 29 3b 0a 20 20 20 20 20 20  dlidx.n);.      
13690 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d  bFlag = 1;.    }
136a0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
136b0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
136c0 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 62  rc, &pPg->buf, b
136d0 46 6c 61 67 29 3b 0a 20 20 20 20 66 74 73 35 42  Flag);.    fts5B
136e0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
136f0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e  t(&p->rc, &pPg->
13700 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e 6e 45  buf, pWriter->nE
13710 6d 70 74 79 29 3b 0a 20 20 20 20 70 57 72 69 74  mpty);.    pWrit
13720 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a  er->nEmpty = 0;.
13730 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65    }..  /* Whethe
13740 72 20 6f 72 20 6e 6f 74 20 69 74 20 77 61 73 20  r or not it was 
13750 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2c  written to disk,
13760 20 7a 65 72 6f 20 74 68 65 20 64 6f 63 6c 69 73   zero the doclis
13770 74 20 69 6e 64 65 78 20 61 74 20 74 68 69 73 0a  t index at this.
13780 20 20 2a 2a 20 70 6f 69 6e 74 20 2a 2f 0a 20 20    ** point */.  
13790 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
137a0 72 5a 65 72 6f 28 26 70 57 72 69 74 65 72 2d 3e  rZero(&pWriter->
137b0 64 6c 69 64 78 29 3b 0a 20 20 70 57 72 69 74 65  dlidx);.  pWrite
137c0 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c  r->bDlidxPrevVal
137d0 69 64 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  id = 0;.}..stati
137e0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
137f0 42 74 72 65 65 47 72 6f 77 28 46 74 73 35 49 6e  BtreeGrow(Fts5In
13800 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
13810 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
13820 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
13830 72 20 2a 61 4e 65 77 3b 0a 20 20 46 74 73 35 50  r *aNew;.  Fts5P
13840 61 67 65 57 72 69 74 65 72 20 2a 70 4e 65 77 3b  ageWriter *pNew;
13850 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 73 69  .  int nNew = si
13860 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69  zeof(Fts5PageWri
13870 74 65 72 29 20 2a 20 28 70 57 72 69 74 65 72 2d  ter) * (pWriter-
13880 3e 6e 57 72 69 74 65 72 2b 31 29 3b 0a 0a 20 20  >nWriter+1);..  
13890 61 4e 65 77 20 3d 20 28 46 74 73 35 50 61 67 65  aNew = (Fts5Page
138a0 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f  Writer*)sqlite3_
138b0 72 65 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d  realloc(pWriter-
138c0 3e 61 57 72 69 74 65 72 2c 20 6e 4e 65 77 29 3b  >aWriter, nNew);
138d0 0a 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29  .  if( aNew==0 )
138e0 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 4e 65 77   return;..  pNew
138f0 20 3d 20 26 61 4e 65 77 5b 70 57 72 69 74 65 72   = &aNew[pWriter
13900 2d 3e 6e 57 72 69 74 65 72 5d 3b 0a 20 20 6d 65  ->nWriter];.  me
13910 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69  mset(pNew, 0, si
13920 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69  zeof(Fts5PageWri
13930 74 65 72 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  ter));.  pNew->p
13940 67 6e 6f 20 3d 20 31 3b 0a 20 20 66 74 73 35 42  gno = 1;.  fts5B
13950 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
13960 74 28 26 70 2d 3e 72 63 2c 20 26 70 4e 65 77 2d  t(&p->rc, &pNew-
13970 3e 62 75 66 2c 20 31 29 3b 0a 0a 20 20 70 57 72  >buf, 1);..  pWr
13980 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 2b 2b 3b  iter->nWriter++;
13990 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69  .  pWriter->aWri
139a0 74 65 72 20 3d 20 61 4e 65 77 3b 0a 7d 0a 0a 2f  ter = aNew;.}../
139b0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
139c0 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
139d0 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65  h leaf page exce
139e0 70 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61  pt the first tha
139f0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74  t contains.** at
13a00 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
13a10 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d   Argument (nTerm
13a20 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73  /pTerm) is the s
13a30 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72  plit-key - a ter
13a40 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  m that.** is lar
13a50 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72  ger than all ter
13a60 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61  ms written to ea
13a70 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e  rlier leaves, an
13a80 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a  d equal to or.**
13a90 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
13aa0 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
13ab0 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a  the new leaf..**
13ac0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
13ad0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
13ae0 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
13af0 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
13b00 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61  f an error.** ha
13b10 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
13b20 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
13b30 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
13b40 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
13b50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
13b60 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72  ts5WriteBtreeTer
13b70 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
13b80 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13b90 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
13ba0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
13bb0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
13bc0 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
13bd0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
13be0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  t */.  int nTerm
13bf0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
13c00 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  m      /* First 
13c10 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65  term on new page
13c20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65   */.){.  int iHe
13c30 69 67 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69  ight;.  for(iHei
13c40 67 68 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68  ght=1; 1; iHeigh
13c50 74 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61  t++){.    Fts5Pa
13c60 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b  geWriter *pPage;
13c70 0a 0a 20 20 20 20 69 66 28 20 69 48 65 69 67 68  ..    if( iHeigh
13c80 74 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69  t>=pWriter->nWri
13c90 74 65 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ter ){.      fts
13ca0 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28  5WriteBtreeGrow(
13cb0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
13cc0 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
13cd0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
13ce0 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
13cf0 72 2d 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67  r->aWriter[iHeig
13d00 68 74 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  ht];..    fts5Wr
13d10 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70  iteBtreeNEmpty(p
13d20 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20  , pWriter);..   
13d30 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
13d40 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
13d50 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  gsz ){.      /* 
13d60 70 50 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72  pPage will be wr
13d70 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54  itten to disk. T
13d80 68 65 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20  he term will be 
13d90 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
13da0 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74  .      ** parent
13db0 20 6f 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20   of pPage.  */. 
13dc0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
13dd0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
13de0 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20  OWID(.          
13df0 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70  pWriter->iIdx, p
13e00 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
13e10 69 48 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e  iHeight, pPage->
13e20 70 67 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20  pgno.      );.  
13e30 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
13e40 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61  e(p, iRowid, pPa
13e50 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65  ge->buf.p, pPage
13e60 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  ->buf.n);.      
13e70 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
13e80 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20  pPage->buf);.   
13e90 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
13ea0 6f 28 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b  o(&pPage->term);
13eb0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
13ec0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
13ed0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
13ee0 66 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e  f, pPage[-1].pgn
13ef0 6f 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  o);.      pPage-
13f00 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >pgno++;.    }el
13f10 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50  se{.      int nP
13f20 72 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  re = fts5PrefixC
13f30 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74  ompress(pPage->t
13f40 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65  erm.n, pPage->te
13f50 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65  rm.p, nTerm, pTe
13f60 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  rm);.      fts5B
13f70 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
13f80 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
13f90 2d 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a  ->buf, nPre+2);.
13fa0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
13fb0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
13fc0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
13fd0 2c 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20  , nTerm-nPre);. 
13fe0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
13ff0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
14000 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
14010 54 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d  Term-nPre, pTerm
14020 2b 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74  +nPre);.      ft
14030 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
14040 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d  rc, &pPage->term
14050 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
14060 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14070 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
14080 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
14090 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46  BtreeNoTerm(.  F
140a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
140b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
140c0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
140d0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
140e0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
140f0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r          /* Wr
14100 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  iter object */.)
14110 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  {.  if( pWriter-
14120 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
14130 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  ge ){.    /* No 
14140 72 6f 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70  rowids on this p
14150 61 67 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30  age. Append an 0
14160 78 30 30 20 62 79 74 65 20 74 6f 20 74 68 65 20  x00 byte to the 
14170 63 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20  current .    ** 
14180 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f  doclist-index */
14190 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
141a0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
141b0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  nt(&p->rc, &pWri
141c0 74 65 72 2d 3e 64 6c 69 64 78 2c 20 30 29 3b 0a  ter->dlidx, 0);.
141d0 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e    }.  pWriter->n
141e0 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  Empty++;.}../*.*
141f0 2a 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68  * Rowid iRowid h
14200 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70  as just been app
14210 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72  ended to the cur
14220 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20  rent leaf page. 
14230 41 73 20 69 74 20 69 73 0a 2a 2a 20 74 68 65 20  As it is.** the 
14240 66 69 72 73 74 20 6f 6e 20 69 74 73 20 70 61 67  first on its pag
14250 65 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 6e 74  e, append an ent
14260 72 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ry to the curren
14270 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  t doclist-index.
14280 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14290 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
142a0 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65  pend(.  Fts5Inde
142b0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
142c0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
142d0 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29   .  i64 iRowid.)
142e0 7b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20  {.  i64 iVal;.  
142f0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 44 6c  if( pWriter->bDl
14300 69 64 78 50 72 65 76 56 61 6c 69 64 20 29 7b 0a  idxPrevValid ){.
14310 20 20 20 20 69 56 61 6c 20 3d 20 70 57 72 69 74      iVal = pWrit
14320 65 72 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 2d  er->iDlidxPrev -
14330 20 69 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65   iRowid;.  }else
14340 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f  {.    iVal = iRo
14350 77 69 64 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  wid;.  }.  sqlit
14360 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
14370 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
14380 20 26 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78   &pWriter->dlidx
14390 2c 20 69 56 61 6c 29 3b 0a 20 20 70 57 72 69 74  , iVal);.  pWrit
143a0 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61  er->bDlidxPrevVa
143b0 6c 69 64 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  lid = 1;.  pWrit
143c0 65 72 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 3d  er->iDlidxPrev =
143d0 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61 74   iRowid;.}..stat
143e0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
143f0 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49  eFlushLeaf(Fts5I
14400 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
14410 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
14420 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
14430 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30   u8 zero[] = { 0
14440 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
14450 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50   0x00 };.  Fts5P
14460 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
14470 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
14480 69 74 65 72 5b 30 5d 3b 0a 20 20 69 36 34 20 69  iter[0];.  i64 i
14490 52 6f 77 69 64 3b 0a 0a 20 20 69 66 28 20 70 50  Rowid;..  if( pP
144a0 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29  age->term.n==0 )
144b0 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d  {.    /* No term
144c0 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20   was written to 
144d0 74 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20  this page. */.  
144e0 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73    assert( 0==fts
144f0 35 47 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e  5GetU16(&pPage->
14500 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20  buf.p[2]) );.   
14510 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
14520 6f 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72  oTerm(p, pWriter
14530 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  );.  }..  /* Wri
14540 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  te the current p
14550 61 67 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a  age to the db. *
14560 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53  /.  iRowid = FTS
14570 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
14580 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70  pWriter->iIdx, p
14590 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
145a0 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  0, pPage->pgno);
145b0 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
145c0 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67  (p, iRowid, pPag
145d0 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
145e0 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49  >buf.n);..  /* I
145f0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65  nitialize the ne
14600 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  xt page. */.  ft
14610 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
14620 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73  age->buf);.  fts
14630 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
14640 67 65 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73  ge->term);.  fts
14650 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
14660 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
14670 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b  ->buf, 4, zero);
14680 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b  .  pPage->pgno++
14690 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65  ;..  /* Increase
146a0 20 74 68 65 20 6c 65 61 76 65 73 20 77 72 69 74   the leaves writ
146b0 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ten counter */. 
146c0 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57   pWriter->nLeafW
146d0 72 69 74 74 65 6e 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ritten++;.}../*.
146e0 2a 2a 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70  ** Append term p
146f0 54 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68  Term/nTerm to th
14700 65 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20  e segment being 
14710 77 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 77  written by the w
14720 72 69 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20  riter passed.** 
14730 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
14740 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
14750 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
14760 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
14770 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
14780 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
14790 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
147a0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
147b0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
147c0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
147d0 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
147e0 64 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  dTerm(.  Fts5Ind
147f0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
14800 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
14810 2c 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63  ,.  int nTerm, c
14820 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a  onst u8 *pTerm .
14830 29 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78  ){.  int nPrefix
14840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14850 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
14860 20 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73   prefix compress
14870 69 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a  ion for term */.
14880 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
14890 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
148a0 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a  er->aWriter[0];.
148b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
148c0 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 62 75  ==0 || pPage->bu
148d0 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  f.n==0 || pPage-
148e0 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20 20 69 66  >buf.n>4 );.  if
148f0 28 20 70 50 61 67 65 20 26 26 20 70 50 61 67 65  ( pPage && pPage
14900 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20  ->buf.n==0 ){.  
14910 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 66 69    /* Zero the fi
14920 72 73 74 20 74 65 72 6d 20 61 6e 64 20 66 69 72  rst term and fir
14930 73 74 20 64 6f 63 69 64 20 66 69 65 6c 64 73 20  st docid fields 
14940 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
14950 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20  nst u8 zero[] = 
14960 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  { 0x00, 0x00, 0x
14970 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 20 20  00, 0x00 };.    
14980 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
14990 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
149a0 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
149b0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
149c0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30  pPage->term.n==0
149d0 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   );.  }.  if( p-
149e0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
149f0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65  .  if( pPage->te
14a00 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  rm.n==0 ){.    /
14a10 2a 20 55 70 64 61 74 65 20 74 68 65 20 22 66 69  * Update the "fi
14a20 72 73 74 20 74 65 72 6d 22 20 66 69 65 6c 64 20  rst term" field 
14a30 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64  of the page head
14a40 65 72 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  er. */.    asser
14a50 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  t( pPage->buf.p[
14a60 32 5d 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  2]==0 && pPage->
14a70 62 75 66 2e 70 5b 33 5d 3d 3d 30 20 29 3b 0a 20  buf.p[3]==0 );. 
14a80 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70     fts5PutU16(&p
14a90 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20  Page->buf.p[2], 
14aa0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
14ab0 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a     nPrefix = 0;.
14ac0 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
14ad0 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f  >aWriter[0].pgno
14ae0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73  !=1 ){.      fts
14af0 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
14b00 70 2c 20 70 57 72 69 74 65 72 2c 20 6e 54 65 72  p, pWriter, nTer
14b10 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
14b20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
14b30 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20  r->aWriter[0];. 
14b40 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
14b50 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35    nPrefix = fts5
14b60 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a  PrefixCompress(.
14b70 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 74          pPage->t
14b80 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65  erm.n, pPage->te
14b90 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65  rm.p, nTerm, pTe
14ba0 72 6d 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 74  rm.    );.    ft
14bb0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
14bc0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
14bd0 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69  age->buf, nPrefi
14be0 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70  x);.  }..  /* Ap
14bf0 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20  pend the number 
14c00 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20  of bytes of new 
14c10 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74  data, then the t
14c20 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a  erm data itself.
14c30 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
14c40 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
14c50 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
14c60 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
14c70 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
14c80 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  ix);.  fts5Buffe
14c90 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
14ca0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
14cb0 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
14cc0 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78  , &pTerm[nPrefix
14cd0 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  ]);..  /* Update
14ce0 20 74 68 65 20 46 74 73 35 50 61 67 65 57 72 69   the Fts5PageWri
14cf0 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20  ter.term field. 
14d00 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  */.  fts5BufferS
14d10 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  et(&p->rc, &pPag
14d20 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  e->term, nTerm, 
14d30 70 54 65 72 6d 29 3b 0a 0a 20 20 70 57 72 69 74  pTerm);..  pWrit
14d40 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
14d50 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72  nPage = 0;.  pWr
14d60 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
14d70 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a  dInDoclist = 1;.
14d80 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
14d90 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69  rent leaf page i
14da0 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74  s full, flush it
14db0 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69   to disk. */.  i
14dc0 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
14dd0 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
14de0 7a 20 29 7b 0a 20 20 20 20 66 74 73 35 57 72 69  z ){.    fts5Wri
14df0 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
14e00 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 57 72  Writer);.    pWr
14e10 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
14e20 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 7d  dInPage = 1;.  }
14e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
14e40 20 61 20 64 6f 63 69 64 20 74 6f 20 74 68 65 20   a docid to the 
14e50 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
14e60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14e70 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
14e80 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
14e90 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
14ea0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
14eb0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
14ec0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
14ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
14ee0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
14ef0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
14f00 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20  >aWriter[0];..  
14f10 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
14f20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
14f30 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
14f40 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
14f50 68 65 20 0a 20 20 20 20 2a 2a 20 64 6f 63 69 64  he .    ** docid
14f60 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
14f70 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
14f80 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
14f90 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
14fa0 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20    ** buffer, in 
14fb0 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  case a doclist-i
14fc0 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64  ndex is required
14fd0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  .  */.    if( pW
14fe0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
14ff0 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
15000 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61    fts5PutU16(pPa
15010 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65  ge->buf.p, pPage
15020 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  ->buf.n);.      
15030 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70  fts5WriteDlidxAp
15040 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c  pend(p, pWriter,
15050 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a   iRowid);.    }.
15060 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
15070 65 20 64 6f 63 69 64 2e 20 2a 2f 0a 20 20 20 20  e docid. */.    
15080 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
15090 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
150a0 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46  t || pWriter->bF
150b0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
150c0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  ){.      fts5Buf
150d0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
150e0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
150f0 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  buf, iRowid);.  
15100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
15110 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
15120 69 52 6f 77 69 64 3c 70 57 72 69 74 65 72 2d 3e  iRowid<pWriter->
15130 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20  iPrevRowid );.  
15140 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
15150 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
15160 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
15170 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
15180 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20  wid - iRowid);. 
15190 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72     }.    pWriter
151a0 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69  ->iPrevRowid = i
151b0 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74  Rowid;.    pWrit
151c0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
151d0 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20  nDoclist = 0;.  
151e0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
151f0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
15200 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ;..    if( pPage
15210 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e  ->buf.n>=p->pCon
15220 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
15230 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
15240 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
15250 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  );.      pWriter
15260 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
15270 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  age = 1;.    }. 
15280 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
15290 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
152a0 64 50 6f 73 6c 69 73 74 49 6e 74 28 0a 20 20 46  dPoslistInt(.  F
152b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
152c0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
152d0 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 69 56  Writer,.  int iV
152e0 61 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  al.){.  if( p->r
152f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15300 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
15310 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
15320 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
15330 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
15340 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
15350 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
15360 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 69 66 28  , iVal);.    if(
15370 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70   pPage->buf.n>=p
15380 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
15390 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
153a0 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
153b0 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Writer);.      p
153c0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
153d0 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  widInPage = 1;. 
153e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
153f0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
15400 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61  eAppendPoslistDa
15410 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ta(.  Fts5Index 
15420 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
15430 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
15440 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74    const u8 *aDat
15450 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a  a, .  int nData.
15460 29 7b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  ){.  Fts5PageWri
15470 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
15480 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
15490 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ];.  const u8 *a
154a0 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20   = aData;.  int 
154b0 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20  n = nData;.  .  
154c0 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
154d0 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20  ig->pgsz>0 );.  
154e0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
154f0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67  LITE_OK && (pPag
15500 65 2d 3e 62 75 66 2e 6e 20 2b 20 6e 29 3e 3d 70  e->buf.n + n)>=p
15510 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
15520 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20  ){.    int nReq 
15530 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
15540 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e  sz - pPage->buf.
15550 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  n;.    int nCopy
15560 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
15570 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20   nCopy<nReq ){. 
15580 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a       i64 dummy;.
15590 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 67        nCopy += g
155a0 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70  etVarint(&a[nCop
155b0 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d 79  y], (u64*)&dummy
155c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
155d0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
155e0 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
155f0 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29  ->buf, nCopy, a)
15600 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79  ;.    a += nCopy
15610 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79  ;.    n -= nCopy
15620 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46  ;.    fts5WriteF
15630 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
15640 74 65 72 29 3b 0a 20 20 20 20 70 57 72 69 74 65  ter);.    pWrite
15650 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
15660 50 61 67 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Page = 1;.  }.  
15670 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66  if( n>0 ){.    f
15680 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
15690 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
156a0 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a  ge->buf, n, a);.
156b0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
156c0 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
156d0 6e 64 5a 65 72 6f 62 79 74 65 28 46 74 73 35 49  ndZerobyte(Fts5I
156e0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
156f0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
15700 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  {.  fts5BufferAp
15710 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
15720 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72  c, &pWriter->aWr
15730 69 74 65 72 5b 30 5d 2e 62 75 66 2c 20 30 29 3b  iter[0].buf, 0);
15740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
15750 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64 20  any data cached 
15760 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f 62  by the writer ob
15770 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74 61  ject to the data
15780 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a  base. Free any.*
15790 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  * allocations as
157a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
157b0 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61  e writer..*/.sta
157c0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
157d0 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35  teFinish(.  Fts5
157e0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
157f0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
15800 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
15810 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
15820 0a 20 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  .  int *pnHeight
15830 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15840 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68     /* OUT: Heigh
15850 74 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  t of the b-tree 
15860 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66  */.  int *pnLeaf
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15880 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
15890 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
158a0 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29  s in b-tree */.)
158b0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
158c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
158d0 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 4c 65 61 66  K ){.    *pnLeaf
158e0 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69   = pWriter->aWri
158f0 74 65 72 5b 30 5d 2e 70 67 6e 6f 3b 0a 20 20 20  ter[0].pgno;.   
15900 20 69 66 28 20 2a 70 6e 4c 65 61 66 3d 3d 31 20   if( *pnLeaf==1 
15910 26 26 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69  && pWriter->aWri
15920 74 65 72 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 20  ter[0].buf.n==0 
15930 29 7b 0a 20 20 20 20 20 20 2a 70 6e 4c 65 61 66  ){.      *pnLeaf
15940 20 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 6e 48   = 0;.      *pnH
15950 65 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 7d  eight = 0;.    }
15960 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
15970 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
15980 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
15990 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
159a0 57 72 69 74 65 72 3d 3d 31 20 26 26 20 70 57 72  Writer==1 && pWr
159b0 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54  iter->nEmpty>=FT
159c0 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
159d0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  E ){.        fts
159e0 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28  5WriteBtreeGrow(
159f0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
15a00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
15a10 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3e  Writer->nWriter>
15a20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  1 ){.        fts
15a30 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74  5WriteBtreeNEmpt
15a40 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  y(p, pWriter);. 
15a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 6e       }.      *pn
15a60 48 65 69 67 68 74 20 3d 20 70 57 72 69 74 65 72  Height = pWriter
15a70 2d 3e 6e 57 72 69 74 65 72 3b 0a 0a 20 20 20 20  ->nWriter;..    
15a80 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 57 72    for(i=1; i<pWr
15a90 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69  iter->nWriter; i
15aa0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73  ++){.        Fts
15ab0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 67  5PageWriter *pPg
15ac0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
15ad0 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 20  iter[i];.       
15ae0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
15af0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  , .            F
15b00 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
15b10 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c  D(pWriter->iIdx,
15b20 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
15b30 2c 20 69 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 2c  , i, pPg->pgno),
15b40 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50   .            pP
15b50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62  g->buf.p, pPg->b
15b60 75 66 2e 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a  uf.n.        );.
15b70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15b80 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
15b90 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b  Writer->nWriter;
15ba0 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50   i++){.    Fts5P
15bb0 61 67 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d  ageWriter *pPg =
15bc0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
15bd0 65 72 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  er[i];.    asser
15be0 74 28 20 70 50 67 20 7c 7c 20 70 2d 3e 72 63 21  t( pPg || p->rc!
15bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
15c00 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
15c10 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
15c20 65 28 26 70 50 67 2d 3e 74 65 72 6d 29 3b 0a 20  e(&pPg->term);. 
15c30 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46       fts5BufferF
15c40 72 65 65 28 26 70 50 67 2d 3e 62 75 66 29 3b 0a  ree(&pPg->buf);.
15c50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
15c60 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
15c70 2d 3e 61 57 72 69 74 65 72 29 3b 0a 20 20 73 71  ->aWriter);.  sq
15c80 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46  lite3Fts5BufferF
15c90 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 64 6c  ree(&pWriter->dl
15ca0 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  idx);.}..static 
15cb0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e  void fts5WriteIn
15cc0 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
15cd0 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
15ce0 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
15cf0 20 20 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20    int iIdx, int 
15d00 69 53 65 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73  iSegid.){.  mems
15d10 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73  et(pWriter, 0, s
15d20 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
15d30 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72  ter));.  pWriter
15d40 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20  ->iIdx = iIdx;. 
15d50 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
15d60 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 70 57   = iSegid;..  pW
15d70 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d  riter->aWriter =
15d80 20 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72   (Fts5PageWriter
15d90 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
15da0 70 2c 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67  p,sizeof(Fts5Pag
15db0 65 57 72 69 74 65 72 29 29 3b 0a 20 20 69 66 28  eWriter));.  if(
15dc0 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
15dd0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
15de0 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65   pWriter->nWrite
15df0 72 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  r = 1;.  pWriter
15e00 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e  ->aWriter[0].pgn
15e10 6f 20 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63  o = 1;.}..static
15e20 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49   void fts5WriteI
15e30 6e 69 74 46 6f 72 41 70 70 65 6e 64 28 0a 20 20  nitForAppend(.  
15e40 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
15e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e60 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
15e70 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
15e80 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
15e90 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er,         /* W
15ea0 72 69 74 65 72 20 74 6f 20 69 6e 69 74 69 61 6c  riter to initial
15eb0 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ize */.  int iId
15ec0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
15ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15ee0 78 20 73 65 67 6d 65 6e 74 20 69 73 20 61 20 70  x segment is a p
15ef0 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35  art of */.  Fts5
15f00 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
15f10 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53   *pSeg      /* S
15f20 65 67 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f  egment object to
15f30 20 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b   append to */.){
15f40 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70  .  int nByte = p
15f50 53 65 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73  Seg->nHeight * s
15f60 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72  izeof(Fts5PageWr
15f70 69 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28  iter);.  memset(
15f80 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  pWriter, 0, size
15f90 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
15fa0 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  ));.  pWriter->i
15fb0 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57  Idx = iIdx;.  pW
15fc0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  riter->iSegid = 
15fd0 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
15fe0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
15ff0 20 3d 20 28 46 74 73 35 50 61 67 65 57 72 69 74   = (Fts5PageWrit
16000 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
16010 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70  c(p, nByte);.  p
16020 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20  Writer->nWriter 
16030 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3b  = pSeg->nHeight;
16040 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
16050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16060 69 6e 74 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  int pgno = 1;.  
16070 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 57 72    int i;.    pWr
16080 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
16090 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67  .pgno = pSeg->pg
160a0 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 66 6f  noLast+1;.    fo
160b0 72 28 69 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68  r(i=pSeg->nHeigh
160c0 74 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  t-1; i>0; i--){.
160d0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
160e0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
160f0 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
16100 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  Idx, pWriter->iS
16110 65 67 69 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a  egid, i, pgno);.
16120 20 20 20 20 20 20 46 74 73 35 50 61 67 65 57 72        Fts5PageWr
16130 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72  iter *pPg = &pWr
16140 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d  iter->aWriter[i]
16150 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  ;.      pPg->pgn
16160 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  o = pgno;.      
16170 66 74 73 35 44 61 74 61 42 75 66 66 65 72 28 70  fts5DataBuffer(p
16180 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f  , &pPg->buf, iRo
16190 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
161a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
161b0 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35   ){.        Fts5
161c0 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20  NodeIter ss;.   
161d0 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65       fts5NodeIte
161e0 72 49 6e 69 74 28 70 50 67 2d 3e 62 75 66 2e 70  rInit(pPg->buf.p
161f0 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73  , pPg->buf.n, &s
16200 73 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  s);.        whil
16210 65 28 20 73 73 2e 61 44 61 74 61 20 29 20 66 74  e( ss.aData ) ft
16220 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
16230 70 2d 3e 72 63 2c 20 26 73 73 29 3b 0a 20 20 20  p->rc, &ss);.   
16240 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
16250 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d  et(&p->rc, &pPg-
16260 3e 74 65 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e  >term, ss.term.n
16270 2c 20 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20  , ss.term.p);.  
16280 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e        pgno = ss.
16290 69 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20  iChild;.        
162a0 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65  fts5NodeIterFree
162b0 28 26 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (&ss);.      }. 
162c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 65     }.    if( pSe
162d0 67 2d 3e 6e 48 65 69 67 68 74 3d 3d 31 20 29 7b  g->nHeight==1 ){
162e0 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
162f0 6e 45 6d 70 74 79 20 3d 20 70 53 65 67 2d 3e 70  nEmpty = pSeg->p
16300 67 6e 6f 4c 61 73 74 2d 31 3b 0a 20 20 20 20 7d  gnoLast-1;.    }
16310 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 67  .    assert( (pg
16320 6e 6f 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  no+pWriter->nEmp
16330 74 79 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  ty)==pSeg->pgnoL
16340 61 73 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ast );.  }.}../*
16350 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
16360 65 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69  er was used to i
16370 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
16380 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  he input segment
16390 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e  s of on an.** in
163a0 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20  cremental merge 
163b0 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
163c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
163d0 65 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d  ed if the increm
163e0 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73  ental.** merge s
163f0 74 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64  tep has finished
16400 20 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68   but the input h
16410 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70  as not been comp
16420 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64  letely exhausted
16430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16440 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
16450 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
16460 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
16470 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
16480 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i;.  Fts5Buffer 
16490 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
164a0 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
164b0 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f  s5Buffer));.  fo
164c0 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
164d0 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
164e0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
164f0 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
16500 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65  [i];.    if( pSe
16510 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20  g->pSeg==0 ){.  
16520 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
16530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53      }else if( pS
16540 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  eg->pLeaf==0 ){.
16550 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
16560 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a  ->pgnoLast = 0;.
16570 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
16580 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b  ->pgnoFirst = 0;
16590 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
165a0 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65    int iOff = pSe
165b0 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  g->iTermLeafOffs
165c0 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  et;     /* Offse
165d0 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c  t on new first l
165e0 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
165f0 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64    i64 iLeafRowid
16600 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61  ;.      Fts5Data
16610 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69   *pData;.      i
16620 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70  nt iId = pSeg->p
16630 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
16640 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20     u8 aHdr[4] = 
16650 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30  {0x00, 0x00, 0x0
16660 30 2c 20 30 78 30 34 7d 3b 0a 0a 20 20 20 20 20  0, 0x04};..     
16670 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54   iLeafRowid = FT
16680 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
16690 28 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64  (pSeg->iIdx, iId
166a0 2c 20 30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d  , 0, pSeg->iTerm
166b0 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
166c0 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
166d0 61 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f  aRead(p, iLeafRo
166e0 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
166f0 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
16700 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
16710 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66  &buf);.        f
16720 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
16730 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
16740 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20  , sizeof(aHdr), 
16750 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66  aHdr);.        f
16760 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
16770 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
16780 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
16790 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
167a0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
167b0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
167c0 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67  eg->term.n, pSeg
167d0 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20  ->term.p);.     
167e0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
167f0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
16800 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 20 2d  &buf, pData->n -
16810 20 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70   iOff, &pData->p
16820 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20  [iOff]);.       
16830 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
16840 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  (pData);.       
16850 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
16860 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69  oFirst = pSeg->i
16870 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  TermLeafPgno;.  
16880 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65        fts5DataDe
16890 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47  lete(p, FTS5_SEG
168a0 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
168b0 3e 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 31  >iIdx, iId, 0, 1
168c0 29 2c 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  ),iLeafRowid);. 
168d0 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57         fts5DataW
168e0 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77  rite(p, iLeafRow
168f0 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e  id, buf.p, buf.n
16900 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16910 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
16920 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a  rFree(&buf);.}..
16930 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
16940 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65  void fts5IndexMe
16950 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35  rgeLevel(.  Fts5
16960 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
16970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16980 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
16990 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
169a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
169b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
169c0 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20   to work on */. 
169d0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
169e0 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
169f0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63   /* IN/OUT: Stuc
16a00 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 69 49  ture of index iI
16a10 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  dx */.  int iLvl
16a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16a30 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
16a40 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66   to read input f
16a50 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rom */.  int *pn
16a60 52 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Rem             
16a70 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
16a80 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e  e up to this man
16a90 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20  y output leaves 
16aa0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
16ab0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
16ac0 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74   *ppStruct;.  Ft
16ad0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
16ae0 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
16af0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
16b00 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
16b10 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a  Level *pLvlOut;.
16b20 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
16b30 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20  er *pIter = 0;  
16b40 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
16b50 20 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61   read input data
16b60 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d   */.  int nRem =
16b70 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20   pnRem ? *pnRem 
16b80 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20  : 0;  /* Output 
16b90 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20  leaf pages left 
16ba0 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e  to write */.  in
16bb0 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20  t nInput;       
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16bd0 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
16be0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46   segments */.  F
16bf0 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
16c00 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
16c10 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
16c20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
16c30 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
16c40 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73       /* Output s
16c50 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
16c60 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69  Buffer term;.  i
16c70 6e 74 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69  nt bRequireDocli
16c80 73 74 54 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f  stTerm = 0;    /
16c90 2a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e  * Doclist termin
16ca0 61 74 6f 72 20 28 30 78 30 30 29 20 72 65 71 75  ator (0x00) requ
16cb0 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 4f  ired */.  int bO
16cc0 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  ldest;          
16cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
16ce0 65 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  e if the output 
16cf0 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f  segment is the o
16d00 6c 64 65 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ldest */..  asse
16d10 72 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  rt( iLvl<pStruct
16d20 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73  ->nLevel );.  as
16d30 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72  sert( pLvl->nMer
16d40 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29  ge<=pLvl->nSeg )
16d50 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69  ;..  memset(&wri
16d60 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
16d70 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a  ts5SegWriter));.
16d80 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
16d90 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
16da0 66 66 65 72 29 29 3b 0a 20 20 77 72 69 74 65 72  ffer));.  writer
16db0 2e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20  .iIdx = iIdx;.  
16dc0 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
16dd0 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20   ){.    pLvlOut 
16de0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
16df0 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20  el[iLvl+1];.    
16e00 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d  assert( pLvlOut-
16e10 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e  >nSeg>0 );.    n
16e20 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d  Input = pLvl->nM
16e30 65 72 67 65 3b 0a 20 20 20 20 66 74 73 35 57 72  erge;.    fts5Wr
16e40 69 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64  iteInitForAppend
16e50 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64  (p, &writer, iId
16e60 78 2c 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65  x, &pLvlOut->aSe
16e70 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d  g[pLvlOut->nSeg-
16e80 31 5d 29 3b 0a 20 20 20 20 70 53 65 67 20 3d 20  1]);.    pSeg = 
16e90 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
16ea0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b  LvlOut->nSeg-1];
16eb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
16ec0 74 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41  t iSegid = fts5A
16ed0 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20  llocateSegid(p, 
16ee0 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f  pStruct);..    /
16ef0 2a 20 45 78 74 65 6e 64 20 74 68 65 20 46 74 73  * Extend the Fts
16f00 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
16f10 74 20 61 73 20 72 65 71 75 69 72 65 64 20 74 6f  t as required to
16f20 20 65 6e 73 75 72 65 20 74 68 65 20 6f 75 74 70   ensure the outp
16f30 75 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e  ut.    ** segmen
16f40 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20  t exists. */.   
16f50 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75   if( iLvl==pStru
16f60 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a  ct->nLevel-1 ){.
16f70 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
16f80 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e  ureAddLevel(&p->
16f90 72 63 2c 20 70 70 53 74 72 75 63 74 29 3b 0a 20  rc, ppStruct);. 
16fa0 20 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 2a       pStruct = *
16fb0 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a  ppStruct;.    }.
16fc0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
16fd0 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d  eExtendLevel(&p-
16fe0 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 4c  >rc, pStruct, iL
16ff0 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20  vl+1, 1, 0);.   
17000 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74   pLvl = &pStruct
17010 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
17020 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70      pLvlOut = &p
17030 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
17040 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73  Lvl+1];..    fts
17050 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
17060 72 69 74 65 72 2c 20 69 49 64 78 2c 20 69 53 65  riter, iIdx, iSe
17070 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  gid);..    /* Ad
17080 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e  d the new segmen
17090 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  t to the output 
170a0 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28  level */.    if(
170b0 20 69 4c 76 6c 2b 31 3d 3d 70 53 74 72 75 63 74   iLvl+1==pStruct
170c0 2d 3e 6e 4c 65 76 65 6c 20 29 20 70 53 74 72 75  ->nLevel ) pStru
170d0 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20  ct->nLevel++;.  
170e0 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
170f0 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
17100 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c  >nSeg];.    pLvl
17110 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20  Out->nSeg++;.   
17120 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
17130 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e   = 1;.    pSeg->
17140 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
17150 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e  ..    /* Read in
17160 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67  put from all seg
17170 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70  ments in the inp
17180 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
17190 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e  nInput = pLvl->n
171a0 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65  Seg;.  }.  bOlde
171b0 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e  st = (pLvlOut->n
171c0 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63  Seg==1 && pStruc
171d0 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b  t->nLevel==iLvl+
171e0 32 29 3b 0a 0a 23 69 66 20 30 0a 66 70 72 69 6e  2);..#if 0.fprin
171f0 74 66 28 73 74 64 6f 75 74 2c 20 22 6d 65 72 67  tf(stdout, "merg
17200 69 6e 67 20 25 64 20 73 65 67 6d 65 6e 74 73 20  ing %d segments 
17210 66 72 6f 6d 20 6c 65 76 65 6c 20 25 64 21 22 2c  from level %d!",
17220 20 6e 49 6e 70 75 74 2c 20 69 4c 76 6c 29 3b 0a   nInput, iLvl);.
17230 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
17240 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 66 74  #endif..  for(ft
17250 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
17260 2c 20 70 53 74 72 75 63 74 2c 20 69 49 64 78 2c  , pStruct, iIdx,
17270 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76   0, 0, 0, 0, iLv
17280 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65  l, nInput, &pIte
17290 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  r);.      fts5Mu
172a0 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
172b0 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66  ter)==0;.      f
172c0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
172d0 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29  (p, pIter, 0, 0)
172e0 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65  .  ){.    Fts5Se
172f0 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
17300 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
17310 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a  r->aFirst[1] ];.
17320 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65      Fts5ChunkIte
17330 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20 20 20  r sPos;         
17340 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
17350 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 6f 73  rate through pos
17360 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a 20  ition list */.. 
17370 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 67     /* If the seg
17380 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74 74  ment being writt
17390 65 6e 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74  en is the oldest
173a0 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 69   in the entire i
173b0 6e 64 65 78 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ndex and.    ** 
173c0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
173d0 74 20 69 73 20 65 6d 70 74 79 20 28 69 2e 65 2e  t is empty (i.e.
173e0 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 61 20   the entry is a 
173f0 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 29 2c 20  delete marker), 
17400 6e 6f 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  no.    ** entry 
17410 6e 65 65 64 20 62 65 20 77 72 69 74 74 65 6e 20  need be written 
17420 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
17430 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b  */.    fts5Chunk
17440 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67  IterInit(p, pSeg
17450 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20 20 69 66  , &sPos);.    if
17460 28 20 62 4f 6c 64 65 73 74 3d 3d 30 20 7c 7c 20  ( bOldest==0 || 
17470 73 50 6f 73 2e 6e 52 65 6d 3e 30 20 29 7b 0a 20  sPos.nRem>0 ){. 
17480 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a       int nTerm;.
17490 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
174a0 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74  pTerm = fts5Mult
174b0 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c  iIterTerm(pIter,
174c0 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20   &nTerm);.      
174d0 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e  if( nTerm!=term.
174e0 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72  n || memcmp(pTer
174f0 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d  m, term.p, nTerm
17500 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
17510 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72   pnRem && writer
17520 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52  .nLeafWritten>nR
17530 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  em ){.          
17540 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c  fts5ChunkIterRel
17550 65 61 73 65 28 26 73 50 6f 73 29 3b 0a 20 20 20  ease(&sPos);.   
17560 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
17570 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
17580 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65   /* This is a ne
17590 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61  w term. Append a
175a0 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74   term to the out
175b0 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a  put segment. */.
175c0 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65 71          if( bReq
175d0 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20  uireDoclistTerm 
175e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
175f0 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f  5WriteAppendZero
17600 62 79 74 65 28 70 2c 20 26 77 72 69 74 65 72 29  byte(p, &writer)
17610 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17620 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
17630 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74  endTerm(p, &writ
17640 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  er, nTerm, pTerm
17650 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
17660 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
17670 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70   &term, nTerm, p
17680 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 62  Term);.        b
17690 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65  RequireDoclistTe
176a0 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rm = 1;.      }.
176b0 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  .      /* Append
176c0 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68   the rowid to th
176d0 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
176e0 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
176f0 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74 65  dRowid(p, &write
17700 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r, fts5MultiIter
17710 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b 0a 0a  Rowid(pIter));..
17720 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
17730 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
17740 66 72 6f 6d 20 69 6e 70 75 74 20 74 6f 20 6f 75  from input to ou
17750 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 66 74  tput */.      ft
17760 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
17770 6c 69 73 74 49 6e 74 28 70 2c 20 26 77 72 69 74  listInt(p, &writ
17780 65 72 2c 20 73 50 6f 73 2e 6e 52 65 6d 29 3b 0a  er, sPos.nRem);.
17790 20 20 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 6f        for(/* noo
177a0 70 20 2a 2f 3b 20 21 66 74 73 35 43 68 75 6e 6b  p */; !fts5Chunk
177b0 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73  IterEof(p, &sPos
177c0 29 3b 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  ); fts5ChunkIter
177d0 4e 65 78 74 28 70 2c 20 26 73 50 6f 73 29 29 7b  Next(p, &sPos)){
177e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69  .        fts5Wri
177f0 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44  teAppendPoslistD
17800 61 74 61 28 70 2c 20 26 77 72 69 74 65 72 2c 20  ata(p, &writer, 
17810 73 50 6f 73 2e 70 2c 20 73 50 6f 73 2e 6e 29 3b  sPos.p, sPos.n);
17820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
17830 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
17840 72 52 65 6c 65 61 73 65 28 26 73 50 6f 73 29 3b  rRelease(&sPos);
17850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68  .  }..  /* Flush
17860 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70   the last leaf p
17870 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74  age to disk. Set
17880 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
17890 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67 68  ent b-tree heigh
178a0 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20  t.  ** and last 
178b0 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
178c0 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
178d0 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69  e.  */.  fts5Wri
178e0 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69  teFinish(p, &wri
178f0 74 65 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65 69  ter, &pSeg->nHei
17900 67 68 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f  ght, &pSeg->pgno
17910 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74  Last);..  if( ft
17920 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
17930 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20  , pIter) ){.    
17940 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52  int i;..    /* R
17950 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64  emove the redund
17960 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  ant segments fro
17970 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
17980 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  le */.    for(i=
17990 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b  0; i<nInput; i++
179a0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ){.      fts5Dat
179b0 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70  aRemoveSegment(p
179c0 2c 20 69 49 64 78 2c 20 70 4c 76 6c 2d 3e 61 53  , iIdx, pLvl->aS
179d0 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20  eg[i].iSegid);. 
179e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d     }..    /* Rem
179f0 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e  ove the redundan
17a00 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  t segments from 
17a10 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20  the input level 
17a20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  */.    if( pLvl-
17a30 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b  >nSeg!=nInput ){
17a40 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65  .      int nMove
17a50 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d   = (pLvl->nSeg -
17a60 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f   nInput) * sizeo
17a70 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
17a80 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d  egment);.      m
17a90 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65  emmove(pLvl->aSe
17aa0 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e  g, &pLvl->aSeg[n
17ab0 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a  Input], nMove);.
17ac0 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e      }.    pLvl->
17ad0 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a  nSeg -= nInput;.
17ae0 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65      pLvl->nMerge
17af0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53   = 0;.    if( pS
17b00 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20  eg->pgnoLast==0 
17b10 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75 74  ){.      pLvlOut
17b20 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 7d 0a  ->nSeg--;.    }.
17b30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
17b40 65 72 74 28 20 70 53 65 67 2d 3e 6e 48 65 69 67  ert( pSeg->nHeig
17b50 68 74 3e 30 20 26 26 20 70 53 65 67 2d 3e 70 67  ht>0 && pSeg->pg
17b60 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20  noLast>0 );.    
17b70 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
17b80 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
17b90 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e  pLvl->nMerge = n
17ba0 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74  Input;.  }..  ft
17bb0 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
17bc0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73  p, pIter);.  fts
17bd0 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
17be0 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20  m);.  if( pnRem 
17bf0 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74  ) *pnRem -= writ
17c00 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b  er.nLeafWritten;
17c10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74 61  .}../*.** A tota
17c20 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66 20  l of nLeaf leaf 
17c30 70 61 67 65 73 20 6f 66 20 64 61 74 61 20 68 61  pages of data ha
17c40 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75 73  s just been flus
17c50 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d 30  hed to a level-0
17c60 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69 6e 20  .** segments in 
17c70 69 6e 64 65 78 20 69 49 64 78 20 77 69 74 68 20  index iIdx with 
17c80 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
17c90 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
17ca0 20 75 70 64 61 74 65 73 20 74 68 65 0a 2a 2a 20   updates the.** 
17cb0 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63  write-counter ac
17cc0 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69  cordingly and, i
17cd0 66 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72  f necessary, per
17ce0 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61  forms incrementa
17cf0 6c 20 6d 65 72 67 65 0a 2a 2a 20 77 6f 72 6b 2e  l merge.** work.
17d00 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
17d10 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
17d20 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
17d30 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
17d40 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
17d50 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
17d60 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
17d70 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
17d80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
17d90 6e 64 65 78 57 6f 72 6b 28 0a 20 20 46 74 73 35  ndexWork(.  Fts5
17da0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
17db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17dc0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
17dd0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
17de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17df0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17e00 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20   to work on */. 
17e10 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
17e20 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
17e30 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
17e40 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66  ent structure of
17e50 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
17e60 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  nLeaf           
17e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17e80 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
17e90 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69 74  leaves just writ
17ea0 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ten */.){.  if( 
17eb0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
17ec0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
17ed0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
17ee0 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20   *ppStruct;.    
17ef0 69 36 34 20 6e 57 72 69 74 65 3b 20 20 20 20 20  i64 nWrite;     
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17f10 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
17f20 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20  f write-counter 
17f30 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72 6b  */.    int nWork
17f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17f50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17f60 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f  f work-quanta to
17f70 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20 20   perform */.    
17f80 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20 20 20  int nRem;       
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17fa0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
17fb0 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72  pages left to wr
17fc0 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 55  ite */..    /* U
17fd0 70 64 61 74 65 20 74 68 65 20 77 72 69 74 65 2d  pdate the write-
17fe0 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65 20 64  counter. While d
17ff0 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57 6f  oing so, set nWo
18000 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69 74  rk. */.    nWrit
18010 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72  e = pStruct->nWr
18020 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20  iteCounter;.    
18030 6e 57 6f 72 6b 20 3d 20 28 28 6e 57 72 69 74 65  nWork = ((nWrite
18040 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e   + nLeaf) / p->n
18050 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72  WorkUnit) - (nWr
18060 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  ite / p->nWorkUn
18070 69 74 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74  it);.    pStruct
18080 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20  ->nWriteCounter 
18090 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52  += nLeaf;.    nR
180a0 65 6d 20 3d 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  em = p->nWorkUni
180b0 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72  t * nWork * pStr
180c0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 0a 20 20  uct->nLevel;..  
180d0 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
180e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76  ){.      int iLv
180f0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
18100 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61       /* To itera
18110 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
18120 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
18130 42 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20  BestLvl = 0;    
18140 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
18150 6f 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73  offering the mos
18160 74 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  t input segments
18170 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
18180 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
18190 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
181a0 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
181b0 73 20 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c 20  s on best level 
181c0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74  */..      /* Set
181d0 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68 65   iBestLvl to the
181e0 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69   level to read i
181f0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66 72  nput segments fr
18200 6f 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  om. */.      ass
18210 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c  ert( pStruct->nL
18220 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  evel>0 );.      
18230 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
18240 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
18250 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
18260 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
18270 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
18280 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
18290 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  Lvl];.        if
182a0 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  ( pLvl->nMerge )
182b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
182c0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65  pLvl->nMerge>nBe
182d0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
182e0 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76    iBestLvl = iLv
182f0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  l;.            n
18300 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65  Best = pLvl->nMe
18310 72 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rge;.          }
18320 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
18330 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18340 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
18350 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  eg>nBest ){.    
18360 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c        nBest = pL
18370 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20  vl->nSeg;.      
18380 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69      iBestLvl = i
18390 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Lvl;.        }. 
183a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
183b0 20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74 69   If nBest is sti
183c0 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20 69  ll 0, then the i
183d0 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d 70  ndex must be emp
183e0 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ty. */.#ifdef SQ
183f0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
18400 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65   for(iLvl=0; nBe
18410 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53  st==0 && iLvl<pS
18420 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
18430 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
18440 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
18450 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
18460 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  eg==0 );.      }
18470 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
18480 66 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e  f( nBest<p->pCon
18490 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20  fig->nAutomerge 
184a0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 53  .          && pS
184b0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42  truct->aLevel[iB
184c0 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d  estLvl].nMerge==
184d0 30 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  0 .        ){.  
184e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
184f0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 49     }.      fts5I
18500 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
18510 2c 20 69 49 64 78 2c 20 26 70 53 74 72 75 63 74  , iIdx, &pStruct
18520 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65  , iBestLvl, &nRe
18530 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74  m);.      fts5St
18540 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
18550 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53  , iBestLvl+1, pS
18560 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 61 73  truct);.      as
18570 73 65 72 74 28 20 6e 52 65 6d 3d 3d 30 20 7c 7c  sert( nRem==0 ||
18580 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18590 4b 20 29 3b 0a 20 20 20 20 20 20 2a 70 70 53 74  K );.      *ppSt
185a0 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
185b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
185c0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
185d0 65 78 43 72 69 73 69 73 4d 65 72 67 65 28 0a 20  exCrisisMerge(. 
185e0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
185f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18600 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
18610 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
18620 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20   iIdx,          
18630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18640 49 6e 64 65 78 20 74 6f 20 77 6f 72 6b 20 6f 6e  Index to work on
18650 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
18660 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20  ure **ppStruct  
18670 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
18680 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
18690 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29  re of index */.)
186a0 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
186b0 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
186c0 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c  Struct;.  int iL
186d0 76 6c 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  vl = 0;.  while(
186e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
186f0 4b 20 0a 20 20 20 20 20 20 26 26 20 69 4c 76 6c  K .      && iLvl
18700 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
18710 0a 20 20 20 20 20 20 26 26 20 70 53 74 72 75 63  .      && pStruc
18720 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
18730 6e 53 65 67 3e 3d 70 2d 3e 6e 43 72 69 73 69 73  nSeg>=p->nCrisis
18740 4d 65 72 67 65 20 0a 20 20 29 7b 0a 20 20 20 20  Merge .  ){.    
18750 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
18760 76 65 6c 28 70 2c 20 69 49 64 78 2c 20 26 70 53  vel(p, iIdx, &pS
18770 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b  truct, iLvl, 0);
18780 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
18790 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76  rePromote(p, iLv
187a0 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  l+1, pStruct);. 
187b0 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20     iLvl++;.  }. 
187c0 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
187d0 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ruct;.}..static 
187e0 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65 74  int fts5IndexRet
187f0 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70  urn(Fts5Index *p
18800 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  ){.  int rc = p-
18810 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  >rc;.  p->rc = S
18820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75  QLITE_OK;.  retu
18830 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65  rn rc;.}..typede
18840 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  f struct Fts5Flu
18850 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68 43  shCtx Fts5FlushC
18860 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46  tx;.struct Fts5F
18870 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35  lushCtx {.  Fts5
18880 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46  Index *pIdx;.  F
18890 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
188a0 74 65 72 3b 20 0a 7d 3b 0a 0a 73 74 61 74 69 63  ter; .};..static
188b0 20 69 6e 74 20 66 74 73 35 46 6c 75 73 68 4e 65   int fts5FlushNe
188c0 77 54 65 72 6d 28 76 6f 69 64 20 2a 70 43 74 78  wTerm(void *pCtx
188d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
188e0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 29 7b  erm, int nTerm){
188f0 0a 20 20 46 74 73 35 46 6c 75 73 68 43 74 78 20  .  Fts5FlushCtx 
18900 2a 70 20 3d 20 28 46 74 73 35 46 6c 75 73 68 43  *p = (Fts5FlushC
18910 74 78 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20  tx*)pCtx;.  int 
18920 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18930 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
18940 64 54 65 72 6d 28 70 2d 3e 70 49 64 78 2c 20 26  dTerm(p->pIdx, &
18950 70 2d 3e 77 72 69 74 65 72 2c 20 6e 54 65 72 6d  p->writer, nTerm
18960 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65  , (const u8*)zTe
18970 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rm);.  return rc
18980 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
18990 66 74 73 35 46 6c 75 73 68 54 65 72 6d 44 6f 6e  fts5FlushTermDon
189a0 65 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20  e(void *pCtx){. 
189b0 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 2a 70   Fts5FlushCtx *p
189c0 20 3d 20 28 46 74 73 35 46 6c 75 73 68 43 74 78   = (Fts5FlushCtx
189d0 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72 63  *)pCtx;.  int rc
189e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
189f0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f 63  /* Write the doc
18a00 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20  list terminator 
18a10 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 41 70  */.  fts5WriteAp
18a20 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2d 3e  pendZerobyte(p->
18a30 70 49 64 78 2c 20 26 70 2d 3e 77 72 69 74 65 72  pIdx, &p->writer
18a40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18a50 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
18a60 73 35 46 6c 75 73 68 4e 65 77 45 6e 74 72 79 28  s5FlushNewEntry(
18a70 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
18a80 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20    i64 iRowid, . 
18a90 20 63 6f 6e 73 74 20 75 38 20 2a 61 50 6f 73 6c   const u8 *aPosl
18aa0 69 73 74 2c 20 0a 20 20 69 6e 74 20 6e 50 6f 73  ist, .  int nPos
18ab0 6c 69 73 74 0a 29 7b 0a 20 20 46 74 73 35 46 6c  list.){.  Fts5Fl
18ac0 75 73 68 43 74 78 20 2a 70 20 3d 20 28 46 74 73  ushCtx *p = (Fts
18ad0 35 46 6c 75 73 68 43 74 78 2a 29 70 43 74 78 3b  5FlushCtx*)pCtx;
18ae0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
18af0 64 78 20 3d 20 70 2d 3e 70 49 64 78 3b 0a 0a 20  dx = p->pIdx;.. 
18b00 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72   /* Append the r
18b10 6f 77 69 64 20 69 74 73 65 6c 66 20 2a 2f 0a 20  owid itself */. 
18b20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
18b30 52 6f 77 69 64 28 70 49 64 78 2c 20 26 70 2d 3e  Rowid(pIdx, &p->
18b40 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b  writer, iRowid);
18b50 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
18b60 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 6f  e size of the po
18b70 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62  sition list in b
18b80 79 74 65 73 20 2a 2f 0a 20 20 66 74 73 35 57 72  ytes */.  fts5Wr
18b90 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
18ba0 49 6e 74 28 70 49 64 78 2c 20 26 70 2d 3e 77 72  Int(pIdx, &p->wr
18bb0 69 74 65 72 2c 20 6e 50 6f 73 6c 69 73 74 29 3b  iter, nPoslist);
18bc0 0a 0a 20 20 2f 2a 20 41 6e 64 20 74 68 65 20 70  ..  /* And the p
18bd0 6f 73 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20  oslist data */. 
18be0 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
18bf0 50 6f 73 6c 69 73 74 44 61 74 61 28 70 49 64 78  PoslistData(pIdx
18c00 2c 20 26 70 2d 3e 77 72 69 74 65 72 2c 20 61 50  , &p->writer, aP
18c10 6f 73 6c 69 73 74 2c 20 6e 50 6f 73 6c 69 73 74  oslist, nPoslist
18c20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78  );.  return pIdx
18c30 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ->rc;.}../*.** F
18c40 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  lush the content
18c50 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68  s of in-memory h
18c60 61 73 68 20 74 61 62 6c 65 20 69 48 61 73 68 20  ash table iHash 
18c70 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30  to a new level-0
18c80 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20   .** segment on 
18c90 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74  disk. Also updat
18ca0 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  e the correspond
18cb0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65  ing structure re
18cc0 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
18cd0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
18ce0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
18cf0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
18d00 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
18d10 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
18d20 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
18d30 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
18d40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18d50 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
18d60 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
18d70 6e 74 20 69 48 61 73 68 2c 20 69 6e 74 20 2a 70  nt iHash, int *p
18d80 6e 4c 65 61 66 29 7b 0a 20 20 46 74 73 35 53 74  nLeaf){.  Fts5St
18d90 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
18da0 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
18db0 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d    int pgnoLast =
18dc0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18dd0 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66      /* Last leaf
18de0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
18df0 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  segment */..  /*
18e00 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65   Obtain a refere
18e10 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78  nce to the index
18e20 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
18e30 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
18e40 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f  gment-id.  ** fo
18e50 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d  r the new level-
18e60 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20  0 segment.  */. 
18e70 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
18e80 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20  tructureRead(p, 
18e90 69 48 61 73 68 29 3b 0a 20 20 69 53 65 67 69 64  iHash);.  iSegid
18ea0 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53   = fts5AllocateS
18eb0 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29  egid(p, pStruct)
18ec0 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 20  ;..  if( iSegid 
18ed0 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
18ee0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
18ef0 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d  g;   /* New segm
18f00 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72 75  ent within pStru
18f10 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 48  ct */.    int nH
18f20 65 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  eight;          
18f30 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68          /* Heigh
18f40 74 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74  t of new segment
18f50 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 69   b-tree */.    i
18f60 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 46  nt rc;.    Fts5F
18f70 6c 75 73 68 43 74 78 20 63 74 78 3b 0a 0a 20 20  lushCtx ctx;..  
18f80 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28    fts5WriteInit(
18f90 70 2c 20 26 63 74 78 2e 77 72 69 74 65 72 2c 20  p, &ctx.writer, 
18fa0 69 48 61 73 68 2c 20 69 53 65 67 69 64 29 3b 0a  iHash, iSegid);.
18fb0 20 20 20 20 63 74 78 2e 70 49 64 78 20 3d 20 70      ctx.pIdx = p
18fc0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
18fd0 74 65 33 46 74 73 35 48 61 73 68 49 74 65 72 61  te3Fts5HashItera
18fe0 74 65 28 20 70 2d 3e 61 70 48 61 73 68 5b 69 48  te( p->apHash[iH
18ff0 61 73 68 5d 2c 20 28 76 6f 69 64 2a 29 26 63 74  ash], (void*)&ct
19000 78 2c 20 0a 20 20 20 20 20 20 20 20 66 74 73 35  x, .        fts5
19010 46 6c 75 73 68 4e 65 77 54 65 72 6d 2c 20 66 74  FlushNewTerm, ft
19020 73 35 46 6c 75 73 68 4e 65 77 45 6e 74 72 79 2c  s5FlushNewEntry,
19030 20 66 74 73 35 46 6c 75 73 68 54 65 72 6d 44 6f   fts5FlushTermDo
19040 6e 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ne.    );.    if
19050 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19060 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b  OK ) p->rc = rc;
19070 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 69  .    fts5WriteFi
19080 6e 69 73 68 28 70 2c 20 26 63 74 78 2e 77 72 69  nish(p, &ctx.wri
19090 74 65 72 2c 20 26 6e 48 65 69 67 68 74 2c 20 26  ter, &nHeight, &
190a0 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20  pgnoLast);..    
190b0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
190c0 73 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20  s5Structure. It 
190d0 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
190e0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
190f0 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74  by the.    ** ft
19100 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
19110 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e  se() call below.
19120 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
19130 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20  ruct->nLevel==0 
19140 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
19150 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
19160 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29  p->rc, &pStruct)
19170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
19180 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
19190 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
191a0 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  ruct, 0, 1, 0);.
191b0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
191c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
191d0 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
191e0 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65  t->aLevel[0].aSe
191f0 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  g[ pStruct->aLev
19200 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a  el[0].nSeg++ ];.
19210 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67        pSeg->iSeg
19220 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
19230 20 20 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74     pSeg->nHeight
19240 20 3d 20 6e 48 65 69 67 68 74 3b 0a 20 20 20 20   = nHeight;.    
19250 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
19260 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65  t = 1;.      pSe
19270 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67  g->pgnoLast = pg
19280 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20  noLast;.    }.  
19290 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e  }..  if( p->pCon
192a0 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e  fig->nAutomerge>
192b0 30 20 29 20 66 74 73 35 49 6e 64 65 78 57 6f 72  0 ) fts5IndexWor
192c0 6b 28 70 2c 20 69 48 61 73 68 2c 20 26 70 53 74  k(p, iHash, &pSt
192d0 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b  ruct, pgnoLast);
192e0 0a 20 20 66 74 73 35 49 6e 64 65 78 43 72 69 73  .  fts5IndexCris
192f0 69 73 4d 65 72 67 65 28 70 2c 20 69 48 61 73 68  isMerge(p, iHash
19300 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66  , &pStruct);.  f
19310 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
19320 65 28 70 2c 20 69 48 61 73 68 2c 20 70 53 74 72  e(p, iHash, pStr
19330 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
19340 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
19350 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ruct);.}../*.** 
19360 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73  Flush any data s
19370 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
19380 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
19390 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
193a0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
193b0 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  id fts5IndexFlus
193c0 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  h(Fts5Index *p){
193d0 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
193e0 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
193f0 66 69 67 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20  fig;.  int i;   
19400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19410 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
19420 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
19430 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  h indexes */.  i
19440 6e 74 20 6e 4c 65 61 66 20 3d 20 30 3b 20 20 20  nt nLeaf = 0;   
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19460 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
19470 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20  es written */.. 
19480 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
19490 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
194a0 72 65 64 20 74 68 69 73 20 63 61 6c 6c 20 69 73  red this call is
194b0 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
194c0 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
194d0 5f 4f 4b 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69  _OK || p->nPendi
194e0 6e 67 44 61 74 61 3d 3d 30 20 29 20 72 65 74 75  ngData==0 ) retu
194f0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rn;.  assert( p-
19500 3e 61 70 48 61 73 68 20 29 3b 0a 0a 20 20 2f 2a  >apHash );..  /*
19510 20 46 6c 75 73 68 20 74 68 65 20 74 65 72 6d 73   Flush the terms
19520 20 61 6e 64 20 65 61 63 68 20 70 72 65 66 69 78   and each prefix
19530 20 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 20 2a   index to disk *
19540 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  /.  for(i=0; i<=
19550 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
19560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35  ; i++){.    fts5
19570 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 2c 20  FlushOneHash(p, 
19580 69 2c 20 26 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a  i, &nLeaf);.  }.
19590 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
195a0 61 20 3d 20 30 3b 0a 7d 0a 0a 0a 69 6e 74 20 73  a = 0;.}...int s
195b0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
195c0 70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65  ptimize(Fts5Inde
195d0 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e  x *p){.  Fts5Con
195e0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
195f0 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74  ->pConfig;.  int
19600 20 69 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78   i;..  fts5Index
19610 46 6c 75 73 68 28 70 29 3b 0a 20 20 66 6f 72 28  Flush(p);.  for(
19620 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67 2d  i=0; i<=pConfig-
19630 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a  >nPrefix; i++){.
19640 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
19650 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73  e *pStruct = fts
19660 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
19670 2c 20 69 29 3b 0a 20 20 20 20 46 74 73 35 53 74  , i);.    Fts5St
19680 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20  ructure *pNew = 
19690 30 3b 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 20  0;.    int nSeg 
196a0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 53 74  = 0;.    if( pSt
196b0 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 6e 53  ruct ){.      nS
196c0 65 67 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  eg = fts5Structu
196d0 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
196e0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20  pStruct);.      
196f0 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20  if( nSeg>1 ){.  
19700 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
19710 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  = sizeof(Fts5Str
19720 75 63 74 75 72 65 29 3b 0a 20 20 20 20 20 20 20  ucture);.       
19730 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75   nByte += (pStru
19740 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20  ct->nLevel+1) * 
19750 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
19760 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20  tureLevel);.    
19770 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35      pNew = (Fts5
19780 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74  Structure*)sqlit
19790 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
197a0 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
197b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
197c0 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
197d0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
197e0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
197f0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
19800 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46   nSeg * sizeof(F
19810 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
19820 65 6e 74 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ent);.      pNew
19830 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75  ->nLevel = pStru
19840 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20  ct->nLevel+1;.  
19850 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65      pNew->nWrite
19860 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63  Counter = pStruc
19870 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
19880 3b 0a 20 20 20 20 20 20 70 4c 76 6c 20 3d 20 26  ;.      pLvl = &
19890 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  pNew->aLevel[pSt
198a0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
198b0 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
198c0 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
198d0 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33  Segment*)sqlite3
198e0 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
198f0 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20  p->rc, nByte);. 
19900 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61       if( pLvl->a
19910 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Seg ){.        i
19920 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
19930 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f         int iSegO
19940 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
19950 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
19960 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
19970 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
19980 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
19990 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
199a0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
199b0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
199c0 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65         pLvl->aSe
199d0 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74  g[iSegOut] = pSt
199e0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
199f0 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l].aSeg[iSeg];. 
19a00 20 20 20 20 20 20 20 20 20 20 20 69 53 65 67 4f             iSegO
19a10 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ut++;.          
19a20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
19a30 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d      pLvl->nSeg =
19a40 20 6e 53 65 67 3b 0a 20 20 20 20 20 20 7d 65 6c   nSeg;.      }el
19a50 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
19a60 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
19a70 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30          pNew = 0
19a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19a90 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b  .    if( pNew ){
19aa0 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 20  .      int iLvl 
19ab0 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31  = pNew->nLevel-1
19ac0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
19ad0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19ae0 26 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b  && pNew->aLevel[
19af0 69 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a  iLvl].nSeg>0 ){.
19b00 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 6d          int nRem
19b10 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b   = FTS5_OPT_WORK
19b20 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20 20 20 66  _UNIT;.        f
19b30 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
19b40 65 6c 28 70 2c 20 69 2c 20 26 70 4e 65 77 2c 20  el(p, i, &pNew, 
19b50 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  iLvl, &nRem);.  
19b60 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73      }..      fts
19b70 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
19b80 70 2c 20 69 2c 20 70 4e 65 77 29 3b 0a 20 20 20  p, i, pNew);.   
19b90 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
19ba0 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20  Release(pNew);. 
19bb0 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74     }..    fts5St
19bc0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
19bd0 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20  Struct);.  }..  
19be0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
19bf0 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 0a  Return(p); .}...
19c00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
19c10 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20  simple checksum 
19c20 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74  value based on t
19c30 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f  he arguments..*/
19c40 0a 73 74 61 74 69 63 20 75 36 34 20 66 74 73 35  .static u64 fts5
19c50 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
19c60 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a  .  i64 iRowid, .
19c70 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69    int iCol, .  i
19c80 6e 74 20 69 50 6f 73 2c 20 0a 20 20 63 6f 6e 73  nt iPos, .  cons
19c90 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 0a  t char *pTerm, .
19ca0 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20    int nTerm.){. 
19cb0 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65   int i;.  u64 re
19cc0 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65  t = iRowid;.  re
19cd0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
19ce0 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28  iCol;.  ret += (
19cf0 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a  ret<<3) + iPos;.
19d00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65    for(i=0; i<nTe
19d10 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20  rm; i++) ret += 
19d20 28 72 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d  (ret<<3) + pTerm
19d30 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  [i];.  return re
19d40 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  t;.}..static voi
19d50 64 20 66 74 73 35 42 74 72 65 65 49 74 65 72 49  d fts5BtreeIterI
19d60 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
19d70 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78   *p, .  int iIdx
19d80 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
19d90 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
19da0 0a 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72  .  Fts5BtreeIter
19db0 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69 6e 74   *pIter.){.  int
19dc0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
19dd0 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
19de0 66 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  f(pIter->aLvl[0]
19df0 29 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65 69 67  ) * (pSeg->nHeig
19e00 68 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ht-1);.  memset(
19e10 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
19e20 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
19e30 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65 67 2d  er->nLvl = pSeg-
19e40 3e 6e 48 65 69 67 68 74 2d 31 3b 0a 20 20 70 49  >nHeight-1;.  pI
19e50 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78  ter->iIdx = iIdx
19e60 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70  ;.  pIter->p = p
19e70 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20  ;.  pIter->pSeg 
19e80 3d 20 70 53 65 67 3b 0a 20 20 69 66 28 20 6e 42  = pSeg;.  if( nB
19e90 79 74 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  yte && p->rc==SQ
19ea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
19eb0 49 74 65 72 2d 3e 61 4c 76 6c 20 3d 20 28 46 74  Iter->aLvl = (Ft
19ec0 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
19ed0 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
19ee0 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  p, nByte);.  }. 
19ef0 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
19f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
19f10 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b  pIter->nLvl; i++
19f20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
19f30 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
19f40 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65  _ROWID(iIdx, pSe
19f50 67 2d 3e 69 53 65 67 69 64 2c 20 69 2b 31 2c 20  g->iSegid, i+1, 
19f60 31 29 3b 0a 20 20 20 20 46 74 73 35 44 61 74 61  1);.    Fts5Data
19f70 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 49 74   *pData;.    pIt
19f80 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74  er->aLvl[i].pDat
19f90 61 20 3d 20 70 44 61 74 61 20 3d 20 66 74 73 35  a = pData = fts5
19fa0 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
19fb0 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61  id);.    if( pDa
19fc0 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ta ){.      fts5
19fd0 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70 44 61  NodeIterInit(pDa
19fe0 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 2c  ta->p, pData->n,
19ff0 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d   &pIter->aLvl[i]
1a000 2e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  .s);.    }.  }..
1a010 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 4c 76    if( pIter->nLv
1a020 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20 29 7b  l==0 || p->rc ){
1a030 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
1a040 20 3d 20 31 3b 0a 20 20 20 20 70 49 74 65 72 2d   = 1;.    pIter-
1a050 3e 69 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  >iLeaf = pSeg->p
1a060 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65  gnoLast;.  }else
1a070 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d  {.    pIter->nEm
1a080 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  pty = pIter->aLv
1a090 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20  l[0].s.nEmpty;. 
1a0a0 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20     pIter->iLeaf 
1a0b0 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  = pIter->aLvl[0]
1a0c0 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 70  .s.iChild;.    p
1a0d0 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70  Iter->bDlidx = p
1a0e0 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
1a0f0 62 44 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 73  bDlidx;.  }.}..s
1a100 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
1a110 74 72 65 65 49 74 65 72 4e 65 78 74 28 46 74 73  treeIterNext(Fts
1a120 35 42 74 72 65 65 49 74 65 72 20 2a 70 49 74 65  5BtreeIter *pIte
1a130 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r){.  Fts5Index 
1a140 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 3b 0a 20  *p = pIter->p;. 
1a150 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
1a160 74 28 20 70 49 74 65 72 2d 3e 62 45 6f 66 3d 3d  t( pIter->bEof==
1a170 30 20 26 26 20 70 49 74 65 72 2d 3e 61 4c 76 6c  0 && pIter->aLvl
1a180 5b 30 5d 2e 73 2e 61 44 61 74 61 20 29 3b 0a 20  [0].s.aData );. 
1a190 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
1a1a0 72 2d 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e 72 63  r->nLvl && p->rc
1a1b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
1a1c0 29 7b 0a 20 20 20 20 46 74 73 35 42 74 72 65 65  ){.    Fts5Btree
1a1d0 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  IterLevel *pLvl 
1a1e0 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  = &pIter->aLvl[i
1a1f0 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49  ];.    fts5NodeI
1a200 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20  terNext(&p->rc, 
1a210 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69  &pLvl->s);.    i
1a220 66 28 20 70 4c 76 6c 2d 3e 73 2e 61 44 61 74 61  f( pLvl->s.aData
1a230 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
1a240 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
1a250 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 4c  &pIter->term, pL
1a260 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20 70 4c  vl->s.term.n, pL
1a270 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b 0a 20  vl->s.term.p);. 
1a280 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
1a2a0 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 70  5NodeIterFree(&p
1a2b0 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20 66  Lvl->s);.      f
1a2c0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
1a2d0 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  Lvl->pData);.   
1a2e0 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d     pLvl->pData =
1a2f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1a300 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e 6e 4c  if( i==pIter->nL
1a310 76 6c 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20  vl || p->rc ){. 
1a320 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
1a330 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
1a340 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49   int iSegid = pI
1a350 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
1a360 64 3b 0a 20 20 20 20 66 6f 72 28 69 2d 2d 3b 20  d;.    for(i--; 
1a370 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
1a380 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c    Fts5BtreeIterL
1a390 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49  evel *pLvl = &pI
1a3a0 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20  ter->aLvl[i];.  
1a3b0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
1a3c0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1a3d0 57 49 44 28 70 49 74 65 72 2d 3e 69 49 64 78 2c  WID(pIter->iIdx,
1a3e0 69 53 65 67 69 64 2c 69 2b 31 2c 70 4c 76 6c 5b  iSegid,i+1,pLvl[
1a3f0 31 5d 2e 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20  1].s.iChild);.  
1a400 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
1a410 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
1a420 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
1a430 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
1a440 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
1a450 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70 4c 76  NodeIterInit(pLv
1a460 6c 2d 3e 70 44 61 74 61 2d 3e 70 2c 20 70 4c 76  l->pData->p, pLv
1a470 6c 2d 3e 70 44 61 74 61 2d 3e 6e 2c 20 26 70 4c  l->pData->n, &pL
1a480 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20 7d 0a  vl->s);.      }.
1a490 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74      }.  }..  pIt
1a4a0 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74  er->nEmpty = pIt
1a4b0 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45  er->aLvl[0].s.nE
1a4c0 6d 70 74 79 3b 0a 20 20 70 49 74 65 72 2d 3e 62  mpty;.  pIter->b
1a4d0 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61  Dlidx = pIter->a
1a4e0 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b  Lvl[0].s.bDlidx;
1a4f0 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20  .  pIter->iLeaf 
1a500 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  = pIter->aLvl[0]
1a510 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 61 73 73  .s.iChild;.  ass
1a520 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
1a530 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  TE_OK || pIter->
1a540 62 45 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61 74 69  bEof );.}..stati
1a550 63 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65  c void fts5Btree
1a560 49 74 65 72 46 72 65 65 28 46 74 73 35 42 74 72  IterFree(Fts5Btr
1a570 65 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  eeIter *pIter){.
1a580 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1a590 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76  =0; i<pIter->nLv
1a5a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73  l; i++){.    Fts
1a5b0 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20  5BtreeIterLevel 
1a5c0 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
1a5d0 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73  aLvl[i];.    fts
1a5e0 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 70  5NodeIterFree(&p
1a5f0 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28  Lvl->s);.    if(
1a600 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a   pLvl->pData ){.
1a610 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
1a620 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
1a630 61 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  a);.      pLvl->
1a640 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d  pData = 0;.    }
1a650 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1a660 72 65 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29  ree(pIter->aLvl)
1a670 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
1a680 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29  ee(&pIter->term)
1a690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1a6a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65  function is pure
1a6b0 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ly an internal t
1a6c0 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  est. It does not
1a6d0 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a   contribute to .
1a6e0 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61  ** FTS functiona
1a6f0 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68  lity, or even th
1a700 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
1a710 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  k, in any way..*
1a720 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74  *.** Instead, it
1a730 20 74 65 73 74 73 20 74 68 61 74 20 74 68 65 20   tests that the 
1a740 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f  same set of pgno
1a750 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
1a760 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69  ons are .** visi
1a770 74 65 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ted regardless o
1a780 66 20 77 68 65 74 68 65 72 20 74 68 65 20 64 6f  f whether the do
1a790 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e  clist-index iden
1a7a0 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
1a7b0 74 65 72 73 0a 2a 2a 20 69 49 64 78 2f 69 53 65  ters.** iIdx/iSe
1a7c0 67 69 64 2f 69 4c 65 61 66 20 69 73 20 69 74 65  gid/iLeaf is ite
1a7d0 72 61 74 65 64 20 69 6e 20 66 6f 72 77 61 72 64  rated in forward
1a7e0 73 20 6f 72 20 72 65 76 65 72 73 65 20 6f 72 64  s or reverse ord
1a7f0 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  er..*/.#ifdef SQ
1a800 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
1a810 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78  c void fts5Dlidx
1a820 49 74 65 72 54 65 73 74 52 65 76 65 72 73 65 28  IterTestReverse(
1a830 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1a840 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20   .  int iIdx,   
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
1a870 6c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64  load doclist-ind
1a880 65 78 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ex from */.  int
1a890 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20   iSegid,        
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a8b0 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f  Segment id to lo
1a8c0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
1a8d0 20 69 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   iLeaf          
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a8f0 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64  Load doclist-ind
1a900 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  ex for this leaf
1a910 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69   */.){.  Fts5Dli
1a920 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
1a930 20 30 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d 31   0;.  i64 cksum1
1a940 20 3d 20 31 33 3b 0a 20 20 69 36 34 20 63 6b 73   = 13;.  i64 cks
1a950 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72  um2 = 13;..  for
1a960 28 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  (fts5DlidxIterIn
1a970 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c 20 69  it(p, 0, iIdx, i
1a980 53 65 67 69 64 2c 20 69 4c 65 61 66 2c 20 26 70  Segid, iLeaf, &p
1a990 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74  Dlidx);.      ft
1a9a0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
1a9b0 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
1a9c0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
1a9d0 72 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20  rNext(pDlidx).  
1a9e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a9f0 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f  Dlidx->iLeafPgno
1aa00 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b  >iLeaf );.    ck
1aa10 73 75 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e  sum1 = (cksum1 ^
1aa20 20 28 20 28 69 36 34 29 28 70 44 6c 69 64 78 2d   ( (i64)(pDlidx-
1aa30 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c 20 33  >iLeafPgno) << 3
1aa40 32 20 29 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31  2 ));.    cksum1
1aa50 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 70 44 6c   = (cksum1 ^ pDl
1aa60 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  idx->iRowid);.  
1aa70 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  }.  fts5DlidxIte
1aa80 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
1aa90 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20   pDlidx = 0;..  
1aaa0 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65  for(fts5DlidxIte
1aab0 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 49 64 78  rInit(p, 1, iIdx
1aac0 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 2c  , iSegid, iLeaf,
1aad0 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20   &pDlidx);.     
1aae0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
1aaf0 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b  f(p, pDlidx)==0;
1ab00 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
1ab10 49 74 65 72 50 72 65 76 28 70 44 6c 69 64 78 29  IterPrev(pDlidx)
1ab20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
1ab30 28 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50  ( pDlidx->iLeafP
1ab40 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20  gno>iLeaf );.   
1ab50 20 63 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d   cksum2 = (cksum
1ab60 32 20 5e 20 28 20 28 69 36 34 29 28 70 44 6c 69  2 ^ ( (i64)(pDli
1ab70 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c  dx->iLeafPgno) <
1ab80 3c 20 33 32 20 29 29 3b 0a 20 20 20 20 63 6b 73  < 32 ));.    cks
1ab90 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20  um2 = (cksum2 ^ 
1aba0 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b  pDlidx->iRowid);
1abb0 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78  .  }.  fts5Dlidx
1abc0 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
1abd0 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a  ;.  pDlidx = 0;.
1abe0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1abf0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d  LITE_OK && cksum
1ac00 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  1!=cksum2 ) p->r
1ac10 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
1ac20 3b 20 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  ; .}.#else.# def
1ac30 69 6e 65 20 66 74 73 35 44 6c 69 64 78 49 74 65  ine fts5DlidxIte
1ac40 72 54 65 73 74 52 65 76 65 72 73 65 28 77 2c 78  rTestReverse(w,x
1ac50 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 73 74  ,y,z).#endif..st
1ac60 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1ac70 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
1ac80 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35  kSegment(.  Fts5
1ac90 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1acb0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1acc0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
1acd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ace0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1acf0 20 74 68 61 74 20 70 53 65 67 20 69 73 20 61 20   that pSeg is a 
1ad00 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73  part of */.  Fts
1ad10 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1ad20 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20  t *pSeg      /* 
1ad30 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b  Segment to check
1ad40 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73   internal consis
1ad50 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74  tency */.){.  Ft
1ad60 73 35 42 74 72 65 65 49 74 65 72 20 69 74 65 72  s5BtreeIter iter
1ad70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ad80 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
1ad90 20 74 68 72 6f 75 67 68 20 62 2d 74 72 65 65 20   through b-tree 
1ada0 68 69 65 72 61 72 63 68 79 20 2a 2f 0a 0a 20 20  hierarchy */..  
1adb0 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
1adc0 67 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  gh the b-tree hi
1add0 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 66  erarchy.  */.  f
1ade0 6f 72 28 66 74 73 35 42 74 72 65 65 49 74 65 72  or(fts5BtreeIter
1adf0 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 70 53  Init(p, iIdx, pS
1ae00 65 67 2c 20 26 69 74 65 72 29 3b 0a 20 20 20 20  eg, &iter);.    
1ae10 20 20 69 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a    iter.bEof==0;.
1ae20 20 20 20 20 20 20 66 74 73 35 42 74 72 65 65 49        fts5BtreeI
1ae30 74 65 72 4e 65 78 74 28 26 69 74 65 72 29 0a 20  terNext(&iter). 
1ae40 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
1ae50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ae60 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
1ae70 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
1ae80 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c      Fts5Data *pL
1ae90 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
1aea0 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68    /* Data for th
1aeb0 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69  is leaf */.    i
1aec0 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20  nt iOff;        
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aee0 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
1aef0 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a  term on leaf */.
1af00 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
1af30 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6d 70  rate through emp
1af40 74 79 20 6c 65 61 76 65 73 20 2a 2f 0a 0a 20 20  ty leaves */..  
1af50 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66    /* If the leaf
1af60 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73   in question has
1af70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72   already been tr
1af80 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73  immed from the s
1af90 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20  egment, .    ** 
1afa0 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72  ignore this b-tr
1afb0 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77  ee entry. Otherw
1afc0 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74  ise, load it int
1afd0 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20  o memory. */.   
1afe0 20 69 66 28 20 69 74 65 72 2e 69 4c 65 61 66 3c   if( iter.iLeaf<
1aff0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
1b000 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1b010 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d  iRow = FTS5_SEGM
1b020 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20  ENT_ROWID(iIdx, 
1b030 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c  pSeg->iSegid, 0,
1b040 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20   iter.iLeaf);.  
1b050 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
1b060 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 29 3b  taRead(p, iRow);
1b070 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d  .    if( pLeaf==
1b080 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
1b090 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
1b0a0 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20  e leaf contains 
1b0b0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72  at least one ter
1b0c0 6d 2c 20 61 6e 64 20 74 68 61 74 20 69 74 20 69  m, and that it i
1b0d0 73 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74  s equal.    ** t
1b0e0 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68 61 6e  o or larger than
1b0f0 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 69   the split-key i
1b100 6e 20 69 74 65 72 2e 74 65 72 6d 2e 20 20 2a 2f  n iter.term.  */
1b110 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35  .    iOff = fts5
1b120 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
1b130 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 4f  [2]);.    if( iO
1b140 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ff==0 ){.      p
1b150 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
1b160 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  UPT;.    }else{.
1b170 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
1b1a0 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74  m on leaf in byt
1b1b0 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
1b1c0 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
1b1d0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61          /* Compa
1b1e0 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e  rison of term an
1b1f0 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 20  d split-key */. 
1b200 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74       iOff += get
1b210 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
1b220 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29  >p[iOff], nTerm)
1b230 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65  ;.      res = me
1b240 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69  mcmp(&pLeaf->p[i
1b250 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72 6d 2e  Off], iter.term.
1b260 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 69 74  p, MIN(nTerm, it
1b270 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20 20 20  er.term.n));.   
1b280 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20     if( res==0 ) 
1b290 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 69 74  res = nTerm - it
1b2a0 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20  er.term.n;.     
1b2b0 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
1b2c0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
1b2d0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
1b2e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
1b2f0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
1b300 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eaf);.    if( p-
1b310 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  >rc ) break;..  
1b320 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74    /* Now check t
1b330 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d  hat the iter.nEm
1b340 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  pty leaves follo
1b350 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  wing the current
1b360 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29   leaf.    ** (a)
1b370 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63   exist and (b) c
1b380 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e  ontain no terms.
1b390 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   */.    for(i=1;
1b3a0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b3b0 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e 45 6d  K && i<=iter.nEm
1b3c0 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  pty; i++){.     
1b3d0 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1b3e0 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b 69 29  aRead(p, iRow+i)
1b3f0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 61  ;.      if( pLea
1b400 66 20 26 26 20 30 21 3d 66 74 73 35 47 65 74 55  f && 0!=fts5GetU
1b410 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29  16(&pLeaf->p[2])
1b420 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
1b430 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
1b440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b450 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1b460 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  pLeaf);.    }.. 
1b470 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
1b480 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
1b490 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74  x, check that it
1b4a0 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f   looks right. */
1b4b0 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e 62 44  .    if( iter.bD
1b4c0 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74  lidx ){.      Ft
1b4d0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
1b4e0 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72  idx = 0;  /* For
1b4f0 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
1b500 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  gh doclist index
1b510 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50   */.      int iP
1b520 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72 2e 69  revLeaf = iter.i
1b530 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
1b540 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69  iSegid = pSeg->i
1b550 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74  Segid;.      int
1b560 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36 34 20   iPg;.      i64 
1b570 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72  iKey;..      for
1b580 28 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  (fts5DlidxIterIn
1b590 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c 20 69  it(p, 0, iIdx, i
1b5a0 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c 65 61  Segid, iter.iLea
1b5b0 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20  f, &pDlidx);.   
1b5c0 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78         fts5Dlidx
1b5d0 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
1b5e0 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20  x)==0;.         
1b5f0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
1b600 78 74 28 70 44 6c 69 64 78 29 0a 20 20 20 20 20  xt(pDlidx).     
1b610 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   ){..        /* 
1b620 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d  Check any rowid-
1b630 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74 20  less pages that 
1b640 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65  occur before the
1b650 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a   current leaf. *
1b660 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 50  /.        for(iP
1b670 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69  g=iPrevLeaf+1; i
1b680 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66  Pg<pDlidx->iLeaf
1b690 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  Pgno; iPg++){.  
1b6a0 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
1b6b0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1b6c0 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
1b6d0 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  0, iPg);.       
1b6e0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1b6f0 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
1b700 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1b710 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
1b720 20 20 20 20 20 69 66 28 20 66 74 73 35 47 65 74       if( fts5Get
1b730 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d  U16(&pLeaf->p[0]
1b740 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  )!=0 ) p->rc = F
1b750 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
1b760 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
1b770 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
1b780 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1b7a0 50 72 65 76 4c 65 61 66 20 3d 20 70 44 6c 69 64  PrevLeaf = pDlid
1b7b0 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20  x->iLeafPgno;.. 
1b7c0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
1b7d0 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61  that the leaf pa
1b7e0 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ge indicated by 
1b7f0 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
1b800 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20  lly does.       
1b810 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   ** contain the 
1b820 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20  rowid suggested 
1b830 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a  by the same. */.
1b840 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
1b850 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1b860 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
1b870 30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66  0, pDlidx->iLeaf
1b880 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  Pgno);.        p
1b890 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
1b8a0 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
1b8b0 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
1b8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  ){.          i64
1b8d0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20   iRowid;.       
1b8e0 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
1b8f0 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
1b900 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20  Leaf->p[0]);.   
1b910 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
1b920 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69  (&pLeaf->p[iRowi
1b930 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52  dOff], (u64*)&iR
1b940 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
1b950 20 69 66 28 20 69 52 6f 77 69 64 21 3d 70 44 6c   if( iRowid!=pDl
1b960 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 20 70 2d  idx->iRowid ) p-
1b970 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1b980 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  PT;.          ft
1b990 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
1b9a0 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eaf);.        }.
1b9b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1b9c0 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61  for(iPg=iPrevLea
1b9d0 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65 72 2e  f+1; iPg<=(iter.
1b9e0 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e 45 6d  iLeaf + iter.nEm
1b9f0 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  pty); iPg++){.  
1ba00 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
1ba10 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
1ba20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c  iIdx, iSegid, 0,
1ba30 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70   iPg);.        p
1ba40 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
1ba50 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
1ba60 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
1ba70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1ba80 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
1ba90 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20 70  af->p[0])!=0 ) p
1baa0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
1bab0 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66  UPT;.          f
1bac0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
1bad0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  Leaf);.        }
1bae0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1baf0 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
1bb00 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  e(pDlidx);.     
1bb10 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 54 65   fts5DlidxIterTe
1bb20 73 74 52 65 76 65 72 73 65 28 70 2c 20 69 49 64  stReverse(p, iId
1bb30 78 2c 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e  x, iSegid, iter.
1bb40 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20  iLeaf);.    }.  
1bb50 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
1bb60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65  SQLITE_OK && ite
1bb70 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70  r.iLeaf!=pSeg->p
1bb80 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
1bb90 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
1bba0 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  UPT;.  }..  fts5
1bbb0 42 74 72 65 65 49 74 65 72 46 72 65 65 28 26 69  BtreeIterFree(&i
1bbc0 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ter);.}../*.** I
1bbd0 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20 63  terator pMulti c
1bbe0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1bbf0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1bc00 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73   (not EOF). This
1bc10 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  .** function app
1bc20 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66 20 74  ends a copy of t
1bc30 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
1bc40 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 70 4d   of the entry pM
1bc50 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65 6e 74  ulti .** current
1bc60 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20  ly points to to 
1bc70 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
1bc80 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1bc90 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1bca0 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
1bcb0 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61 73 73  p->rc. It is ass
1bcc0 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72  umed.** no error
1bcd0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
1bce0 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
1bcf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1bd00 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1bd10 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
1bd20 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49  Poslist(.  Fts5I
1bd30 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 4d  ndex *p,.  Fts5M
1bd40 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75  ultiSegIter *pMu
1bd50 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a 2c 0a  lti,.  int bSz,.
1bd60 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1bd70 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  uf.){.  if( p->r
1bd80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bd90 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65      Fts5ChunkIte
1bda0 72 20 69 74 65 72 3b 0a 20 20 20 20 46 74 73 35  r iter;.    Fts5
1bdb0 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
1bdc0 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70  &pMulti->aSeg[ p
1bdd0 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d  Multi->aFirst[1]
1bde0 20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ];.    assert( 
1bdf0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1be00 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29  (p, pMulti)==0 )
1be10 3b 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49  ;.    fts5ChunkI
1be20 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c  terInit(p, pSeg,
1be30 20 26 69 74 65 72 29 3b 0a 20 20 20 20 69 66 28   &iter);.    if(
1be40 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f   fts5ChunkIterEo
1be50 66 28 70 2c 20 26 69 74 65 72 29 3d 3d 30 20 29  f(p, &iter)==0 )
1be60 7b 0a 20 20 20 20 20 20 69 66 28 20 62 53 7a 20  {.      if( bSz 
1be70 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
1be80 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1be90 74 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  t(&p->rc, pBuf, 
1bea0 69 74 65 72 2e 6e 52 65 6d 29 3b 0a 20 20 20 20  iter.nRem);.    
1beb0 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
1bec0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f   fts5ChunkIterEo
1bed0 66 28 70 2c 20 26 69 74 65 72 29 3d 3d 30 20 29  f(p, &iter)==0 )
1bee0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
1bef0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1bf00 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65  p->rc, pBuf, ite
1bf10 72 2e 6e 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20  r.n, iter.p);.  
1bf20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
1bf30 74 65 72 4e 65 78 74 28 70 2c 20 26 69 74 65 72  terNext(p, &iter
1bf40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1bf50 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74  .    fts5ChunkIt
1bf60 65 72 52 65 6c 65 61 73 65 28 26 69 74 65 72 29  erRelease(&iter)
1bf70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1bf80 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74  void fts5Doclist
1bf90 49 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63  IterNext(Fts5Doc
1bfa0 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 29  listIter *pIter)
1bfb0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  {.  if( pIter->i
1bfc0 3c 70 49 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20  <pIter->n ){.   
1bfd0 20 69 66 28 20 70 49 74 65 72 2d 3e 69 20 29 7b   if( pIter->i ){
1bfe0 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74  .      i64 iDelt
1bff0 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  a;.      pIter->
1c000 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  i += getVarint(&
1c010 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e  pIter->a[pIter->
1c020 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  i], (u64*)&iDelt
1c030 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  a);.      if( pI
1c040 74 65 72 2d 3e 62 41 73 63 20 29 7b 0a 20 20 20  ter->bAsc ){.   
1c050 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77       pIter->iRow
1c060 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
1c070 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c080 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
1c090 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   -= iDelta;.    
1c0a0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1c0b0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d       pIter->i +=
1c0c0 20 67 65 74 56 61 72 69 6e 74 28 26 70 49 74 65   getVarint(&pIte
1c0d0 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20  r->a[pIter->i], 
1c0e0 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
1c0f0 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
1c100 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74   pIter->i += get
1c110 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d  Varint32(&pIter-
1c120 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 70 49  >a[pIter->i], pI
1c130 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 29 3b 0a  ter->nPoslist);.
1c140 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c      pIter->aPosl
1c150 69 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 5b  ist = &pIter->a[
1c160 70 49 74 65 72 2d 3e 69 5d 3b 0a 20 20 20 20 70  pIter->i];.    p
1c170 49 74 65 72 2d 3e 69 20 2b 3d 20 70 49 74 65 72  Iter->i += pIter
1c180 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65  ->nPoslist;.  }e
1c190 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
1c1a0 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20  aPoslist = 0;.  
1c1b0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
1c1c0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
1c1d0 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66 66  Init(.  Fts5Buff
1c1e0 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  er *pBuf, .  int
1c1f0 20 62 41 73 63 2c 20 0a 20 20 46 74 73 35 44 6f   bAsc, .  Fts5Do
1c200 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72  clistIter *pIter
1c210 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  .){.  memset(pIt
1c220 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
1c230 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
1c240 3e 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20  >a = pBuf->p;.  
1c250 70 49 74 65 72 2d 3e 6e 20 3d 20 70 42 75 66 2d  pIter->n = pBuf-
1c260 3e 6e 3b 0a 20 20 70 49 74 65 72 2d 3e 62 41 73  >n;.  pIter->bAs
1c270 63 20 3d 20 62 41 73 63 3b 0a 20 20 66 74 73 35  c = bAsc;.  fts5
1c280 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
1c290 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
1c2a0 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73   Append a doclis
1c2b0 74 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  t to buffer pBuf
1c2c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c2d0 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
1c2e0 44 6f 63 69 64 28 0a 20 20 69 6e 74 20 2a 70 52  Docid(.  int *pR
1c2f0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1c300 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
1c310 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a  UT: Error code *
1c320 2f 0a 20 20 69 6e 74 20 62 41 73 63 2c 0a 20 20  /.  int bAsc,.  
1c330 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1c340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c350 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 69  /* Buffer to wri
1c360 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a  te to */.  i64 *
1c370 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20  piLastRowid,    
1c380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
1c390 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72  /OUT: Previous r
1c3a0 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28 69 66  owid written (if
1c3b0 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69   any) */.  i64 i
1c3c0 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
1c3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1c3e0 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  wid to append */
1c3f0 0a 29 7b 0a 20 20 69 66 28 20 70 42 75 66 2d 3e  .){.  if( pBuf->
1c400 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
1c410 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1c420 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52  nt(pRc, pBuf, iR
1c430 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69  owid);.  }else i
1c440 66 28 20 62 41 73 63 3d 3d 30 20 29 7b 0a 20 20  f( bAsc==0 ){.  
1c450 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1c460 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42  ndVarint(pRc, pB
1c470 75 66 2c 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  uf, *piLastRowid
1c480 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65   - iRowid);.  }e
1c490 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75 66  lse{.    fts5Buf
1c4a0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1c4b0 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69  pRc, pBuf, iRowi
1c4c0 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  d - *piLastRowid
1c4d0 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61 73 74  );.  }.  *piLast
1c4e0 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1c4f0 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73  }../*.** Buffers
1c500 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61   p1 and p2 conta
1c510 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69  in doclists. Thi
1c520 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65  s function merge
1c530 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  s the content.**
1c540 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c   of the two docl
1c550 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e  ists together an
1c560 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31  d sets buffer p1
1c570 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62   to the result b
1c580 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
1c590 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
1c5a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1c5b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
1c5c0 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66  eft in p->rc. If
1c5d0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a   an error has.**
1c5e0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1c5f0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1c600 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1c610 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1c620 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
1c630 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1c640 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c650 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1c660 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1c670 69 6e 74 20 62 41 73 63 2c 0a 20 20 46 74 73 35  int bAsc,.  Fts5
1c680 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20  Buffer *p1,     
1c690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c6a0 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72  irst list to mer
1c6b0 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ge */.  Fts5Buff
1c6c0 65 72 20 2a 70 32 20 20 20 20 20 20 20 20 20 20  er *p2          
1c6d0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e          /* Secon
1c6e0 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  d list to merge 
1c6f0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e  */.){.  if( p2->
1c700 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 61  n ){.    i64 iLa
1c710 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
1c720 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
1c730 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44 6f 63   i1;.    Fts5Doc
1c740 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20 20 20  listIter i2;.   
1c750 20 46 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b   Fts5Buffer out;
1c760 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
1c770 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  tmp;.    memset(
1c780 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &out, 0, sizeof(
1c790 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  out));.    memse
1c7a0 74 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f  t(&tmp, 0, sizeo
1c7b0 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20 66 74  f(tmp));..    ft
1c7c0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
1c7d0 74 28 70 31 2c 20 62 41 73 63 2c 20 26 69 31 29  t(p1, bAsc, &i1)
1c7e0 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ;.    fts5Doclis
1c7f0 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20 62 41  tIterInit(p2, bA
1c800 73 63 2c 20 26 69 32 29 3b 0a 20 20 20 20 77 68  sc, &i2);.    wh
1c810 69 6c 65 28 20 69 31 2e 61 50 6f 73 6c 69 73 74  ile( i1.aPoslist
1c820 21 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69  !=0 || i2.aPosli
1c830 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  st!=0 ){.      i
1c840 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i2.aPoslist==
1c850 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73  0 || (i1.aPoslis
1c860 74 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  t && .          
1c870 20 28 20 28 21 62 41 73 63 20 26 26 20 69 31 2e   ( (!bAsc && i1.
1c880 69 52 6f 77 69 64 3e 69 32 2e 69 52 6f 77 69 64  iRowid>i2.iRowid
1c890 29 20 7c 7c 20 28 62 41 73 63 20 26 26 20 69 31  ) || (bAsc && i1
1c8a0 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69  .iRowid<i2.iRowi
1c8b0 64 29 20 29 0a 20 20 20 20 20 20 29 29 7b 0a 20  d) ).      )){. 
1c8c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
1c8d0 6e 74 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a  ntry from i1 */.
1c8e0 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
1c8f0 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d  eAppendDocid(&p-
1c900 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f 75 74 2c  >rc, bAsc, &out,
1c910 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31   &iLastRowid, i1
1c920 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
1c930 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1c940 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1c950 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69   &out, i1.nPosli
1c960 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  st);.        fts
1c970 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1c980 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  b(&p->rc, &out, 
1c990 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 31 2e  i1.nPoslist, i1.
1c9a0 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  aPoslist);.     
1c9b0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
1c9c0 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
1c9d0 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20     }.      else 
1c9e0 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d  if( i1.aPoslist=
1c9f0 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21  =0 || i2.iRowid!
1ca00 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20  =i1.iRowid ){.  
1ca10 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e        /* Copy en
1ca20 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20  try from i2 */. 
1ca30 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
1ca40 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e  AppendDocid(&p->
1ca50 72 63 2c 20 62 41 73 63 2c 20 26 6f 75 74 2c 20  rc, bAsc, &out, 
1ca60 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e  &iLastRowid, i2.
1ca70 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1ca80 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ca90 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1caa0 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  &out, i2.nPoslis
1cab0 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t);.        fts5
1cac0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1cad0 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69  (&p->rc, &out, i
1cae0 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 32 2e 61  2.nPoslist, i2.a
1caf0 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Poslist);.      
1cb00 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
1cb10 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20  rNext(&i2);.    
1cb20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a    }.      else{.
1cb30 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
1cb40 69 73 74 52 65 61 64 65 72 20 72 31 3b 0a 20 20  istReader r1;.  
1cb50 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
1cb60 74 52 65 61 64 65 72 20 72 32 3b 0a 20 20 20 20  tReader r2;.    
1cb70 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57      Fts5PoslistW
1cb80 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 0a 20  riter writer;.. 
1cb90 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77         memset(&w
1cba0 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
1cbb0 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20 20 20  (writer));..    
1cbc0 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65      /* Merge the
1cbd0 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69   two position li
1cbe0 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20  sts. */ .       
1cbf0 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
1cc00 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 41  Docid(&p->rc, bA
1cc10 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74  sc, &out, &iLast
1cc20 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
1cc30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
1cc40 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b  ufferZero(&tmp);
1cc50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1cc60 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1cc70 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e 61 50 6f  rInit(-1, i1.aPo
1cc80 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69  slist, i1.nPosli
1cc90 73 74 2c 20 26 72 31 29 3b 0a 20 20 20 20 20 20  st, &r1);.      
1cca0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
1ccb0 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d  listReaderInit(-
1ccc0 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20  1, i2.aPoslist, 
1ccd0 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 72 32  i2.nPoslist, &r2
1cce0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
1ccf0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1cd00 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f 66 3d 3d  OK && (r1.bEof==
1cd10 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d 3d 30 29  0 || r2.bEof==0)
1cd20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36   ){.          i6
1cd30 34 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  4 iNew;.        
1cd40 20 20 69 66 28 20 72 32 2e 62 45 6f 66 20 7c 7c    if( r2.bEof ||
1cd50 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 26 26 20   (r1.bEof==0 && 
1cd60 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50 6f 73 29  r1.iPos<r2.iPos)
1cd70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cd80 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f 73 3b 0a  iNew = r1.iPos;.
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1cda0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
1cdb0 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b 0a 20  aderNext(&r1);. 
1cdc0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 69 4e 65 77              iNew
1cde0 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20 20 20 20   = r2.iPos;.    
1cdf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1ce00 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
1ce10 4e 65 78 74 28 26 72 32 29 3b 0a 20 20 20 20 20  Next(&r2);.     
1ce20 20 20 20 20 20 20 20 69 66 28 20 72 31 2e 69 50         if( r1.iP
1ce30 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29 20 73 71  os==r2.iPos ) sq
1ce40 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
1ce50 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b  ReaderNext(&r1);
1ce60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ce70 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
1ce80 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1ce90 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 74  tWriterAppend(&t
1cea0 6d 70 2c 20 26 77 72 69 74 65 72 2c 20 69 4e 65  mp, &writer, iNe
1ceb0 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  w);.        }.. 
1cec0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1ced0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1cee0 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70 2e  ->rc, &out, tmp.
1cef0 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
1cf00 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1cf10 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74  (&p->rc, &out, t
1cf20 6d 70 2e 6e 2c 20 74 6d 70 2e 70 29 3b 0a 20 20  mp.n, tmp.p);.  
1cf30 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
1cf40 74 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a  tIterNext(&i1);.
1cf50 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
1cf60 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29  istIterNext(&i2)
1cf70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cf80 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
1cf90 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f  et(&p->rc, p1, o
1cfa0 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20  ut.n, out.p);.  
1cfb0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1cfc0 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74 73 35  (&tmp);.    fts5
1cfd0 42 75 66 66 65 72 46 72 65 65 28 26 6f 75 74 29  BufferFree(&out)
1cfe0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1cff0 76 6f 69 64 20 66 74 73 35 42 75 66 66 65 72 53  void fts5BufferS
1d000 77 61 70 28 46 74 73 35 42 75 66 66 65 72 20 2a  wap(Fts5Buffer *
1d010 70 31 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  p1, Fts5Buffer *
1d020 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65  p2){.  Fts5Buffe
1d030 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a  r tmp = *p1;.  *
1d040 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20  p1 = *p2;.  *p2 
1d050 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63  = tmp;.}..static
1d060 20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70 50   void fts5SetupP
1d070 72 65 66 69 78 49 74 65 72 28 0a 20 20 46 74 73  refixIter(.  Fts
1d080 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d0a0 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66 72  Index to read fr
1d0b0 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 41 73 63  om */.  int bAsc
1d0c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d0d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1d0e0 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f  for "ORDER BY ro
1d0f0 77 69 64 20 41 53 43 22 20 2a 2f 0a 20 20 63 6f  wid ASC" */.  co
1d100 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20  nst u8 *pToken, 
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d120 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
1d130 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61 74  ng prefix to mat
1d140 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b  ch */.  int nTok
1d150 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
1d160 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1d170 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65 6e  of buffer pToken
1d180 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46   in bytes */.  F
1d190 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
1d1a0 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  ter            /
1d1b0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
1d1c0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
1d1d0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1d1e0 74 72 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66  truct;.  Fts5Buf
1d1f0 66 65 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e  fer *aBuf;.  con
1d200 73 74 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32  st int nBuf = 32
1d210 3b 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73  ;..  aBuf = (Fts
1d220 35 42 75 66 66 65 72 2a 29 66 74 73 35 49 64 78  5Buffer*)fts5Idx
1d230 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
1d240 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75  (Fts5Buffer)*nBu
1d250 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  f);.  pStruct = 
1d260 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
1d270 64 28 70 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20  d(p, 0);..  if( 
1d280 61 42 75 66 20 26 26 20 70 53 74 72 75 63 74 20  aBuf && pStruct 
1d290 29 7b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69  ){.    Fts5Docli
1d2a0 73 74 49 74 65 72 20 2a 70 44 6f 63 6c 69 73 74  stIter *pDoclist
1d2b0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1d2c0 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
1d2d0 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 4d 75 6c  = 0;.    Fts5Mul
1d2e0 74 69 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  tiSegIter *p1 = 
1d2f0 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74  0;     /* Iterat
1d300 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74 68 65  or used to gathe
1d310 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65  r data from inde
1d320 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66  x */.    Fts5Buf
1d330 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20  fer doclist;..  
1d340 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73    memset(&doclis
1d350 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63  t, 0, sizeof(doc
1d360 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 6f 72 28  list));.    for(
1d370 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
1d380 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20  (p, pStruct, 0, 
1d390 31 2c 20 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54  1, 1, pToken, nT
1d3a0 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31  oken, -1, 0, &p1
1d3b0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
1d3c0 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
1d3d0 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66  1)==0;.        f
1d3e0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
1d3f0 28 70 2c 20 70 31 2c 20 30 2c 20 30 29 0a 20 20  (p, p1, 0, 0).  
1d400 20 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69    ){.      i64 i
1d410 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74  Rowid = fts5Mult
1d420 69 49 74 65 72 52 6f 77 69 64 28 70 31 29 3b 0a  iIterRowid(p1);.
1d430 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
1d440 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
1d450 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c  *pTerm = fts5Mul
1d460 74 69 49 74 65 72 54 65 72 6d 28 70 31 2c 20 26  tiIterTerm(p1, &
1d470 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 61 73  nTerm);.      as
1d480 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 70 54 6f  sert( memcmp(pTo
1d490 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28  ken, pTerm, MIN(
1d4a0 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c  nToken, nTerm))<
1d4b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
1d4c0 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20  nTerm<nToken || 
1d4d0 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70  memcmp(pToken, p
1d4e0 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20  Term, nToken) ) 
1d4f0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66  break;..      if
1d500 28 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 0a 20  ( doclist.n>0 . 
1d510 20 20 20 20 20 20 26 26 20 28 28 21 62 41 73 63        && ((!bAsc
1d520 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4c 61 73   && iRowid>=iLas
1d530 74 52 6f 77 69 64 29 20 7c 7c 20 28 62 41 73 63  tRowid) || (bAsc
1d540 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73   && iRowid<=iLas
1d550 74 52 6f 77 69 64 29 29 0a 20 20 20 20 20 20 29  tRowid)).      )
1d560 7b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  {..        for(i
1d570 3d 30 3b 20 64 6f 63 6c 69 73 74 2e 6e 20 26 26  =0; doclist.n &&
1d580 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d590 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  K; i++){.       
1d5a0 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75     assert( i<nBu
1d5b0 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  f );.          i
1d5c0 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20  f( aBuf[i].n==0 
1d5d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
1d5e0 74 73 35 42 75 66 66 65 72 53 77 61 70 28 26 64  ts5BufferSwap(&d
1d5f0 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
1d600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
1d610 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64  ts5BufferZero(&d
1d620 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oclist);.       
1d630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d640 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 50        fts5MergeP
1d650 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20 62 41  refixLists(p, bA
1d660 73 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61  sc, &doclist, &a
1d670 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
1d680 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
1d690 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20  ero(&aBuf[i]);. 
1d6a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1d6b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d6c0 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e     if( doclist.n
1d6d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
1d6e0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d6f0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64  arint(&p->rc, &d
1d700 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69 64 29 3b  oclist, iRowid);
1d710 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1d720 20 62 41 73 63 3d 3d 30 20 29 7b 0a 20 20 20 20   bAsc==0 ){.    
1d730 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1d740 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1d750 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 4c 61  c, &doclist, iLa
1d760 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77 69 64  stRowid - iRowid
1d770 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1d780 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1d790 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d7a0 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c  p->rc, &doclist,
1d7b0 20 69 52 6f 77 69 64 20 2d 20 69 4c 61 73 74 52   iRowid - iLastR
1d7c0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  owid);.      }. 
1d7d0 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20       iLastRowid 
1d7e0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  = iRowid;.      
1d7f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73  fts5MultiIterPos
1d800 6c 69 73 74 28 70 2c 20 70 31 2c 20 31 2c 20 26  list(p, p1, 1, &
1d810 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  doclist);.    }.
1d820 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1d830 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nBuf; i++){.    
1d840 20 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69    fts5MergePrefi
1d850 78 4c 69 73 74 73 28 70 2c 20 62 41 73 63 2c 20  xLists(p, bAsc, 
1d860 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
1d870 69 5d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  i]);.      fts5B
1d880 75 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b  ufferFree(&aBuf[
1d890 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
1d8a0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
1d8b0 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44  (p, p1);..    pD
1d8c0 6f 63 6c 69 73 74 20 3d 20 28 46 74 73 35 44 6f  oclist = (Fts5Do
1d8d0 63 6c 69 73 74 49 74 65 72 2a 29 66 74 73 35 49  clistIter*)fts5I
1d8e0 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
1d8f0 6f 66 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74  of(Fts5DoclistIt
1d900 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  er));.    if( !p
1d910 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
1d920 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1d930 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d  &doclist);.    }
1d940 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1d950 72 2d 3e 70 44 6f 63 6c 69 73 74 20 3d 20 70 44  r->pDoclist = pD
1d960 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 66 74  oclist;.      ft
1d970 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
1d980 74 28 26 64 6f 63 6c 69 73 74 2c 20 62 41 73 63  t(&doclist, bAsc
1d990 2c 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  , pIter->pDoclis
1d9a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  t);.    }.  }.. 
1d9b0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1d9c0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
1d9d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
1d9e0 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Buf);.}../*.** R
1d9f0 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  un internal chec
1da00 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ks to ensure tha
1da10 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20  t the FTS index 
1da20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c  (a) is internall
1da30 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74  y .** consistent
1da40 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
1da50 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68  s entries for wh
1da60 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74  ich the XOR of t
1da70 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20  he checksums.** 
1da80 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79  as calculated by
1da90 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
1daa0 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e  ksum() is cksum.
1dab0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1dac0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
1dad0 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72  any of the inter
1dae0 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c  nal checks fail,
1daf0 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68   or if the.** ch
1db00 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20  ecksum does not 
1db10 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51  match. Return SQ
1db20 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63  LITE_OK if all c
1db30 68 65 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f  hecks pass witho
1db40 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20  ut.** error, or 
1db50 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74  some other SQLit
1db60 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
1db70 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65  another error (e
1db80 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75  .g. OOM).** occu
1db90 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
1dba0 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67  e3Fts5IndexInteg
1dbb0 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e  rityCheck(Fts5In
1dbc0 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75  dex *p, u64 cksu
1dbd0 6d 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  m){.  Fts5Config
1dbe0 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
1dbf0 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 49  Config;.  int iI
1dc00 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
1dc10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1dc20 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
1dc30 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
1dc40 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1dc70 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 32   */.  u64 cksum2
1dc80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1dc90 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
1dca0 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65  m based on conte
1dcb0 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a  nts of indexes *
1dcc0 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  /..  /* Check th
1dcd0 61 74 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  at the checksum 
1dce0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6d 61 74  of the index mat
1dcf0 63 68 65 73 20 74 68 65 20 61 72 67 75 6d 65 6e  ches the argumen
1dd00 74 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20  t checksum */.  
1dd10 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49 64 78  for(iIdx=0; iIdx
1dd20 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
1dd30 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20  ix; iIdx++){.   
1dd40 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
1dd50 72 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 46 74  r *pIter;.    Ft
1dd60 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1dd70 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
1dd80 74 75 72 65 52 65 61 64 28 70 2c 20 69 49 64 78  tureRead(p, iIdx
1dd90 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4d  );.    for(fts5M
1dda0 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
1ddb0 53 74 72 75 63 74 2c 20 69 49 64 78 2c 20 30 2c  Struct, iIdx, 0,
1ddc0 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c   0, 0, 0, -1, 0,
1ddd0 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20   &pIter);.      
1dde0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
1ddf0 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
1de00 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
1de10 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
1de20 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 20 20 29  ter, 0, 0).    )
1de30 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 49  {.      Fts5PosI
1de40 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20  ter sPos;       
1de50 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
1de60 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70  terate through p
1de70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
1de80 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20        int n;    
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dea0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
1deb0 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
1dec0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
1ded0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
1dee0 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20  wid(pIter);.    
1def0 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
1df00 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
1df10 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b  Term(pIter, &n);
1df20 0a 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73 35  ..      for(fts5
1df30 50 6f 73 49 74 65 72 49 6e 69 74 28 70 2c 20 70  PosIterInit(p, p
1df40 49 74 65 72 2c 20 26 73 50 6f 73 29 3b 0a 20 20  Iter, &sPos);.  
1df50 20 20 20 20 20 20 20 20 66 74 73 35 50 6f 73 49          fts5PosI
1df60 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73 29  terEof(p, &sPos)
1df70 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ==0;.          f
1df80 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28 70  ts5PosIterNext(p
1df90 2c 20 26 73 50 6f 73 29 0a 20 20 20 20 20 20 29  , &sPos).      )
1dfa0 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32  {.        cksum2
1dfb0 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74   ^= fts5IndexEnt
1dfc0 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
1dfd0 73 50 6f 73 2e 69 43 6f 6c 2c 20 73 50 6f 73 2e  sPos.iCol, sPos.
1dfe0 69 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a 23 69 66  iPos, z, n);.#if
1dff0 20 30 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e   0.        fprin
1e000 74 66 28 73 74 64 6f 75 74 2c 20 22 72 6f 77 69  tf(stdout, "rowi
1e010 64 3d 25 64 20 22 2c 20 28 69 6e 74 29 69 52 6f  d=%d ", (int)iRo
1e020 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 70  wid);.        fp
1e030 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74  rintf(stdout, "t
1e040 65 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e 2c 20 7a  erm=%.*s ", n, z
1e050 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
1e060 74 66 28 73 74 64 6f 75 74 2c 20 22 63 6f 6c 3d  tf(stdout, "col=
1e070 25 64 20 22 2c 20 73 50 6f 73 2e 69 43 6f 6c 29  %d ", sPos.iCol)
1e080 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
1e090 66 28 73 74 64 6f 75 74 2c 20 22 6f 66 66 3d 25  f(stdout, "off=%
1e0a0 64 5c 6e 22 2c 20 73 50 6f 73 2e 69 50 6f 73 29  d\n", sPos.iPos)
1e0b0 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68  ;.        fflush
1e0c0 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66  (stdout);.#endif
1e0d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e0e0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1e0f0 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Free(p, pIter);.
1e100 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1e110 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1e120 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 2d  );.  }.  rc = p-
1e130 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  >rc;.  if( rc==S
1e140 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
1e150 6d 21 3d 63 6b 73 75 6d 32 20 29 20 72 63 20 3d  m!=cksum2 ) rc =
1e160 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
1e170 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1e180 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
1e190 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65  es of each segme
1e1a0 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61  nt match the lea
1e1b0 76 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 49 64  ves */.  for(iId
1e1c0 78 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  x=0; rc==SQLITE_
1e1d0 4f 4b 20 26 26 20 69 49 64 78 3c 3d 70 43 6f 6e  OK && iIdx<=pCon
1e1e0 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49  fig->nPrefix; iI
1e1f0 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53  dx++){.    Fts5S
1e200 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1e210 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
1e220 65 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a  eRead(p, iIdx);.
1e230 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20      if( pStruct 
1e240 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76  ){.      int iLv
1e250 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 66  l, iSeg;.      f
1e260 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
1e270 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
1e280 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
1e290 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
1e2a0 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
1e2b0 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
1e2c0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
1e2d0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
1e2e0 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
1e2f0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1e300 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d  iLvl].aSeg[iSeg]
1e310 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1e320 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
1e330 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 69 49  eckSegment(p, iI
1e340 64 78 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20  dx, pSeg);.     
1e350 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e360 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
1e370 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1e380 75 63 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  uct);.    rc = p
1e390 2d 3e 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ->rc;.  }..  ret
1e3a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1e3b0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
1e3c0 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63  all subsequent c
1e3d0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46  alls to sqlite3F
1e3e0 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20  ts5IndexWrite() 
1e3f0 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68  pertain.** to th
1e400 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
1e410 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f  rowid iRowid..*/
1e420 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1e430 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28  IndexBeginWrite(
1e440 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
1e450 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73  4 iRowid){.  ass
1e460 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
1e470 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 69  TE_OK );.  if( i
1e480 52 6f 77 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65  Rowid<=p->iWrite
1e490 52 6f 77 69 64 20 7c 7c 20 28 70 2d 3e 6e 50 65  Rowid || (p->nPe
1e4a0 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e  ndingData > p->n
1e4b0 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 29 20  MaxPendingData) 
1e4c0 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
1e4d0 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20  Flush(p);.  }.  
1e4e0 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d  p->iWriteRowid =
1e4f0 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 75 72   iRowid;.  retur
1e500 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
1e510 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n(p);.}../*.** C
1e520 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64 69  ommit data to di
1e530 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
1e540 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28  e3Fts5IndexSync(
1e550 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
1e560 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 61 73  t bCommit){.  as
1e570 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
1e580 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
1e590 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20  IndexFlush(p);. 
1e5a0 20 69 66 28 20 62 43 6f 6d 6d 69 74 20 29 20 66   if( bCommit ) f
1e5b0 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
1e5c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
1e5d0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
1e5e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
1e5f0 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
1e600 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1e610 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44  y hash tables. D
1e620 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a  o not write it.*
1e630 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1e640 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
1e650 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
1e660 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1e670 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65   %_data.** table
1e680 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
1e690 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e  d on disk. So an
1e6a0 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  y in-memory cach
1e6b0 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a  es of %_data .**
1e6c0 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65   records must be
1e6d0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
1e6e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1e6f0 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74  IndexRollback(Ft
1e700 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66  s5Index *p){.  f
1e710 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
1e720 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44 69  );.  fts5IndexDi
1e730 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20 20  scardData(p);.  
1e740 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
1e750 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
1e760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e770 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  }../*.** The %_d
1e780 61 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  ata table is com
1e790 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68  pletely empty wh
1e7a0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1e7b0 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73   is called. This
1e7c0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  .** function pop
1e7d0 75 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74  ulates it with t
1e7e0 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63  he initial struc
1e7f0 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72  ture objects for
1e800 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20   each index,.** 
1e810 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  and the initial 
1e820 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22  version of the "
1e830 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
1e840 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c   (a zero-byte bl
1e850 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ob)..*/.int sqli
1e860 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e  te3Fts5IndexRein
1e870 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  it(Fts5Index *p)
1e880 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73  {.  int i;.  Fts
1e890 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a 0a 20  5Structure s;.. 
1e8a0 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
1e8b0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
1e8c0 75 72 65 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ure));.  for(i=0
1e8d0 3b 20 69 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  ; i<p->pConfig->
1e8e0 6e 50 72 65 66 69 78 2b 31 3b 20 69 2b 2b 29 7b  nPrefix+1; i++){
1e8f0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1e900 72 65 57 72 69 74 65 28 70 2c 20 69 2c 20 26 73  reWrite(p, i, &s
1e910 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1e920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e930 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
1e940 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
1e950 41 76 65 72 61 67 65 73 28 70 2c 20 28 63 6f 6e  Averages(p, (con
1e960 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20  st u8*)"", 0);. 
1e970 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73   }..  return fts
1e980 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
1e990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1e9a0 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20 68   new Fts5Index h
1e9b0 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43  andle. If the bC
1e9c0 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69  reate argument i
1e9d0 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a  s true, create.*
1e9e0 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
1e9f0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1ea00 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a  %_data table..**
1ea10 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1ea20 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  l, set *pp to po
1ea30 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f  int to the new o
1ea40 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
1ea50 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
1ea60 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70  therwise, set *p
1ea70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65  p to NULL and re
1ea80 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
1ea90 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
1eaa0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
1eab0 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f  exOpen(.  Fts5Co
1eac0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a  nfig *pConfig, .
1ead0 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a    int bCreate, .
1eae0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70    Fts5Index **pp
1eaf0 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
1eb00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1eb10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35  QLITE_OK;.  Fts5
1eb20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1eb40 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  ew object */..  
1eb50 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49  *pp = p = (Fts5I
1eb60 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 5f 6d 61  ndex*)sqlite3_ma
1eb70 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 35  lloc(sizeof(Fts5
1eb80 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 21  Index));.  if( !
1eb90 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  p ) return SQLIT
1eba0 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 6d 65 6d 73  E_NOMEM;..  mems
1ebb0 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
1ebc0 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 70  Fts5Index));.  p
1ebd0 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e  ->pConfig = pCon
1ebe0 66 69 67 3b 0a 20 20 70 2d 3e 6e 43 72 69 73 69  fig;.  p->nCrisi
1ebf0 73 4d 65 72 67 65 20 3d 20 46 54 53 35 5f 43 52  sMerge = FTS5_CR
1ec00 49 53 49 53 5f 4d 45 52 47 45 3b 0a 20 20 70 2d  ISIS_MERGE;.  p-
1ec10 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53  >nWorkUnit = FTS
1ec20 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 70  5_WORK_UNIT;.  p
1ec30 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74  ->nMaxPendingDat
1ec40 61 20 3d 20 31 30 32 34 2a 31 30 32 34 3b 0a 20  a = 1024*1024;. 
1ec50 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73   p->zDataTbl = s
1ec60 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1ec70 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69  %s_data", pConfi
1ec80 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  g->zName);.  if(
1ec90 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d 30 20   p->zDataTbl==0 
1eca0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1ecb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
1ecc0 65 20 69 66 28 20 62 43 72 65 61 74 65 20 29 7b  e if( bCreate ){
1ecd0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ece0 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
1ecf0 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69  (.        pConfi
1ed00 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49  g, "data", "id I
1ed10 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1ed20 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c  EY, block BLOB",
1ed30 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 29 3b   0, pzErr.    );
1ed40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ed50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ed60 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
1ed70 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a  IndexReinit(p);.
1ed80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1ed90 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
1eda0 54 45 5f 4f 4b 20 7c 7c 20 72 63 21 3d 53 51 4c  TE_OK || rc!=SQL
1edb0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
1edc0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
1edd0 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
1ede0 70 2c 20 30 29 3b 0a 20 20 20 20 2a 70 70 20 3d  p, 0);.    *pp =
1edf0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1ee00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
1ee10 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65  ose a handle ope
1ee20 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
1ee30 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
1ee40 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29  3Fts5IndexOpen()
1ee50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ee60 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46  Fts5IndexClose(F
1ee70 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
1ee80 20 62 44 65 73 74 72 6f 79 29 7b 0a 20 20 69 6e   bDestroy){.  in
1ee90 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1eea0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1eeb0 20 69 66 28 20 62 44 65 73 74 72 6f 79 20 29 7b   if( bDestroy ){
1eec0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1eed0 74 65 33 46 74 73 35 44 72 6f 70 54 61 62 6c 65  te3Fts5DropTable
1eee0 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 22 64 61  (p->pConfig, "da
1eef0 74 61 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ta");.    }.    
1ef00 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64  assert( p->pRead
1ef10 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  er==0 );.    sql
1ef20 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
1ef30 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73  >pWriter);.    s
1ef40 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1ef50 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20  p->pDeleter);.  
1ef60 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 20    if( p->apHash 
1ef70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
1ef80 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1ef90 3c 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50  <=p->pConfig->nP
1efa0 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  refix; i++){.   
1efb0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1efc0 48 61 73 68 46 72 65 65 28 70 2d 3e 61 70 48 61  HashFree(p->apHa
1efd0 73 68 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  sh[i]);.      }.
1efe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1eff0 65 65 28 70 2d 3e 61 70 48 61 73 68 29 3b 0a 20  ee(p->apHash);. 
1f000 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1f010 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62  _free(p->zDataTb
1f020 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
1f030 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  free(p);.  }.  r
1f040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f050 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f  ** Argument p po
1f060 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
1f070 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d   containing utf-
1f080 38 20 74 65 78 74 20 74 68 61 74 20 69 73 20 6e  8 text that is n
1f090 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69   bytes in .** si
1f0a0 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ze. Return the n
1f0b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1f0c0 6e 20 74 68 65 20 6e 43 68 61 72 20 63 68 61 72  n the nChar char
1f0d0 61 63 74 65 72 20 70 72 65 66 69 78 20 6f 66 20  acter prefix of 
1f0e0 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f  the.** buffer, o
1f0f0 72 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  r 0 if there are
1f100 20 6c 65 73 73 20 74 68 61 6e 20 6e 43 68 61 72   less than nChar
1f110 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
1f120 6f 74 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  otal..*/.static 
1f130 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61  int fts5IndexCha
1f140 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 63 6f  rlenToBytelen(co
1f150 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 69 6e 74  nst char *p, int
1f160 20 6e 42 79 74 65 2c 20 69 6e 74 20 6e 43 68 61   nByte, int nCha
1f170 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  r){.  int n = 0;
1f180 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1f190 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b  i=0; i<nChar; i+
1f1a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e  +){.    if( n>=n
1f1b0 42 79 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Byte ) return 0;
1f1c0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
1f1d0 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
1f1e0 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a  an nChar chars *
1f1f0 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67  /.    if( (unsig
1f200 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e  ned char)p[n++]>
1f210 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77  =0xc0 ){.      w
1f220 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78  hile( (p[n] & 0x
1f230 63 30 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b  c0)==0x80 ) n++;
1f240 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1f250 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
1f260 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65  pIn is a UTF-8 e
1f270 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e  ncoded string, n
1f280 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  In bytes in size
1f290 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
1f2a0 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64  ber of.** unicod
1f2b0 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  e characters in 
1f2c0 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 69  the string..*/.i
1f2d0 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61 72  nt fts5IndexChar
1f2e0 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  len(const char *
1f2f0 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20  pIn, int nIn){. 
1f300 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20   int nChar = 0; 
1f310 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
1f320 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  t i = 0;.  while
1f330 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69  ( i<nIn ){.    i
1f340 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  f( (unsigned cha
1f350 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30  r)pIn[i++]>=0xc0
1f360 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
1f370 20 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69   i<nIn && (pIn[i
1f380 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
1f390 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ) i++;.    }.   
1f3a0 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20   nChar++;.  }.  
1f3b0 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a  return nChar;.}.
1f3c0 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74 65  ./*.** Calculate
1f3d0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
1f3e0 65 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20 74  ecksum that is t
1f3f0 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69 6e  he XOR of the in
1f400 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68 65  dex entry.** che
1f410 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74  cksum of all ent
1f420 72 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20  ries that would 
1f430 62 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  be generated by 
1f440 74 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69 66  the token specif
1f450 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 69  ied.** by the fi
1f460 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73 2e  nal 5 arguments.
1f470 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46  .*/.u64 sqlite3F
1f480 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a 20  ts5IndexCksum(. 
1f490 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
1f4a0 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20  nfig,           
1f4b0 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
1f4c0 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  n object */.  i6
1f4d0 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4f0 20 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20 61   Document term a
1f500 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69  ppears in */.  i
1f510 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
1f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f530 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61 70  * Column term ap
1f540 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e  pears in */.  in
1f550 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  t iPos,         
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f570 20 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20 61   Position term a
1f580 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 63  ppears in */.  c
1f590 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d  onst char *pTerm
1f5a0 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 2f  , int nTerm    /
1f5b0 2a 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20 2a  * Term at iPos *
1f5c0 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20 3d  /.){.  u64 ret =
1f5d0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f5e0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f5f0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
1f600 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
1f610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1f620 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
1f630 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
1f640 0a 20 20 72 65 74 20 3d 20 66 74 73 35 49 6e 64  .  ret = fts5Ind
1f650 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
1f660 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
1f670 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   pTerm, nTerm);.
1f680 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69  .  for(iIdx=0; i
1f690 49 64 78 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  Idx<pConfig->nPr
1f6a0 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
1f6b0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 66     int nByte = f
1f6c0 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54  ts5IndexCharlenT
1f6d0 6f 42 79 74 65 6c 65 6e 28 70 54 65 72 6d 2c 20  oBytelen(pTerm, 
1f6e0 6e 54 65 72 6d 2c 20 70 43 6f 6e 66 69 67 2d 3e  nTerm, pConfig->
1f6f0 61 50 72 65 66 69 78 5b 69 49 64 78 5d 29 3b 0a  aPrefix[iIdx]);.
1f700 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
1f710 0a 20 20 20 20 20 20 72 65 74 20 5e 3d 20 66 74  .      ret ^= ft
1f720 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
1f730 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  m(iRowid, iCol, 
1f740 69 50 6f 73 2c 20 70 54 65 72 6d 2c 20 6e 42 79  iPos, pTerm, nBy
1f750 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  te);.    }.  }..
1f760 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
1f770 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
1f780 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20   remove data to 
1f790 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  or from the inde
1f7a0 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 64  x. Each time a d
1f7b0 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61  ocument is .** a
1f7c0 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76  dded to or remov
1f7d0 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ed from the inde
1f7e0 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  x, this function
1f7f0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f   is called one o
1f800 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e  r more.** times.
1f810 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
1f820 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65  sert, it must be
1f830 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
1f840 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
1f850 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e  he new document.
1f860 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61  .** If the opera
1f870 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65  tion is a delete
1f880 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
1f890 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f  led (at least) o
1f8a0 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  nce for each.** 
1f8b0 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20  unique token in 
1f8c0 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
1f8d0 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20  h an iCol value 
1f8e0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20  less than zero. 
1f8f0 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75  The iPos.** argu
1f900 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20  ment is ignored 
1f910 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f  for a delete..*/
1f920 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1f930 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46 74  IndexWrite(.  Ft
1f940 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f960 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20   Index to write 
1f970 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  to */.  int iCol
1f980 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f990 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
1f9a0 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20  n token appears 
1f9b0 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74  in (-ve -> delet
1f9c0 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73  e) */.  int iPos
1f9d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f9e0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
1f9f0 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  ion of token wit
1fa00 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  hin column */.  
1fa10 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
1fa20 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20  en, int nToken  
1fa30 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20  /* Token to add 
1fa40 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20  or remove to or 
1fa50 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  from index */.){
1fa60 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
1fa90 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e  erate through in
1faa0 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 43  dexes */.  Fts5C
1fab0 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
1fac0 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 61   p->pConfig;.  a
1fad0 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1fae0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a  LITE_OK );..  /*
1faf0 20 41 6c 6c 6f 63 61 74 65 20 68 61 73 68 20 74   Allocate hash t
1fb00 61 62 6c 65 73 20 69 66 20 74 68 65 79 20 68 61  ables if they ha
1fb10 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  ve not already b
1fb20 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  een allocated */
1fb30 0a 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68  .  if( p->apHash
1fb40 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
1fb50 48 61 73 68 20 3d 20 70 43 6f 6e 66 69 67 2d 3e  Hash = pConfig->
1fb60 6e 50 72 65 66 69 78 20 2b 20 31 3b 0a 20 20 20  nPrefix + 1;.   
1fb70 20 70 2d 3e 61 70 48 61 73 68 20 3d 20 28 46 74   p->apHash = (Ft
1fb80 73 35 48 61 73 68 2a 2a 29 66 74 73 35 49 64 78  s5Hash**)fts5Idx
1fb90 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66  Malloc(p, sizeof
1fba0 28 46 74 73 35 48 61 73 68 2a 29 20 2a 20 6e 48  (Fts5Hash*) * nH
1fbb0 61 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ash);.    for(i=
1fbc0 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
1fbd0 5f 4f 4b 20 26 26 20 69 3c 6e 48 61 73 68 3b 20  _OK && i<nHash; 
1fbe0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  i++){.      p->r
1fbf0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
1fc00 61 73 68 4e 65 77 28 26 70 2d 3e 61 70 48 61 73  ashNew(&p->apHas
1fc10 68 5b 69 5d 2c 20 26 70 2d 3e 6e 50 65 6e 64 69  h[i], &p->nPendi
1fc20 6e 67 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  ngData);.    }. 
1fc30 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
1fc40 20 6e 65 77 20 74 6f 6b 65 6e 20 74 6f 20 74 68   new token to th
1fc50 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 68 61 73  e main terms has
1fc60 68 20 74 61 62 6c 65 2e 20 41 6e 64 20 74 6f 20  h table. And to 
1fc70 65 61 63 68 20 6f 66 20 74 68 65 0a 20 20 2a 2a  each of the.  **
1fc80 20 70 72 65 66 69 78 20 68 61 73 68 20 74 61 62   prefix hash tab
1fc90 6c 65 73 20 74 68 61 74 20 69 74 20 69 73 20 6c  les that it is l
1fca0 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 2e  arge enough for.
1fcb0 20 2a 2f 0a 20 20 66 74 73 35 41 64 64 54 65 72   */.  fts5AddTer
1fcc0 6d 54 6f 48 61 73 68 28 70 2c 20 30 2c 20 69 43  mToHash(p, 0, iC
1fcd0 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e  ol, iPos, pToken
1fce0 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 66 6f 72  , nToken);.  for
1fcf0 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d  (i=0; i<pConfig-
1fd00 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a  >nPrefix; i++){.
1fd10 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
1fd20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
1fd30 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e  ToBytelen(pToken
1fd40 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69  , nToken, pConfi
1fd50 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a  g->aPrefix[i]);.
1fd60 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
1fd70 0a 20 20 20 20 20 20 66 74 73 35 41 64 64 54 65  .      fts5AddTe
1fd80 72 6d 54 6f 48 61 73 68 28 70 2c 20 69 2b 31 2c  rmToHash(p, i+1,
1fd90 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 6f   iCol, iPos, pTo
1fda0 6b 65 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ken, nByte);.   
1fdb0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1fdc0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
1fdd0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  (p);.}../*.** Op
1fde0 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f  en a new iterato
1fdf0 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f  r to iterate tho
1fe00 75 67 68 20 61 6c 6c 20 64 6f 63 69 64 73 20 74  ugh all docids t
1fe10 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a  hat match the .*
1fe20 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65  * specified toke
1fe30 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69  n or token prefi
1fe40 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
1fe50 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
1fe60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe80 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
1fe90 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f  to query */.  co
1fea0 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
1feb0 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a  , int nToken, /*
1fec0 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69   Token (or prefi
1fed0 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  x) to query for 
1fee0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1fef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff00 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1ff10 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
1ff20 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
1ff30 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49  5IndexIter **ppI
1ff40 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
1ff50 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f  OUT: New iterato
1ff60 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
1ff70 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
1ff80 70 52 65 74 3b 0a 20 20 69 6e 74 20 69 49 64 78  pRet;.  int iIdx
1ff90 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 66 6c 61   = 0;..  if( fla
1ffa0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
1ffb0 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20  UERY_PREFIX ){. 
1ffc0 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
1ffd0 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
1ffe0 66 69 67 3b 0a 20 20 20 20 69 6e 74 20 6e 43 68  fig;.    int nCh
1fff0 61 72 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68  ar = fts5IndexCh
20000 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54  arlen(pToken, nT
20010 6f 6b 65 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69  oken);.    for(i
20020 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f  Idx=1; iIdx<=pCo
20030 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
20040 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Idx++){.      if
20050 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  ( pConfig->aPref
20060 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61  ix[iIdx-1]==nCha
20070 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
20080 0a 20 20 20 20 69 66 28 20 69 49 64 78 3e 70 43  .    if( iIdx>pC
20090 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29  onfig->nPrefix )
200a0 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 2d  {.      iIdx = -
200b0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
200c0 70 52 65 74 20 3d 20 28 46 74 73 35 49 6e 64 65  pRet = (Fts5Inde
200d0 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 46 74  xIter*)sqlite3Ft
200e0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
200f0 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  >rc, sizeof(Fts5
20100 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 20 20 69  IndexIter));.  i
20110 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 6d  f( pRet ){.    m
20120 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 73  emset(pRet, 0, s
20130 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49  izeof(Fts5IndexI
20140 74 65 72 29 29 3b 0a 0a 20 20 20 20 70 52 65 74  ter));..    pRet
20150 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20  ->pIndex = p;.  
20160 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 7b    if( iIdx>=0 ){
20170 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 70 53 74  .      pRet->pSt
20180 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
20190 74 75 72 65 52 65 61 64 28 70 2c 20 69 49 64 78  tureRead(p, iIdx
201a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
201b0 74 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a 20 20  t->pStruct ){.  
201c0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
201d0 74 65 72 4e 65 77 28 70 2c 20 70 52 65 74 2d 3e  terNew(p, pRet->
201e0 70 53 74 72 75 63 74 2c 20 0a 20 20 20 20 20 20  pStruct, .      
201f0 20 20 20 20 20 20 69 49 64 78 2c 20 31 2c 20 66        iIdx, 1, f
20200 6c 61 67 73 2c 20 28 63 6f 6e 73 74 20 75 38 2a  lags, (const u8*
20210 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c  )pToken, nToken,
20220 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 2d 3e 70   -1, 0, &pRet->p
20230 4d 75 6c 74 69 0a 20 20 20 20 20 20 20 20 29 3b  Multi.        );
20240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
20250 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 41  se{.      int bA
20260 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  sc = (flags & FT
20270 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 41 53  S5INDEX_QUERY_AS
20280 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  C)!=0;.      fts
20290 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72  5SetupPrefixIter
202a0 28 70 2c 20 62 41 73 63 2c 20 28 63 6f 6e 73 74  (p, bAsc, (const
202b0 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f   u8*)pToken, nTo
202c0 6b 65 6e 2c 20 70 52 65 74 29 3b 0a 20 20 20 20  ken, pRet);.    
202d0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
202e0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
202f0 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70  3Fts5IterClose(p
20300 52 65 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  Ret);.    pRet =
20310 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 74 65   0;.  }.  *ppIte
20320 72 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75  r = pRet;.  retu
20330 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
20340 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
20350 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
20360 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
20370 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
20380 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f  rgument is at EO
20390 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  F..*/.int sqlite
203a0 33 46 74 73 35 49 74 65 72 45 6f 66 28 46 74 73  3Fts5IterEof(Fts
203b0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
203c0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  r){.  assert( pI
203d0 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
203e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
203f0 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
20400 69 73 74 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ist ){ .    retu
20410 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  rn pIter->pDocli
20420 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3d 3d 30 3b  st->aPoslist==0;
20430 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72   .  }else{.    r
20440 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49  eturn fts5MultiI
20450 74 65 72 45 6f 66 28 70 49 74 65 72 2d 3e 70 49  terEof(pIter->pI
20460 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75  ndex, pIter->pMu
20470 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  lti);.  }.}../*.
20480 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e  ** Move to the n
20490 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  ext matching row
204a0 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  id. .*/.int sqli
204b0 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 28  te3Fts5IterNext(
204c0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
204d0 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
204e0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
204f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
20500 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44  .  if( pIter->pD
20510 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 66 74  oclist ){.    ft
20520 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
20530 74 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  t(pIter->pDoclis
20540 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
20550 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
20560 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
20570 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
20580 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70  terNext(pIter->p
20590 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d  Index, pIter->pM
205a0 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ulti, 0, 0);.  }
205b0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
205c0 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d  dexReturn(pIter-
205d0 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a  >pIndex);.}../*.
205e0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64 6f 63 6c  ** Move the docl
205f0 69 73 74 2d 69 74 65 72 20 70 61 73 73 65 64 20  ist-iter passed 
20600 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
20610 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  ument to the nex
20620 74 20 0a 2a 2a 20 6d 61 74 63 68 69 6e 67 20 72  t .** matching r
20630 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72 73  owid that occurs
20640 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61   at or after iMa
20650 74 63 68 2e 20 54 68 65 20 64 65 66 69 6e 69 74  tch. The definit
20660 69 6f 6e 20 6f 66 20 22 61 74 20 0a 2a 2a 20 6f  ion of "at .** o
20670 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73  r after" depends
20680 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73   on whether this
20690 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74   iterator iterat
206a0 65 73 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  es in ascending 
206b0 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e 64 69 6e  or .** descendin
206c0 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a  g rowid order..*
206d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
206e0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
206f0 74 46 72 6f 6d 28 46 74 73 35 44 6f 63 6c 69 73  tFrom(Fts5Doclis
20700 74 49 74 65 72 20 2a 70 2c 20 69 36 34 20 69 4d  tIter *p, i64 iM
20710 61 74 63 68 29 7b 0a 20 20 64 6f 7b 0a 20 20 20  atch){.  do{.   
20720 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 70 2d   i64 iRowid = p-
20730 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 69 66 28  >iRowid;.    if(
20740 20 70 2d 3e 62 41 73 63 21 3d 30 20 26 26 20 69   p->bAsc!=0 && i
20750 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
20760 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
20770 2d 3e 62 41 73 63 3d 3d 30 20 26 26 20 69 52 6f  ->bAsc==0 && iRo
20780 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72  wid<=iMatch ) br
20790 65 61 6b 3b 0a 20 20 20 20 66 74 73 35 44 6f 63  eak;.    fts5Doc
207a0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 29 3b  listIterNext(p);
207b0 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e 61 50  .  }while( p->aP
207c0 6f 73 6c 69 73 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a  oslist );.}../*.
207d0 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e  ** Move to the n
207e0 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  ext matching row
207f0 69 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  id that occurs a
20800 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63  t or after iMatc
20810 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69  h. The.** defini
20820 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61  tion of "at or a
20830 66 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e  fter" depends on
20840 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74   whether this it
20850 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a  erator iterates.
20860 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
20870 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  or descending ro
20880 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e  wid order..*/.in
20890 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
208a0 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e  rNextFrom(Fts5In
208b0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
208c0 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 69  i64 iMatch){.  i
208d0 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  f( pIter->pDocli
208e0 73 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f  st ){.    fts5Do
208f0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f  clistIterNextFro
20900 6d 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  m(pIter->pDoclis
20910 74 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 7d 65  t, iMatch);.  }e
20920 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c  lse{.    fts5Mul
20930 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  tiIterNextFrom(p
20940 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
20950 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61  ter->pMulti, iMa
20960 74 63 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  tch);.  }.  retu
20970 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
20980 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
20990 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
209a0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
209b0 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  owid..*/.i64 sql
209c0 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69  ite3Fts5IterRowi
209d0 64 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  d(Fts5IndexIter 
209e0 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
209f0 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29  Iter->pDoclist )
20a00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74  {.    return pIt
20a10 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 69 52  er->pDoclist->iR
20a20 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  owid;.  }else{. 
20a30 20 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75     return fts5Mu
20a40 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
20a50 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 7d  er->pMulti);.  }
20a60 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
20a70 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
20a80 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
20a90 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ng a copy of the
20aa0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66   position list f
20ab0 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  or.** the curren
20ac0 74 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74 20  t entry. Output 
20ad0 76 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73 20  variable *pn is 
20ae0 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
20af0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a  of the buffer .*
20b00 2a 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72  * in bytes befor
20b10 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
20b20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
20b30 62 75 66 66 65 72 20 64 6f 65 73 20 6e 6f 74 20  buffer does not 
20b40 69 6e 63 6c 75 64 65 20 74 68 65 20 30 78 30 30  include the 0x00
20b50 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65   terminator byte
20b60 20 73 74 6f 72 65 64 20 6f 6e 0a 2a 2a 20 64 69   stored on.** di
20b70 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
20b80 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73  e3Fts5IterPoslis
20b90 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  t(Fts5IndexIter 
20ba0 2a 70 49 74 65 72 2c 20 63 6f 6e 73 74 20 75 38  *pIter, const u8
20bb0 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 6e 29 7b   **pp, int *pn){
20bc0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
20bd0 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
20be0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
20bf0 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
20c00 20 29 7b 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49   ){.    *pn = pI
20c10 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 6e  ter->pDoclist->n
20c20 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 2a 70 70  Poslist;.    *pp
20c30 20 3d 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69   = pIter->pDocli
20c40 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3b 0a 20 20  st->aPoslist;.  
20c50 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 49  }else{.    Fts5I
20c60 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d  ndex *p = pIter-
20c70 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73  >pIndex;.    fts
20c80 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74  5BufferZero(&pIt
20c90 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
20ca0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50    fts5MultiIterP
20cb0 6f 73 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2d  oslist(p, pIter-
20cc0 3e 70 4d 75 6c 74 69 2c 20 30 2c 20 26 70 49 74  >pMulti, 0, &pIt
20cd0 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
20ce0 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70    *pn = pIter->p
20cf0 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 2a 70  oslist.n;.    *p
20d00 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  p = pIter->posli
20d10 73 74 2e 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  st.p;.  }.  retu
20d20 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
20d30 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
20d40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
20d50 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70  e an iterator op
20d60 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
20d70 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
20d80 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  e3Fts5IndexQuery
20d90 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
20da0 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
20db0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
20dc0 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
20dd0 74 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ter ){.    if( p
20de0 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29  Iter->pDoclist )
20df0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
20e00 66 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f 63  free(pIter->pDoc
20e10 6c 69 73 74 2d 3e 61 29 3b 0a 20 20 20 20 20 20  list->a);.      
20e20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
20e30 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20  er->pDoclist);. 
20e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20e50 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
20e60 65 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  e(pIter->pIndex,
20e70 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b   pIter->pMulti);
20e80 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
20e90 74 75 72 65 52 65 6c 65 61 73 65 28 70 49 74 65  tureRelease(pIte
20ea0 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20  r->pStruct);.   
20eb0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
20ec0 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  e(&pIter->poslis
20ed0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  t);.    }.    ft
20ee0 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49  s5CloseReader(pI
20ef0 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 20 20  ter->pIndex);.  
20f00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
20f10 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Iter);.  }.}../*
20f20 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 22 61 76  .** Read the "av
20f30 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 69  erages" record i
20f40 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73  nto the buffer s
20f50 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73  upplied as the s
20f60 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65  econd .** argume
20f70 6e 74 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  nt. Return SQLIT
20f80 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
20f90 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
20fa0 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
20fb0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
20fc0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
20fd0 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65  3Fts5IndexGetAve
20fe0 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
20ff0 2a 70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  *p, Fts5Buffer *
21000 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
21010 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
21020 4b 20 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52  K );.  fts5DataR
21030 65 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20 70  eadOrBuffer(p, p
21040 42 75 66 2c 20 46 54 53 35 5f 41 56 45 52 41 47  Buf, FTS5_AVERAG
21050 45 53 5f 52 4f 57 49 44 29 3b 0a 20 20 72 65 74  ES_ROWID);.  ret
21060 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
21070 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
21080 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75 72   Replace the cur
21090 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22 20  rent "averages" 
210a0 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65 20  record with the 
210b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
210c0 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c  buffer .** suppl
210d0 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  ied as the secon
210e0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  d argument..*/.i
210f0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
21100 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28 46  dexSetAverages(F
21110 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e  ts5Index *p, con
21120 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
21130 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73 65  t nData){.  asse
21140 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
21150 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44 61  E_OK );.  fts5Da
21160 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f  taWrite(p, FTS5_
21170 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20  AVERAGES_ROWID, 
21180 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
21190 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
211a0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
211b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
211c0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
211d0 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75  blocks this modu
211e0 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d  le has read from
211f0 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74   the %_data.** t
21200 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61  able since it wa
21210 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e  s created..*/.in
21220 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
21230 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65  exReads(Fts5Inde
21240 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  x *p){.  return 
21250 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  p->nRead;.}../*.
21260 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62 69  ** Set the 32-bi
21270 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73  t cookie value s
21280 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
21290 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63 74  rt of all struct
212a0 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ure .** records 
212b0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
212c0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
212d0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
212e0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
212f0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
21300 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
21310 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
21320 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e  error.** occurs.
21330 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
21340 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69  ts5IndexSetCooki
21350 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
21360 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74  int iNew){.  int
21370 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21380 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
21390 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
213a0 66 69 67 3b 0a 20 20 75 38 20 61 43 6f 6f 6b 69  fig;.  u8 aCooki
213b0 65 5b 34 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e[4];.  int i;..
213c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
213d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
213e0 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32  sqlite3Fts5Put32
213f0 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b  (aCookie, iNew);
21400 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
21410 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d  SQLITE_OK && i<=
21420 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
21430 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
21440 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20  te3_blob *pBlob 
21450 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 69 52 6f  = 0;.    i64 iRo
21460 77 69 64 20 3d 20 46 54 53 35 5f 53 54 52 55 43  wid = FTS5_STRUC
21470 54 55 52 45 5f 52 4f 57 49 44 28 69 29 3b 0a 20  TURE_ROWID(i);. 
21480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
21490 62 6c 6f 62 5f 6f 70 65 6e 28 0a 20 20 20 20 20  blob_open(.     
214a0 20 20 20 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20     pConfig->db, 
214b0 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d  pConfig->zDb, p-
214c0 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63  >zDataTbl, "bloc
214d0 6b 22 2c 20 69 52 6f 77 69 64 2c 20 31 2c 20 26  k", iRowid, 1, &
214e0 70 42 6c 6f 62 0a 20 20 20 20 29 3b 0a 20 20 20  pBlob.    );.   
214f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21500 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
21510 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70  te3_blob_write(p
21520 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34  Blob, aCookie, 4
21530 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 0);.      rc =
21540 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
21550 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20  ose(pBlob);.    
21560 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
21570 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74  rc;.}..int sqlit
21580 65 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43  e3Fts5IndexLoadC
21590 6f 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20  onfig(Fts5Index 
215a0 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  *p){.  Fts5Struc
215b0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
215c0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
215d0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20  tructureRead(p, 
215e0 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  0);.  fts5Struct
215f0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
21600 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ct);.  return ft
21610 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
21620 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
21630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
21670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
216a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
216b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65  **********.** Be
216c0 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69  low this point i
216d0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
216e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35  tion of the fts5
216f0 5f 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72  _decode() scalar
21700 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c  .** function onl
21710 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  y..*/../*.** Dec
21720 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61  ode a segment-da
21730 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68  ta rowid from th
21740 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20  e %_data table. 
21750 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
21760 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65  .** the opposite
21770 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53   of macro FTS5_S
21780 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a  EGMENT_ROWID()..
21790 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
217a0 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a  ts5DecodeRowid(.
217b0 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217d0 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20    /* Rowid from 
217e0 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
217f0 20 20 69 6e 74 20 2a 70 69 49 64 78 2c 20 20 20    int *piIdx,   
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 2f 2a 20 4f 55 54 3a 20 49 6e 64 65 78 20    /* OUT: Index 
21820 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69  */.  int *piSegi
21830 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
21840 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67       /* OUT: Seg
21850 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74  ment id */.  int
21860 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20   *piHeight,     
21870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21880 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20  OUT: Height */. 
21890 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20   int *piPgno    
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75   /* OUT: Page nu
218c0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69  mber */.){.  *pi
218d0 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f  Pgno = (int)(iRo
218e0 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
218f0 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  < FTS5_DATA_PAGE
21900 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
21910 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
21920 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69  A_PAGE_B;..  *pi
21930 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69  Height = (int)(i
21940 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
21950 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45   << FTS5_DATA_HE
21960 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20  IGHT_B) - 1));. 
21970 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
21980 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a  _DATA_HEIGHT_B;.
21990 0a 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28 69  .  *piSegid = (i
219a0 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
219b0 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
219c0 54 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a  TA_ID_B) - 1));.
219d0 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
219e0 35 5f 44 41 54 41 5f 49 44 5f 42 3b 0a 0a 20 20  5_DATA_ID_B;..  
219f0 2a 70 69 49 64 78 20 3d 20 28 69 6e 74 29 28 69  *piIdx = (int)(i
21a00 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31  Rowid & (((i64)1
21a10 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44   << FTS5_DATA_ID
21a20 58 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73  X_B) - 1));.}..s
21a30 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
21a40 65 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70  ebugRowid(int *p
21a50 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
21a60 70 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b  pBuf, i64 iKey){
21a70 0a 20 20 69 6e 74 20 69 49 64 78 2c 69 53 65 67  .  int iIdx,iSeg
21a80 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f  id,iHeight,iPgno
21a90 3b 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70  ;  /* Rowid comp
21aa0 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35  enents */.  fts5
21ab0 44 65 63 6f 64 65 52 6f 77 69 64 28 69 4b 65 79  DecodeRowid(iKey
21ac0 2c 20 26 69 49 64 78 2c 20 26 69 53 65 67 69 64  , &iIdx, &iSegid
21ad0 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67  , &iHeight, &iPg
21ae0 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67  no);..  if( iSeg
21af0 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  id==0 ){.    if(
21b00 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45 52   iKey==FTS5_AVER
21b10 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20  AGES_ROWID ){.  
21b20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
21b30 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
21b40 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28 61  f(pRc, pBuf, "(a
21b50 76 65 72 61 67 65 73 29 20 22 29 3b 0a 20 20 20  verages) ");.   
21b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
21b70 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
21b80 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
21b90 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20   pBuf, .        
21ba0 20 20 22 7b 73 74 72 75 63 74 75 72 65 20 69 64    "{structure id
21bb0 78 3d 25 64 7d 22 2c 20 28 69 6e 74 29 28 69 4b  x=%d}", (int)(iK
21bc0 65 79 2d 31 30 29 0a 20 20 20 20 20 20 29 3b 0a  ey-10).      );.
21bd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65      }.  }.  else
21be0 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d 46 54   if( iHeight==FT
21bf0 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48  S5_SEGMENT_MAX_H
21c00 45 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71 6c  EIGHT ){.    sql
21c10 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
21c20 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
21c30 70 42 75 66 2c 20 22 28 64 6c 69 64 78 20 69 64  pBuf, "(dlidx id
21c40 78 3d 25 64 20 73 65 67 69 64 3d 25 64 20 70 67  x=%d segid=%d pg
21c50 6e 6f 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20  no=%d)",.       
21c60 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69   iIdx, iSegid, i
21c70 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 65  Pgno.    );.  }e
21c80 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
21c90 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
21ca0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
21cb0 2c 20 22 28 69 64 78 3d 25 64 20 73 65 67 69 64  , "(idx=%d segid
21cc0 3d 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64  =%d h=%d pgno=%d
21cd0 29 22 2c 0a 20 20 20 20 20 20 20 20 69 49 64 78  )",.        iIdx
21ce0 2c 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  , iSegid, iHeigh
21cf0 74 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a  t, iPgno.    );.
21d00 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
21d10 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72 75  id fts5DebugStru
21d20 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52  cture(.  int *pR
21d30 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
21d40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
21d50 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  UT: error code *
21d60 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
21d70 70 42 75 66 2c 0a 20 20 46 74 73 35 53 74 72 75  pBuf,.  Fts5Stru
21d80 63 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e  cture *p.){.  in
21d90 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20  t iLvl, iSeg;   
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21db0 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
21dc0 20 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74   levels, segment
21dd0 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c  s */..  for(iLvl
21de0 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76  =0; iLvl<p->nLev
21df0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
21e00 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
21e10 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e  vel *pLvl = &p->
21e20 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
21e30 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
21e40 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
21e50 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20  pRc, pBuf, .    
21e60 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d      " {lvl=%d nM
21e70 65 72 67 65 3d 25 64 22 2c 20 69 4c 76 6c 2c 20  erge=%d", iLvl, 
21e80 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20 20  pLvl->nMerge.   
21e90 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67   );.    for(iSeg
21ea0 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
21eb0 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
21ec0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
21ed0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
21ee0 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
21ef0 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g];.      sqlite
21f00 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
21f10 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
21f20 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20  f, .          " 
21f30 7b 69 64 3d 25 64 20 68 3d 25 64 20 6c 65 61 76  {id=%d h=%d leav
21f40 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65  es=%d..%d}", pSe
21f50 67 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d  g->iSegid, pSeg-
21f60 3e 6e 48 65 69 67 68 74 2c 20 0a 20 20 20 20 20  >nHeight, .     
21f70 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
21f80 69 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f  irst, pSeg->pgno
21f90 4c 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  Last.      );.  
21fa0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
21fb0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
21fc0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
21fd0 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   "}");.  }.}../*
21fe0 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74  .** This is part
21ff0 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
22000 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20  ode() debugging 
22010 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  aid..**.** Argum
22020 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62  ents pBlob/nBlob
22030 20 63 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61   contain a seria
22040 6c 69 7a 65 64 20 46 74 73 35 53 74 72 75 63 74  lized Fts5Struct
22050 75 72 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73  ure object. This
22060 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  .** function app
22070 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61  ends a human-rea
22080 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  dable representa
22090 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
220a0 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68   object.** to th
220b0 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  e buffer passed 
220c0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
220d0 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74  gument. .*/.stat
220e0 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
220f0 64 65 53 74 72 75 63 74 75 72 65 28 0a 20 20 69  deStructure(.  i
22100 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22120 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20  * IN/OUT: error 
22130 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
22140 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f  ffer *pBuf,.  co
22150 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69  nst u8 *pBlob, i
22160 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e  nt nBlob.){.  in
22170 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22190 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
221a0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
221b0 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *p = 0;         
221c0 20 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72    /* Decoded str
221d0 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f  ucture object */
221e0 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72  ..  rc = fts5Str
221f0 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c  uctureDecode(pBl
22200 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70  ob, nBlob, 0, &p
22210 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
22220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
22230 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  Rc = rc;.    ret
22240 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  urn;.  }..  fts5
22250 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 70  DebugStructure(p
22260 52 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20  Rc, pBuf, p);.  
22270 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
22280 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ease(p);.}../*.*
22290 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20 69  * Buffer (a/n) i
222a0 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
222b0 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 73  tain a list of s
222c0 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74  erialized varint
222d0 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68 20  s. Read.** each 
222e0 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e  varint and appen
222f0 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65 70  d its string rep
22300 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62  resentation to b
22310 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74 75  uffer pBuf. Retu
22320 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74 68  rn.** after eith
22330 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75 66  er the input buf
22340 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65 64  fer is exhausted
22350 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69 73   or a 0 value is
22360 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   read..**.** The
22370 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
22380 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
22390 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ytes read from t
223a0 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e  he input buffer.
223b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
223c0 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
223d0 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
223e0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e  uffer *pBuf, con
223f0 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29  st u8 *a, int n)
22400 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30  {.  int iOff = 0
22410 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c  ;.  while( iOff<
22420 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61  n ){.    int iVa
22430 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  l;.    iOff += g
22440 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
22450 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20  ff], iVal);.    
22460 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
22470 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
22480 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20  c, pBuf, " %d", 
22490 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74  iVal);.  }.  ret
224a0 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  urn iOff;.}../*.
224b0 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20  ** The start of 
224c0 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e  buffer (a/n) con
224d0 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74 20  tains the start 
224e0 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68  of a doclist. Th
224f0 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79  e doclist.** may
22500 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69   or may not fini
22510 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62 75  sh within the bu
22520 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
22530 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65  ion appends a te
22540 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61  xt.** representa
22550 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74  tion of the part
22560 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20   of the doclist 
22570 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
22580 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75  to buffer.** pBu
22590 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  f. .**.** The re
225a0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
225b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
225c0 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
225d0 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
225e0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
225f0 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e  DecodeDoclist(in
22600 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
22610 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
22620 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
22630 20 69 36 34 20 69 44 6f 63 69 64 3b 0a 20 20 69   i64 iDocid;.  i
22640 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  nt iOff = 0;..  
22650 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
22660 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
22670 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  3GetVarint(&a[iO
22680 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 6f 63  ff], (u64*)&iDoc
22690 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  id);.    sqlite3
226a0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
226b0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
226c0 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c  , " rowid=%lld",
226d0 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20   iDocid);.  }.  
226e0 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
226f0 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20  .    int nPos;. 
22700 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
22710 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
22720 20 6e 50 6f 73 29 3b 0a 20 20 20 20 69 4f 66 66   nPos);.    iOff
22730 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f   += fts5DecodePo
22740 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c  slist(pRc, pBuf,
22750 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e   &a[iOff], MIN(n
22760 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20  -iOff, nPos));. 
22770 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b     if( iOff<n ){
22780 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74  .      i64 iDelt
22790 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  a;.      iOff +=
227a0 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
227b0 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
227c0 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
227d0 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
227e0 29 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 20  ) return iOff;. 
227f0 20 20 20 20 20 69 44 6f 63 69 64 20 2d 3d 20 69       iDocid -= i
22800 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c  Delta;.      sql
22810 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
22820 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
22830 70 42 75 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c  pBuf, " rowid=%l
22840 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20  ld", iDocid);.  
22850 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
22860 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
22870 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
22880 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69  ion of user-defi
22890 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
228a0 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28  ion fts5_decode(
228b0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
228c0 64 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63  d fts5DecodeFunc
228d0 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
228e0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20  context *pCtx,  
228f0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
22900 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74  ion call context
22910 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20   */.  int nArg, 
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22940 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20  of args (always 
22950 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  2) */.  sqlite3_
22960 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20  value **apVal   
22970 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
22980 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ion arguments */
22990 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64  .){.  i64 iRowid
229a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
229b0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
229c0 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20  or record being 
229d0 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74  decoded */.  int
229e0 20 69 49 64 78 2c 69 53 65 67 69 64 2c 69 48 65   iIdx,iSegid,iHe
229f0 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20  ight,iPgno;  /* 
22a00 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73  Rowid components
22a10 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
22a20 61 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  a; int n;       
22a30 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20        /* Record 
22a40 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 46  to decode */.  F
22a50 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20  ts5Buffer s;    
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22a70 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20  * Build up text 
22a80 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a  to return here *
22a90 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
22aa0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
22ab0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
22ac0 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
22ad0 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65   nArg==2 );.  me
22ae0 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
22af0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
22b00 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69  .  iRowid = sqli
22b10 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
22b20 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d  apVal[0]);.  n =
22b30 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
22b40 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  ytes(apVal[1]);.
22b50 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    a = sqlite3_va
22b60 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31  lue_blob(apVal[1
22b70 5d 29 3b 0a 20 20 66 74 73 35 44 65 63 6f 64 65  ]);.  fts5Decode
22b80 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69  Rowid(iRowid, &i
22b90 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20 26 69  Idx, &iSegid, &i
22ba0 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b  Height, &iPgno);
22bb0 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77  ..  fts5DebugRow
22bc0 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77  id(&rc, &s, iRow
22bd0 69 64 29 3b 0a 20 20 69 66 28 20 69 48 65 69 67  id);.  if( iHeig
22be0 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54  ht==FTS5_SEGMENT
22bf0 5f 4d 41 58 5f 48 45 49 47 48 54 20 29 7b 0a 20  _MAX_HEIGHT ){. 
22c00 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
22c10 20 20 69 36 34 20 69 50 72 65 76 3b 0a 20 20 20    i64 iPrev;.   
22c20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
22c30 20 20 69 20 3d 20 67 65 74 56 61 72 69 6e 74 28    i = getVarint(
22c40 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 50  &a[i], (u64*)&iP
22c50 72 65 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rev);.      sqli
22c60 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
22c70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26  endPrintf(&rc, &
22c80 73 2c 20 22 20 25 6c 6c 64 22 2c 20 69 50 72 65  s, " %lld", iPre
22c90 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  v);.    }.    wh
22ca0 69 6c 65 28 20 69 3c 6e 20 29 7b 0a 20 20 20 20  ile( i<n ){.    
22cb0 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
22cc0 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    i += getVarint
22cd0 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69  (&a[i], (u64*)&i
22ce0 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Val);.      if( 
22cf0 69 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iVal==0 ){.     
22d00 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
22d10 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
22d20 28 26 72 63 2c 20 26 73 2c 20 22 20 78 22 29 3b  (&rc, &s, " x");
22d30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22d40 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69 50        iPrev = iP
22d50 72 65 76 20 2d 20 69 56 61 6c 3b 0a 20 20 20 20  rev - iVal;.    
22d60 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
22d70 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
22d80 66 28 26 72 63 2c 20 26 73 2c 20 22 20 25 6c 6c  f(&rc, &s, " %ll
22d90 64 22 2c 20 69 50 72 65 76 29 3b 0a 20 20 20 20  d", iPrev);.    
22da0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c    }.    }..  }el
22db0 73 65 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d  se.  if( iSegid=
22dc0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 52  =0 ){.    if( iR
22dd0 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52 41  owid==FTS5_AVERA
22de0 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  GES_ROWID ){.   
22df0 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20     /* todo */.  
22e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
22e10 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75  ts5DecodeStructu
22e20 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e  re(&rc, &s, a, n
22e30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
22e40 7b 0a 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  {..    Fts5Buffe
22e50 72 20 74 65 72 6d 3b 0a 20 20 20 20 6d 65 6d 73  r term;.    mems
22e60 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
22e70 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
22e80 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65 69 67  ;..    if( iHeig
22e90 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ht==0 ){.      i
22ea0 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b  nt iTermOff = 0;
22eb0 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69  .      int iRowi
22ec0 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  dOff = 0;.      
22ed0 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
22ee0 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a  int nKeep = 0;..
22ef0 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20        iRowidOff 
22f00 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
22f10 30 5d 29 3b 0a 20 20 20 20 20 20 69 54 65 72 6d  0]);.      iTerm
22f20 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
22f30 28 26 61 5b 32 5d 29 3b 0a 0a 20 20 20 20 20 20  (&a[2]);..      
22f40 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b  if( iRowidOff ){
22f50 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20  .        iOff = 
22f60 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20  iRowidOff;.     
22f70 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d   }else if( iTerm
22f80 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Off ){.        i
22f90 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
22fa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22fb0 20 20 20 20 20 69 4f 66 66 20 3d 20 6e 3b 0a 20       iOff = n;. 
22fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
22fd0 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26  5DecodePoslist(&
22fe0 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69  rc, &s, &a[4], i
22ff0 4f 66 66 2d 34 29 3b 0a 0a 0a 20 20 20 20 20 20  Off-4);...      
23000 61 73 73 65 72 74 28 20 69 52 6f 77 69 64 4f 66  assert( iRowidOf
23010 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 52  f==0 || iOff==iR
23020 6f 77 69 64 4f 66 66 20 29 3b 0a 20 20 20 20 20  owidOff );.     
23030 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
23040 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
23050 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  = fts5DecodeDocl
23060 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
23070 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a  iOff], n-iOff);.
23080 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
23090 73 73 65 72 74 28 20 69 54 65 72 6d 4f 66 66 3d  ssert( iTermOff=
230a0 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 54 65 72  =0 || iOff==iTer
230b0 6d 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 77 68  mOff );.      wh
230c0 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
230d0 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
230e0 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
230f0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
23100 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a  [iOff], nByte);.
23110 20 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 3d 20          term.n= 
23120 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20 66  nKeep;.        f
23130 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
23140 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20  lob(&rc, &term, 
23150 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29  nByte, &a[iOff])
23160 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
23170 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20  = nByte;..      
23180 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
23190 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
231a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 72 63  .            &rc
231b0 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a  , &s, " term=%.*
231c0 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e  s", term.n, (con
231d0 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a  st char*)term.p.
231e0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
231f0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
23200 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
23210 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
23220 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20  n-iOff);.       
23230 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20   if( iOff<n ){. 
23240 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
23250 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b   getVarint32(&a[
23260 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20  iOff], nKeep);. 
23270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23280 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
23290 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
232a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46    }else{.      F
232b0 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b 0a  ts5NodeIter ss;.
232c0 20 20 20 20 20 20 66 6f 72 28 66 74 73 35 4e 6f        for(fts5No
232d0 64 65 49 74 65 72 49 6e 69 74 28 61 2c 20 6e 2c  deIterInit(a, n,
232e0 20 26 73 73 29 3b 20 73 73 2e 61 44 61 74 61 3b   &ss); ss.aData;
232f0 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
23300 74 28 26 72 63 2c 20 26 73 73 29 29 7b 0a 20 20  t(&rc, &ss)){.  
23310 20 20 20 20 20 20 69 66 28 20 73 73 2e 74 65 72        if( ss.ter
23320 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  m.n==0 ){.      
23330 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
23340 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
23350 66 28 26 72 63 2c 20 26 73 2c 20 22 20 6c 65 66  f(&rc, &s, " lef
23360 74 3d 25 64 22 2c 20 73 73 2e 69 43 68 69 6c 64  t=%d", ss.iChild
23370 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
23380 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23390 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
233a0 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 26 73  endPrintf(&rc,&s
233b0 2c 20 22 20 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a  , " \"%.*s\"", .
233c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 73                ss
233d0 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d  .term.n, ss.term
233e0 2e 70 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .p.          );.
233f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23400 20 20 69 66 28 20 73 73 2e 6e 45 6d 70 74 79 20    if( ss.nEmpty 
23410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
23420 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
23430 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20  pendPrintf(&rc, 
23440 26 73 2c 20 22 20 65 6d 70 74 79 3d 25 64 25 73  &s, " empty=%d%s
23450 22 2c 20 73 73 2e 6e 45 6d 70 74 79 2c 0a 20 20  ", ss.nEmpty,.  
23460 20 20 20 20 20 20 20 20 20 20 20 20 73 73 2e 62              ss.b
23470 44 6c 69 64 78 20 3f 20 22 2a 22 20 3a 20 22 22  Dlidx ? "*" : ""
23480 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
23490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
234a0 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74        fts5NodeIt
234b0 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20 20 20  erFree(&ss);.   
234c0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
234d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
234e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
234f0 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28  ult_text(pCtx, (
23500 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c  const char*)s.p,
23510 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   s.n, SQLITE_TRA
23520 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
23530 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
23540 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
23550 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  pCtx, rc);.  }. 
23560 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
23570 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  &s);.}../*.** Th
23580 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
23590 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
235a0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
235b0 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a   fts5_rowid()..*
235c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
235d0 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28  s5RowidFunction(
235e0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
235f0 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
23600 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
23610 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
23620 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23640 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
23650 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
23660 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
23670 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
23680 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
23690 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
236a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
236b0 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  g;.  if( nArg==0
236c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
236d0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
236e0 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66  x, "should be: f
236f0 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63  ts5_rowid(subjec
23700 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a  t, ....)", -1);.
23710 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72    }else{.    zAr
23720 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
23730 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
23740 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
23750 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
23760 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
23770 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20  "segment") ){.  
23780 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
23790 20 20 20 20 20 20 69 6e 74 20 69 64 78 2c 20 73        int idx, s
237a0 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67  egid, height, pg
237b0 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41  no;.      if( nA
237c0 72 67 21 3d 35 20 29 7b 0a 20 20 20 20 20 20 20  rg!=5 ){.       
237d0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
237e0 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20  error(pCtx, .   
237f0 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64           "should
23800 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28   be: fts5_rowid(
23810 27 73 65 67 6d 65 6e 74 27 2c 20 69 64 78 2c 20  'segment', idx, 
23820 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70  segid, height, p
23830 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20 20  gno))", -1.     
23840 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73     );.      }els
23850 65 7b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  e{.        idx =
23860 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
23870 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  nt(apVal[1]);.  
23880 20 20 20 20 20 20 73 65 67 69 64 20 3d 20 73 71        segid = sq
23890 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
238a0 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20 20  apVal[2]);.     
238b0 20 20 20 68 65 69 67 68 74 20 3d 20 73 71 6c 69     height = sqli
238c0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
238d0 56 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 20 20 20  Val[3]);.       
238e0 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f   pgno = sqlite3_
238f0 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
23900 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f  4]);.        iRo
23910 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
23920 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 73 65  NT_ROWID(idx, se
23930 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e  gid, height, pgn
23940 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
23950 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
23960 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
23970 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
23980 65 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33  e if( 0==sqlite3
23990 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22  _stricmp(zArg, "
239a0 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78 22 29  start-of-index")
239b0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
239c0 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  owid;.      int 
239d0 69 64 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  idx;.      if( n
239e0 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
239f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
23a00 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a 20 20  _error(pCtx, .  
23a10 20 20 20 20 20 20 20 20 20 20 22 73 68 6f 75 6c            "shoul
23a20 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64  d be: fts5_rowid
23a30 28 27 73 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78  ('start-of-index
23a40 27 2c 20 69 64 78 29 22 2c 20 2d 31 0a 20 20 20  ', idx)", -1.   
23a50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65       );.      }e
23a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 64 78  lse{.        idx
23a70 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
23a80 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  _int(apVal[1]);.
23a90 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
23aa0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
23ab0 57 49 44 28 69 64 78 2c 20 31 2c 20 30 2c 20 30  WID(idx, 1, 0, 0
23ac0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
23ad0 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28  e3_result_int64(
23ae0 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20  pCtx, iRowid);. 
23af0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
23b00 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
23b10 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
23b20 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69  tx, .        "fi
23b30 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f  rst arg to fts5_
23b40 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20  rowid() must be 
23b50 27 73 65 67 6d 65 6e 74 27 20 22 0a 20 20 20 20  'segment' ".    
23b60 20 20 20 20 22 6f 72 20 27 73 74 61 72 74 2d 6f      "or 'start-o
23b70 66 2d 69 6e 64 65 78 27 20 2e 2e 2e 22 0a 20 20  f-index' ...".  
23b80 20 20 20 20 20 20 2c 20 2d 31 0a 20 20 20 20 20        , -1.     
23b90 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
23ba0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
23bb0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
23bc0 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65   registering the
23bd0 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77 69 74   FTS5 module wit
23be0 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  h database.** co
23bf0 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49 74 20  nnection db. It 
23c00 72 65 67 69 73 74 65 72 73 20 73 65 76 65 72 61  registers severa
23c10 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  l user-defined s
23c20 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20  calar functions 
23c30 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46  useful.** with F
23c40 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  TS5..**.** If su
23c50 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
23c60 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
23c70 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
23c80 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a  urs, some other.
23c90 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
23ca0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
23cb0 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74   instead..*/.int
23cc0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
23cd0 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64  xInit(sqlite3 *d
23ce0 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  b){.  int rc = s
23cf0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
23d00 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  nction(.      db
23d10 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 22 2c  , "fts5_decode",
23d20 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
23d30 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75   0, fts5DecodeFu
23d40 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29  nction, 0, 0.  )
23d50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
23d60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
23d70 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
23d80 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
23d90 20 20 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77     db, "fts5_row
23da0 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  id", -1, SQLITE_
23db0 55 54 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77  UTF8, 0, fts5Row
23dc0 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
23dd0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65  .    );.  }.  re
23de0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a              turn rc;.}..