/ Hex Artifact Content
Login

Artifact ef6c7764a9f4968465936839c8f7e7423d8458c2:


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 0a 23 64 65 66  of work */..#def
0700: 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49  ine FTS5_MIN_DLI
0710: 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20 2f 2a  DX_SIZE 4     /*
0720: 20 41 64 64 20 64 6c 69 64 78 20 69 66 20 74 68   Add dlidx if th
0730: 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20 70 61  is many empty pa
0740: 67 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  ges */../*.** De
0750: 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  tails:.**.** The
0760: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 6d 61   %_data table ma
0770: 6e 61 67 65 64 20 62 79 20 74 68 69 73 20 6d 6f  naged by this mo
0780: 64 75 6c 65 2c 0a 2a 2a 0a 2a 2a 20 20 20 20 20  dule,.**.**     
0790: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 5f 64  CREATE TABLE %_d
07a0: 61 74 61 28 69 64 20 49 4e 54 45 47 45 52 20 50  ata(id INTEGER P
07b0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63  RIMARY KEY, bloc
07c0: 6b 20 42 4c 4f 42 29 3b 0a 2a 2a 0a 2a 2a 20 2c  k BLOB);.**.** ,
07d0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 6f   contains the fo
07e0: 6c 6c 6f 77 69 6e 67 20 35 20 74 79 70 65 73 20  llowing 5 types 
07f0: 6f 66 20 72 65 63 6f 72 64 73 2e 20 53 65 65 20  of records. See 
0800: 74 68 65 20 63 6f 6d 6d 65 6e 74 73 20 73 75 72  the comments sur
0810: 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 74 68 65 20  rounding.** the 
0820: 46 54 53 35 5f 2a 5f 52 4f 57 49 44 20 6d 61 63  FTS5_*_ROWID mac
0830: 72 6f 73 20 62 65 6c 6f 77 20 66 6f 72 20 61 20  ros below for a 
0840: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 68  description of h
0850: 6f 77 20 25 5f 64 61 74 61 20 72 6f 77 69 64 73  ow %_data rowids
0860: 20 61 72 65 20 0a 2a 2a 20 61 73 73 69 67 6e 65   are .** assigne
0870: 64 20 74 6f 20 65 61 63 68 20 66 6f 20 74 68 65  d to each fo the
0880: 6d 2e 0a 2a 2a 0a 2a 2a 20 31 2e 20 53 74 72 75  m..**.** 1. Stru
0890: 63 74 75 72 65 20 52 65 63 6f 72 64 73 3a 0a 2a  cture Records:.*
08a0: 2a 0a 2a 2a 20 20 20 54 68 65 20 73 65 74 20 6f  *.**   The set o
08b0: 66 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20  f segments that 
08c0: 6d 61 6b 65 20 75 70 20 61 6e 20 69 6e 64 65 78  make up an index
08d0: 20 2d 20 74 68 65 20 69 6e 64 65 78 20 73 74 72   - the index str
08e0: 75 63 74 75 72 65 20 2d 20 61 72 65 0a 2a 2a 20  ucture - are.** 
08f0: 20 20 72 65 63 6f 72 64 65 64 20 69 6e 20 61 20    recorded in a 
0900: 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 77 69  single record wi
0910: 74 68 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  thin the %_data 
0920: 74 61 62 6c 65 2e 20 54 68 65 20 72 65 63 6f 72  table. The recor
0930: 64 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 20 20  d consists.**   
0940: 6f 66 20 61 20 73 69 6e 67 6c 65 20 33 32 2d 62  of a single 32-b
0950: 69 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  it configuration
0960: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 66 6f   cookie value fo
0970: 6c 6c 6f 77 65 64 20 62 79 20 61 20 6c 69 73 74  llowed by a list
0980: 20 6f 66 20 0a 2a 2a 20 20 20 53 51 4c 69 74 65   of .**   SQLite
0990: 20 76 61 72 69 6e 74 73 2e 20 49 66 20 74 68 65   varints. If the
09a0: 20 46 54 53 20 74 61 62 6c 65 20 66 65 61 74 75   FTS table featu
09b0: 72 65 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  res more than on
09c0: 65 20 69 6e 64 65 78 20 28 62 65 63 61 75 73 65  e index (because
09d0: 0a 2a 2a 20 20 20 74 68 65 72 65 20 61 72 65 20  .**   there are 
09e0: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 70 72 65 66  one or more pref
09f0: 69 78 20 69 6e 64 65 78 65 73 29 2c 20 69 74 20  ix indexes), it 
0a00: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
0a10: 61 74 20 61 6c 6c 20 73 68 61 72 65 0a 2a 2a 20  at all share.** 
0a20: 20 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69    the same cooki
0a30: 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  e value..**.**  
0a40: 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   Immediately fol
0a50: 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6e 66 69  lowing the confi
0a60: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 2c  guration cookie,
0a70: 20 74 68 65 20 72 65 63 6f 72 64 20 62 65 67 69   the record begi
0a80: 6e 73 20 77 69 74 68 0a 2a 2a 20 20 20 74 68 72  ns with.**   thr
0a90: 65 65 20 76 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a  ee varints:.**.*
0aa0: 2a 20 20 20 20 20 2b 20 6e 75 6d 62 65 72 20 6f  *     + number o
0ab0: 66 20 6c 65 76 65 6c 73 2c 0a 2a 2a 20 20 20 20  f levels,.**    
0ac0: 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20   + total number 
0ad0: 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61  of segments on a
0ae0: 6c 6c 20 6c 65 76 65 6c 73 2c 0a 2a 2a 20 20 20  ll levels,.**   
0af0: 20 20 2b 20 76 61 6c 75 65 20 6f 66 20 77 72 69    + value of wri
0b00: 74 65 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a  te counter..**.*
0b10: 2a 20 20 20 54 68 65 6e 2c 20 66 6f 72 20 65 61  *   Then, for ea
0b20: 63 68 20 6c 65 76 65 6c 20 66 72 6f 6d 20 30 20  ch level from 0 
0b30: 74 6f 20 6e 4d 61 78 3a 0a 2a 2a 0a 2a 2a 20 20  to nMax:.**.**  
0b40: 20 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 69     + number of i
0b50: 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 69 6e  nput segments in
0b60: 20 6f 6e 67 6f 69 6e 67 20 6d 65 72 67 65 2e 0a   ongoing merge..
0b70: 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c 20 6e  **     + total n
0b80: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
0b90: 73 20 69 6e 20 6c 65 76 65 6c 2e 0a 2a 2a 20 20  s in level..**  
0ba0: 20 20 20 2b 20 66 6f 72 20 65 61 63 68 20 73 65     + for each se
0bb0: 67 6d 65 6e 74 20 66 72 6f 6d 20 6f 6c 64 65 73  gment from oldes
0bc0: 74 20 74 6f 20 6e 65 77 65 73 74 3a 0a 2a 2a 20  t to newest:.** 
0bd0: 20 20 20 20 20 20 20 20 2b 20 73 65 67 6d 65 6e          + segmen
0be0: 74 20 69 64 20 28 61 6c 77 61 79 73 20 3e 20 30  t id (always > 0
0bf0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 62  ).**         + b
0c00: 2d 74 72 65 65 20 68 65 69 67 68 74 20 28 31 20  -tree height (1 
0c10: 2d 3e 20 72 6f 6f 74 20 69 73 20 6c 65 61 66 2c  -> root is leaf,
0c20: 20 32 20 2d 3e 20 72 6f 6f 74 20 69 73 20 70 61   2 -> root is pa
0c30: 72 65 6e 74 20 6f 66 20 6c 65 61 66 20 65 74 63  rent of leaf etc
0c40: 2e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20  .).**         + 
0c50: 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  first leaf page 
0c60: 6e 75 6d 62 65 72 20 28 6f 66 74 65 6e 20 31 2c  number (often 1,
0c70: 20 61 6c 77 61 79 73 20 67 72 65 61 74 65 72 20   always greater 
0c80: 74 68 61 6e 20 30 29 0a 2a 2a 20 20 20 20 20 20  than 0).**      
0c90: 20 20 20 2b 20 66 69 6e 61 6c 20 6c 65 61 66 20     + final leaf 
0ca0: 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2a 0a 2a  page number.**.*
0cb0: 2a 20 32 2e 20 54 68 65 20 41 76 65 72 61 67 65  * 2. The Average
0cc0: 73 20 52 65 63 6f 72 64 3a 0a 2a 2a 0a 2a 2a 20  s Record:.**.** 
0cd0: 20 20 41 20 73 69 6e 67 6c 65 20 72 65 63 6f 72    A single recor
0ce0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 25 5f 64  d within the %_d
0cf0: 61 74 61 20 74 61 62 6c 65 2e 20 54 68 65 20 64  ata table. The d
0d00: 61 74 61 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ata is a list of
0d10: 20 76 61 72 69 6e 74 73 2e 0a 2a 2a 20 20 20 54   varints..**   T
0d20: 68 65 20 66 69 72 73 74 20 76 61 6c 75 65 20 69  he first value i
0d30: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
0d40: 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
0d50: 78 2e 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  x. Then, for eac
0d60: 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 20 20 66 72  h column.**   fr
0d70: 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
0d80: 2c 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  , the total numb
0d90: 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20  er of tokens in 
0da0: 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 61  the column for a
0db0: 6c 6c 20 0a 2a 2a 20 20 20 72 6f 77 73 20 6f 66  ll .**   rows of
0dc0: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
0dd0: 2a 20 33 2e 20 53 65 67 6d 65 6e 74 20 6c 65 61  * 3. Segment lea
0de0: 76 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 45 52  ves:.**.**   TER
0df0: 4d 20 44 4f 43 4c 49 53 54 20 46 4f 52 4d 41 54  M DOCLIST FORMAT
0e00: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4d 6f 73 74  :.**.**     Most
0e10: 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65 6e 74   of each segment
0e20: 20 6c 65 61 66 20 69 73 20 74 61 6b 65 6e 20 75   leaf is taken u
0e30: 70 20 62 79 20 74 65 72 6d 2f 64 6f 63 6c 69 73  p by term/doclis
0e40: 74 20 64 61 74 61 2e 20 54 68 65 20 0a 2a 2a 20  t data. The .** 
0e50: 20 20 20 20 67 65 6e 65 72 61 6c 20 66 6f 72 6d      general form
0e60: 61 74 20 6f 66 20 74 68 65 20 74 65 72 6d 2f 64  at of the term/d
0e70: 6f 63 6c 69 73 74 20 64 61 74 61 20 69 73 3a 0a  oclist data is:.
0e80: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61  **.**         va
0e90: 72 69 6e 74 20 3a 20 73 69 7a 65 20 6f 66 20 66  rint : size of f
0ea0: 69 72 73 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20  irst term.**    
0eb0: 20 20 20 20 20 62 6c 6f 62 3a 20 20 20 20 66 69       blob:    fi
0ec0: 72 73 74 20 74 65 72 6d 20 64 61 74 61 0a 2a 2a  rst term data.**
0ed0: 20 20 20 20 20 20 20 20 20 64 6f 63 6c 69 73 74           doclist
0ee0: 3a 20 66 69 72 73 74 20 64 6f 63 6c 69 73 74 0a  : first doclist.
0ef0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
0f00: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
0f10: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
0f20: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
0f30: 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 70  in common with p
0f40: 72 65 76 69 6f 75 73 20 74 65 72 6d 0a 2a 2a 20  revious term.** 
0f50: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
0f60: 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  :  number of byt
0f70: 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20 64  es of new term d
0f80: 61 74 61 20 28 6e 4e 65 77 29 0a 2a 2a 20 20 20  ata (nNew).**   
0f90: 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20 20          blob:   
0fa0: 20 6e 4e 65 77 20 62 79 74 65 73 20 6f 66 20 6e   nNew bytes of n
0fb0: 65 77 20 74 65 72 6d 20 64 61 74 61 0a 2a 2a 20  ew term data.** 
0fc0: 20 20 20 20 20 20 20 20 20 20 64 6f 63 6c 69 73            doclis
0fd0: 74 3a 20 6e 65 78 74 20 64 6f 63 6c 69 73 74 0a  t: next doclist.
0fe0: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a  **         }.**.
0ff0: 2a 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 20 66  **     doclist f
1000: 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ormat:.**.**    
1010: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
1020: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 20 20 20 20  rst rowid.**    
1030: 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 66 69       poslist: fi
1040: 72 73 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  rst poslist.**  
1050: 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d         zero-or-m
1060: 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ore {.**        
1070: 20 20 20 76 61 72 69 6e 74 3a 20 20 72 6f 77 69     varint:  rowi
1080: 64 20 64 65 6c 74 61 20 28 61 6c 77 61 79 73 20  d delta (always 
1090: 3e 20 30 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  > 0).**         
10a0: 20 20 70 6f 73 6c 69 73 74 3a 20 66 69 72 73 74    poslist: first
10b0: 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20 20   poslist.**     
10c0: 20 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20      }.**        
10d0: 20 30 78 30 30 20 62 79 74 65 0a 2a 2a 0a 2a 2a   0x00 byte.**.**
10e0: 20 20 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72       poslist for
10f0: 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  mat:.**.**      
1100: 20 20 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20     varint: size 
1110: 6f 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79  of poslist in by
1120: 74 65 73 2e 20 6e 6f 74 20 69 6e 63 6c 75 64 69  tes. not includi
1130: 6e 67 20 74 68 69 73 20 66 69 65 6c 64 2e 0a 2a  ng this field..*
1140: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69 73  *         collis
1150: 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63  t: collist for c
1160: 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20 20  olumn 0.**      
1170: 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20     zero-or-more 
1180: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 30  {.**           0
1190: 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  x01 byte.**     
11a0: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63 6f        varint: co
11b0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29 0a  lumn number (I).
11c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c  **           col
11d0: 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f  list: collist fo
11e0: 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20 20  r column I.**   
11f0: 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20        }.**.**   
1200: 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61 74    collist format
1210: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1220: 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f 66  varint: first of
1230: 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20 20  fset + 2.**     
1240: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1250: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1260: 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20 64  varint: offset d
1270: 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20 20  elta + 2.**     
1280: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50 41      }.**.**   PA
1290: 47 49 4e 41 54 49 4f 4e 0a 2a 2a 0a 2a 2a 20 20  GINATION.**.**  
12a0: 20 20 20 54 68 65 20 66 6f 72 6d 61 74 20 64 65     The format de
12b0: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 69 73  scribed above is
12c0: 20 6f 6e 6c 79 20 61 63 63 75 72 61 74 65 20 69   only accurate i
12d0: 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 65 72  f the entire ter
12e0: 6d 2f 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20  m/doclist.**    
12f0: 20 64 61 74 61 20 66 69 74 73 20 6f 6e 20 61 20   data fits on a 
1300: 73 69 6e 67 6c 65 20 6c 65 61 66 20 70 61 67 65  single leaf page
1310: 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
1320: 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 20 66   the case, the f
1330: 6f 72 6d 61 74 0a 2a 2a 20 20 20 20 20 69 73 20  ormat.**     is 
1340: 63 68 61 6e 67 65 64 20 69 6e 20 74 77 6f 20 77  changed in two w
1350: 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ays:.**.**      
1360: 20 2b 20 69 66 20 74 68 65 20 66 69 72 73 74 20   + if the first 
1370: 72 6f 77 69 64 20 6f 6e 20 61 20 70 61 67 65 20  rowid on a page 
1380: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 74 68  occurs before th
1390: 65 20 66 69 72 73 74 20 74 65 72 6d 2c 20 69 74  e first term, it
13a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 69 73 20 73  .**         is s
13b0: 74 6f 72 65 64 20 61 73 20 61 20 6c 69 74 65 72  tored as a liter
13c0: 61 6c 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20  al value:.**.** 
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69              vari
13e0: 6e 74 3a 20 20 66 69 72 73 74 20 72 6f 77 69 64  nt:  first rowid
13f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 74  .**.**       + t
1400: 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
1410: 20 65 61 63 68 20 70 61 67 65 20 69 73 20 73 74   each page is st
1420: 6f 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ored in the same
1430: 20 77 61 79 20 61 73 20 74 68 65 0a 2a 2a 20 20   way as the.**  
1440: 20 20 20 20 20 20 20 76 65 72 79 20 66 69 72 73         very firs
1450: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
1460: 67 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  gment:.**.**    
1470: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 20           varint 
1480: 3a 20 73 69 7a 65 20 6f 66 20 66 69 72 73 74 20  : size of first 
1490: 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20  term.**         
14a0: 20 20 20 20 62 6c 6f 62 3a 20 20 20 20 66 69 72      blob:    fir
14b0: 73 74 20 74 65 72 6d 20 64 61 74 61 0a 2a 2a 0a  st term data.**.
14c0: 2a 2a 20 20 20 20 20 45 61 63 68 20 6c 65 61 66  **     Each leaf
14d0: 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74   page begins wit
14e0: 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b  h:.**.**       +
14f0: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
1500: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73   containing offs
1510: 65 74 20 74 6f 20 66 69 72 73 74 20 72 6f 77 69  et to first rowi
1520: 64 20 28 6f 72 20 30 29 2e 0a 2a 2a 20 20 20 20  d (or 0)..**    
1530: 20 20 20 2b 20 32 2d 62 79 74 65 20 75 6e 73 69     + 2-byte unsi
1540: 67 6e 65 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  gned containing 
1550: 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
1560: 74 65 72 6d 20 28 6f 72 20 30 29 2e 0a 2a 2a 0a  term (or 0)..**.
1570: 2a 2a 20 20 20 46 6f 6c 6c 6f 77 65 64 20 62 79  **   Followed by
1580: 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61   term/doclist da
1590: 74 61 2e 0a 2a 2a 0a 2a 2a 20 34 2e 20 53 65 67  ta..**.** 4. Seg
15a0: 6d 65 6e 74 20 69 6e 74 65 72 69 6f 72 20 6e 6f  ment interior no
15b0: 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  des:.**.**   The
15c0: 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20   interior nodes 
15d0: 74 75 72 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  turn the list of
15e0: 20 6c 65 61 76 65 73 20 69 6e 74 6f 20 61 20 62   leaves into a b
15f0: 2b 74 72 65 65 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  +tree. .**.**   
1600: 45 61 63 68 20 69 6e 74 65 72 69 6f 72 20 6e 6f  Each interior no
1610: 64 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 61  de begins with a
1620: 20 76 61 72 69 6e 74 20 2d 20 74 68 65 20 70 61   varint - the pa
1630: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1640: 20 6c 65 66 74 0a 2a 2a 20 20 20 6d 6f 73 74 20   left.**   most 
1650: 63 68 69 6c 64 20 6e 6f 64 65 2e 20 46 6f 6c 6c  child node. Foll
1660: 6f 77 69 6e 67 20 74 68 69 73 2c 20 66 6f 72 20  owing this, for 
1670: 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 65  each leaf page e
1680: 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74 2c  xcept the first,
1690: 0a 2a 2a 20 20 20 74 68 65 20 69 6e 74 65 72 69  .**   the interi
16a0: 6f 72 20 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e  or nodes contain
16b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 29 20 49  :.**.**     a) I
16c0: 66 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  f the leaf page 
16d0: 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73  contains at leas
16e0: 74 20 6f 6e 65 20 74 65 72 6d 2c 20 74 68 65 6e  t one term, then
16f0: 20 61 20 74 65 72 6d 2d 70 72 65 66 69 78 20 74   a term-prefix t
1700: 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 69 73  hat.**        is
1710: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
1720: 6c 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 73  l previous terms
1730: 2c 20 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20  , and less than 
1740: 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a  or equal to the.
1750: 2a 2a 20 20 20 20 20 20 20 20 66 69 72 73 74 20  **        first 
1760: 74 65 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66  term on the leaf
1770: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   page..**.**    
1780: 20 62 29 20 49 66 20 74 68 65 20 6c 65 61 66 20   b) If the leaf 
1790: 70 61 67 65 20 6e 6f 20 74 65 72 6d 73 2c 20 61  page no terms, a
17a0: 20 72 65 63 6f 72 64 20 69 6e 64 69 63 61 74 69   record indicati
17b0: 6e 67 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6e 73  ng how many cons
17c0: 65 63 75 74 69 76 65 0a 2a 2a 20 20 20 20 20 20  ecutive.**      
17d0: 20 20 6c 65 61 76 65 73 20 63 6f 6e 74 61 69 6e    leaves contain
17e0: 20 6e 6f 20 74 65 72 6d 73 2c 20 61 6e 64 20 77   no terms, and w
17f0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
1800: 65 72 65 20 69 73 20 61 6e 20 61 73 73 6f 63 69  ere is an associ
1810: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 62  ated.**        b
1820: 79 2d 72 6f 77 69 64 20 69 6e 64 65 78 20 72 65  y-rowid index re
1830: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 42 79  cord..**.**   By
1840: 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 74 68 65   definition, the
1850: 72 65 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65  re is never more
1860: 20 74 68 61 6e 20 6f 6e 65 20 74 79 70 65 20 28   than one type (
1870: 62 29 20 72 65 63 6f 72 64 20 69 6e 20 61 20 72  b) record in a r
1880: 6f 77 2e 0a 2a 2a 20 20 20 54 79 70 65 20 28 62  ow..**   Type (b
1890: 29 20 72 65 63 6f 72 64 73 20 6f 6e 6c 79 20 65  ) records only e
18a0: 76 65 72 20 61 70 70 65 61 72 20 6f 6e 20 68 65  ver appear on he
18b0: 69 67 68 74 3d 31 20 70 61 67 65 73 20 2d 20 69  ight=1 pages - i
18c0: 6d 6d 65 64 69 61 74 65 20 70 61 72 65 6e 74 73  mmediate parents
18d0: 0a 2a 2a 20 20 20 6f 66 20 6c 65 61 76 65 73 2e  .**   of leaves.
18e0: 20 4f 6e 6c 79 20 74 79 70 65 20 28 61 29 20 72   Only type (a) r
18f0: 65 63 6f 72 64 73 20 61 72 65 20 70 75 73 68 65  ecords are pushe
1900: 64 20 74 6f 20 68 69 67 68 65 72 20 6c 65 76 65  d to higher leve
1910: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 65 72 6d  ls..**.**   Term
1920: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
1930: 20 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62     * Number of b
1940: 79 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77  ytes in common w
1950: 69 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72  ith previous ter
1960: 6d 20 70 6c 75 73 20 32 2c 20 61 73 20 61 20 76  m plus 2, as a v
1970: 61 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20 2a 20  arint..**     * 
1980: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1990: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
19a0: 2c 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  , as a varint..*
19b0: 2a 20 20 20 20 20 2a 20 6e 65 77 20 74 65 72 6d  *     * new term
19c0: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 4e   data..**.**   N
19d0: 6f 2d 74 65 72 6d 20 66 6f 72 6d 61 74 3a 0a 2a  o-term format:.*
19e0: 2a 0a 2a 2a 20 20 20 20 20 2a 20 65 69 74 68 65  *.**     * eithe
19f0: 72 20 61 6e 20 30 78 30 30 20 6f 72 20 30 78 30  r an 0x00 or 0x0
1a00: 31 20 62 79 74 65 2e 20 49 66 20 74 68 65 20 76  1 byte. If the v
1a10: 61 6c 75 65 20 30 78 30 31 20 69 73 20 75 73 65  alue 0x01 is use
1a20: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 0a 2a  d, then there .*
1a30: 2a 20 20 20 20 20 20 20 69 73 20 61 6e 20 61 73  *       is an as
1a40: 73 6f 63 69 61 74 65 64 20 69 6e 64 65 78 2d 62  sociated index-b
1a50: 79 2d 72 6f 77 69 64 20 72 65 63 6f 72 64 2e 0a  y-rowid record..
1a60: 2a 2a 20 20 20 20 20 2a 20 74 68 65 20 6e 75 6d  **     * the num
1a70: 62 65 72 20 6f 66 20 7a 65 72 6f 2d 74 65 72 6d  ber of zero-term
1a80: 20 6c 65 61 76 65 73 20 61 73 20 61 20 76 61 72   leaves as a var
1a90: 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 35 2e 20 53 65  int..**.** 5. Se
1aa0: 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69 6e  gment doclist in
1ab0: 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 41  dexes:.**.**   A
1ac0: 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73   list of varints
1ad0: 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 74  . If the first t
1ae0: 65 72 6d 6c 65 73 73 20 70 61 67 65 20 63 6f 6e  ermless page con
1af0: 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f  tains at least o
1b00: 6e 65 0a 2a 2a 20 20 20 64 6f 63 69 64 2c 20 74  ne.**   docid, t
1b10: 68 65 20 6c 69 73 74 20 62 65 67 69 6e 73 20 77  he list begins w
1b20: 69 74 68 20 74 68 61 74 20 64 6f 63 69 64 20 61  ith that docid a
1b30: 73 20 61 20 76 61 72 69 6e 74 20 66 6f 6c 6c 6f  s a varint follo
1b40: 77 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 20 20  wed by the.**   
1b50: 76 61 6c 75 65 20 31 20 28 30 78 30 31 29 2e 20  value 1 (0x01). 
1b60: 4f 72 2c 20 69 66 20 74 68 65 20 66 69 72 73 74  Or, if the first
1b70: 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 20 63   termless page c
1b80: 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 6f 63 69 64  ontains no docid
1b90: 73 2c 0a 2a 2a 20 20 20 61 20 76 61 72 69 6e 74  s,.**   a varint
1ba0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1bb0: 6c 61 73 74 20 64 6f 63 69 64 20 73 74 6f 72 65  last docid store
1bc0: 64 20 6f 6e 20 74 68 65 20 74 65 72 6d 20 70 61  d on the term pa
1bd0: 67 65 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 20  ge followed.**  
1be0: 20 62 79 20 61 20 30 20 28 30 78 30 30 29 20 76   by a 0 (0x00) v
1bf0: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  alue..**.**   Fo
1c00: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1c10: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 6f  t page in the do
1c20: 63 6c 69 73 74 2c 20 65 69 74 68 65 72 20 61 20  clist, either a 
1c30: 30 78 30 30 20 62 79 74 65 20 69 66 20 74 68 65  0x00 byte if the
1c40: 0a 2a 2a 20 20 20 70 61 67 65 20 63 6f 6e 74 61  .**   page conta
1c50: 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20 6f 72  ins no terms, or
1c60: 20 61 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64   a delta-encoded
1c70: 20 64 6f 63 69 64 20 28 61 6c 77 61 79 73 20 2b   docid (always +
1c80: 76 65 29 20 0a 2a 2a 20 20 20 72 65 70 72 65 73  ve) .**   repres
1c90: 65 6e 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  enting the first
1ca0: 20 64 6f 63 69 64 20 6f 6e 20 74 68 65 20 70 61   docid on the pa
1cb0: 67 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  ge otherwise..*/
1cc0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 73 20 66  ../*.** Rowids f
1cd0: 6f 72 20 74 68 65 20 61 76 65 72 61 67 65 73 20  or the averages 
1ce0: 61 6e 64 20 73 74 72 75 63 74 75 72 65 20 72 65  and structure re
1cf0: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 25 5f 64  cords in the %_d
1d00: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64  ata table..*/.#d
1d10: 65 66 69 6e 65 20 46 54 53 35 5f 41 56 45 52 41  efine FTS5_AVERA
1d20: 47 45 53 5f 52 4f 57 49 44 20 20 20 20 20 31 20  GES_ROWID     1 
1d30: 20 20 20 2f 2a 20 52 6f 77 69 64 20 75 73 65 64     /* Rowid used
1d40: 20 66 6f 72 20 74 68 65 20 61 76 65 72 61 67 65   for the average
1d50: 73 20 72 65 63 6f 72 64 20 2a 2f 0a 23 64 65 66  s record */.#def
1d60: 69 6e 65 20 46 54 53 35 5f 53 54 52 55 43 54 55  ine FTS5_STRUCTU
1d70: 52 45 5f 52 4f 57 49 44 28 69 49 64 78 29 20 28  RE_ROWID(iIdx) (
1d80: 31 30 20 2b 20 28 69 49 64 78 29 29 20 20 20 20  10 + (iIdx))    
1d90: 20 2f 2a 20 46 6f 72 20 73 74 72 75 63 74 75 72   /* For structur
1da0: 65 20 72 65 63 6f 72 64 73 20 2a 2f 0a 0a 2f 2a  e records */../*
1db0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 64 65 74 65 72  .** Macros deter
1dc0: 6d 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64  mining the rowid
1dd0: 73 20 75 73 65 64 20 62 79 20 73 65 67 6d 65 6e  s used by segmen
1de0: 74 20 6e 6f 64 65 73 2e 20 41 6c 6c 20 6e 6f 64  t nodes. All nod
1df0: 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a 20 73 65 67  es in all.** seg
1e00: 6d 65 6e 74 73 20 66 6f 72 20 61 6c 6c 20 69 6e  ments for all in
1e10: 64 65 78 65 73 20 28 74 68 65 20 72 65 67 75 6c  dexes (the regul
1e20: 61 72 20 46 54 53 20 69 6e 64 65 78 20 61 6e 64  ar FTS index and
1e30: 20 61 6e 79 20 70 72 65 66 69 78 20 69 6e 64 65   any prefix inde
1e40: 78 65 73 29 0a 2a 2a 20 61 72 65 20 73 74 6f 72  xes).** are stor
1e50: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e60: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e70: 65 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64  e positive rowid
1e80: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  s..**.** The %_d
1e90: 61 74 61 20 74 61 62 6c 65 20 6d 61 79 20 63 6f  ata table may co
1ea0: 6e 74 61 69 6e 20 75 70 20 74 6f 20 28 31 3c 3c  ntain up to (1<<
1eb0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 49 4e 44  FTS5_SEGMENT_IND
1ec0: 45 58 5f 42 49 54 53 29 20 0a 2a 2a 20 69 6e 64  EX_BITS) .** ind
1ed0: 65 78 65 73 20 2d 20 6f 6e 65 20 72 65 67 75 6c  exes - one regul
1ee0: 61 72 20 74 65 72 6d 20 69 6e 64 65 78 20 61 6e  ar term index an
1ef0: 64 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70  d zero or more p
1f00: 72 65 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a  refix indexes..*
1f10: 2a 0a 2a 2a 20 45 61 63 68 20 73 65 67 6d 65 6e  *.** Each segmen
1f20: 74 20 69 6e 20 61 6e 20 69 6e 64 65 78 20 68 61  t in an index ha
1f30: 73 20 61 20 75 6e 69 71 75 65 20 69 64 20 67 72  s a unique id gr
1f40: 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
1f50: 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 6e 6f 64 65  .**.** Each node
1f60: 20 69 6e 20 61 20 73 65 67 6d 65 6e 74 20 62 2d   in a segment b-
1f70: 74 72 65 65 20 69 73 20 61 73 73 69 67 6e 65 64  tree is assigned
1f80: 20 61 20 22 70 61 67 65 20 6e 75 6d 62 65 72 22   a "page number"
1f90: 20 74 68 61 74 20 69 73 20 75 6e 69 71 75 65 0a   that is unique.
1fa0: 2a 2a 20 77 69 74 68 69 6e 20 6e 6f 64 65 73 20  ** within nodes 
1fb0: 6f 66 20 69 74 73 20 68 65 69 67 68 74 20 77 69  of its height wi
1fc0: 74 68 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  thin the segment
1fd0: 20 28 6c 65 61 66 20 6e 6f 64 65 73 20 68 61 76   (leaf nodes hav
1fe0: 65 20 61 20 68 65 69 67 68 74 20 0a 2a 2a 20 6f  e a height .** o
1ff0: 66 20 30 2c 20 70 61 72 65 6e 74 73 20 31 2c 20  f 0, parents 1, 
2000: 65 74 63 2e 29 2e 20 50 61 67 65 20 6e 75 6d 62  etc.). Page numb
2010: 65 72 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  ers are allocate
2020: 64 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 20 73  d sequentially s
2030: 6f 20 74 68 61 74 0a 2a 2a 20 61 20 6e 6f 64 65  o that.** a node
2040: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  s page number is
2050: 20 61 6c 77 61 79 73 20 6f 6e 65 20 6d 6f 72 65   always one more
2060: 20 74 68 61 6e 20 69 74 73 20 6c 65 66 74 20 73   than its left s
2070: 69 62 6c 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ibling..**.** Th
2080: 65 20 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f  e rowid for a no
2090: 64 65 20 69 73 20 74 68 65 6e 20 66 6f 75 6e 64  de is then found
20a0: 20 75 73 69 6e 67 20 74 68 65 20 46 54 53 35 5f   using the FTS5_
20b0: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20  SEGMENT_ROWID() 
20c0: 6d 61 63 72 6f 0a 2a 2a 20 62 65 6c 6f 77 2e 20  macro.** below. 
20d0: 54 68 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  The FTS5_SEGMENT
20e0: 5f 2a 5f 42 49 54 53 20 6d 61 63 72 6f 73 20 64  _*_BITS macros d
20f0: 65 66 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  efine the number
2100: 20 6f 66 20 62 69 74 73 20 75 73 65 64 0a 2a 2a   of bits used.**
2110: 20 74 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 74   to encode the t
2120: 68 72 65 65 20 46 54 53 35 5f 53 45 47 4d 45 4e  hree FTS5_SEGMEN
2130: 54 5f 52 4f 57 49 44 28 29 20 61 72 67 75 6d 65  T_ROWID() argume
2140: 6e 74 73 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65  nts. This module
2150: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49   returns.** SQLI
2160: 54 45 5f 46 55 4c 4c 20 61 6e 64 20 66 61 69 6c  TE_FULL and fail
2170: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70  s the current op
2180: 65 72 61 74 69 6f 6e 20 69 66 20 74 68 65 79 20  eration if they 
2190: 65 76 65 72 20 70 72 6f 76 65 20 74 6f 6f 20 73  ever prove too s
21a0: 6d 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mall..*/.#define
21b0: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 58 5f 42   FTS5_DATA_IDX_B
21c0: 20 20 20 20 20 35 20 20 20 20 20 2f 2a 20 4d 61       5     /* Ma
21d0: 78 20 6f 66 20 33 31 20 70 72 65 66 69 78 20 69  x of 31 prefix i
21e0: 6e 64 65 78 65 73 20 2a 2f 0a 23 64 65 66 69 6e  ndexes */.#defin
21f0: 65 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  e FTS5_DATA_ID_B
2200: 20 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d       16     /* M
2210: 61 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72  ax seg id number
2220: 20 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e   65535 */.#defin
2230: 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  e FTS5_DATA_HEIG
2240: 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a 20 4d  HT_B  5     /* M
2250: 61 78 20 62 2d 74 72 65 65 20 68 65 69 67 68 74  ax b-tree height
2260: 20 6f 66 20 33 32 20 2a 2f 0a 23 64 65 66 69 6e   of 32 */.#defin
2270: 65 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  e FTS5_DATA_PAGE
2280: 5f 42 20 20 20 33 31 20 20 20 20 20 2f 2a 20 4d  _B   31     /* M
2290: 61 78 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ax page number o
22a0: 66 20 32 31 34 37 34 38 33 36 34 38 20 2a 2f 0a  f 2147483648 */.
22b0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45  .#define FTS5_SE
22c0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c  GMENT_ROWID(idx,
22d0: 20 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20   segid, height, 
22e0: 70 67 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20  pgno) (         
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 5c 0a 20 28 28 69 36 34 29 28 69 64 78 29 20 20  \. ((i64)(idx)  
2310: 20 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f    << (FTS5_DATA_
2320: 49 44 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41  ID_B + FTS5_DATA
2330: 5f 50 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44  _PAGE_B + FTS5_D
2340: 41 54 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b  ATA_HEIGHT_B)) +
2350: 20 5c 0a 20 28 28 69 36 34 29 28 73 65 67 69 64   \. ((i64)(segid
2360: 29 20 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41  )  << (FTS5_DATA
2370: 5f 50 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44  _PAGE_B + FTS5_D
2380: 41 54 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b  ATA_HEIGHT_B)) +
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 5c 0a 20 28 28 69 36 34 29 28 68 65 69 67    \. ((i64)(heig
23b0: 68 74 29 20 3c 3c 20 28 46 54 53 35 5f 44 41 54  ht) << (FTS5_DAT
23c0: 41 5f 50 41 47 45 5f 42 29 29 20 2b 20 20 20 20  A_PAGE_B)) +    
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 20 20 20 5c 0a 20 28 28 69 36 34 29 28 70 67 6e     \. ((i64)(pgn
2400: 6f 29 29 20 20 20 20 20 20 20 20 20 20 20 20 20  o))             
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 5c 0a 29 0a 0a 23 69 66 20 46 54 53      \.)..#if FTS
2450: 35 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44  5_MAX_PREFIX_IND
2460: 45 58 45 53 20 3e 20 28 28 31 3c 3c 46 54 53 35  EXES > ((1<<FTS5
2470: 5f 44 41 54 41 5f 49 44 58 5f 42 29 2d 31 29 20  _DATA_IDX_B)-1) 
2480: 0a 23 20 65 72 72 6f 72 20 22 46 54 53 35 5f 4d  .# error "FTS5_M
2490: 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45  AX_PREFIX_INDEXE
24a0: 53 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 22 0a  S is too large".
24b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
24c0: 65 20 68 65 69 67 68 74 20 6f 66 20 73 65 67 6d  e height of segm
24d0: 65 6e 74 20 62 2d 74 72 65 65 73 20 69 73 20 61  ent b-trees is a
24e0: 63 74 75 61 6c 6c 79 20 6c 69 6d 69 74 65 64 20  ctually limited 
24f0: 74 6f 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e  to one less than
2500: 20 0a 2a 2a 20 28 31 3c 3c 48 45 49 47 48 54 5f   .** (1<<HEIGHT_
2510: 42 49 54 53 29 2e 20 54 68 69 73 20 69 73 20 62  BITS). This is b
2520: 65 63 61 75 73 65 20 74 68 65 20 72 6f 77 69 64  ecause the rowid
2530: 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 66   address space f
2540: 6f 72 20 6e 6f 64 65 73 0a 2a 2a 20 77 69 74 68  or nodes.** with
2550: 20 73 75 63 68 20 61 20 68 65 69 67 68 74 20 69   such a height i
2560: 73 20 75 73 65 64 20 62 79 20 64 6f 63 6c 69 73  s used by doclis
2570: 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2f 0a 23 64  t indexes..*/.#d
2580: 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d 45  efine FTS5_SEGME
2590: 4e 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 28 28  NT_MAX_HEIGHT ((
25a0: 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48  1 << FTS5_DATA_H
25b0: 45 49 47 48 54 5f 42 29 2d 31 29 0a 0a 2f 2a 0a  EIGHT_B)-1)../*.
25c0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
25d0: 20 74 68 65 20 64 6f 63 6c 69 73 74 20 69 6e 64   the doclist ind
25e0: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
25f0: 74 68 20 6c 65 61 66 20 70 61 67 65 20 70 67 6e  th leaf page pgn
2600: 6f 20 6f 66 20 73 65 67 6d 65 6e 74 0a 2a 2a 20  o of segment.** 
2610: 73 65 67 69 64 20 69 6e 20 69 6e 64 65 78 20 69  segid in index i
2620: 64 78 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  dx..*/.#define F
2630: 54 53 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f  TS5_DOCLIST_IDX_
2640: 52 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69 64  ROWID(idx, segid
2650: 2c 20 70 67 6e 6f 29 20 5c 0a 20 20 20 20 20 20  , pgno) \.      
2660: 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52    FTS5_SEGMENT_R
2670: 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c  OWID(idx, segid,
2680: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41   FTS5_SEGMENT_MA
2690: 58 5f 48 45 49 47 48 54 2c 20 70 67 6e 6f 29 0a  X_HEIGHT, pgno).
26a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26b0: 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
26c0: 46 74 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20  Fts5Corrupt() { 
26d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
26e0: 52 52 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65  RRUPT_VTAB; }.#e
26f0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  ndif.../*.** Eac
2700: 68 20 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73  h time a blob is
2710: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
2720: 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20  _data table, it 
2730: 69 73 20 70 61 64 64 65 64 20 77 69 74 68 20 74  is padded with t
2740: 68 69 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f  his.** many zero
2750: 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b   bytes. This mak
2760: 65 73 20 69 74 20 65 61 73 69 65 72 20 74 6f 20  es it easier to 
2770: 64 65 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f  decode the vario
2780: 75 73 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  us record format
2790: 73 0a 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65  s.** without ove
27a0: 72 72 65 61 64 69 6e 67 20 69 66 20 74 68 65 20  rreading if the 
27b0: 72 65 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72  records are corr
27c0: 75 70 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  upt..*/.#define 
27d0: 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
27e0: 41 44 44 49 4e 47 20 38 0a 0a 74 79 70 65 64 65  ADDING 8..typede
27f0: 66 20 73 74 72 75 63 74 20 46 74 73 35 42 74 72  f struct Fts5Btr
2800: 65 65 49 74 65 72 20 46 74 73 35 42 74 72 65 65  eeIter Fts5Btree
2810: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
2820: 72 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74  ruct Fts5BtreeIt
2830: 65 72 4c 65 76 65 6c 20 46 74 73 35 42 74 72 65  erLevel Fts5Btre
2840: 65 49 74 65 72 4c 65 76 65 6c 3b 0a 74 79 70 65  eIterLevel;.type
2850: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43  def struct Fts5C
2860: 68 75 6e 6b 49 74 65 72 20 46 74 73 35 43 68 75  hunkIter Fts5Chu
2870: 6e 6b 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  nkIter;.typedef 
2880: 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78  struct Fts5Dlidx
2890: 49 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74  Iter Fts5DlidxIt
28a0: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
28b0: 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  ct Fts5MultiSegI
28c0: 74 65 72 20 46 74 73 35 4d 75 6c 74 69 53 65 67  ter Fts5MultiSeg
28d0: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
28e0: 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65  ruct Fts5NodeIte
28f0: 72 20 46 74 73 35 4e 6f 64 65 49 74 65 72 3b 0a  r Fts5NodeIter;.
2900: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2910: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74  ts5PageWriter Ft
2920: 73 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79  s5PageWriter;.ty
2930: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2940: 35 50 6f 73 49 74 65 72 20 46 74 73 35 50 6f 73  5PosIter Fts5Pos
2950: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
2960: 72 75 63 74 20 46 74 73 35 53 65 67 49 74 65 72  ruct Fts5SegIter
2970: 20 46 74 73 35 53 65 67 49 74 65 72 3b 0a 74 79   Fts5SegIter;.ty
2980: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2990: 35 44 6f 63 6c 69 73 74 49 74 65 72 20 46 74 73  5DoclistIter Fts
29a0: 35 44 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74 79  5DoclistIter;.ty
29b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
29c0: 35 53 65 67 57 72 69 74 65 72 20 46 74 73 35 53  5SegWriter Fts5S
29d0: 65 67 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65  egWriter;.typede
29e0: 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74 72  f struct Fts5Str
29f0: 75 63 74 75 72 65 20 46 74 73 35 53 74 72 75 63  ucture Fts5Struc
2a00: 74 75 72 65 3b 0a 74 79 70 65 64 65 66 20 73 74  ture;.typedef st
2a10: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
2a20: 72 65 4c 65 76 65 6c 20 46 74 73 35 53 74 72 75  reLevel Fts5Stru
2a30: 63 74 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65  ctureLevel;.type
2a40: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2a50: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
2a60: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
2a70: 6d 65 6e 74 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65  ment;../*.** One
2a80: 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61   object per %_da
2a90: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72  ta table..*/.str
2aa0: 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a  uct Fts5Index {.
2ab0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
2ac0: 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20  onfig;          
2ad0: 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62    /* Virtual tab
2ae0: 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  le configuration
2af0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74   */.  char *zDat
2b00: 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20  aTbl;           
2b10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2b20: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
2b30: 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74  .  int nWorkUnit
2b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b50: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73     /* Leaf pages
2b60: 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20   in a "unit" of 
2b70: 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  work */..  /*.  
2b80: 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c  ** Variables rel
2b90: 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75  ated to the accu
2ba0: 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  mulation of toke
2bb0: 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20  ns and doclists 
2bc0: 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20  within the.  ** 
2bd0: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
2be0: 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65  ables before the
2bf0: 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f  y are flushed to
2c00: 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74   disk..  */.  Ft
2c10: 73 35 48 61 73 68 20 2a 2a 61 70 48 61 73 68 3b  s5Hash **apHash;
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c30: 20 41 72 72 61 79 20 6f 66 20 68 61 73 68 20 74   Array of hash t
2c40: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  ables */.  int n
2c50: 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 3b 20  MaxPendingData; 
2c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2c70: 78 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 62  x pending data b
2c80: 65 66 6f 72 65 20 66 6c 75 73 68 20 74 6f 20 64  efore flush to d
2c90: 69 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 65  isk */.  int nPe
2ca0: 6e 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20 20  ndingData;      
2cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
2cc0: 65 6e 74 20 62 79 74 65 73 20 6f 66 20 70 65 6e  ent bytes of pen
2cd0: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 69  ding data */.  i
2ce0: 36 34 20 69 57 72 69 74 65 52 6f 77 69 64 3b 20  64 iWriteRowid; 
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d00: 2a 20 52 6f 77 69 64 20 66 6f 72 20 63 75 72 72  * Rowid for curr
2d10: 65 6e 74 20 64 6f 63 20 62 65 69 6e 67 20 77 72  ent doc being wr
2d20: 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 45  itten */..  /* E
2d30: 72 72 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20  rror state. */. 
2d40: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f   /* Current erro
2d70: 72 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  r code */..  /* 
2d80: 53 74 61 74 65 20 75 73 65 64 20 62 79 20 74 68  State used by th
2d90: 65 20 66 74 73 35 44 61 74 61 58 58 58 28 29 20  e fts5DataXXX() 
2da0: 66 75 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  functions. */.  
2db0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52  sqlite3_blob *pR
2dc0: 65 61 64 65 72 3b 20 20 20 20 20 20 20 20 20 20  eader;          
2dd0: 2f 2a 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20  /* RO incr-blob 
2de0: 6f 70 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74  open on %_data t
2df0: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
2e00: 33 5f 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b  3_stmt *pWriter;
2e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e            /* "IN
2e20: 53 45 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20  SERT ... %_data 
2e30: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a  VALUES(?,?)" */.
2e40: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2e50: 70 44 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20  pDeleter;       
2e60: 20 20 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f    /* "DELETE FRO
2e70: 4d 20 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e  M %_data ... id>
2e80: 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f  =? AND id<=?" */
2e90: 0a 20 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20  .  int nRead;   
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
2ec0: 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61  er of blocks rea
2ed0: 64 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  d */.};..struct 
2ee0: 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
2ef0: 7b 0a 20 20 69 6e 74 20 62 44 65 73 63 3b 20 20  {.  int bDesc;  
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2f20: 44 45 53 43 20 6f 72 64 65 72 2c 20 66 61 6c 73  DESC order, fals
2f30: 65 20 66 6f 72 20 41 53 43 20 2a 2f 0a 20 20 75  e for ASC */.  u
2f40: 38 20 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  8 *a;.  int n;. 
2f50: 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4f 75   int i;..  /* Ou
2f60: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20  tput variables. 
2f70: 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74 20 45  aPoslist==0 at E
2f80: 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  OF */.  i64 iRow
2f90: 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73 6c 69  id;.  u8 *aPosli
2fa0: 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69  st;.  int nPosli
2fb0: 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61  st;.};../*.** Ea
2fc0: 63 68 20 69 74 65 72 61 74 6f 72 20 75 73 65 64  ch iterator used
2fd0: 20 62 79 20 65 78 74 65 72 6e 61 6c 20 6d 6f 64   by external mod
2fe0: 75 6c 65 73 20 69 73 20 61 6e 20 69 6e 73 74 61  ules is an insta
2ff0: 6e 63 65 20 6f 66 20 74 68 69 73 20 74 79 70 65  nce of this type
3000: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3010: 49 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 46 74  IndexIter {.  Ft
3020: 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b  s5Index *pIndex;
3030: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
3040: 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
3050: 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
3060: 4d 75 6c 74 69 3b 0a 20 20 46 74 73 35 44 6f 63  Multi;.  Fts5Doc
3070: 6c 69 73 74 49 74 65 72 20 2a 70 44 6f 63 6c 69  listIter *pDocli
3080: 73 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  st;.  Fts5Buffer
3090: 20 70 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20   poslist;       
30a0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
30b0: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65  containing curre
30c0: 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 7d 3b  nt poslist */.};
30d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ../*.** The cont
30e0: 65 6e 74 73 20 6f 66 20 74 68 65 20 22 73 74 72  ents of the "str
30f0: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20 66  ucture" record f
3100: 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 61 72  or each index ar
3110: 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a 2a 2a  e represented.**
3120: 20 75 73 69 6e 67 20 61 6e 20 46 74 73 35 53 74   using an Fts5St
3130: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 69  ructure record i
3140: 6e 20 6d 65 6d 6f 72 79 2e 20 57 68 69 63 68 20  n memory. Which 
3150: 75 73 65 73 20 69 6e 73 74 61 6e 63 65 73 20 6f  uses instances o
3160: 66 20 74 68 65 20 0a 2a 2a 20 6f 74 68 65 72 20  f the .** other 
3170: 46 74 73 35 53 74 72 75 63 74 75 72 65 58 58 58  Fts5StructureXXX
3180: 20 74 79 70 65 73 20 61 73 20 63 6f 6d 70 6f 6e   types as compon
3190: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ents..*/.struct 
31a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
31b0: 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20 69 53 65  ment {.  int iSe
31c0: 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  gid;            
31d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
31e0: 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
31f0: 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 20  nHeight;        
3200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
3210: 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e 74  eight of segment
3220: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
3230: 20 70 67 6e 6f 46 69 72 73 74 3b 20 20 20 20 20   pgnoFirst;     
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3250: 46 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  First leaf page 
3260: 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e  number in segmen
3270: 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 4c  t */.  int pgnoL
3280: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
3290: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c         /* Last l
32a0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
32b0: 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d 3b  in segment */.};
32c0: 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75  .struct Fts5Stru
32d0: 63 74 75 72 65 4c 65 76 65 6c 20 7b 0a 20 20 69  ctureLevel {.  i
32e0: 6e 74 20 6e 4d 65 72 67 65 3b 20 20 20 20 20 20  nt nMerge;      
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3300: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
3310: 65 6e 74 73 20 69 6e 20 69 6e 63 72 2d 6d 65 72  ents in incr-mer
3320: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  ge */.  int nSeg
3330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3340: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3350: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
3360: 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f 0a  nts on level */.
3370: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
3380: 65 67 6d 65 6e 74 20 2a 61 53 65 67 3b 20 20 20  egment *aSeg;   
3390: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65    /* Array of se
33a0: 67 6d 65 6e 74 73 2e 20 61 53 65 67 5b 30 5d 20  gments. aSeg[0] 
33b0: 69 73 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d 3b  is oldest. */.};
33c0: 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75  .struct Fts5Stru
33d0: 63 74 75 72 65 20 7b 0a 20 20 75 36 34 20 6e 57  cture {.  u64 nW
33e0: 72 69 74 65 43 6f 75 6e 74 65 72 3b 20 20 20 20  riteCounter;    
33f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3400: 61 6c 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  al leaves writte
3410: 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f 0a  n to level 0 */.
3420: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20    int nLevel;   
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3440: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
3450: 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e  evels in this in
3460: 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  dex */.  Fts5Str
3470: 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76  uctureLevel aLev
3480: 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20 41 72 72 61  el[0];   /* Arra
3490: 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65  y of nLevel leve
34a0: 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a  l objects */.};.
34b0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
34c0: 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65 67   of type Fts5Seg
34d0: 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20 74  Writer is used t
34e0: 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65  o write to segme
34f0: 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  nts..*/.struct F
3500: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a  ts5PageWriter {.
3510: 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20    int pgno;     
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
3540: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
3550: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
3560: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
3570: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3580: 6e 74 61 69 6e 69 6e 67 20 70 61 67 65 20 64 61  ntaining page da
3590: 74 61 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ta */.  Fts5Buff
35a0: 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  er term;        
35b0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
35c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69  containing previ
35d0: 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65  ous term on page
35e0: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
35f0: 73 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20 20  s5SegWriter {.  
3600: 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74  /* Index to writ
3630: 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 53  e to */.  int iS
3640: 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  egid;           
3650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
3660: 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  id to write to *
3670: 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 72 3b  /.  int nWriter;
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3690: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36a0: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 57 72 69   entries in aWri
36b0: 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 50 61 67  ter */.  Fts5Pag
36c0: 65 57 72 69 74 65 72 20 2a 61 57 72 69 74 65 72  eWriter *aWriter
36d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  ;        /* Arra
36e0: 79 20 6f 66 20 50 61 67 65 57 72 69 74 65 72 20  y of PageWriter 
36f0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 36 34  objects */.  i64
3700: 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20 20 20   iPrevRowid;    
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3720: 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 77  Previous docid w
3730: 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72 65 6e  ritten to curren
3740: 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38 20 62  t leaf */.  u8 b
3750: 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
3760: 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ist;        /* T
3770: 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69  rue if next rowi
3780: 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 64 6f  d is first in do
3790: 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62 46  clist */.  u8 bF
37a0: 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3b  irstRowidInPage;
37b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
37c0: 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69 64  ue if next rowid
37d0: 20 69 73 20 66 69 72 73 74 20 69 6e 20 70 61 67   is first in pag
37e0: 65 20 2a 2f 0a 20 20 75 38 20 62 46 69 72 73 74  e */.  u8 bFirst
37f0: 54 65 72 6d 49 6e 50 61 67 65 3b 20 20 20 20 20  TermInPage;     
3800: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3810: 66 20 6e 65 78 74 20 74 65 72 6d 20 77 69 6c 6c  f next term will
3820: 20 62 65 20 66 69 72 73 74 20 69 6e 20 6c 65 61   be first in lea
3830: 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  f */.  int nLeaf
3840: 57 72 69 74 74 65 6e 3b 20 20 20 20 20 20 20 20  Written;        
3850: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3860: 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 77   of leaf pages w
3870: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
3880: 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20  nEmpty;         
3890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
38a0: 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74 69 67 75  umber of contigu
38b0: 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f  ous term-less no
38c0: 64 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  des */.  Fts5Buf
38d0: 66 65 72 20 63 64 6c 69 64 78 3b 20 20 20 20 20  fer cdlidx;     
38e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
38f0: 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
3900: 69 36 34 20 69 44 6c 69 64 78 50 72 65 76 3b 20  i64 iDlidxPrev; 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3930: 64 20 61 70 70 65 6e 64 65 64 20 74 6f 20 64 6c  d appended to dl
3940: 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 44 6c  idx */.  int bDl
3950: 69 64 78 50 72 65 76 56 61 6c 69 64 3b 20 20 20  idxPrevValid;   
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 69 44 6c 69 64 78 50 72 65 76 20 69   if iDlidxPrev i
3980: 73 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b 0a 0a 2f  s valid */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 74 68 65 20 6d 65 72 67 65 64 20 72 65 73  h the merged res
39c0: 75 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d  ults of one or m
39d0: 6f 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a  ore segments,.**
39e0: 20 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74   visiting each t
39f0: 65 72 6d 2f 64 6f 63 69 64 20 70 61 69 72 20 69  erm/docid pair i
3a00: 6e 20 74 68 65 20 6d 65 72 67 65 64 20 64 61 74  n the merged dat
3a10: 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73  a..**.** nSeg is
3a20: 20 61 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20   always a power 
3a30: 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74  of two greater t
3a40: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
3a50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
3a60: 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74   segments that t
3a70: 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65  his object is me
3a80: 72 67 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e  rging data from.
3a90: 20 42 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d   Both the aSeg[]
3aa0: 20 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d   and.** aFirst[]
3ab0: 20 61 72 72 61 79 73 20 61 72 65 20 73 69 7a 65   arrays are size
3ac0: 64 20 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65  d at nSeg entrie
3ad0: 73 2e 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72  s. The aSeg[] ar
3ae0: 72 61 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a  ray is padded.**
3af0: 20 77 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a   with zeroed obj
3b00: 65 63 74 73 20 2d 20 74 68 65 73 65 20 61 72 65  ects - these are
3b10: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74   handled as if t
3b20: 68 65 79 20 77 65 72 65 20 69 74 65 72 61 74 6f  hey were iterato
3b30: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3b40: 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a  empty segments..
3b50: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
3b60: 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73  s of comparing s
3b70: 65 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20  egments aSeg[N] 
3b80: 61 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77  and aSeg[N+1], w
3b90: 68 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20  here N is an.** 
3ba0: 65 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20  even number, is 
3bb0: 73 74 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74  stored in aFirst
3bc0: 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68  [(nSeg+N)/2]. Th
3bd0: 65 20 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68  e "result" of th
3be0: 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e  e .** comparison
3bf0: 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74   in this context
3c00: 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
3c10: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68   the iterator th
3c20: 61 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  at currently.** 
3c30: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d  points to the sm
3c40: 61 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64  aller term/rowid
3c50: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74   combination. It
3c60: 65 72 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61  erators at EOF a
3c70: 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  re.** considered
3c80: 20 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 74   to be greater t
3c90: 68 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74  han all other it
3ca0: 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61  erators..**.** a
3cb0: 46 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e  First[1] contain
3cc0: 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61  s the index in a
3cd0: 53 65 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65  Seg[] of the ite
3ce0: 72 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74  rator that point
3cf0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c  s to.** the smal
3d00: 6c 65 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c  lest key overall
3d10: 2e 20 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75  . aFirst[0] is u
3d20: 6e 75 73 65 64 2e 20 0a 2a 2f 0a 73 74 72 75 63  nused. .*/.struc
3d30: 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74  t Fts5MultiSegIt
3d40: 65 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b  er {.  int nSeg;
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d60: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
3d70: 66 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 2a  f aSeg[] array *
3d80: 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20  /.  int bRev;   
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
3db0: 74 65 72 61 74 65 20 69 6e 20 72 65 76 65 72 73  terate in revers
3dc0: 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74  e order */.  int
3dd0: 20 62 53 6b 69 70 45 6d 70 74 79 3b 20 20 20 20   bSkipEmpty;    
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3df0: 54 72 75 65 20 74 6f 20 73 6b 69 70 20 64 65 6c  True to skip del
3e00: 65 74 65 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a  eted entries */.
3e10: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 61    Fts5SegIter *a
3e20: 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
3e30: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65    /* Array of se
3e40: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  gment iterators 
3e50: 2a 2f 0a 20 20 75 31 36 20 2a 61 46 69 72 73 74  */.  u16 *aFirst
3e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e70: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3e80: 6d 65 72 67 65 20 73 74 61 74 65 20 28 73 65 65  merge state (see
3e90: 20 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f   above) */.};../
3ea0: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
3eb0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
3ec0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
3ed0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
3ee0: 68 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a 20  h term/docid.** 
3ef0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
3f00: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3f10: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3f20: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3f30: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3f40: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3f50: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3f60: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3f70: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3f80: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3f90: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3fa0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3fb0: 20 74 68 61 74 20 69 73 20 6f 6e 65 20 62 79 74   that is one byt
3fc0: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
3fd0: 66 20 74 68 65 0a 2a 2a 20 20 20 72 6f 77 69 64  f the.**   rowid
3fe0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75   field of the cu
3ff0: 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73 75  rrent entry. Usu
4000: 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68 65  ally this is the
4010: 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74   size field of t
4020: 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e  he.**   position
4030: 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65 20   list data. The 
4040: 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20  exception is if 
4050: 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  the rowid for th
4060: 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  e current entry 
4070: 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61 73  .**   is the las
4080: 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 6c  t thing on the l
4090: 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  eaf page..**.** 
40a0: 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66 66  pLeaf:.**   Buff
40b0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75  er containing cu
40c0: 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20  rrent leaf page 
40d0: 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55 4c  data. Set to NUL
40e0: 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  L at EOF..**.** 
40f0: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20 69  iTermLeafPgno, i
4100: 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a 0a  TermLeafOffset:.
4110: 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20 6e  **   Leaf page n
4120: 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  umber containing
4130: 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20 72   the last term r
4140: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67  ead from the seg
4150: 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20 74  ment. And.**   t
4160: 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64 69  he offset immedi
4170: 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
4180: 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a 2a  the term data..*
4190: 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20 20  *.** flags:.**  
41a0: 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53 45   Mask of FTS5_SE
41b0: 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65 73  GITER_XXX values
41c0: 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61 73  . Interpreted as
41d0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
41e0: 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f    FTS5_SEGITER_O
41f0: 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20 49  NETERM:.**     I
4200: 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20 69  f set, set the i
4210: 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e 74  terator to point
4220: 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74 68   to EOF after th
4230: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
4240: 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62 65  t .**     has be
4250: 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44 6f  en exhausted. Do
4260: 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f 20   not proceed to 
4270: 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69 6e  the next term in
4280: 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a   the segment..**
4290: 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54  .**   FTS5_SEGIT
42a0: 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20 20  ER_REVERSE:.**  
42b0: 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20     This flag is 
42c0: 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69 66  only ever set if
42d0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
42e0: 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73 65  ETERM is also se
42f0: 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74 20  t. If.**     it 
4300: 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65 20  is set, iterate 
4310: 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73 20 69  through docids i
4320: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
4330: 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  r instead of the
4340: 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c 74 20  .**     default 
4350: 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72  descending order
4360: 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f 66  ..**.** iRowidOf
4370: 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73 65  fset/nRowidOffse
4380: 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a 0a  t/aRowidOffset:.
4390: 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72 65  **     These are
43a0: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
43b0: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
43c0: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a  E flag is set..*
43d0: 2a 0a 2a 2a 20 20 20 20 20 45 61 63 68 20 74 69  *.**     Each ti
43e0: 6d 65 20 61 20 6e 65 77 20 70 61 67 65 20 69 73  me a new page is
43f0: 20 6c 6f 61 64 65 64 2c 20 74 68 65 20 69 74 65   loaded, the ite
4400: 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20  rator is set to 
4410: 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  point to the.** 
4420: 20 20 20 20 66 69 6e 61 6c 20 72 6f 77 69 64 2e      final rowid.
4430: 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74   Additionally, t
4440: 68 65 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  he aRowidOffset[
4450: 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70 75 6c  ] array is popul
4460: 61 74 65 64 20 0a 2a 2a 20 20 20 20 20 77 69 74  ated .**     wit
4470: 68 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  h the byte offse
4480: 74 73 20 6f 66 20 61 6c 6c 20 72 65 6c 65 76 61  ts of all releva
4490: 6e 74 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20  nt rowid fields 
44a0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 2a 2f  on the page. .*/
44b0: 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67 49  .struct Fts5SegI
44c0: 74 65 72 20 7b 0a 20 20 46 74 73 35 53 74 72 75  ter {.  Fts5Stru
44d0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
44e0: 65 67 3b 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg;     /* Segme
44f0: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
4500: 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 69  rough */.  int i
4510: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
4520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
4530: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
4540: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
4550: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4570: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
4580: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
4590: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
45a0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
45b0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
45c0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
45d0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
45e0: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
45f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4600: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4610: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4620: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4630: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
4640: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
4650: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  leaf */..  /* Th
4660: 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73 65  e page and offse
4670: 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65  t from which the
4680: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77 61   current term wa
4690: 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66 73  s read. The offs
46a0: 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  et .  ** is the 
46b0: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66 69  offset of the fi
46c0: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  rst rowid in the
46d0: 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
46e0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72  .  */.  int iTer
46f0: 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  mLeafPgno;.  int
4700: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
4710: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
4720: 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75  owing are only u
4730: 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35 5f  sed if the FTS5_
4740: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20  SEGITER_REVERSE 
4750: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f 0a  flag is set. */.
4760: 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73    int iRowidOffs
4770: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
4780: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e 74    /* Current ent
4790: 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66 73  ry in aRowidOffs
47a0: 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  et[] */.  int nR
47b0: 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20  owidOffset;     
47c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
47d0: 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
47e0: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72  RowidOffset[] ar
47f0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52  ray */.  int *aR
4800: 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20  owidOffset;     
4810: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
4820: 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20 72  y of offset to r
4830: 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a 0a  owid fields */..
4840: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
4850: 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20  *pDlidx;        
4860: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
4870: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
4880: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61 62   */..  /* Variab
4890: 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62 61  les populated ba
48a0: 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20 65  sed on current e
48b0: 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35 42  ntry. */.  Fts5B
48c0: 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
48d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
48e0: 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  rrent term */.  
48f0: 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4910: 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64  /* Current rowid
4920: 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20   */.};..#define 
4930: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
4940: 54 45 52 4d 20 30 78 30 31 0a 23 64 65 66 69 6e  TERM 0x01.#defin
4950: 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  e FTS5_SEGITER_R
4960: 45 56 45 52 53 45 20 30 78 30 32 0a 0a 0a 2f 2a  EVERSE 0x02.../*
4970: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
4980: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
4990: 20 70 61 67 69 6e 61 74 65 64 20 64 61 74 61 2e   paginated data.
49a0: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 43  .*/.struct Fts5C
49b0: 68 75 6e 6b 49 74 65 72 20 7b 0a 20 20 46 74 73  hunkIter {.  Fts
49c0: 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20  5Data *pLeaf;   
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49e0: 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
49f0: 61 2e 20 4e 55 4c 4c 20 2d 3e 20 45 4f 46 2e 20  a. NULL -> EOF. 
4a00: 2a 2f 0a 20 20 69 36 34 20 69 4c 65 61 66 52 6f  */.  i64 iLeafRo
4a10: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4a20: 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74 65       /* Absolute
4a30: 20 72 6f 77 69 64 20 6f 66 20 63 75 72 72 65 6e   rowid of curren
4a40: 74 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20  t leaf */.  int 
4a50: 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nRem;           
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
4a70: 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20 6f  emaining bytes o
4a80: 66 20 64 61 74 61 20 74 6f 20 72 65 61 64 20 2a  f data to read *
4a90: 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 70  /..  /* Output p
4aa0: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 75  arameters */.  u
4ab0: 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  8 *p;           
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4ad0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 68 75  * Pointer to chu
4ae0: 6e 6b 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  nk of data */.  
4af0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
4b20: 72 20 70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  r p in bytes */.
4b30: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  };../*.** Object
4b40: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
4b50: 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c 65 20  hrough a single 
4b60: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e  position list on
4b70: 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 72 75 63 74   disk..*/.struct
4b80: 20 46 74 73 35 50 6f 73 49 74 65 72 20 7b 0a 20   Fts5PosIter {. 
4b90: 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 63   Fts5ChunkIter c
4ba0: 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  hunk;           
4bb0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 63 68 75 6e   /* Current chun
4bc0: 6b 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 69  k of data */.  i
4bd0: 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20  nt iOff;        
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4bf0: 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20  * Offset within 
4c00: 63 68 75 6e 6b 20 64 61 74 61 20 2a 2f 0a 0a 20  chunk data */.. 
4c10: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e 74   int iCol;.  int
4c20: 20 69 50 6f 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   iPos;.};../*.**
4c30: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
4c40: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68  ating through th
4c50: 65 20 63 6f 6e 65 6e 74 73 20 6f 66 20 61 20 73  e conents of a s
4c60: 69 6e 67 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e  ingle internal n
4c70: 6f 64 65 20 69 6e 20 0a 2a 2a 20 6d 65 6d 6f 72  ode in .** memor
4c80: 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  y..*/.struct Fts
4c90: 35 4e 6f 64 65 49 74 65 72 20 7b 0a 20 20 2f 2a  5NodeIter {.  /*
4ca0: 20 49 6e 74 65 72 6e 61 6c 2e 20 53 65 74 20 61   Internal. Set a
4cb0: 6e 64 20 6d 61 6e 61 67 65 64 20 62 79 20 66 74  nd managed by ft
4cc0: 73 35 4e 6f 64 65 49 74 65 72 58 58 58 28 29 20  s5NodeIterXXX() 
4cd0: 66 75 6e 63 74 69 6f 6e 73 2e 20 45 78 63 65 70  functions. Excep
4ce0: 74 2c 20 0a 20 20 2a 2a 20 74 68 65 20 45 4f 46  t, .  ** the EOF
4cf0: 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 69 74   test for the it
4d00: 65 72 61 74 6f 72 20 69 73 20 28 46 74 73 35 4e  erator is (Fts5N
4d10: 6f 64 65 49 74 65 72 2e 61 44 61 74 61 3d 3d 30  odeIter.aData==0
4d20: 29 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ).  */.  const u
4d30: 38 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  8 *aData;.  int 
4d40: 6e 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66  nData;.  int iOf
4d50: 66 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  f;..  /* Output 
4d60: 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 46  variables */.  F
4d70: 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a  ts5Buffer term;.
4d80: 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 0a 20 20    int nEmpty;.  
4d90: 69 6e 74 20 69 43 68 69 6c 64 3b 0a 20 20 69 6e  int iChild;.  in
4da0: 74 20 62 44 6c 69 64 78 3b 0a 7d 3b 0a 0a 2f 2a  t bDlidx;.};../*
4db0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
4dc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
4dd0: 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74 6f   type is used to
4de0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
4df0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
4e00: 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   of a doclist-in
4e10: 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  dex record..**.*
4e20: 2a 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 52 65  * pData:.**   Re
4e30: 63 6f 72 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  cord containing 
4e40: 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
4e50: 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45  x data..**.** bE
4e60: 6f 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20  of:.**   Set to 
4e70: 74 72 75 65 20 6f 6e 63 65 20 69 74 65 72 61 74  true once iterat
4e80: 6f 72 20 68 61 73 20 72 65 61 63 68 65 64 20 45  or has reached E
4e90: 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a  OF..**.** iOff:.
4ea0: 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 68 65 20  **   Set to the 
4eb0: 63 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 77  current offset w
4ec0: 69 74 68 69 6e 20 72 65 63 6f 72 64 20 70 44 61  ithin record pDa
4ed0: 74 61 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  ta..*/.struct Ft
4ee0: 73 35 44 6c 69 64 78 49 74 65 72 20 7b 0a 20 20  s5DlidxIter {.  
4ef0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4f10: 20 44 61 74 61 20 66 6f 72 20 64 6f 63 6c 69 73   Data for doclis
4f20: 74 20 69 6e 64 65 78 2c 20 69 66 20 61 6e 79 20  t index, if any 
4f30: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20  */.  int iOff;  
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f50: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66     /* Current of
4f60: 66 73 65 74 20 69 6e 74 6f 20 70 44 6c 69 64 78  fset into pDlidx
4f70: 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20   */.  int bEof; 
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f90: 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c      /* At EOF al
4fa0: 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69  ready */.  int i
4fb0: 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20  FirstOff;       
4fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
4fd0: 20 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72   by reverse iter
4fe0: 61 74 6f 72 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 20  ators only */.. 
4ff0: 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61   /* Output varia
5000: 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  bles */.  int iL
5010: 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20  eafPgno;        
5020: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
5030: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  number of curren
5040: 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  t leaf page */. 
5050: 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5070: 2a 20 46 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  * First rowid on
5080: 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20   leaf iLeafPgno 
5090: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  */.};.../*.** An
50a0: 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20 6f   Fts5BtreeIter o
50b0: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
50c0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
50d0: 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20   all entries in 
50e0: 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65 20 68 69  the.** b-tree hi
50f0: 65 72 61 72 63 68 79 20 62 65 6c 6f 6e 67 69 6e  erarchy belongin
5100: 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 66 74  g to a single ft
5110: 73 35 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74  s5 segment. In t
5120: 68 69 73 20 63 61 73 65 20 74 68 65 0a 2a 2a 20  his case the.** 
5130: 22 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68  "b-tree hierarch
5140: 79 22 20 69 73 20 61 6c 6c 20 62 2d 74 72 65 65  y" is all b-tree
5150: 20 6e 6f 64 65 73 20 65 78 63 65 70 74 20 6c 65   nodes except le
5160: 61 76 65 73 2e 20 45 61 63 68 20 65 6e 74 72 79  aves. Each entry
5170: 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65   in the.** b-tre
5180: 65 20 68 69 65 72 61 72 63 68 79 20 63 6f 6e 73  e hierarchy cons
5190: 69 73 74 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ists of the foll
51a0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  owing:.**.**   i
51b0: 4c 65 61 66 3a 20 20 54 68 65 20 70 61 67 65 20  Leaf:  The page 
51c0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c 65  number of the le
51d0: 61 66 20 70 61 67 65 20 74 68 65 20 65 6e 74 72  af page the entr
51e0: 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a  y points to..**.
51f0: 2a 2a 20 20 20 74 65 72 6d 3a 20 20 20 41 20 73  **   term:   A s
5200: 70 6c 69 74 2d 6b 65 79 20 74 68 61 74 20 61 6c  plit-key that al
5210: 6c 20 74 65 72 6d 73 20 6f 6e 20 6c 65 61 66 20  l terms on leaf 
5220: 70 61 67 65 20 24 69 4c 65 61 66 20 6d 75 73 74  page $iLeaf must
5230: 20 62 65 20 67 72 65 61 74 65 72 0a 2a 2a 20 20   be greater.**  
5240: 20 20 20 20 20 20 20 20 20 74 68 61 6e 20 6f 72           than or
5250: 20 65 71 75 61 6c 20 74 6f 2e 20 54 68 65 20 22   equal to. The "
5260: 74 65 72 6d 22 20 61 73 73 6f 63 69 61 74 65 64  term" associated
5270: 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
5280: 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 20 20 20  b-tree.**       
5290: 20 20 20 20 68 69 65 72 61 72 63 68 79 20 65 6e      hierarchy en
52a0: 74 72 79 20 28 74 68 65 20 6f 6e 65 20 74 68 61  try (the one tha
52b0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 6c 65 61 66  t points to leaf
52c0: 20 70 61 67 65 20 31 29 20 69 73 20 61 6c 77 61   page 1) is alwa
52d0: 79 73 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ys .**          
52e0: 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
52f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45 6d 70 74 79  ..**.**   nEmpty
5300: 3a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  : The number of 
5310: 65 6d 70 74 79 20 28 74 65 72 6d 6c 65 73 73 29  empty (termless)
5320: 20 6c 65 61 66 20 70 61 67 65 73 20 74 68 61 74   leaf pages that
5330: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20   immediately.** 
5340: 20 20 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f 77            follow
5350: 69 6e 67 20 69 4c 65 61 66 2e 0a 2a 2a 0a 2a 2a  ing iLeaf..**.**
5360: 20 54 68 65 20 46 74 73 35 42 74 72 65 65 49 74   The Fts5BtreeIt
5370: 65 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 6e 6c  er object is onl
5380: 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
5390: 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  f the integrity-
53a0: 63 68 65 63 6b 20 63 6f 64 65 2e 0a 2a 2f 0a 73  check code..*/.s
53b0: 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65 49  truct Fts5BtreeI
53c0: 74 65 72 4c 65 76 65 6c 20 7b 0a 20 20 46 74 73  terLevel {.  Fts
53d0: 35 4e 6f 64 65 49 74 65 72 20 73 3b 20 20 20 20  5NodeIter s;    
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
53f0: 49 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65  Iterator for the
5400: 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 2a 2f   current node */
5410: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
5420: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
5430: 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74     /* Data for t
5440: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
5450: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
5460: 35 42 74 72 65 65 49 74 65 72 20 7b 0a 20 20 46  5BtreeIter {.  F
5470: 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20  ts5Index *p;    
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5490: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
54a0: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
54b0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
54c0: 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 49 74  *pSeg;     /* It
54d0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
54e0: 69 73 20 73 65 67 6d 65 6e 74 27 73 20 62 2d 74  is segment's b-t
54f0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ree */.  int iId
5500: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
5510: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
5520: 78 20 70 53 65 67 20 62 65 6c 6f 6e 67 73 20 74  x pSeg belongs t
5530: 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b  o */.  int nLvl;
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
5560: 66 20 61 4c 76 6c 5b 5d 20 61 72 72 61 79 20 2a  f aLvl[] array *
5570: 2f 0a 20 20 46 74 73 35 42 74 72 65 65 49 74 65  /.  Fts5BtreeIte
5580: 72 4c 65 76 65 6c 20 2a 61 4c 76 6c 3b 20 20 20  rLevel *aLvl;   
5590: 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 66 6f 72      /* Level for
55a0: 20 65 61 63 68 20 74 69 65 72 20 6f 66 20 62 2d   each tier of b-
55b0: 74 72 65 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75  tree */..  /* Ou
55c0: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a  tput variables *
55d0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
55e0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
55f0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
5600: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  erm */.  int iLe
5610: 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
5620: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66           /* Leaf
5630: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d   containing term
5640: 73 20 3e 3d 20 63 75 72 72 65 6e 74 20 74 65 72  s >= current ter
5650: 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74  m */.  int nEmpt
5660: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
5670: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5680: 20 6f 66 20 22 65 6d 70 74 79 22 20 6c 65 61 76   of "empty" leav
5690: 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65  es following iLe
56a0: 61 66 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66  af */.  int bEof
56b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
56c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
56d0: 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a 2f  o true at EOF */
56e0: 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b 20 20  .  int bDlidx;  
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
5710: 65 72 65 20 65 78 69 73 74 73 20 61 20 64 6c 69  ere exists a dli
5720: 64 78 20 2a 2f 0a 7d 3b 0a 0a 0a 73 74 61 74 69  dx */.};...stati
5730: 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55 31  c void fts5PutU1
5740: 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20  6(u8 *aOut, u16 
5750: 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d  iVal){.  aOut[0]
5760: 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20   = (iVal>>8);.  
5770: 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26  aOut[1] = (iVal&
5780: 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  0xFF);.}..static
5790: 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36 28   u16 fts5GetU16(
57a0: 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a  const u8 *aIn){.
57b0: 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29 61    return ((u16)a
57c0: 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49  In[0] << 8) + aI
57d0: 6e 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n[1];.}../*.** T
57e0: 68 69 73 20 69 73 20 61 20 63 6f 70 79 20 6f 66  his is a copy of
57f0: 20 74 68 65 20 73 71 6c 69 74 65 33 47 65 74 56   the sqlite3GetV
5800: 61 72 69 6e 74 33 32 28 29 20 72 6f 75 74 69 6e  arint32() routin
5810: 65 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 69 74  e from the SQLit
5820: 65 20 63 6f 72 65 2e 0a 2a 2a 20 45 78 63 65 70  e core..** Excep
5830: 74 2c 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  t, this version 
5840: 64 6f 65 73 20 68 61 6e 64 6c 65 20 74 68 65 20  does handle the 
5850: 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 73 65  single byte case
5860: 20 74 68 61 74 20 74 68 65 20 63 6f 72 65 0a 2a   that the core.*
5870: 2a 20 76 65 72 73 69 6f 6e 20 64 65 70 65 6e 64  * version depend
5880: 73 20 6f 6e 20 62 65 69 6e 67 20 68 61 6e 64 6c  s on being handl
5890: 65 64 20 62 65 66 6f 72 65 20 69 74 73 20 66 75  ed before its fu
58a0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
58b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
58c0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  Fts5GetVarint32(
58d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
58e0: 68 61 72 20 2a 70 2c 20 75 33 32 20 2a 76 29 7b  har *p, u32 *v){
58f0: 0a 20 20 75 33 32 20 61 2c 62 3b 0a 0a 20 20 2f  .  u32 a,b;..  /
5900: 2a 20 54 68 65 20 31 2d 62 79 74 65 20 63 61 73  * The 1-byte cas
5910: 65 2e 20 4f 76 65 72 77 68 65 6c 6d 69 6e 67 6c  e. Overwhelmingl
5920: 79 20 74 68 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  y the most commo
5930: 6e 2e 20 2a 2f 0a 20 20 61 20 3d 20 2a 70 3b 0a  n. */.  a = *p;.
5940: 20 20 2f 2a 20 61 3a 20 70 30 20 28 75 6e 6d 61    /* a: p0 (unma
5950: 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21  sked) */.  if (!
5960: 28 61 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20  (a&0x80)).  {.  
5970: 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77    /* Values betw
5980: 65 65 6e 20 30 20 61 6e 64 20 31 32 37 20 2a 2f  een 0 and 127 */
5990: 0a 20 20 20 20 2a 76 20 3d 20 61 3b 0a 20 20 20  .    *v = a;.   
59a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
59b0: 20 20 2f 2a 20 54 68 65 20 32 2d 62 79 74 65 20    /* The 2-byte 
59c0: 63 61 73 65 20 2a 2f 0a 20 20 70 2b 2b 3b 0a 20  case */.  p++;. 
59d0: 20 62 20 3d 20 2a 70 3b 0a 20 20 2f 2a 20 62 3a   b = *p;.  /* b:
59e0: 20 70 31 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a   p1 (unmasked) *
59f0: 2f 0a 20 20 69 66 20 28 21 28 62 26 30 78 38 30  /.  if (!(b&0x80
5a00: 29 29 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61  )).  {.    /* Va
5a10: 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 32 38  lues between 128
5a20: 20 61 6e 64 20 31 36 33 38 33 20 2a 2f 0a 20 20   and 16383 */.  
5a30: 20 20 61 20 26 3d 20 30 78 37 66 3b 0a 20 20 20    a &= 0x7f;.   
5a40: 20 61 20 3d 20 61 3c 3c 37 3b 0a 20 20 20 20 2a   a = a<<7;.    *
5a50: 76 20 3d 20 61 20 7c 20 62 3b 0a 20 20 20 20 72  v = a | b;.    r
5a60: 65 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 0a 20 20  eturn 2;.  }..  
5a70: 2f 2a 20 54 68 65 20 33 2d 62 79 74 65 20 63 61  /* The 3-byte ca
5a80: 73 65 20 2a 2f 0a 20 20 70 2b 2b 3b 0a 20 20 61  se */.  p++;.  a
5a90: 20 3d 20 61 3c 3c 31 34 3b 0a 20 20 61 20 7c 3d   = a<<14;.  a |=
5aa0: 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70 30 3c   *p;.  /* a: p0<
5ab0: 3c 31 34 20 7c 20 70 32 20 28 75 6e 6d 61 73 6b  <14 | p2 (unmask
5ac0: 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21 28 61  ed) */.  if (!(a
5ad0: 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20 20 20  &0x80)).  {.    
5ae0: 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77 65 65  /* Values betwee
5af0: 6e 20 31 36 33 38 34 20 61 6e 64 20 32 30 39 37  n 16384 and 2097
5b00: 31 35 31 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20  151 */.    a &= 
5b10: 28 30 78 37 66 3c 3c 31 34 29 7c 28 30 78 37 66  (0x7f<<14)|(0x7f
5b20: 29 3b 0a 20 20 20 20 62 20 26 3d 20 30 78 37 66  );.    b &= 0x7f
5b30: 3b 0a 20 20 20 20 62 20 3d 20 62 3c 3c 37 3b 0a  ;.    b = b<<7;.
5b40: 20 20 20 20 2a 76 20 3d 20 61 20 7c 20 62 3b 0a      *v = a | b;.
5b50: 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
5b60: 7d 0a 0a 20 20 2f 2a 20 41 20 33 32 2d 62 69 74  }..  /* A 32-bit
5b70: 20 76 61 72 69 6e 74 20 69 73 20 75 73 65 64 20   varint is used 
5b80: 74 6f 20 73 74 6f 72 65 20 73 69 7a 65 20 69 6e  to store size in
5b90: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 62 74 72  formation in btr
5ba0: 65 65 73 2e 0a 20 20 2a 2a 20 4f 62 6a 65 63 74  ees..  ** Object
5bb0: 73 20 61 72 65 20 72 61 72 65 6c 79 20 6c 61 72  s are rarely lar
5bc0: 67 65 72 20 74 68 61 6e 20 32 4d 69 42 20 6c 69  ger than 2MiB li
5bd0: 6d 69 74 20 6f 66 20 61 20 33 2d 62 79 74 65 20  mit of a 3-byte 
5be0: 76 61 72 69 6e 74 2e 0a 20 20 2a 2a 20 41 20 33  varint..  ** A 3
5bf0: 2d 62 79 74 65 20 76 61 72 69 6e 74 20 69 73 20  -byte varint is 
5c00: 73 75 66 66 69 63 69 65 6e 74 2c 20 66 6f 72 20  sufficient, for 
5c10: 65 78 61 6d 70 6c 65 2c 20 74 6f 20 72 65 63 6f  example, to reco
5c20: 72 64 20 74 68 65 20 73 69 7a 65 0a 20 20 2a 2a  rd the size.  **
5c30: 20 6f 66 20 61 20 31 30 34 38 35 36 39 2d 62 79   of a 1048569-by
5c40: 74 65 20 42 4c 4f 42 20 6f 72 20 73 74 72 69 6e  te BLOB or strin
5c50: 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  g..  **.  ** We 
5c60: 6f 6e 6c 79 20 75 6e 72 6f 6c 6c 20 74 68 65 20  only unroll the 
5c70: 66 69 72 73 74 20 31 2d 2c 20 32 2d 2c 20 61 6e  first 1-, 2-, an
5c80: 64 20 33 2d 20 62 79 74 65 20 63 61 73 65 73 2e  d 3- byte cases.
5c90: 20 20 54 68 65 20 76 65 72 79 0a 20 20 2a 2a 20    The very.  ** 
5ca0: 72 61 72 65 20 6c 61 72 67 65 72 20 63 61 73 65  rare larger case
5cb0: 73 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64  s can be handled
5cc0: 20 62 79 20 74 68 65 20 73 6c 6f 77 65 72 20 36   by the slower 6
5cd0: 34 2d 62 69 74 20 76 61 72 69 6e 74 0a 20 20 2a  4-bit varint.  *
5ce0: 2a 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  * routine..  */.
5cf0: 20 20 7b 0a 20 20 20 20 75 36 34 20 76 36 34 3b    {.    u64 v64;
5d00: 0a 20 20 20 20 75 38 20 6e 3b 0a 20 20 20 20 70  .    u8 n;.    p
5d10: 20 2d 3d 20 32 3b 0a 20 20 20 20 6e 20 3d 20 73   -= 2;.    n = s
5d20: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28  qlite3GetVarint(
5d30: 70 2c 20 26 76 36 34 29 3b 0a 20 20 20 20 2a 76  p, &v64);.    *v
5d40: 20 3d 20 28 75 33 32 29 76 36 34 3b 0a 20 20 20   = (u32)v64;.   
5d50: 20 61 73 73 65 72 74 28 20 6e 3e 33 20 26 26 20   assert( n>3 && 
5d60: 6e 3c 3d 39 20 29 3b 0a 20 20 20 20 72 65 74 75  n<=9 );.    retu
5d70: 72 6e 20 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn n;.  }.}../*.
5d80: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
5d90: 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72 20  return a buffer 
5da0: 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62  at least nByte b
5db0: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
5dc0: 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
5dd0: 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
5de0: 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ed, return NULL 
5df0: 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72 6f  and set the erro
5e00: 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65  r code in.** the
5e10: 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
5e20: 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
5e30: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
5e40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
5e50: 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74  fts5IdxMalloc(Ft
5e60: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
5e70: 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a  nByte){.  void *
5e80: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
5e90: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
5ea0: 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73   ){.    pRet = s
5eb0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42  qlite3_malloc(nB
5ec0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 52  yte);.    if( pR
5ed0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
5ee0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
5ef0: 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
5f00: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65        memset(pRe
5f10: 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20  t, 0, nByte);.  
5f20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5f30: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
5f40: 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74  Compare the cont
5f50: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66  ents of the pLef
5f60: 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74 68  t buffer with th
5f70: 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20  e pRight/nRight 
5f80: 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  blob..**.** Retu
5f90: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
5fa0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
5fb0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
5fc0: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
5fd0: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
5fe0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
5ff0: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
6000: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
6010: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
6020: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
6030: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
6040: 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 46  CompareBlob(.  F
6050: 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74  ts5Buffer *pLeft
6060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6070: 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64 65  * Left hand side
6080: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a   of comparison *
6090: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52  /.  const u8 *pR
60a0: 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74  ight, int nRight
60b0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61 6e      /* Right han
60c0: 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72  d side of compar
60d0: 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ison */.){.  int
60e0: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66   nCmp = MIN(pLef
60f0: 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20  t->n, nRight);. 
6100: 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d   int res = memcm
6110: 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67  p(pLeft->p, pRig
6120: 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  ht, nCmp);.  ret
6130: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70  urn (res==0 ? (p
6140: 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74  Left->n - nRight
6150: 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 23 69 66  ) : res);.}..#if
6160: 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74   0.static int ft
6170: 73 35 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20  s5CompareBlob(. 
6180: 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 65 66 74   const u8 *pLeft
6190: 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63  , int nLeft,.  c
61a0: 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74 2c  onst u8 *pRight,
61b0: 20 69 6e 74 20 6e 52 69 67 68 74 0a 29 7b 0a 20   int nRight.){. 
61c0: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
61d0: 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 29 3b 0a  nLeft, nRight);.
61e0: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
61f0: 6d 70 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  mp(pLeft, pRight
6200: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
6210: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 6e 4c 65  n (res==0 ? (nLe
6220: 66 74 20 2d 20 6e 52 69 67 68 74 29 20 3a 20 72  ft - nRight) : r
6230: 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  es);.}.#endif../
6240: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
6250: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
6260: 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69   two buffers usi
6270: 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20  ng memcmp(). If 
6280: 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73  one buffer.** is
6290: 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
62a0: 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f   other, it is co
62b0: 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73  nsidered the les
62c0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ser..**.** Retur
62d0: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
62e0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
62f0: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
6300: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
6310: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
6320: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
6330: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
6340: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
6350: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
6360: 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63  pRight.*/.static
6370: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
6380: 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65  ompare(Fts5Buffe
6390: 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75  r *pLeft, Fts5Bu
63a0: 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  ffer *pRight){. 
63b0: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
63c0: 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74  pLeft->n, pRight
63d0: 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ->n);.  int res 
63e0: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e  = memcmp(pLeft->
63f0: 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43  p, pRight->p, nC
6400: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
6410: 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e  es==0 ? (pLeft->
6420: 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a  n - pRight->n) :
6430: 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   res);.}.../*.**
6440: 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d   Close the read-
6450: 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65  only blob handle
6460: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
6470: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6480: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
6490: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
64a0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20   if( p->pReader 
64b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
64c0: 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20 70  lob *pReader = p
64d0: 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 70  ->pReader;.    p
64e0: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
64f0: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
6500: 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b 0a  close(pReader);.
6510: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74    }.}..static Ft
6520: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
6530: 52 65 61 64 4f 72 42 75 66 66 65 72 28 0a 20 20  ReadOrBuffer(.  
6540: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
6550: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
6560: 66 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64  f, .  i64 iRowid
6570: 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  .){.  Fts5Data *
6580: 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  pRet = 0;.  if( 
6590: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
65a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
65b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
65c0: 20 30 0a 46 74 73 35 42 75 66 66 65 72 20 62 75   0.Fts5Buffer bu
65d0: 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 66 74 73  f = {0,0,0};.fts
65e0: 35 44 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c  5DebugRowid(&rc,
65f0: 20 26 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a   &buf, iRowid);.
6600: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
6610: 22 72 65 61 64 3a 20 25 73 5c 6e 22 2c 20 62 75  "read: %s\n", bu
6620: 66 2e 70 29 3b 0a 66 66 6c 75 73 68 28 73 74 64  f.p);.fflush(std
6630: 6f 75 74 29 3b 0a 73 71 6c 69 74 65 33 5f 66 72  out);.sqlite3_fr
6640: 65 65 28 62 75 66 2e 70 29 3b 0a 23 65 6e 64 69  ee(buf.p);.#endi
6650: 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65  f.    if( p->pRe
6660: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ader ){.      /*
6670: 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72   This call may r
6680: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
6690: 52 54 20 69 66 20 74 68 65 72 65 20 68 61 73 20  RT if there has 
66a0: 62 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  been a savepoint
66b0: 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
66c0: 63 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ck since it was 
66d0: 6c 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68  last used. In th
66e0: 69 73 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c  is case a new bl
66f0: 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20  ob handle.      
6700: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ** is required. 
6710: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
6720: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
6730: 65 6e 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 69  en(p->pReader, i
6740: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
6750: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  ( rc==SQLITE_ABO
6760: 52 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  RT ){.        ft
6770: 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29  s5CloseReader(p)
6780: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
6790: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
67a0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
67b0: 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  If the blob hand
67c0: 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  le is not yet op
67d0: 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65 65  en, open and see
67e0: 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  k it. Otherwise,
67f0: 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   use.    ** the 
6800: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41 50  blob_reopen() AP
6810: 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65 20  I to reseek the 
6820: 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68 61  existing blob ha
6830: 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ndle.  */.    if
6840: 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
6850: 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e  ){.      Fts5Con
6860: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
6870: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20  ->pConfig;.     
6880: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
6890: 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d  ob_open(pConfig-
68a0: 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  >db, .          
68b0: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d  pConfig->zDb, p-
68c0: 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63  >zDataTbl, "bloc
68d0: 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26  k", iRowid, 0, &
68e0: 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20  p->pReader.     
68f0: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
6900: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6910: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f   ){.      u8 *aO
6920: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
6930: 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c        /* Read bl
6940: 6f 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  ob data into thi
6950: 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  s buffer */.    
6960: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71    int nByte = sq
6970: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
6980: 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20  (p->pReader);.  
6990: 20 20 20 20 69 66 28 20 70 42 75 66 20 29 7b 0a      if( pBuf ){.
69a0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
69b0: 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20  erZero(pBuf);.  
69c0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
69d0: 47 72 6f 77 28 26 72 63 2c 20 70 42 75 66 2c 20  Grow(&rc, pBuf, 
69e0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
69f0: 61 4f 75 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a  aOut = pBuf->p;.
6a00: 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
6a10: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  = nByte;.      }
6a20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
6a30: 74 20 6e 53 70 61 63 65 20 3d 20 6e 42 79 74 65  t nSpace = nByte
6a40: 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52   + FTS5_DATA_ZER
6a50: 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20 20  O_PADDING;.     
6a60: 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 44     pRet = (Fts5D
6a70: 61 74 61 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ata*)sqlite3Fts5
6a80: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
6a90: 6e 53 70 61 63 65 2b 73 69 7a 65 6f 66 28 46 74  nSpace+sizeof(Ft
6aa0: 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20  s5Data));.      
6ab0: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
6ac0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 20          pRet->n 
6ad0: 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20  = nByte;.       
6ae0: 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e     aOut = pRet->
6af0: 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31  p = (u8*)&pRet[1
6b00: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65  ];.          pRe
6b10: 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
6b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
6b30: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6b40: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6b50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6b60: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65  blob_read(p->pRe
6b70: 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74  ader, aOut, nByt
6b80: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
6b90: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
6ba0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6bb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6bc0: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
6bd0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
6be0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20      }.    p->rc 
6bf0: 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = rc;.    p->nRe
6c00: 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ad++;.  }..  ret
6c10: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
6c20: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72 65  ** Retrieve a re
6c30: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  cord from the %_
6c40: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
6c50: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6c60: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
6c70: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
6c80: 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20  ror left in the 
6c90: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62  .** Fts5Index ob
6ca0: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
6cb0: 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61  Fts5Data *fts5Da
6cc0: 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  taRead(Fts5Index
6cd0: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29   *p, i64 iRowid)
6ce0: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52  {.  Fts5Data *pR
6cf0: 65 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  et = fts5DataRea
6d00: 64 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c 20  dOrBuffer(p, 0, 
6d10: 69 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72  iRowid);.  asser
6d20: 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70  t( (pRet==0)==(p
6d30: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc!=SQLITE_OK)
6d40: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65   );.  return pRe
6d50: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  t;.}../*.** Read
6d60: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
6d70: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
6d80: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
6d90: 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a  supplied as the.
6da0: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
6db0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
6dc0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
6dd0: 20 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69   error is left i
6de0: 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  n the Fts5Index 
6df0: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a  object. If an.**
6e00: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
6e10: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
6e20: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
6e30: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
6e40: 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  a .** no-op..*/.
6e50: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6e60: 44 61 74 61 42 75 66 66 65 72 28 46 74 73 35 49  DataBuffer(Fts5I
6e70: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66  ndex *p, Fts5Buf
6e80: 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69  fer *pBuf, i64 i
6e90: 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64 29  Rowid){.  (void)
6ea0: 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
6eb0: 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69 52  ffer(p, pBuf, iR
6ec0: 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  owid);.}../*.** 
6ed0: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6ee0: 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f  nce to data reco
6ef0: 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  rd returned by a
6f00: 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
6f10: 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61  o.** fts5DataRea
6f20: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
6f30: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65  oid fts5DataRele
6f40: 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44  ase(Fts5Data *pD
6f50: 61 74 61 29 7b 0a 20 20 69 66 28 20 70 44 61 74  ata){.  if( pDat
6f60: 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  a ){.    assert(
6f70: 20 70 44 61 74 61 2d 3e 6e 52 65 66 3e 30 20 29   pData->nRef>0 )
6f80: 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 52 65  ;.    pData->nRe
6f90: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 61  f--;.    if( pDa
6fa0: 74 61 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71  ta->nRef==0 ) sq
6fb0: 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
6fc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
6fd0: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
6fe0: 66 65 72 65 6e 63 65 28 46 74 73 35 44 61 74 61  ference(Fts5Data
6ff0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 70 44 61 74   *pData){.  pDat
7000: 61 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a  a->nRef++;.}../*
7010: 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45  .** INSERT OR RE
7020: 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20 69  PLACE a record i
7030: 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74  nto the %_data t
7040: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
7050: 76 6f 69 64 20 66 74 73 35 44 61 74 61 57 72 69  void fts5DataWri
7060: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
7070: 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e   i64 iRowid, con
7080: 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
7090: 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20  t nData){.  if( 
70a0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
70b0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
70c0: 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20  ( p->pWriter==0 
70d0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
70e0: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
70f0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
7100: 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  fig;.    char *z
7110: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
7120: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
7130: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
7140: 27 2e 25 51 28 69 64 2c 20 62 6c 6f 63 6b 29 20  '.%Q(id, block) 
7150: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 70 43  VALUES(?,?)", pC
7160: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
7170: 44 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20  DataTbl.    );. 
7180: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
7190: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
71a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
71b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
71c0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
71d0: 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  _v2(pConfig->db,
71e0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70   zSql, -1, &p->p
71f0: 57 72 69 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Writer, 0);.    
7200: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
7210: 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
7220: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7230: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  K ){.      p->rc
7240: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
7250: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
7260: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
7270: 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c  nt64(p->pWriter,
7280: 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73   1, iRowid);.  s
7290: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
72a0: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20  (p->pWriter, 2, 
72b0: 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51  pData, nData, SQ
72c0: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
72d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
72e0: 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72  pWriter);.  p->r
72f0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
7300: 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d  t(p->pWriter);.}
7310: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
7320: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  the following SQ
7330: 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c  L:.**.**     DEL
7340: 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20  ETE FROM %_data 
7350: 57 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e  WHERE id BETWEEN
7360: 20 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c   $iFirst AND $iL
7370: 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ast.*/.static vo
7380: 69 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  id fts5DataDelet
7390: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
73a0: 69 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20  i64 iFirst, i64 
73b0: 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d  iLast){.  if( p-
73c0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
73d0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
73e0: 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29  p->pDeleter==0 )
73f0: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
7400: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
7410: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
7420: 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  ig;.    char *zS
7430: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
7440: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 44  intf(.        "D
7450: 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e  ELETE FROM '%q'.
7460: 25 51 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41  %Q WHERE id>=? A
7470: 4e 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66  ND id<=?", pConf
7480: 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74  ig->zDb, p->zDat
7490: 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  aTbl.    );.    
74a0: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
74b0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
74c0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
74d0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
74e0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
74f0: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53  (pConfig->db, zS
7500: 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c  ql, -1, &p->pDel
7510: 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  eter, 0);.      
7520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
7530: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
7540: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
7550: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
7560: 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
7570: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
7580: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
7590: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
75a0: 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71  1, iFirst);.  sq
75b0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
75c0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c  (p->pDeleter, 2,
75d0: 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74   iLast);.  sqlit
75e0: 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65  e3_step(p->pDele
75f0: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
7600: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
7610: 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f  >pDeleter);.}../
7620: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 73  *.** Close the s
7630: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 68 61 6e 64  qlite3_blob hand
7640: 6c 65 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  le used to read 
7650: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
7660: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
7670: 2a 20 41 6e 64 20 64 69 73 63 61 72 64 20 61 6e  * And discard an
7680: 79 20 63 61 63 68 65 64 20 72 65 61 64 73 2e 20  y cached reads. 
7690: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
76a0: 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 65   called at the e
76b0: 6e 64 20 6f 66 0a 2a 2a 20 61 20 72 65 61 64 20  nd of.** a read 
76c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 77  transaction or w
76d0: 68 65 6e 20 61 6e 79 20 73 75 62 2d 74 72 61 6e  hen any sub-tran
76e0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
76f0: 64 20 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20 30  d back..*/.#if 0
7700: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7710: 35 44 61 74 61 52 65 73 65 74 28 46 74 73 35 49  5DataReset(Fts5I
7720: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28 20  ndex *p){.  if( 
7730: 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20  p->pReader ){.  
7740: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63    sqlite3_blob_c
7750: 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64 65 72 29  lose(p->pReader)
7760: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72  ;.    p->pReader
7770: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64   = 0;.  }.}.#end
7780: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  if../*.** Remove
7790: 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61 73 73   all records ass
77a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 65 67  ociated with seg
77b0: 6d 65 6e 74 20 69 53 65 67 69 64 20 69 6e 20 69  ment iSegid in i
77c0: 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2f 0a 73 74  ndex iIdx..*/.st
77d0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
77e0: 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
77f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
7800: 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65 67  t iIdx, int iSeg
7810: 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73  id){.  i64 iFirs
7820: 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  t = FTS5_SEGMENT
7830: 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65  _ROWID(iIdx, iSe
7840: 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69 36  gid, 0, 0);.  i6
7850: 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f 53  4 iLast = FTS5_S
7860: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
7870: 78 2c 20 69 53 65 67 69 64 2b 31 2c 20 30 2c 20  x, iSegid+1, 0, 
7880: 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74 61  0)-1;.  fts5Data
7890: 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73 74  Delete(p, iFirst
78a0: 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , iLast);.}../*.
78b0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
78c0: 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73  erence to an Fts
78d0: 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63  5Structure objec
78e0: 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  t returned by an
78f0: 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c   earlier .** cal
7900: 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75  l to fts5Structu
7910: 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35  reRead() or fts5
7920: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7930: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
7940: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  d fts5StructureR
7950: 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63  elease(Fts5Struc
7960: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
7970: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
7980: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
7990: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75  for(i=0; i<pStru
79a0: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  ct->nLevel; i++)
79b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
79c0: 66 72 65 65 28 70 53 74 72 75 63 74 2d 3e 61 4c  free(pStruct->aL
79d0: 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a 20  evel[i].aSeg);. 
79e0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
79f0: 5f 66 72 65 65 28 70 53 74 72 75 63 74 29 3b 0a  _free(pStruct);.
7a00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
7a10: 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74  erialize and ret
7a20: 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75 72  urn the structur
7a30: 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e 74  e record current
7a40: 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65 72  ly stored in ser
7a50: 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20  ialized.** form 
7a60: 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70 44  within buffer pD
7a70: 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a  ata/nData..**.**
7a80: 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75   The Fts5Structu
7a90: 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20  re.aLevel[] and 
7aa0: 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75  each Fts5Structu
7ab0: 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61  reLevel.aSeg[] a
7ac0: 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72  rray.** are over
7ad0: 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f 6e  -allocated by on
7ae0: 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c 6c  e slot. This all
7af0: 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75 72  ows the structur
7b00: 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f  e contents.** to
7b10: 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79 20   be more easily 
7b20: 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  edited..**.** If
7b30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7b40: 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20  , *ppOut is set 
7b50: 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20 53  to NULL and an S
7b60: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
7b70: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74  .** returned. Ot
7b80: 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74 20  herwise, *ppOut 
7b90: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
7ba0: 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
7bb0: 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  t and.** SQLITE_
7bc0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
7bd0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
7be0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 0a  tructureDecode(.
7bf0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74    const u8 *pDat
7c00: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
7c10: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
7c20: 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  aining serialize
7c30: 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  d structure */. 
7c40: 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20 20   int nData,     
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
7c70: 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74 65  er pData in byte
7c80: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f  s */.  int *piCo
7c90: 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20 20  okie,           
7ca0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
7cb0: 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 76  uration cookie v
7cc0: 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53 74  alue */.  Fts5St
7cd0: 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74 20  ructure **ppOut 
7ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
7cf0: 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20 6f  : Deserialized o
7d00: 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bject */.){.  in
7d10: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7d20: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  ;.  int i = 0;. 
7d30: 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74   int iLvl;.  int
7d40: 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69   nLevel = 0;.  i
7d50: 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b  nt nSegment = 0;
7d60: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
7d90: 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
7da0: 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46 74   at pRet */.  Ft
7db0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65  s5Structure *pRe
7dc0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  t = 0;        /*
7dd0: 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   Structure objec
7de0: 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  t to return */..
7df0: 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63 6f    /* Grab the co
7e00: 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20  okie value */.  
7e10: 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20 2a  if( piCookie ) *
7e20: 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69 74  piCookie = sqlit
7e30: 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61 74  e3Fts5Get32(pDat
7e40: 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20 20  a);.  i = 4;..  
7e50: 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61  /* Read the tota
7e60: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  l number of leve
7e70: 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20  ls and segments 
7e80: 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
7e90: 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63  f the.  ** struc
7ea0: 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f  ture record.  */
7eb0: 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56  .  i += fts5GetV
7ec0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7ed0: 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69 20  ], nLevel);.  i 
7ee0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7ef0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53  32(&pData[i], nS
7f00: 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65  egment);.  nByte
7f10: 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f   = (.      sizeo
7f20: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
7f30: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
7f40: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
7f50: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
7f60: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7f70: 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e  ctureLevel) * (n
7f80: 4c 65 76 65 6c 29 20 20 20 20 20 20 2f 2a 20 61  Level)      /* a
7f90: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
7fa0: 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28  .  );.  pRet = (
7fb0: 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73  Fts5Structure*)s
7fc0: 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63  qlite3Fts5Malloc
7fd0: 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29  Zero(&rc, nByte)
7fe0: 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  ;..  if( pRet ){
7ff0: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65  .    pRet->nLeve
8000: 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20  l = nLevel;.    
8010: 69 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  i += sqlite3GetV
8020: 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c  arint(&pData[i],
8030: 20 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f   &pRet->nWriteCo
8040: 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72  unter);..    for
8050: 28 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c  (iLvl=0; rc==SQL
8060: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e  ITE_OK && iLvl<n
8070: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
8080: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
8090: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
80a0: 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69   &pRet->aLevel[i
80b0: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Lvl];.      int 
80c0: 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69 6e  nTotal;.      in
80d0: 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20 69  t iSeg;..      i
80e0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
80f0: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
8100: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20  Lvl->nMerge);.  
8110: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8120: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8130: 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20  i], nTotal);.   
8140: 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61     assert( nTota
8150: 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  l>=pLvl->nMerge 
8160: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61  );.      pLvl->a
8170: 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
8180: 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
8190: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
81a0: 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  ro(&rc, .       
81b0: 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65     nTotal * size
81c0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
81d0: 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 29  Segment).      )
81e0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
81f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8200: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67        pLvl->nSeg
8210: 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20   = nTotal;.     
8220: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
8230: 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65 67  Seg<nTotal; iSeg
8240: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
8250: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
8260: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
8270: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8280: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20  iSegid);.       
8290: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
82a0: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
82b0: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
82c0: 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20  eg].nHeight);.  
82d0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
82e0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
82f0: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
8300: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
8310: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  st);.          i
8320: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
8330: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
8340: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8350: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20  pgnoLast);.     
8360: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
8370: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  {.        fts5St
8380: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
8390: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
83a0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
83b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
83c0: 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65  Out = pRet;.  re
83d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
83e0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
83f0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64   fts5StructureAd
8400: 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c  dLevel(int *pRc,
8410: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8420: 2a 70 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66  *ppStruct){.  if
8430: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
8440: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
8450: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
8460: 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
8470: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53   int nLevel = pS
8480: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  truct->nLevel;. 
8490: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
84a0: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
84b0: 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b  Fts5Structure) +
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74    /* Main struct
84e0: 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ure */.        s
84f0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
8500: 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65  ureLevel) * (nLe
8510: 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65  vel+1)  /* aLeve
8520: 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  l[] array */.   
8530: 20 29 3b 0a 0a 20 20 20 20 70 53 74 72 75 63 74   );..    pStruct
8540: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
8550: 6f 63 28 70 53 74 72 75 63 74 2c 20 6e 42 79 74  oc(pStruct, nByt
8560: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  e);.    if( pStr
8570: 75 63 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  uct ){.      mem
8580: 73 65 74 28 26 70 53 74 72 75 63 74 2d 3e 61 4c  set(&pStruct->aL
8590: 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c  evel[nLevel], 0,
85a0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
85b0: 63 74 75 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  ctureLevel));.  
85c0: 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65      pStruct->nLe
85d0: 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70  vel++;.      *pp
85e0: 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
85f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8600: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
8610: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
8620: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e  }.}../*.** Exten
8630: 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20  d level iLvl so 
8640: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 72 6f  that there is ro
8650: 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  om for at least 
8660: 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73  nExtra more.** s
8670: 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  egments..*/.stat
8680: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
8690: 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
86a0: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
86b0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
86c0: 70 53 74 72 75 63 74 2c 20 0a 20 20 69 6e 74 20  pStruct, .  int 
86d0: 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78  iLvl, .  int nEx
86e0: 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73  tra, .  int bIns
86f0: 65 72 74 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52  ert.){.  if( *pR
8700: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8710: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
8720: 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
8730: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8740: 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53  iLvl];.    Fts5S
8750: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
8760: 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *aNew;.    int n
8770: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65  Byte;..    nByte
8780: 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b   = (pLvl->nSeg +
8790: 20 6e 45 78 74 72 61 29 20 2a 20 73 69 7a 65 6f   nExtra) * sizeo
87a0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
87b0: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65  egment);.    aNe
87c0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
87d0: 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20  loc(pLvl->aSeg, 
87e0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
87f0: 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  aNew ){.      if
8800: 28 20 62 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a  ( bInsert==0 ){.
8810: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
8820: 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d  aNew[pLvl->nSeg]
8830: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
8840: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8850: 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  ) * nExtra);.   
8860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8870: 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c    int nMove = pL
8880: 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f  vl->nSeg * sizeo
8890: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
88a0: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  egment);.       
88b0: 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e   memmove(&aNew[n
88c0: 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d  Extra], aNew, nM
88d0: 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ove);.        me
88e0: 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20 73 69  mset(aNew, 0, si
88f0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
8900: 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78  reSegment) * nEx
8910: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra);.      }.  
8920: 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
8930: 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65   aNew;.    }else
8940: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
8950: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8960: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8970: 52 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a  Read, deserializ
8980: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
8990: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
89a0: 64 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78  d for index iIdx
89b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
89c0: 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c  Structure.aLevel
89d0: 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35  [] and each Fts5
89e0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61  StructureLevel.a
89f0: 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61  Seg[] array.** a
8a00: 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65  re over-allocate
8a10: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66  d as described f
8a20: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  or function fts5
8a30: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
8a40: 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a  ) .** above..**.
8a50: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
8a60: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
8a70: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
8a80: 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69  rror code left i
8a90: 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64  n the.** Fts5Ind
8aa0: 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e  ex handle. If an
8ab0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
8ac0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
8ad0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
8ae0: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  * is called, it 
8af0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
8b00: 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74  tatic Fts5Struct
8b10: 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75  ure *fts5Structu
8b20: 72 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  reRead(Fts5Index
8b30: 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 29 7b 0a   *p, int iIdx){.
8b40: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
8b50: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
8b60: 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ig;.  Fts5Struct
8b70: 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20  ure *pRet = 0;  
8b80: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
8b90: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46  to return */.  F
8ba0: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20  ts5Data *pData; 
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8bc0: 2a 20 25 5f 64 61 74 61 20 65 6e 74 72 79 20 63  * %_data entry c
8bd0: 6f 6e 74 61 69 6e 69 6e 67 20 73 74 72 75 63 74  ontaining struct
8be0: 75 72 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ure record */.  
8bf0: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8c20: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 0a 20 20 61 73   cookie */..  as
8c30: 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43 6f 6e  sert( iIdx<=pCon
8c40: 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 3b 0a  fig->nPrefix );.
8c50: 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
8c60: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
8c70: 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69  TRUCTURE_ROWID(i
8c80: 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 70 44  Idx));.  if( !pD
8c90: 61 74 61 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ata ) return 0;.
8ca0: 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74    p->rc = fts5St
8cb0: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44  ructureDecode(pD
8cc0: 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e  ata->p, pData->n
8cd0: 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65  , &iCookie, &pRe
8ce0: 74 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  t);..  if( p->rc
8cf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
8d00: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21  Config->iCookie!
8d10: 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20  =iCookie ){.    
8d20: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
8d30: 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43  ts5ConfigLoad(pC
8d40: 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b  onfig, iCookie);
8d50: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
8d60: 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
8d70: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
8d80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
8d90: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8da0: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52  se(pRet);.    pR
8db0: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  et = 0;.  }.  re
8dc0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
8dd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
8de0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
8df0: 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78  egments in index
8e00: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
8e10: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ct..*/.static in
8e20: 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43  t fts5StructureC
8e30: 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73  ountSegments(Fts
8e40: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8e50: 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  uct){.  int nSeg
8e60: 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ment = 0;       
8e70: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8e80: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
8e90: 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  nts */.  if( pSt
8ea0: 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
8eb0: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
8ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8ed0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8ee0: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
8ef0: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
8f00: 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
8f10: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
8f20: 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20      nSegment += 
8f30: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8f40: 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20  iLvl].nSeg;.    
8f50: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
8f60: 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a  nSegment;.}../*.
8f70: 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64  ** Serialize and
8f80: 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72 75   store the "stru
8f90: 63 74 75 72 65 22 20 72 65 63 6f 72 64 20 66 6f  cture" record fo
8fa0: 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2a  r index iIdx..**
8fb0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
8fc0: 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
8fd0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74   error code in t
8fe0: 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a  he Fts5Index obj
8ff0: 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72  ect. If an.** er
9000: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
9010: 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
9020: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
9030: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
9040: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
9050: 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20  Write(Fts5Index 
9060: 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74  *p, int iIdx, Ft
9070: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9080: 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  ruct){.  if( p->
9090: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
90a0: 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  .    int nSegmen
90b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
90c0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
90d0: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
90e0: 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
90f0: 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
9100: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
9110: 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72   serialize recor
9120: 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e  d into */.    in
9130: 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
9140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
9150: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
9160: 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
9170: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  .    int iCookie
9180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9190: 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c     /* Cookie val
91a0: 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a  ue to store */..
91b0: 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 3d 20 66      nSegment = f
91c0: 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
91d0: 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
91e0: 74 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  t);.    memset(&
91f0: 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
9200: 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
9210: 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
9220: 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72  current configur
9230: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a  ation cookie */.
9240: 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d      iCookie = p-
9250: 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69  >pConfig->iCooki
9260: 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b  e;.    if( iCook
9270: 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d  ie<0 ) iCookie =
9280: 20 30 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66   0;.    fts5Buff
9290: 65 72 41 70 70 65 6e 64 33 32 28 26 70 2d 3e 72  erAppend32(&p->r
92a0: 63 2c 20 26 62 75 66 2c 20 69 43 6f 6f 6b 69 65  c, &buf, iCookie
92b0: 29 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66  );..    fts5Buff
92c0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
92d0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 74  p->rc, &buf, pSt
92e0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20  ruct->nLevel);. 
92f0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
9300: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
9310: 2c 20 26 62 75 66 2c 20 6e 53 65 67 6d 65 6e 74  , &buf, nSegment
9320: 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
9330: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9340: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36 34  ->rc, &buf, (i64
9350: 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65  )pStruct->nWrite
9360: 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66  Counter);..    f
9370: 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
9380: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9390: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
93a0: 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20  int iSeg;       
93b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
93c0: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
93d0: 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
93e0: 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53  s */.      Fts5S
93f0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
9400: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
9410: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
9420: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9430: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9440: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
9450: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74  Merge);.      ft
9460: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9470: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9480: 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a  f, pLvl->nSeg);.
9490: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
94a0: 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c  vl->nMerge<=pLvl
94b0: 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20  ->nSeg );..     
94c0: 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
94d0: 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53  g<pLvl->nSeg; iS
94e0: 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66  eg++){.        f
94f0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
9500: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
9510: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
9520: 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20  Seg].iSegid);.  
9530: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9540: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9550: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9560: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69  >aSeg[iSeg].nHei
9570: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ght);.        ft
9580: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9590: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
95a0: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
95b0: 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg].pgnoFirst);.
95c0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
95d0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
95e0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
95f0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
9600: 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d  noLast);.      }
9610: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
9620: 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
9630: 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
9640: 44 28 69 49 64 78 29 2c 20 62 75 66 2e 70 2c 20  D(iIdx), buf.p, 
9650: 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35  buf.n);.    fts5
9660: 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
9670: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73  ;.  }.}..#if 0.s
9680: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
9690: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f  rintStructure(co
96a0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69  nst char *zCapti
96b0: 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  on, Fts5Structur
96c0: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
96d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
96e0: 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  K;.  Fts5Buffer 
96f0: 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
9700: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75  uf, 0, sizeof(bu
9710: 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67  f));.  fts5Debug
9720: 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26  Structure(&rc, &
9730: 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  buf, pStruct);. 
9740: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
9750: 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61   "%s: %s\n", zCa
9760: 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20  ption, buf.p);. 
9770: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
9780: 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
9790: 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65  e(&buf);.}.#else
97a0: 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50 72  .# define fts5Pr
97b0: 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c 79  intStructure(x,y
97c0: 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  ).#endif..static
97d0: 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74   int fts5Segment
97e0: 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74 75  Size(Fts5Structu
97f0: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29  reSegment *pSeg)
9800: 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70  {.  return 1 + p
9810: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
9820: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b  pSeg->pgnoFirst;
9830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9840: 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78   a copy of index
9850: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
9860: 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d  ct. Except, prom
9870: 6f 74 65 20 61 73 20 6d 61 6e 79 20 73 65 67 6d  ote as many segm
9880: 65 6e 74 73 0a 2a 2a 20 61 73 20 70 6f 73 73 69  ents.** as possi
9890: 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72  ble to level iPr
98a0: 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d  omote. If an OOM
98b0: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
98c0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
98d0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
98e0: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
98f0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
9900: 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65  ,.  int iPromote
9910: 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74  ,.  int szPromot
9920: 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  e,.  Fts5Structu
9930: 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20  re *pStruct.){. 
9940: 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46   int il, is;.  F
9950: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
9960: 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75  l *pOut = &pStru
9970: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d  ct->aLevel[iProm
9980: 6f 74 65 5d 3b 0a 0a 20 20 66 6f 72 28 69 6c 3d  ote];..  for(il=
9990: 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70  iPromote+1; il<p
99a0: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
99b0: 69 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53  il++){.    Fts5S
99c0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
99d0: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
99e0: 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20  aLevel[il];.    
99f0: 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
9a00: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
9a10: 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67  or(is=pLvl->nSeg
9a20: 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29  -1; is>=0; is--)
9a30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
9a40: 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65   fts5SegmentSize
9a50: 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d  (&pLvl->aSeg[is]
9a60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 3e  );.      if( sz>
9a70: 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75  szPromote ) retu
9a80: 72 6e 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74  rn;.      fts5St
9a90: 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
9aa0: 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
9ab0: 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c  ct, iPromote, 1,
9ac0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
9ad0: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
9ae0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74       memcpy(pOut
9af0: 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61  ->aSeg, &pLvl->a
9b00: 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28  Seg[is], sizeof(
9b10: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9b20: 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 70 4f  ment));.      pO
9b30: 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20  ut->nSeg++;.    
9b40: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a    pLvl->nSeg--;.
9b50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
9b60: 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74  ** A new segment
9b70: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77   has just been w
9b80: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
9b90: 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74  iLvl of index st
9ba0: 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75  ructure.** pStru
9bb0: 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ct. This functio
9bc0: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  n determines if 
9bd0: 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f  any segments sho
9be0: 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a  uld be promoted.
9bf0: 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20  ** as a result. 
9c00: 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f  Segments are pro
9c10: 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65  moted in two sce
9c20: 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
9c30: 61 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e  a) If the segmen
9c40: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69  t just written i
9c50: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  s smaller than o
9c60: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
9c70: 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68  nts.**      with
9c80: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
9c90: 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c  populated level,
9ca0: 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20   it is promoted 
9cb0: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a  to the previous.
9cc0: 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65  **      populate
9cd0: 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20  d level..**.**  
9ce0: 20 62 29 20 49 66 20 74 68 65 20 73 65 67 6d 65   b) If the segme
9cf0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
9d00: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
9d10: 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e  he newest segmen
9d20: 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65  t on.**      the
9d30: 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20   next populated 
9d40: 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74  level, then that
9d50: 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e   segment, and an
9d60: 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74  y other adjacent
9d70: 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74  .**      segment
9d80: 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20  s that are also 
9d90: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
9da0: 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65   one just writte
9db0: 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20  n, are .**      
9dc0: 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a  promoted. .**.**
9dd0: 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   If one or more 
9de0: 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f  segments are pro
9df0: 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75 63  moted, the struc
9e00: 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75  ture object is u
9e10: 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66  pdated.** to ref
9e20: 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74  lect this..*/.st
9e30: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
9e40: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a  ructurePromote(.
9e50: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
9e80: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  d object */.  in
9e90: 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20  t iLvl,         
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9eb0: 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73   Index level jus
9ec0: 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46  t updated */.  F
9ed0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
9ee0: 74 72 75 63 74 20 20 20 20 20 20 20 20 20 20 2f  truct          /
9ef0: 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
9f00: 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  e */.){.  if( p-
9f10: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9f20: 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a  {.    int iTst;.
9f30: 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65      int iPromote
9f40: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73   = -1;.    int s
9f50: 7a 50 72 6f 6d 6f 74 65 3b 20 20 20 20 20 20 20  zPromote;       
9f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d           /* Prom
9f70: 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69  ote anything thi
9f80: 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65  s size or smalle
9f90: 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72  r */.    Fts5Str
9fa0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
9fb0: 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e  Seg;   /* Segmen
9fc0: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  t just written *
9fd0: 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b  /.    int szSeg;
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ff0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
a000: 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74  egment just writ
a010: 74 65 6e 20 2a 2f 0a 0a 0a 20 20 20 20 70 53 65  ten */...    pSe
a020: 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
a030: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b  evel[iLvl].aSeg[
a040: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
a050: 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20  iLvl].nSeg-1];. 
a060: 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20     szSeg = (1 + 
a070: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
a080: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
a090: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
a0a0: 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28   for condition (
a0b0: 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54  a) */.    for(iT
a0c0: 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e  st=iLvl-1; iTst>
a0d0: 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  =0 && pStruct->a
a0e0: 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67  Level[iTst].nSeg
a0f0: 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20  ==0; iTst--);.  
a100: 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b    if( iTst>=0 ){
a110: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a120: 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20      int szMax = 
a130: 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  0;.      Fts5Str
a140: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73  uctureLevel *pTs
a150: 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
a160: 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20  evel[iTst];.    
a170: 20 20 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e    assert( pTst->
a180: 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20  nMerge==0 );.   
a190: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
a1a0: 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  st->nSeg; i++){.
a1b0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d          int sz =
a1c0: 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70   pTst->aSeg[i].p
a1d0: 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e  gnoLast - pTst->
a1e0: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73  aSeg[i].pgnoFirs
a1f0: 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t + 1;.        i
a200: 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a  f( sz>szMax ) sz
a210: 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  Max = sz;.      
a220: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61  }.      if( szMa
a230: 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20  x>=szSeg ){.    
a240: 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e      /* Condition
a250: 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50 72   (a) is true. Pr
a260: 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74  omote the newest
a270: 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65   segment on leve
a280: 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c  l .        ** iL
a290: 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74  vl to level iTst
a2a0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50  .  */.        iP
a2b0: 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20  romote = iTst;. 
a2c0: 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65         szPromote
a2d0: 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20   = szMax;.      
a2e0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a2f0: 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29  If condition (a)
a300: 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73   is not met, ass
a310: 75 6d 65 20 28 62 29 20 69 73 20 74 72 75 65 2e  ume (b) is true.
a320: 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74   StructurePromot
a330: 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20  eTo().    ** is 
a340: 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73  a no-op if it is
a350: 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66   not.  */.    if
a360: 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a  ( iPromote<0 ){.
a370: 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d        iPromote =
a380: 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50   iLvl;.      szP
a390: 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a  romote = szSeg;.
a3a0: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
a3b0: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
a3c0: 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a  (p, iPromote, sz
a3d0: 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74  Promote, pStruct
a3e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
a3f0: 20 49 66 20 74 68 65 20 70 49 74 65 72 2d 3e 69   If the pIter->i
a400: 4f 66 66 20 6f 66 66 73 65 74 20 63 75 72 72 65  Off offset curre
a410: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
a420: 6e 20 65 6e 74 72 79 20 69 6e 64 69 63 61 74 69  n entry indicati
a430: 6e 67 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72  ng one.** or mor
a440: 65 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65  e term-less node
a450: 73 2c 20 61 64 76 61 6e 63 65 20 70 61 73 74 20  s, advance past 
a460: 69 74 20 61 6e 64 20 73 65 74 20 70 49 74 65 72  it and set pIter
a470: 2d 3e 6e 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74  ->nEmpty to.** t
a480: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70  he number of emp
a490: 74 79 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a  ty child nodes..
a4a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
a4b0: 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c  ts5NodeIterGobbl
a4c0: 65 4e 45 6d 70 74 79 28 46 74 73 35 4e 6f 64 65  eNEmpty(Fts5Node
a4d0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
a4e0: 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c  if( pIter->iOff<
a4f0: 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 26 26 20  pIter->nData && 
a500: 30 3d 3d 28 70 49 74 65 72 2d 3e 61 44 61 74 61  0==(pIter->aData
a510: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20  [pIter->iOff] & 
a520: 30 78 66 65 29 20 29 7b 0a 20 20 20 20 70 49 74  0xfe) ){.    pIt
a530: 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74  er->bDlidx = pIt
a540: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
a550: 3e 69 4f 66 66 5d 20 26 20 30 78 30 31 3b 0a 20  >iOff] & 0x01;. 
a560: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b     pIter->iOff++
a570: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66  ;.    pIter->iOf
a580: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
a590: 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61  nt32(&pIter->aDa
a5a0: 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c  ta[pIter->iOff],
a5b0: 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b   pIter->nEmpty);
a5c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
a5d0: 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b  ter->nEmpty = 0;
a5e0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69  .    pIter->bDli
a5f0: 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  dx = 0;.  }.}../
a600: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20  *.** Advance to 
a610: 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 77  the next entry w
a620: 69 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 2e 0a  ithin the node..
a630: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
a640: 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
a650: 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 4e 6f  int *pRc, Fts5No
a660: 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  deIter *pIter){.
a670: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66    if( pIter->iOf
a680: 66 3e 3d 70 49 74 65 72 2d 3e 6e 44 61 74 61 20  f>=pIter->nData 
a690: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 44  ){.    pIter->aD
a6a0: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  ata = 0;.    pIt
a6b0: 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 70 49  er->iChild += pI
a6c0: 74 65 72 2d 3e 6e 45 6d 70 74 79 3b 0a 20 20 7d  ter->nEmpty;.  }
a6d0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 50  else{.    int nP
a6e0: 72 65 2c 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49  re, nNew;.    pI
a6f0: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  ter->iOff += fts
a700: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49  5GetVarint32(&pI
a710: 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72  ter->aData[pIter
a720: 2d 3e 69 4f 66 66 5d 2c 20 6e 50 72 65 29 3b 0a  ->iOff], nPre);.
a730: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
a740: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
a750: 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61  32(&pIter->aData
a760: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e  [pIter->iOff], n
a770: 4e 65 77 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  New);.    pIter-
a780: 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d 32  >term.n = nPre-2
a790: 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
a7a0: 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20  AppendBlob(pRc, 
a7b0: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e  &pIter->term, nN
a7c0: 65 77 2c 20 70 49 74 65 72 2d 3e 61 44 61 74 61  ew, pIter->aData
a7d0: 2b 70 49 74 65 72 2d 3e 69 4f 66 66 29 3b 0a 20  +pIter->iOff);. 
a7e0: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
a7f0: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74 65  = nNew;.    pIte
a800: 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 28 31 20  r->iChild += (1 
a810: 2b 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29  + pIter->nEmpty)
a820: 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74  ;.    fts5NodeIt
a830: 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70  erGobbleNEmpty(p
a840: 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 2a  Iter);.    if( *
a850: 70 52 63 20 29 20 70 49 74 65 72 2d 3e 61 44 61  pRc ) pIter->aDa
a860: 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ta = 0;.  }.}...
a870: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
a880: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
a890: 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69 74  ject pIter to it
a8a0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
a8b0: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73 65  e internal.** se
a8c0: 67 6d 65 6e 74 20 6e 6f 64 65 20 69 6e 20 70 44  gment node in pD
a8d0: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
a8e0: 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72  oid fts5NodeIter
a8f0: 49 6e 69 74 28 63 6f 6e 73 74 20 75 38 20 2a 61  Init(const u8 *a
a900: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c  Data, int nData,
a910: 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70   Fts5NodeIter *p
a920: 49 74 65 72 29 7b 0a 20 20 6d 65 6d 73 65 74 28  Iter){.  memset(
a930: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
a940: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74  (*pIter));.  pIt
a950: 65 72 2d 3e 61 44 61 74 61 20 3d 20 61 44 61 74  er->aData = aDat
a960: 61 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 44 61 74  a;.  pIter->nDat
a970: 61 20 3d 20 6e 44 61 74 61 3b 0a 20 20 70 49 74  a = nData;.  pIt
a980: 65 72 2d 3e 69 4f 66 66 20 3d 20 66 74 73 35 47  er->iOff = fts5G
a990: 65 74 56 61 72 69 6e 74 33 32 28 61 44 61 74 61  etVarint32(aData
a9a0: 2c 20 70 49 74 65 72 2d 3e 69 43 68 69 6c 64 29  , pIter->iChild)
a9b0: 3b 0a 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72  ;.  fts5NodeIter
a9c0: 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74  GobbleNEmpty(pIt
a9d0: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  er);.}../*.** Fr
a9e0: 65 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c  ee any memory al
a9f0: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 69  located by the i
aa00: 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a  terator object..
aa10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
aa20: 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
aa30: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49  Fts5NodeIter *pI
aa40: 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66  ter){.  fts5Buff
aa50: 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74  erFree(&pIter->t
aa60: 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  erm);.}../*.** T
aa70: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
aa80: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
aa90: 61 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65  argument has the
aaa0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
aab0: 73 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  s set.** as foll
aac0: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
aad0: 6f 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72  on sets up the r
aae0: 65 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61  est of the itera
aaf0: 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  tor so that it.*
ab00: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
ab10: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74  first rowid in t
ab20: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
ab30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a  ..**.**   pData:
ab40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   pointer to docl
ab50: 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64  ist-index record
ab60: 2c 20 0a 2a 2a 20 20 20 69 4c 65 61 66 50 67 6e  , .**   iLeafPgn
ab70: 6f 3a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  o: page number t
ab80: 68 61 74 20 74 68 69 73 20 64 6f 63 6c 69 73 74  hat this doclist
ab90: 2d 69 6e 64 65 78 20 69 73 20 61 73 73 6f 63 69  -index is associ
aba0: 61 74 65 64 20 77 69 74 68 2e 0a 2a 2a 0a 2a 2a  ated with..**.**
abb0: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
abc0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49  ion is called pI
abd0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69  ter->iLeafPgno i
abe0: 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
abf0: 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74  r the.** doclist
ac00: 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77   is associated w
ac10: 69 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61  ith (the one fea
ac20: 74 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29  turing the term)
ac30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ac40: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72  fts5DlidxIterFir
ac50: 73 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  st(Fts5DlidxIter
ac60: 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
ac70: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70 49  Data *pData = pI
ac80: 74 65 72 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e  ter->pData;.  in
ac90: 74 20 69 3b 0a 20 20 69 6e 74 20 62 50 72 65 73  t i;.  int bPres
aca0: 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ent;..  assert( 
acb0: 70 49 74 65 72 2d 3e 70 44 61 74 61 20 29 3b 0a  pIter->pData );.
acc0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
acd0: 3e 69 4c 65 61 66 50 67 6e 6f 3e 30 20 29 3b 0a  >iLeafPgno>0 );.
ace0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66  .  /* Read the f
acf0: 69 72 73 74 20 72 6f 77 69 64 20 76 61 6c 75 65  irst rowid value
ad00: 2e 20 41 6e 64 20 74 68 65 20 22 70 72 65 73 65  . And the "prese
ad10: 6e 74 22 20 66 6c 61 67 20 74 68 61 74 20 66 6f  nt" flag that fo
ad20: 6c 6c 6f 77 73 20 69 74 2e 20 2a 2f 0a 20 20 70  llows it. */.  p
ad30: 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65  Iter->iOff += ge
ad40: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
ad50: 70 5b 30 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  p[0], (u64*)&pIt
ad60: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 62  er->iRowid);.  b
ad70: 50 72 65 73 65 6e 74 20 3d 20 70 44 61 74 61 2d  Present = pData-
ad80: 3e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b  >p[pIter->iOff++
ad90: 5d 3b 0a 20 20 69 66 28 20 62 50 72 65 73 65 6e  ];.  if( bPresen
ada0: 74 20 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a  t ){.    i = 0;.
adb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
adc0: 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
add0: 20 6f 66 20 6c 65 61 64 69 6e 67 20 30 78 30 30   of leading 0x00
ade0: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 66   bytes. */.    f
adf0: 6f 72 28 69 3d 31 3b 20 70 49 74 65 72 2d 3e 69  or(i=1; pIter->i
ae00: 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 3b 20 69 2b  Off<pData->n; i+
ae10: 2b 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 70  +){ .      if( p
ae20: 44 61 74 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69  Data->p[pIter->i
ae30: 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Off] ) break;.  
ae40: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b      pIter->iOff+
ae50: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
ae60: 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 61   Unless we are a
ae70: 6c 72 65 61 64 79 20 61 74 20 74 68 65 20 65 6e  lready at the en
ae80: 64 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  d of the doclist
ae90: 2d 69 6e 64 65 78 2c 20 6c 6f 61 64 20 74 68 65  -index, load the
aea0: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 72 6f   first.    ** ro
aeb0: 77 69 64 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20  wid value.  */. 
aec0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f     if( pIter->iO
aed0: 66 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20  ff<pData->n ){. 
aee0: 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20       i64 iVal;. 
aef0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66       pIter->iOff
af00: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
af10: 44 61 74 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69  Data->p[pIter->i
af20: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61  Off], (u64*)&iVa
af30: 6c 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  l);.      pIter-
af40: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b  >iRowid += iVal;
af50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
af60: 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
af70: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
af80: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
af90: 2b 3d 20 28 69 2b 31 29 3b 0a 0a 20 20 70 49 74  += (i+1);..  pIt
afa0: 65 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20  er->iFirstOff = 
afb0: 70 49 74 65 72 2d 3e 69 4f 66 66 3b 0a 20 20 72  pIter->iOff;.  r
afc0: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f  eturn pIter->bEo
afd0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  f;.}../*.** Adva
afe0: 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
aff0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
b000: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
b010: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b020: 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 46 74  DlidxIterNext(Ft
b030: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b040: 65 72 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  er){.  Fts5Data 
b050: 2a 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  *pData = pIter->
b060: 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66  pData;.  int iOf
b070: 66 3b 0a 0a 20 20 66 6f 72 28 69 4f 66 66 3d 70  f;..  for(iOff=p
b080: 49 74 65 72 2d 3e 69 4f 66 66 3b 20 69 4f 66 66  Iter->iOff; iOff
b090: 3c 70 44 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b  <pData->n; iOff+
b0a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 44 61 74  +){.    if( pDat
b0b0: 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65  a->p[iOff] ) bre
b0c0: 61 6b 3b 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ak; .  }..  if( 
b0d0: 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b  iOff<pData->n ){
b0e0: 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20  .    i64 iVal;. 
b0f0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
b100: 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70  gno += (iOff - p
b110: 49 74 65 72 2d 3e 69 4f 66 66 29 20 2b 20 31 3b  Iter->iOff) + 1;
b120: 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74  .    iOff += get
b130: 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
b140: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
b150: 56 61 6c 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  Val);.    pIter-
b160: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b  >iRowid += iVal;
b170: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
b180: 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65   = iOff;.  }else
b190: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f  {.    pIter->bEo
b1a0: 66 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65  f = 1;.  }..  re
b1b0: 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66  turn pIter->bEof
b1c0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
b1d0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
b1e0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
b1f0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
b200: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ter){.  return (
b210: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
b220: 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 29   || pIter->bEof)
b230: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
b240: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
b250: 73 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  st(Fts5DlidxIter
b260: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
b270: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72  fts5DlidxIterFir
b280: 73 74 28 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a  st(pIter)==0 ){.
b290: 20 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 66 74      while( 0==ft
b2a0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
b2b0: 70 49 74 65 72 29 20 29 3b 0a 20 20 20 20 70 49  pIter) );.    pI
b2c0: 74 65 72 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20  ter->bEof = 0;. 
b2d0: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74   }.}..static int
b2e0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
b2f0: 65 76 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  ev(Fts5DlidxIter
b300: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
b310: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4f  iOff = pIter->iO
b320: 66 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ff;..  assert( p
b330: 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b  Iter->bEof==0 );
b340: 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d 70 49 74  .  if( iOff<=pIt
b350: 65 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b  er->iFirstOff ){
b360: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
b370: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
b380: 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72     u8 *a = pIter
b390: 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20  ->pData->p;.    
b3a0: 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e  i64 iVal;.    in
b3b0: 74 20 69 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f  t iLimit;..    /
b3c0: 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66  * Currently iOff
b3d0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
b3e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76  irst byte of a v
b3f0: 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63  arint. This bloc
b400: 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d  k .    ** decrem
b410: 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20  ents iOff until 
b420: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
b430: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
b440: 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20  he previous .   
b450: 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69   ** varint. Taki
b460: 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72  ng care not to r
b470: 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c  ead any memory l
b480: 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63  ocations that oc
b490: 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  cur.    ** befor
b4a0: 65 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20  e the buffer in 
b4b0: 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20  memory.  */.    
b4c0: 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39  iLimit = (iOff>9
b4d0: 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a   ? iOff-9 : 0);.
b4e0: 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20      for(iOff--; 
b4f0: 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66  iOff>iLimit; iOf
b500: 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  f--){.      if( 
b510: 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38  (a[iOff-1] & 0x8
b520: 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  0)==0 ) break;. 
b530: 20 20 20 7d 0a 0a 20 20 20 20 67 65 74 56 61 72     }..    getVar
b540: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
b550: 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20  64*)&iVal);.    
b560: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d  pIter->iRowid -=
b570: 20 69 56 61 6c 3b 0a 20 20 20 20 70 49 74 65 72   iVal;.    pIter
b580: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a  ->iLeafPgno--;..
b590: 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3e      while( iOff>
b5a0: 70 49 74 65 72 2d 3e 69 46 69 72 73 74 4f 66 66  pIter->iFirstOff
b5b0: 20 0a 20 20 20 20 20 20 20 20 26 26 20 61 5b 69   .        && a[i
b5c0: 4f 66 66 2d 31 5d 3d 3d 30 78 30 30 20 26 26 20  Off-1]==0x00 && 
b5d0: 28 61 5b 69 4f 66 66 2d 32 5d 20 26 20 30 78 38  (a[iOff-2] & 0x8
b5e0: 30 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  0)==0 .    ){.  
b5f0: 20 20 20 20 69 4f 66 66 2d 2d 3b 0a 20 20 20 20      iOff--;.    
b600: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
b610: 6e 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no--;.    }.    
b620: 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 69 4f  pIter->iOff = iO
b630: 66 66 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ff;.  }..  retur
b640: 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d  n pIter->bEof;.}
b650: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
b660: 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 46  s5DlidxIterInitF
b670: 72 6f 6d 44 61 74 61 28 0a 20 20 46 74 73 35 49  romData(.  Fts5I
b680: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
b690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
b6a0: 73 35 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74  s5 Backend to it
b6b0: 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
b6c0: 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52    /* True for OR
b6f0: 44 45 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20  DER BY ASC */.  
b700: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 2c 20 20  int iLeafPgno,  
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d  /* Leaf page num
b730: 62 65 72 20 64 6c 69 64 78 20 69 73 20 66 6f 72  ber dlidx is for
b740: 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
b750: 70 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20  pDlidx,         
b760: 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 69 6e        /* Leaf in
b770: 64 65 78 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  dex data */.  Ft
b780: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 2a 70 70  s5DlidxIter **pp
b790: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Iter          /*
b7a0: 20 4f 55 54 3a 20 50 6f 70 75 6c 61 74 65 64 20   OUT: Populated 
b7b0: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20  iterator */.){. 
b7c0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
b7d0: 70 49 74 65 72 20 3d 20 2a 70 70 49 74 65 72 3b  pIter = *ppIter;
b7e0: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 3d 3d 30  ..  if( pIter==0
b7f0: 20 29 7b 0a 20 20 20 20 2a 70 70 49 74 65 72 20   ){.    *ppIter 
b800: 3d 20 70 49 74 65 72 20 3d 20 28 46 74 73 35 44  = pIter = (Fts5D
b810: 6c 69 64 78 49 74 65 72 2a 29 66 74 73 35 49 64  lidxIter*)fts5Id
b820: 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
b830: 66 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 29  f(Fts5DlidxIter)
b840: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
b850: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 66 74  ==0 ){ .      ft
b860: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
b870: 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 72 65 74  lidx);.      ret
b880: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  urn;.    }.  }el
b890: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  se{.    memset(p
b8a0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
b8b0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b  Fts5DlidxIter));
b8c0: 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70  .  }..  pIter->p
b8d0: 44 61 74 61 20 3d 20 70 44 6c 69 64 78 3b 0a 20  Data = pDlidx;. 
b8e0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b8f0: 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  o = iLeafPgno;. 
b900: 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a   if( bRev==0 ){.
b910: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
b920: 72 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20  rFirst(pIter);. 
b930: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
b940: 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70 49  DlidxIterLast(pI
b950: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
b960: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
b970: 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  dxIterInit(.  Ft
b980: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9a0: 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74 6f   Fts5 Backend to
b9b0: 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
b9c0: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
b9f0: 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a 2f   ORDER BY ASC */
ba00: 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 69 6e 74  .  int iIdx, int
ba10: 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20   iSegid,        
ba20: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 53     /* Segment iS
ba30: 65 67 69 64 20 77 69 74 68 69 6e 20 69 6e 64 65  egid within inde
ba40: 78 20 69 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  x iIdx */.  int 
ba50: 69 4c 65 61 66 50 67 6e 6f 2c 20 20 20 20 20 20  iLeafPgno,      
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
ba70: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
ba80: 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f  to load dlidx fo
ba90: 72 20 2a 2f 0a 20 20 46 74 73 35 44 6c 69 64 78  r */.  Fts5Dlidx
baa0: 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
bab0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
bac0: 6f 70 75 6c 61 74 65 64 20 69 74 65 72 61 74 6f  opulated iterato
bad0: 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61  r */.){.  Fts5Da
bae0: 74 61 20 2a 70 44 6c 69 64 78 3b 0a 20 20 70 44  ta *pDlidx;.  pD
baf0: 6c 69 64 78 20 3d 20 66 74 73 35 44 61 74 61 52  lidx = fts5DataR
bb00: 65 61 64 28 70 2c 20 46 54 53 35 5f 44 4f 43 4c  ead(p, FTS5_DOCL
bb10: 49 53 54 5f 49 44 58 5f 52 4f 57 49 44 28 69 49  IST_IDX_ROWID(iI
bb20: 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61  dx, iSegid, iLea
bb30: 66 50 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70  fPgno));.  if( p
bb40: 44 6c 69 64 78 3d 3d 30 20 29 20 72 65 74 75 72  Dlidx==0 ) retur
bb50: 6e 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74  n;.  fts5DlidxIt
bb60: 65 72 49 6e 69 74 46 72 6f 6d 44 61 74 61 28 70  erInitFromData(p
bb70: 2c 20 62 52 65 76 2c 20 69 4c 65 61 66 50 67 6e  , bRev, iLeafPgn
bb80: 6f 2c 20 70 44 6c 69 64 78 2c 20 70 70 49 74 65  o, pDlidx, ppIte
bb90: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
bba0: 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  e a doclist-inde
bbb0: 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  x iterator objec
bbc0: 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  t allocated by f
bbd0: 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
bbe0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
bbf0: 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  id fts5DlidxIter
bc00: 46 72 65 65 28 46 74 73 35 44 6c 69 64 78 49 74  Free(Fts5DlidxIt
bc10: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
bc20: 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 66  ( pIter ){.    f
bc30: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
bc40: 49 74 65 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20  Iter->pData);.  
bc50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
bc60: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
bc70: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4c 65  atic void fts5Le
bc80: 61 66 48 65 61 64 65 72 28 46 74 73 35 44 61 74  afHeader(Fts5Dat
bc90: 61 20 2a 70 4c 65 61 66 2c 20 69 6e 74 20 2a 70  a *pLeaf, int *p
bca0: 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70 69 54  iRowid, int *piT
bcb0: 65 72 6d 29 7b 0a 20 20 2a 70 69 52 6f 77 69 64  erm){.  *piRowid
bcc0: 20 3d 20 28 69 6e 74 29 66 74 73 35 47 65 74 55   = (int)fts5GetU
bcd0: 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29  16(&pLeaf->p[0])
bce0: 3b 0a 20 20 2a 70 69 54 65 72 6d 20 3d 20 28 69  ;.  *piTerm = (i
bcf0: 6e 74 29 66 74 73 35 47 65 74 55 31 36 28 26 70  nt)fts5GetU16(&p
bd00: 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d 0a 0a  Leaf->p[2]);.}..
bd10: 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e  /*.** Load the n
bd20: 65 78 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e  ext leaf page in
bd30: 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69  to the segment i
bd40: 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  terator..*/.stat
bd50: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
bd60: 74 65 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46  terNextPage(.  F
bd70: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd90: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
bda0: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
bdb0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
bdc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
bdd0: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
bde0: 65 20 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a  e to next page *
bdf0: 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
be00: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
be10: 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b  g = pIter->pSeg;
be20: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c  .  if( pIter->pL
be30: 65 61 66 20 29 20 66 74 73 35 44 61 74 61 52 65  eaf ) fts5DataRe
be40: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
be50: 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  af);.  pIter->iL
be60: 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28  eafPgno++;.  if(
be70: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
be80: 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  o<=pSeg->pgnoLas
be90: 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  t ){.    pIter->
bea0: 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
beb0: 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20 20  Read(p, .       
bec0: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
bed0: 57 49 44 28 70 49 74 65 72 2d 3e 69 49 64 78 2c  WID(pIter->iIdx,
bee0: 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30   pSeg->iSegid, 0
bef0: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  , pIter->iLeafPg
bf00: 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  no).    );.  }el
bf10: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  se{.    pIter->p
bf20: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Leaf = 0;.  }.}.
bf30: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
bf40: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
bf50: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
bf60: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
bf70: 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53  e of the .** "nS
bf80: 75 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20  uffix" field of 
bf90: 61 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e  a term. Function
bfa0: 20 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70   parameter nKeep
bfb0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
bfc0: 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e  lue.** of the "n
bfd0: 50 72 65 66 69 78 22 20 66 69 65 6c 64 20 28 69  Prefix" field (i
bfe0: 66 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20  f there was one 
bff0: 2d 20 69 74 20 69 73 20 70 61 73 73 65 64 20 30  - it is passed 0
c000: 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74   if this is.** t
c010: 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e  he first term in
c020: 20 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a   the segment)..*
c030: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c040: 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 28 46 74  on populates (Ft
c050: 73 35 53 65 67 49 74 65 72 2e 74 65 72 6d 29 20  s5SegIter.term) 
c060: 61 6e 64 20 28 46 74 73 35 53 65 67 49 74 65 72  and (Fts5SegIter
c070: 2e 69 52 6f 77 69 64 29 0a 2a 2a 20 61 63 63 6f  .iRowid).** acco
c080: 72 64 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76  rdingly and leav
c090: 65 73 20 28 46 74 73 35 53 65 67 49 74 65 72 2e  es (Fts5SegIter.
c0a0: 69 4c 65 61 66 4f 66 66 73 65 74 29 20 73 65 74  iLeafOffset) set
c0b0: 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 74   to the offset t
c0c0: 6f 20 0a 2a 2a 20 74 68 65 20 73 69 7a 65 20 66  o .** the size f
c0d0: 69 65 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73  ield of the firs
c0e0: 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e  t position list.
c0f0: 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   The position li
c100: 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 0a 2a 2a  st belonging .**
c110: 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 28 46 74   to document (Ft
c120: 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77 69 64  s5SegIter.iRowid
c130: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
c140: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
c150: 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 20  dTerm(Fts5Index 
c160: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
c170: 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65  *pIter, int nKee
c180: 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  p){.  u8 *a = pI
c190: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
c1a0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
c1b0: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
c1c0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
c1d0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
c1e0: 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74  fset;  /* Offset
c1f0: 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20   to read at */. 
c200: 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c220: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e 65 77   /* Bytes of new
c230: 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66   data */..  iOff
c240: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
c250: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e  t32(&a[iOff], nN
c260: 65 77 29 3b 0a 20 20 70 49 74 65 72 2d 3e 74 65  ew);.  pIter->te
c270: 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  rm.n = nKeep;.  
c280: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
c290: 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 49  Blob(&p->rc, &pI
c2a0: 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c  ter->term, nNew,
c2b0: 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 69 4f   &a[iOff]);.  iO
c2c0: 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 70 49  ff += nNew;.  pI
c2d0: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66  ter->iTermLeafOf
c2e0: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 70  fset = iOff;.  p
c2f0: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
c300: 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
c310: 61 66 50 67 6e 6f 3b 0a 20 20 69 66 28 20 69 4f  afPgno;.  if( iO
c320: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
c330: 2d 3e 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 53  ->n ){.    fts5S
c340: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
c350: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  , pIter);.    if
c360: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
c370: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
c380: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c390: 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
c3a0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65  ORRUPT;.      re
c3b0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
c3c0: 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20  iOff = 4;.    a 
c3d0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c3e0: 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d  p;.  }.  iOff +=
c3f0: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
c400: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
c410: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
c420: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
c430: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
c440: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
c450: 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ize the iterator
c460: 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
c470: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
c480: 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a   the entries in.
c490: 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67 20  ** segment pSeg 
c4a0: 77 69 74 68 69 6e 20 69 6e 64 65 78 20 69 49 64  within index iId
c4b0: 78 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  x. The iterator 
c4c0: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
c4d0: 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66 69 72 73   to the .** firs
c4e0: 74 20 65 6e 74 72 79 20 77 68 65 6e 20 74 68 69  t entry when thi
c4f0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
c500: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ns..**.** If an 
c510: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
c520: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
c530: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
c540: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
c550: 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
c560: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
c570: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
c580: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
c590: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
c5a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c5b0: 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
c5c0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
c5d0: 2c 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e  ,          .  in
c5e0: 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c600: 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20   Config.aHash[] 
c610: 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64  index of FTS ind
c620: 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ex */.  Fts5Stru
c630: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
c640: 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72  eg,     /* Descr
c650: 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e  iption of segmen
c660: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
c670: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
c680: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
c690: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
c6a0: 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70  ){.  if( pSeg->p
c6b0: 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20  gnoFirst==0 ){. 
c6c0: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
c6d0: 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65 6e  ns if the segmen
c6e0: 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 20  t is being used 
c6f0: 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20 61  as an input to a
c700: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20 20  n incremental.  
c710: 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20 61    ** merge and a
c720: 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72 65  ll data has alre
c730: 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d 65  ady been "trimme
c740: 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f 6e  d". See function
c750: 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69 6d  .    ** fts5Trim
c760: 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20 64  Segments() for d
c770: 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20  etails. In this 
c780: 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20 69  case leave the i
c790: 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a 20  terator empty.. 
c7a0: 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72     ** The caller
c7b0: 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28 70   will see the (p
c7c0: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29 20  Iter->pLeaf==0) 
c7d0: 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20 69  and assume the i
c7e0: 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20 2a  terator is.    *
c7f0: 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64 79  * at EOF already
c800: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
c810: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
c820: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
c830: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
c840: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c850: 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c     memset(pIter,
c860: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
c870: 72 29 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  r));.    pIter->
c880: 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20  pSeg = pSeg;.   
c890: 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20 69   pIter->iIdx = i
c8a0: 49 64 78 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Idx;.    pIter->
c8b0: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67  iLeafPgno = pSeg
c8c0: 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20  ->pgnoFirst-1;. 
c8d0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
c8e0: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
c8f0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
c900: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c910: 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74  .    u8 *a = pIt
c920: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
c930: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
c940: 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 55 31  fset = fts5GetU1
c950: 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 66 74  6(&a[2]);.    ft
c960: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
c970: 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  m(p, pIter, 0);.
c980: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
c990: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
c9a0: 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 6f  ly ever called o
c9b0: 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72 65 61  n iterators crea
c9c0: 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a  ted by calls to.
c9d0: 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75 65 72  ** Fts5IndexQuer
c9e0: 79 28 29 20 77 69 74 68 20 74 68 65 20 46 54 53  y() with the FTS
c9f0: 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 41 53 43  5INDEX_QUERY_ASC
ca00: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
ca10: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
ca20: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
ca30: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 70 6f  terator pIter po
ca40: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
ca50: 74 20 72 6f 77 69 64 0a 2a 2a 20 6f 6e 20 74 68  t rowid.** on th
ca60: 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 61  e current leaf a
ca70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
ca80: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 71 75  he term being qu
ca90: 65 72 69 65 64 2e 20 54 68 69 73 20 66 75 6e 63  eried. This func
caa0: 74 69 6f 6e 0a 2a 2a 20 61 64 76 61 6e 63 65 73  tion.** advances
cab0: 20 69 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20   it to point to 
cac0: 74 68 65 20 6c 61 73 74 20 73 75 63 68 20 72 6f  the last such ro
cad0: 77 69 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  wid and, if nece
cae0: 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a  ssary, initializ
caf0: 65 73 0a 2a 2a 20 74 68 65 20 61 52 6f 77 69 64  es.** the aRowid
cb00: 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52 6f  Offset[] and iRo
cb10: 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61 62  widOffset variab
cb20: 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
cb30: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
cb40: 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 46  everseInitPage(F
cb50: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
cb60: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
cb70: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65  {.  int n = pIte
cb80: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 20 20 69  r->pLeaf->n;.  i
cb90: 6e 74 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c  nt i = pIter->iL
cba0: 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  eafOffset;.  u8 
cbb0: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
cbc0: 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77  f->p;.  int iRow
cbd0: 69 64 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  idOffset = 0;.. 
cbe0: 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
cbf0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 20  QLITE_OK && i<n 
cc00: 29 7b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  ){.    i64 iDelt
cc10: 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e  a = 0;.    int n
cc20: 50 6f 73 3b 0a 0a 20 20 20 20 69 20 2b 3d 20 66  Pos;..    i += f
cc30: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
cc40: 61 5b 69 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  a[i], nPos);.   
cc50: 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20   i += nPos;.    
cc60: 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61 6b  if( i>=n ) break
cc70: 3b 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61  ;.    i += getVa
cc80: 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34  rint(&a[i], (u64
cc90: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
cca0: 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20  if( iDelta==0 ) 
ccb0: 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 74 65 72  break;.    pIter
ccc0: 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c  ->iRowid += iDel
ccd0: 74 61 3b 0a 0a 20 20 20 20 69 66 28 20 69 52 6f  ta;..    if( iRo
cce0: 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72  widOffset>=pIter
ccf0: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29  ->nRowidOffset )
cd00: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77  {.      int nNew
cd10: 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64   = pIter->nRowid
cd20: 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20  Offset + 8;.    
cd30: 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69    int *aNew = (i
cd40: 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
cd50: 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69  loc(pIter->aRowi
cd60: 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69  dOffset, nNew*si
cd70: 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20  zeof(int));.    
cd80: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b    if( aNew==0 ){
cd90: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
cda0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
cdb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
cdc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
cdd0: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20  r->aRowidOffset 
cde0: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49  = aNew;.      pI
cdf0: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
ce00: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a  t = nNew;.    }.
ce10: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77  .    pIter->aRow
ce20: 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f  idOffset[iRowidO
ce30: 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72  ffset++] = pIter
ce40: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
ce50: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
ce60: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20  ffset = i;.  }. 
ce70: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66   pIter->iRowidOf
ce80: 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66  fset = iRowidOff
ce90: 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  set;.}../*.**.*/
cea0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ceb0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
cec0: 65 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78  ewPage(Fts5Index
ced0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
cee0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
cef0: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
cf00: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
cf10: 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73  REVERSE );.  ass
cf20: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
cf30: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
cf40: 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66  _ONETERM );..  f
cf50: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
cf60: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
cf70: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
cf80: 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
cf90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
cfa0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e  Iter->iLeafPgno>
cfb0: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
cfc0: 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35  Pgno ){.    Fts5
cfd0: 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Data *pNew;.    
cfe0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
cff0: 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66  --;.    pNew = f
d000: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
d010: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
d020: 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  D(.          pIt
d030: 65 72 2d 3e 69 49 64 78 2c 20 70 49 74 65 72 2d  er->iIdx, pIter-
d040: 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30  >pSeg->iSegid, 0
d050: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  , pIter->iLeafPg
d060: 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69  no.    ));.    i
d070: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
d080: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
d090: 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54  fPgno==pIter->iT
d0a0: 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ermLeafPgno ){. 
d0b0: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72         if( pIter
d0c0: 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
d0d0: 74 3c 70 4e 65 77 2d 3e 6e 20 29 7b 0a 20 20 20  t<pNew->n ){.   
d0e0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
d0f0: 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  eaf = pNew;.    
d100: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
d110: 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72  afOffset = pIter
d120: 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
d130: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
d140: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d150: 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 2c    int iRowidOff,
d160: 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
d170: 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28 70  fts5LeafHeader(p
d180: 4e 65 77 2c 20 26 69 52 6f 77 69 64 4f 66 66 2c  New, &iRowidOff,
d190: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20   &dummy);.      
d1a0: 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20    if( iRowidOff 
d1b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
d1c0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
d1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
d1e0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d1f0: 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
d200: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
d210: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
d220: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
d230: 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d   u8 *a = &pIter-
d240: 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d  >pLeaf->p[pIter-
d250: 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
d260: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
d270: 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 67 65 74  eafOffset += get
d280: 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29  Varint(a, (u64*)
d290: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
d2a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d2b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d2c0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
d2d0: 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
d2e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
d2f0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
d300: 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67  f ){.    fts5Seg
d310: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
d320: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
d330: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
d340: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
d350: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
d360: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
d370: 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a  ument currently.
d380: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64  ** points to a d
d390: 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20  elete marker. A 
d3a0: 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73  delete marker is
d3b0: 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
d3c0: 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74   0 byte.** posit
d3d0: 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion-list..*/.sta
d3e0: 74 69 63 20 69 6e 74 20 66 74 73 35 53 65 67 49  tic int fts5SegI
d3f0: 74 65 72 49 73 44 65 6c 65 74 65 28 0a 20 20 46  terIsDelete(.  F
d400: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d420: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
d430: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
d440: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
d450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
d460: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
d470: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52  e */.){.  int bR
d480: 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35 44 61  et = 0;.  Fts5Da
d490: 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
d4a0: 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 66 28 20  r->pLeaf;.  if( 
d4b0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
d4c0: 20 26 26 20 70 4c 65 61 66 20 29 7b 0a 20 20 20   && pLeaf ){.   
d4d0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
d4e0: 66 4f 66 66 73 65 74 3c 70 4c 65 61 66 2d 3e 6e  fOffset<pLeaf->n
d4f0: 20 29 7b 0a 20 20 20 20 20 20 62 52 65 74 20 3d   ){.      bRet =
d500: 20 28 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72   (pLeaf->p[pIter
d510: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3d 3d  ->iLeafOffset]==
d520: 30 78 30 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  0x00);.    }else
d530: 7b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61  {.      Fts5Data
d540: 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74   *pNew = fts5Dat
d550: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
d560: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20  GMENT_ROWID(.   
d570: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
d580: 69 49 64 78 2c 20 70 49 74 65 72 2d 3e 70 53 65  iIdx, pIter->pSe
d590: 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49  g->iSegid, 0, pI
d5a0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31  ter->iLeafPgno+1
d5b0: 0a 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20  .      ));.     
d5c0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
d5d0: 20 20 20 20 20 62 52 65 74 20 3d 20 28 70 4e 65       bRet = (pNe
d5e0: 77 2d 3e 70 5b 34 5d 3d 3d 30 78 30 30 29 3b 0a  w->p[4]==0x00);.
d5f0: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
d600: 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20  Release(pNew);. 
d610: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d620: 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 3b 0a  .  return bRet;.
d630: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
d640: 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
d650: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
d660: 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  y. .**.** If an 
d670: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74  error occurs, Ft
d680: 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65  s5Index.rc is se
d690: 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69  t to an appropri
d6a0: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ate error code. 
d6b0: 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f  It .** is not co
d6c0: 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
d6d0: 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
d6e0: 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49  r reaches EOF. I
d6f0: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a  f an error has .
d700: 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
d710: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
d720: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
d730: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
d740: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d750: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
d760: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
d770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d780: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
d790: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
d7a0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
d7b0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
d7c0: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
d7d0: 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  vance */.){.  if
d7e0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
d7f0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  OK ){.    if( pI
d800: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
d810: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
d820: 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E ){.      if( p
d830: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
d840: 65 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  et>0 ){.        
d850: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
d860: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20  Leaf->p;.       
d870: 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
d880: 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
d890: 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
d8a0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
d8b0: 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a  iRowidOffset--;.
d8c0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
d8d0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
d8e0: 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77  ff = pIter->aRow
d8f0: 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e  idOffset[pIter->
d900: 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20  iRowidOffset];. 
d910: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
d920: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
d930: 61 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a  a[iOff], nPos);.
d940: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
d950: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 67 65  nPos;.        ge
d960: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
d970: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
d980: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
d990: 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74  >iRowid -= iDelt
d9a0: 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  a;.      }else{.
d9b0: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
d9c0: 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
d9d0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
d9e0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d9f0: 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
da00: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
da10: 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
da20: 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  iOff;.      int 
da30: 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
da40: 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20      int nKeep = 
da50: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 61  0;..      /* Sea
da60: 72 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20  rch for the end 
da70: 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
da80: 6c 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20  list within the 
da90: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f  current page. */
daa0: 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70  .      u8 *a = p
dab0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
dac0: 6e 74 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 6e 3b  nt n = pLeaf->n;
dad0: 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 70  ..      iOff = p
dae0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
daf0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  t;.      if( iOf
db00: 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  f<n ){.        i
db10: 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20  nt nPoslist;.   
db20: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
db30: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
db40: 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73 74 29  iOff], nPoslist)
db50: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
db60: 3d 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20  = nPoslist;.    
db70: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
db80: 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
db90: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74   /* The next ent
dba0: 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72  ry is on the cur
dbb0: 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20  rent page */.   
dbc0: 20 20 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b       u64 iDelta;
dbd0: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
dbe0: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
dbf0: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65  t(&a[iOff], &iDe
dc00: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49  lta);.        pI
dc10: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dc20: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
dc30: 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
dc40: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65 77  {.          bNew
dc50: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
dc60: 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20      if( iOff>=n 
dc70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
dc80: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
dc90: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
dca0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
dcb0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34  >iLeafOffset = 4
dcc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
dcd0: 65 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35  e if( iOff!=fts5
dce0: 47 65 74 55 31 36 28 26 61 5b 32 5d 29 20 29 7b  GetU16(&a[2]) ){
dcf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
dd00: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
dd10: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
dd20: 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65  32(&a[iOff], nKe
dd30: 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ep);.          }
dd40: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dd50: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
dd60: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
dd70: 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
dd80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dd90: 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20    iOff = 0;.    
dda0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72      /* Next entr
ddb0: 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20  y is not on the 
ddc0: 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a  current page */.
ddd0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
dde0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
ddf0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
de00: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
de10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65  );.          pLe
de20: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
de30: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  f;.          if(
de40: 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61   pLeaf==0 ) brea
de50: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
de60: 20 28 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74   (iOff = fts5Get
de70: 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d  U16(&pLeaf->p[0]
de80: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
de90: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
dea0: 33 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61  3GetVarint(&pLea
deb0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
dec0: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
ded0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
dee0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
def0: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
df00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
df10: 65 6c 73 65 20 69 66 28 20 28 69 4f 66 66 20 3d  else if( (iOff =
df20: 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
df30: 61 66 2d 3e 70 5b 32 5d 29 29 20 29 7b 0a 20 20  af->p[2])) ){.  
df40: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
df50: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
df60: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Off;.           
df70: 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20   bNewTerm = 1;. 
df80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
df90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
dfa0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
dfb0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
dfc0: 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73  now at EOF. If s
dfd0: 6f 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e  o, return early.
dfe0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49   */.      if( pI
dff0: 74 65 72 2d 3e 70 4c 65 61 66 20 26 26 20 62 4e  ter->pLeaf && bN
e000: 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20  ewTerm ){.      
e010: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61    if( pIter->fla
e020: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
e030: 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20  R_ONETERM ){.   
e040: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
e050: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
e060: 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
e070: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
e080: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
e090: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53  .          fts5S
e0a0: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70  egIterLoadTerm(p
e0b0: 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b  , pIter, nKeep);
e0c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e0d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
e0e0: 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
e0f0: 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70  Iter currently p
e100: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
e110: 73 74 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f  st rowid in a do
e120: 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66  clist. This.** f
e130: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
e140: 20 69 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20   iterator up so 
e150: 74 68 61 74 20 69 74 65 72 61 74 65 73 20 69 6e  that iterates in
e160: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74   reverse order t
e170: 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f  hrough.** the do
e180: 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  clist..*/.static
e190: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
e1a0: 72 52 65 76 65 72 73 65 28 46 74 73 35 49 6e 64  rReverse(Fts5Ind
e1b0: 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c  ex *p, int iIdx,
e1c0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
e1d0: 74 65 72 29 7b 0a 20 20 46 74 73 35 44 61 74 61  ter){.  Fts5Data
e1e0: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
e1f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
e200: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
e210: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
e220: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
e230: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
e240: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
e250: 6c 65 61 66 20 2a 2f 0a 20 20 46 74 73 35 44 61  leaf */.  Fts5Da
e260: 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20  ta *pLast = 0;. 
e270: 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20   int pgnoLast = 
e280: 30 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 6f  0;..  /* Move to
e290: 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63   the page that c
e2a0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74  ontains the last
e2b0: 20 72 6f 77 69 64 20 69 6e 20 74 68 69 73 20 64   rowid in this d
e2c0: 6f 63 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 4c 65  oclist. */.  pLe
e2d0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
e2e0: 66 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d  f;..  if( pIter-
e2f0: 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69  >pDlidx ){.    i
e300: 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65  nt iSegid = pIte
e310: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  r->pSeg->iSegid;
e320: 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20  .    pgnoLast = 
e330: 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 2d 3e 69  pIter->pDlidx->i
e340: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 70 4c  LeafPgno;.    pL
e350: 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52 65  ast = fts5DataRe
e360: 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
e370: 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69  NT_ROWID(iIdx, i
e380: 53 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f 4c 61  Segid, 0, pgnoLa
e390: 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st));.  }else{. 
e3a0: 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70     while( iOff<p
e3b0: 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20  Leaf->n ){.     
e3c0: 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
e3d0: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
e3e0: 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
e3f0: 6c 69 73 74 20 73 69 7a 65 20 69 6e 20 62 79 74  list size in byt
e400: 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66  es */.      iOff
e410: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
e420: 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
e430: 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20  ff], nPos);.    
e440: 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a    iOff += nPos;.
e450: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
e460: 70 4c 65 61 66 2d 3e 6e 20 29 20 62 72 65 61 6b  pLeaf->n ) break
e470: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;..      /* Rowi
e480: 64 20 64 65 6c 74 61 2e 20 4f 72 2c 20 69 66 20  d delta. Or, if 
e490: 30 78 30 30 2c 20 74 68 65 20 65 6e 64 20 6f 66  0x00, the end of
e4a0: 20 64 6f 63 6c 69 73 74 20 6d 61 72 6b 65 72 2e   doclist marker.
e4b0: 20 2a 2f 0a 20 20 20 20 20 20 6e 50 6f 73 20 3d   */.      nPos =
e4c0: 20 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61   getVarint(&pLea
e4d0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
e4e0: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
e4f0: 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20    if( iDelta==0 
e500: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
e510: 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  Off += nPos;.   
e520: 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66   }..    if( iOff
e530: 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20  >=pLeaf->n ){.  
e540: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
e550: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
e560: 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20   pIter->pSeg;.  
e570: 20 20 20 20 69 36 34 20 69 41 62 73 20 3d 20 46      i64 iAbs = F
e580: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
e590: 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53  D(iIdx, pSeg->iS
e5a0: 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e  egid, 0, pIter->
e5b0: 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20  iLeafPgno);.    
e5c0: 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54    i64 iLast = FT
e5d0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
e5e0: 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65  (iIdx, pSeg->iSe
e5f0: 67 69 64 2c 20 30 2c 20 70 53 65 67 2d 3e 70 67  gid, 0, pSeg->pg
e600: 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 20 20  noLast);..      
e610: 2f 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69  /* The last rowi
e620: 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74  d in the doclist
e630: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74   may not be on t
e640: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
e650: 20 53 65 61 72 63 68 0a 20 20 20 20 20 20 20 2a   Search.       *
e660: 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e  * forward to fin
e670: 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  d the page conta
e680: 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72  ining the last r
e690: 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  owid.  */.      
e6a0: 66 6f 72 28 69 41 62 73 2b 2b 3b 20 70 2d 3e 72  for(iAbs++; p->r
e6b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e6c0: 69 41 62 73 3c 3d 69 4c 61 73 74 3b 20 69 41 62  iAbs<=iLast; iAb
e6d0: 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74  s++){.        Ft
e6e0: 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20 66  s5Data *pNew = f
e6f0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
e700: 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Abs);.        if
e710: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
e720: 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c 20      int iRowid, 
e730: 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  iTerm;.         
e740: 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28   fts5LeafHeader(
e750: 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 2c 20 26  pNew, &iRowid, &
e760: 69 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  iTerm);.        
e770: 20 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a    if( iRowid ){.
e780: 20 20 20 20 20 20 20 20 20 20 20 20 46 74 73 35              Fts5
e790: 44 61 74 61 20 2a 70 54 6d 70 20 3d 20 70 4c 61  Data *pTmp = pLa
e7a0: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
e7b0: 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pLast = pNew;.  
e7c0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
e7d0: 20 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 20   pTmp;.         
e7e0: 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 69 41     pgnoLast = iA
e7f0: 62 73 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  bs & (((i64)1 <<
e800: 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
e810: 42 29 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 20  B) - 1);.       
e820: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
e830: 66 28 20 69 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( iTerm ){.    
e840: 20 20 20 20 20 20 20 20 69 41 62 73 20 3d 20 69          iAbs = i
e850: 4c 61 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Last;.          
e860: 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  }.          fts5
e870: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
e880: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
e890: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
e8a0: 20 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73    /* If pLast is
e8b0: 20 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f   NULL at this po
e8c0: 69 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61  int, then the la
e8d0: 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69  st rowid for thi
e8e0: 73 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c  s doclist.  ** l
e8f0: 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ies on the page 
e900: 63 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61  currently indica
e910: 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61  ted by the itera
e920: 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73  tor. In this cas
e930: 65 20 0a 20 20 2a 2a 20 69 4c 61 73 74 4f 66 66  e .  ** iLastOff
e940: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
e950: 61 6c 75 65 20 74 68 61 74 20 70 49 74 65 72 2d  alue that pIter-
e960: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 77 69 6c  >iLeafOffset wil
e970: 6c 20 74 61 6b 65 20 77 68 65 6e 0a 20 20 2a 2a  l take when.  **
e980: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
e990: 69 6e 74 73 20 74 6f 20 74 68 61 74 20 72 6f 77  ints to that row
e9a0: 69 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72  id..  **.  ** Or
e9b0: 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f  , if pLast is no
e9c0: 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20  n-NULL, then it 
e9d0: 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
e9e0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61   contains the la
e9f0: 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 0a 20  st.  ** rowid.. 
ea00: 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 20   */.  if( pLast 
ea10: 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79  ){.    int dummy
ea20: 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  ;.    fts5DataRe
ea30: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
ea40: 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
ea50: 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20  pLeaf = pLast;. 
ea60: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50     pIter->iLeafP
ea70: 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a  gno = pgnoLast;.
ea80: 20 20 20 20 66 74 73 35 4c 65 61 66 48 65 61 64      fts5LeafHead
ea90: 65 72 28 70 4c 61 73 74 2c 20 26 69 4f 66 66 2c  er(pLast, &iOff,
eaa0: 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f   &dummy);.    iO
eab0: 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  ff += getVarint(
eac0: 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLast->p[iOff],
ead0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
eae0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65  Rowid);.    pIte
eaf0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
eb00: 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 66 74   iOff;.  }..  ft
eb10: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
eb20: 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
eb30: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  r);.}../*.** Ite
eb40: 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72  rator pIter curr
eb50: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
eb60: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
eb70: 6f 66 20 61 20 64 6f 63 6c 69 73 74 20 77 69 74  of a doclist wit
eb80: 68 69 6e 0a 2a 2a 20 69 6e 64 65 78 20 69 49 64  hin.** index iId
eb90: 78 2e 20 54 68 65 72 65 20 69 73 20 61 20 64 6f  x. There is a do
eba0: 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f  clist-index asso
ebb0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
ebc0: 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 0a 2a 2a  final term on.**
ebd0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
ebe0: 65 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  e. If the curren
ebf0: 74 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61  t term is the la
ec00: 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70  st term on the p
ec10: 61 67 65 2c 20 0a 2a 2a 20 6c 6f 61 64 20 74 68  age, .** load th
ec20: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
ec30: 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e  from disk and in
ec40: 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72  itialize an iter
ec50: 61 74 6f 72 20 61 74 20 0a 2a 2a 20 28 70 49 74  ator at .** (pIt
ec60: 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a  er->pDlidx)..*/.
ec70: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ec80: 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78  SegIterLoadDlidx
ec90: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
eca0: 6e 74 20 69 49 64 78 2c 20 46 74 73 35 53 65 67  nt iIdx, Fts5Seg
ecb0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ecc0: 69 6e 74 20 69 53 65 67 20 3d 20 70 49 74 65 72  int iSeg = pIter
ecd0: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
ece0: 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49    int bRev = (pI
ecf0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
ed00: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
ed10: 45 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  E);.  Fts5Data *
ed20: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
ed30: 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74  Leaf; /* Current
ed40: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20   leaf data */.  
ed50: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
ed60: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ->iLeafOffset;  
ed70: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 77  /* Byte offset w
ed80: 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65  ithin current le
ed90: 61 66 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  af */..  assert(
eda0: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
edb0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
edc0: 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  TERM );.  assert
edd0: 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3d  ( pIter->pDlidx=
ede0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
edf0: 6b 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74  k if the current
ee00: 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f 6e   doclist ends on
ee10: 20 74 68 69 73 20 70 61 67 65 2e 20 49 66 20 69   this page. If i
ee20: 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a 20  t does, return. 
ee30: 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f 75   ** early withou
ee40: 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 6f  t loading the do
ee50: 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73 20  clist-index (as 
ee60: 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61 20  it belongs to a 
ee70: 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20 74  different.  ** t
ee80: 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49  erm. */.  if( pI
ee90: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
eea0: 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no==pIter->iLeaf
eeb0: 50 67 6e 6f 20 29 7b 0a 20 20 20 20 77 68 69 6c  Pgno ){.    whil
eec0: 65 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e  e( iOff<pLeaf->n
eed0: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44   ){.      i64 iD
eee0: 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20  elta;.      int 
eef0: 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20 20  nPoslist;..     
ef00: 20 2f 2a 20 69 4f 66 66 20 69 73 20 63 75 72 72   /* iOff is curr
ef10: 65 6e 74 6c 79 20 74 68 65 20 6f 66 66 73 65 74  ently the offset
ef20: 20 6f 66 20 74 68 65 20 73 69 7a 65 20 66 69 65   of the size fie
ef30: 6c 64 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e  ld of a position
ef40: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20   list. */.      
ef50: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
ef60: 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
ef70: 70 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73  p[iOff], nPoslis
ef80: 74 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  t);.      iOff +
ef90: 3d 20 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20  = nPoslist;..   
efa0: 20 20 20 69 66 28 20 69 4f 66 66 3c 70 4c 65 61     if( iOff<pLea
efb0: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  f->n ){.        
efc0: 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
efd0: 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  t(&pLeaf->p[iOff
efe0: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
eff0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
f000: 44 65 6c 74 61 3d 3d 30 20 29 20 72 65 74 75 72  Delta==0 ) retur
f010: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
f020: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 6c 69 64  .  }..  fts5Dlid
f030: 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65  xIterInit(p, bRe
f040: 76 2c 20 69 49 64 78 2c 20 69 53 65 67 2c 20 70  v, iIdx, iSeg, p
f050: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
f060: 67 6e 6f 2c 20 26 70 49 74 65 72 2d 3e 70 44 6c  gno, &pIter->pDl
f070: 69 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  idx);.}../*.** I
f080: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62  nitialize the ob
f090: 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f  ject pIter to po
f0a0: 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72  int to term pTer
f0b0: 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73  m/nTerm within s
f0c0: 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2c 20  egment.** pSeg, 
f0d0: 69 6e 64 65 78 20 69 49 64 78 2e 20 49 66 20 74  index iIdx. If t
f0e0: 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
f0f0: 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65  term in the inde
f100: 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  x, the iterator.
f110: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  ** is set to EOF
f120: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
f130: 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
f140: 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
f150: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
f160: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
f170: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
f180: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
f190: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
f1a0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
f1b0: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
f1c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
f1d0: 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
f1e0: 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
f1f0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
f200: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
f210: 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69  ckend */.  int i
f220: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
f230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
f240: 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64  nfig.aHash[] ind
f250: 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20  ex of FTS index 
f260: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
f270: 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
f280: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
f290: 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  seek to */.  int
f2a0: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f2c0: 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
f2d0: 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  X_XXX flags */. 
f2e0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
f2f0: 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20  gment *pSeg,    
f300: 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
f310: 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  of segment */.  
f320: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
f330: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
f340: 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
f350: 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ulate */.){.  in
f360: 74 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74  t iPg = 1;.  int
f370: 20 68 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20   h;.  int bGe = 
f380: 28 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ((flags & FTS5IN
f390: 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58  DEX_QUERY_PREFIX
f3a0: 29 20 26 26 20 69 49 64 78 3d 3d 30 29 3b 0a 20  ) && iIdx==0);. 
f3b0: 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b   int bDlidx = 0;
f3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3d0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
f3e0: 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
f3f0: 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndex */..  asser
f400: 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c  t( bGe==0 || (fl
f410: 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
f420: 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29  QUERY_DESC)==0 )
f430: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72  ;.  assert( pTer
f440: 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20  m && nTerm );.  
f450: 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
f460: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
f470: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20  ;.  pIter->pSeg 
f480: 3d 20 70 53 65 67 3b 0a 20 20 70 49 74 65 72 2d  = pSeg;.  pIter-
f490: 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 0a 20  >iIdx = iIdx;.. 
f4a0: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73   /* This block s
f4b0: 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ets stack variab
f4c0: 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65  le iPg to the le
f4d0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  af page number t
f4e0: 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e  hat may.  ** con
f4f0: 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d  tain term (pTerm
f500: 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69  /nTerm), if it i
f510: 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65  s present in the
f520: 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 66   segment. */.  f
f530: 6f 72 28 68 3d 70 53 65 67 2d 3e 6e 48 65 69 67  or(h=pSeg->nHeig
f540: 68 74 2d 31 3b 20 68 3e 30 3b 20 68 2d 2d 29 7b  ht-1; h>0; h--){
f550: 0a 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65  .    Fts5NodeIte
f560: 72 20 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  r node;         
f570: 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72       /* For iter
f580: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e  ating through in
f590: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 2a 2f 0a  ternal nodes */.
f5a0: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
f5b0: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
f5c0: 57 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e  WID(iIdx, pSeg->
f5d0: 69 53 65 67 69 64 2c 20 68 2c 20 69 50 67 29 3b  iSegid, h, iPg);
f5e0: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
f5f0: 4e 6f 64 65 20 3d 20 66 74 73 35 44 61 74 61 52  Node = fts5DataR
f600: 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a  ead(p, iRowid);.
f610: 20 20 20 20 69 66 28 20 70 4e 6f 64 65 3d 3d 30      if( pNode==0
f620: 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 66   ) break;..    f
f630: 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28  ts5NodeIterInit(
f640: 70 4e 6f 64 65 2d 3e 70 2c 20 70 4e 6f 64 65 2d  pNode->p, pNode-
f650: 3e 6e 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20 20  >n, &node);.    
f660: 61 73 73 65 72 74 28 20 6e 6f 64 65 2e 74 65 72  assert( node.ter
f670: 6d 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 69  m.n==0 );..    i
f680: 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64  Pg = node.iChild
f690: 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e  ;.    bDlidx = n
f6a0: 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20  ode.bDlidx;.    
f6b0: 66 6f 72 28 66 74 73 35 4e 6f 64 65 49 74 65 72  for(fts5NodeIter
f6c0: 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f  Next(&p->rc, &no
f6d0: 64 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 6f 64  de);.        nod
f6e0: 65 2e 61 44 61 74 61 20 26 26 20 66 74 73 35 42  e.aData && fts5B
f6f0: 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62  ufferCompareBlob
f700: 28 26 6e 6f 64 65 2e 74 65 72 6d 2c 20 70 54 65  (&node.term, pTe
f710: 72 6d 2c 20 6e 54 65 72 6d 29 3c 3d 30 3b 0a 20  rm, nTerm)<=0;. 
f720: 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49         fts5NodeI
f730: 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20  terNext(&p->rc, 
f740: 26 6e 6f 64 65 29 0a 20 20 20 20 29 7b 0a 20 20  &node).    ){.  
f750: 20 20 20 20 69 50 67 20 3d 20 6e 6f 64 65 2e 69      iPg = node.i
f760: 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 62 44 6c  Child;.      bDl
f770: 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44 6c 69 64  idx = node.bDlid
f780: 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  x;.    }.    fts
f790: 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 6e  5NodeIterFree(&n
f7a0: 6f 64 65 29 3b 0a 20 20 20 20 66 74 73 35 44 61  ode);.    fts5Da
f7b0: 74 61 52 65 6c 65 61 73 65 28 70 4e 6f 64 65 29  taRelease(pNode)
f7c0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 50 67  ;.  }..  if( iPg
f7d0: 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  <pSeg->pgnoFirst
f7e0: 20 29 7b 0a 20 20 20 20 69 50 67 20 3d 20 70 53   ){.    iPg = pS
f7f0: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20  eg->pgnoFirst;. 
f800: 20 20 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20     bDlidx = 0;. 
f810: 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65   }..  pIter->iLe
f820: 61 66 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31  afPgno = iPg - 1
f830: 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4e  ;.  fts5SegIterN
f840: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
f850: 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d  );..  if( pIter-
f860: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  >pLeaf ){.    in
f870: 74 20 72 65 73 3b 0a 20 20 20 20 70 49 74 65 72  t res;.    pIter
f880: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
f890: 66 74 73 35 47 65 74 55 31 36 28 26 70 49 74 65  fts5GetU16(&pIte
f8a0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b  r->pLeaf->p[2]);
f8b0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
f8c0: 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65  LoadTerm(p, pIte
f8d0: 72 2c 20 30 29 3b 0a 20 20 20 20 64 6f 20 7b 0a  r, 0);.    do {.
f8e0: 20 20 20 20 20 20 72 65 73 20 3d 20 66 74 73 35        res = fts5
f8f0: 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f  BufferCompareBlo
f900: 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  b(&pIter->term, 
f910: 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
f920: 20 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20       if( res>=0 
f930: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
f940: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
f950: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 77  , pIter);.    }w
f960: 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 70 4c 65  hile( pIter->pLe
f970: 61 66 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  af && p->rc==SQL
f980: 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 69  ITE_OK );..    i
f990: 66 28 20 62 47 65 3d 3d 30 20 26 26 20 72 65 73  f( bGe==0 && res
f9a0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65 74   ){.      /* Set
f9b0: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
f9c0: 6e 74 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20 20  nt to EOF */.   
f9d0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
f9e0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
f9f0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70  ;.      pIter->p
fa00: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Leaf = 0;.    }.
fa10: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
fa20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
fa30: 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 74  Ge==0 ){.    pIt
fa40: 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
fa50: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
fa60: 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  M;.    if( pIter
fa70: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
fa80: 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
fa90: 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
faa0: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  C ){.        pIt
fab0: 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
fac0: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
fad0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
fae0: 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20   if( bDlidx ){. 
faf0: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
fb00: 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c 20 69  erLoadDlidx(p, i
fb10: 49 64 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  Idx, pIter);.   
fb20: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66     }.      if( f
fb30: 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
fb40: 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20  _QUERY_DESC ){. 
fb50: 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
fb60: 65 72 52 65 76 65 72 73 65 28 70 2c 20 69 49 64  erReverse(p, iId
fb70: 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  x, pIter);.     
fb80: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
fb90: 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69  /*.** Zero the i
fba0: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
fbb0: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
fbc0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
fbd0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 43  oid fts5SegIterC
fbe0: 6c 65 61 72 28 46 74 73 35 53 65 67 49 74 65 72  lear(Fts5SegIter
fbf0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35   *pIter){.  fts5
fc00: 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65  BufferFree(&pIte
fc10: 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35  r->term);.  fts5
fc20: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
fc30: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73  r->pLeaf);.  fts
fc40: 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70  5DlidxIterFree(p
fc50: 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 20  Iter->pDlidx);. 
fc60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
fc70: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
fc80: 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  t);.  memset(pIt
fc90: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
fca0: 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a 0a  s5SegIter));.}..
fcb0: 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d  /*.** Do the com
fcc0: 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72  parison necessar
fcd0: 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49  y to populate pI
fce0: 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
fcf0: 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  ]..**.** If the 
fd00: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
fd10: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
fd20: 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65 78   it is the index
fd30: 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20   of an entry.** 
fd40: 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53  in the pIter->aS
fd50: 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20  eg[] array that 
fd60: 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f  is (a) not at EO
fd70: 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74  F, and (b) point
fd80: 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20  ing.** to a key 
fd90: 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69 63  that is a duplic
fda0: 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20  ate of another, 
fdb0: 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c  higher priority,
fdc0: 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65   .** segment-ite
fdd0: 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65  rator in the pSe
fde0: 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e  g->aSeg[] array.
fdf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
fe00: 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f  ts5MultiIterDoCo
fe10: 6d 70 61 72 65 28 46 74 73 35 4d 75 6c 74 69 53  mpare(Fts5MultiS
fe20: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
fe30: 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20  nt iOut){.  int 
fe40: 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i1;             
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
fe60: 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e  ndex of left-han
fe70: 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
fe80: 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20  .  int i2;      
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
feb0: 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65  ight-hand Fts5Se
fec0: 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  gIter */.  int i
fed0: 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49 74  Res;.  Fts5SegIt
fee0: 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20 20  er *p1;         
fef0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
ff00: 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
ff10: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
ff20: 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20 20   *p2;           
ff30: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61       /* Right-ha
ff40: 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
ff50: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75  /..  assert( iOu
ff60: 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26  t<pIter->nSeg &&
ff70: 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73   iOut>0 );.  ass
ff80: 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76  ert( pIter->bRev
ff90: 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52  ==0 || pIter->bR
ffa0: 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ev==1 );..  if( 
ffb0: 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53  iOut>=(pIter->nS
ffc0: 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20  eg/2) ){.    i1 
ffd0: 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d  = (iOut - pIter-
ffe0: 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20  >nSeg/2) * 2;.  
fff0: 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20    i2 = i1 + 1;. 
10000 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d   }else{.    i1 =
10010 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
10020 4f 75 74 2a 32 5d 3b 0a 20 20 20 20 69 32 20 3d  Out*2];.    i2 =
10030 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
10040 4f 75 74 2a 32 2b 31 5d 3b 0a 20 20 7d 0a 20 20  Out*2+1];.  }.  
10050 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
10060 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70  g[i1];.  p2 = &p
10070 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a  Iter->aSeg[i2];.
10080 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66  .  if( p1->pLeaf
10090 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
100a0 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74 20   /* If p1 is at 
100b0 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20  EOF */.    iRes 
100c0 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = i2;.  }else if
100d0 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p2->pLeaf==0 )
100e0 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20 69  {     /* If p2 i
100f0 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20  s at EOF */.    
10100 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c  iRes = i1;.  }el
10110 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20  se{.    int res 
10120 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  = fts5BufferComp
10130 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26  are(&p1->term, &
10140 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69  p2->term);.    i
10150 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
10160 20 20 20 61 73 73 65 72 74 28 20 69 32 3e 69 31     assert( i2>i1
10170 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10180 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( i2!=0 );.     
10190 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d   if( p1->iRowid=
101a0 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 20 72 65  =p2->iRowid ) re
101b0 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 72  turn i2;.      r
101c0 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69  es = ((p1->iRowi
101d0 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d  d > p2->iRowid)=
101e0 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20  =pIter->bRev) ? 
101f0 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  -1 : +1;.    }. 
10200 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d     assert( res!=
10210 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  0 );.    if( res
10220 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73  <0 ){.      iRes
10230 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = i1;.    }else
10240 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
10250 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
10260 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
10270 75 74 5d 20 3d 20 69 52 65 73 3b 0a 20 20 72 65  ut] = iRes;.  re
10280 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10290 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74   Move the seg-it
102a0 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  er so that it po
102b0 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
102c0 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20  t rowid on page 
102d0 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74  iLeafPgno..** It
102e0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20   is an error if 
102f0 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 63  leaf iLeafPgno c
10300 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64  ontains no rowid
10310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10320 20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f   fts5SegIterGoto
10330 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
10340 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
10350 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
10360 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
10370 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
10380 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
10390 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
103a0 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
103b0 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b  int iLeafPgno.){
103c0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66  .  assert( iLeaf
103d0 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
103e0 66 50 67 6e 6f 20 29 3b 0a 20 20 69 66 28 20 70  fPgno );.  if( p
103f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10400 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  ){.    pIter->iL
10410 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
10420 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53  gno-1;.    fts5S
10430 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
10440 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73  , pIter);.    as
10450 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
10460 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d  ITE_OK || pIter-
10470 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61  >iLeafPgno==iLea
10480 66 50 67 6e 6f 20 29 3b 0a 20 20 7d 0a 0a 20 20  fPgno );.  }..  
10490 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
104a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
104b0 69 4f 66 66 3b 0a 20 20 20 20 75 38 20 2a 61 20  iOff;.    u8 *a 
104c0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
104d0 70 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  p;.    int n = p
104e0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a  Iter->pLeaf->n;.
104f0 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35  .    iOff = fts5
10500 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20  GetU16(&a[0]);. 
10510 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c     if( iOff<4 ||
10520 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20   iOff>=n ){.    
10530 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
10540 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73  ORRUPT;.    }els
10550 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  e{.      iOff +=
10560 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f   getVarint(&a[iO
10570 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
10580 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
10590 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
105a0 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
105b0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
105c0 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
105d0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
105e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
105f0 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61  nt until it is a
10600 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f  t or .** past ro
10610 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72  wid iFrom. Regar
10620 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
10630 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65  ue of iFrom, the
10640 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20   iterator is.** 
10650 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20  always advanced 
10660 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a  at least once..*
10670 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10680 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
10690 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
106a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
106b0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
106c0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
106d0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
106e0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
106f0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
10700 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34  advance */.  i64
10710 20 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20   iMatch         
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10730 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
10740 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66   at least this f
10750 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  ar */.){.  int b
10760 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
10770 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
10780 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
10790 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
107a0 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
107b0 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61  lidx;.  int iLea
107c0 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
107d0 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
107e0 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73  bMove = 1;..  as
107f0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
10800 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
10810 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
10820 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
10830 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74  lidx );.  assert
10840 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
10850 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30  ;..  if( bRev==0
10860 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 66   ){.    while( f
10870 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
10880 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 20 26 26  p, pDlidx)==0 &&
10890 20 69 4d 61 74 63 68 3e 70 44 6c 69 64 78 2d 3e   iMatch>pDlidx->
108a0 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
108b0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69  iLeafPgno = pDli
108c0 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  dx->iLeafPgno;. 
108d0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
108e0 65 72 4e 65 78 74 28 70 44 6c 69 64 78 29 3b 0a  erNext(pDlidx);.
108f0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
10900 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74  ( iLeafPgno>=pIt
10910 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c  er->iLeafPgno ||
10920 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66   p->rc );.    if
10930 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
10940 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
10950 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
10960 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74  rGotoPage(p, pIt
10970 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a  er, iLeafPgno);.
10980 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b        bMove = 0;
10990 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
109a0 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 61 74      assert( iMat
109b0 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  ch<pIter->iRowid
109c0 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66   );.    while( f
109d0 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
109e0 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 20 26 26  p, pDlidx)==0 &&
109f0 20 69 4d 61 74 63 68 3c 70 44 6c 69 64 78 2d 3e   iMatch<pDlidx->
10a00 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
10a10 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
10a20 76 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d  v(pDlidx);.    }
10a30 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d  .    iLeafPgno =
10a40 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67   pDlidx->iLeafPg
10a50 6e 6f 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  no;..    assert(
10a60 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
10a70 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20  f(p, pDlidx) || 
10a80 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72  iLeafPgno<=pIter
10a90 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ->iLeafPgno );..
10aa0 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
10ab0 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o<pIter->iLeafPg
10ac0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  no ){.      pIte
10ad0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
10ae0 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20  LeafPgno+1;.    
10af0 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
10b00 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
10b10 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Iter);.      bMo
10b20 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
10b30 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  }..  while( 1 ){
10b40 0a 20 20 20 20 69 66 28 20 62 4d 6f 76 65 20 29  .    if( bMove )
10b50 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
10b60 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
10b70 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
10b80 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
10b90 20 69 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20   if( bRev==0 && 
10ba0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69  pIter->iRowid>=i
10bb0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
10bc0 20 20 20 69 66 28 20 62 52 65 76 21 3d 30 20 26     if( bRev!=0 &
10bd0 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c  & pIter->iRowid<
10be0 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
10bf0 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a  .    bMove = 1;.
10c00 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72    }.}.../*.** Fr
10c10 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ee the iterator 
10c20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
10c30 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
10c40 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
10c50 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
10c60 65 72 46 72 65 65 28 46 74 73 35 49 6e 64 65 78  erFree(Fts5Index
10c70 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65   *p, Fts5MultiSe
10c80 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
10c90 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
10ca0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
10cb0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
10cc0 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Seg; i++){.     
10cd0 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61   fts5SegIterClea
10ce0 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  r(&pIter->aSeg[i
10cf0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ]);.    }.    sq
10d00 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
10d10 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
10d20 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
10d30 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46  terAdvanced(.  F
10d40 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10d60 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
10d70 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
10d80 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53   */.  Fts5MultiS
10d90 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
10da0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
10db0 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72  r to update aFir
10dc0 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a  st[] array for *
10dd0 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64  /.  int iChanged
10de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10df0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
10e00 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73  sub-iterator jus
10e10 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20  t advanced */.  
10e20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20  int iMinset     
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79  /* Minimum entry
10e50 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20   in aFirst[] to 
10e60 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  set */.){.  int 
10e70 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65  i;.  for(i=(pIte
10e80 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64  r->nSeg+iChanged
10e90 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20  )/2; i>=iMinset 
10ea0 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
10eb0 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20  _OK; i=i/2){.   
10ec0 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66   int iEq;.    if
10ed0 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c  ( (iEq = fts5Mul
10ee0 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
10ef0 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20  pIter, i)) ){.  
10f00 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
10f10 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61  ext(p, &pIter->a
10f20 53 65 67 5b 69 45 71 5d 29 3b 0a 20 20 20 20 20  Seg[iEq]);.     
10f30 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67   i = pIter->nSeg
10f40 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20   + iEq;.    }.  
10f50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  }.}../*.** Move 
10f60 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
10f70 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
10f80 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
10f90 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
10fa0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
10fb0 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
10fc0 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  . It is not .** 
10fd0 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
10fe0 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61  ror if the itera
10ff0 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c  tor reaches EOF,
11000 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72   or if it is alr
11010 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20  eady at .** EOF 
11020 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
11030 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
11040 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
11050 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a  5MultiIterNext(.
11060 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
11070 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
11080 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e  ter *pIter,.  in
11090 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t bFrom,        
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
110b0 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e   True if argumen
110c0 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64  t iFrom is valid
110d0 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20   */.  i64 iFrom 
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110f0 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
11100 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72   at least as far
11110 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20   as this */.){. 
11120 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
11130 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
11140 20 62 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f   bUseFrom = bFro
11150 6d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  m;.    do {.    
11160 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
11170 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 3b  Iter->aFirst[1];
11180 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
11190 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
111a0 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b  r->aSeg[iFirst];
111b0 0a 20 20 20 20 20 20 69 66 28 20 62 55 73 65 46  .      if( bUseF
111c0 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c  rom && pSeg->pDl
111d0 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66  idx ){.        f
111e0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72  ts5SegIterNextFr
111f0 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f  om(p, pSeg, iFro
11200 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
11210 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
11220 49 74 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67  IterNext(p, pSeg
11230 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11240 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
11250 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c  vanced(p, pIter,
11260 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20   iFirst, 1);.   
11270 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b     bUseFrom = 0;
11280 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49 74  .    }while( pIt
11290 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 0a  er->bSkipEmpty .
112a0 20 20 20 20 20 20 20 20 20 26 26 20 66 74 73 35           && fts5
112b0 53 65 67 49 74 65 72 49 73 44 65 6c 65 74 65 28  SegIterIsDelete(
112c0 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
112d0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
112e0 5d 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  ]).    );.  }.}.
112f0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
11300 61 20 6e 65 77 20 46 74 73 35 4d 75 6c 74 69 53  a new Fts5MultiS
11310 65 67 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a  egIter object..*
11320 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a  *.** The new obj
11330 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ect will be used
11340 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
11350 75 67 68 20 64 61 74 61 20 69 6e 20 73 74 72 75  ugh data in stru
11360 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a  cture pStruct..*
11370 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d  * If iLevel is -
11380 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74  ve, then all dat
11390 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74  a in all segment
113a0 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c  s is merged. Or,
113b0 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73   if iLevel.** is
113c0 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72   zero or greater
113d0 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  , data from the 
113e0 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73  first nSegment s
113f0 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
11400 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65   iLevel.** is me
11410 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rged..**.** The 
11420 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c  iterator initial
11430 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
11440 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69   first term/rowi
11450 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a  d entry in the .
11460 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61 74 61  ** iterated data
11470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11480 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
11490 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  w(.  Fts5Index *
114a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
114b0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
114c0 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
114d0 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35  within */.  Fts5
114e0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
114f0 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ct,         /* S
11500 74 72 75 63 74 75 72 65 20 6f 66 20 73 70 65 63  tructure of spec
11510 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ific index */.  
11520 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11540 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b  /* Config.aHash[
11550 5d 20 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69  ] index of FTS i
11560 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53  ndex */.  int bS
11570 6b 69 70 45 6d 70 74 79 2c 0a 20 20 69 6e 74 20  kipEmpty,.  int 
11580 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
11590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
115a0 72 75 65 20 66 6f 72 20 3e 3d 20 2a 2f 0a 20 20  rue for >= */.  
115b0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
115c0 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
115d0 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
115e0 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a  to (or NULL/0) *
115f0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
11620 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20  iterate (-1 for 
11630 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  all) */.  int nS
11640 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20  egment,         
11650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11660 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
11670 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c  to merge (iLevel
11680 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 4d 75  >=0) */.  Fts5Mu
11690 6c 74 69 53 65 67 49 74 65 72 20 2a 2a 70 70 4f  ltiSegIter **ppO
116a0 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77  ut        /* New
116b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
116c0 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
116f0 6d 65 6e 74 73 20 6d 65 72 67 65 64 20 2a 2f 0a  ments merged */.
11700 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20    int nSlot;    
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77    /* Power of tw
11730 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 20 20 69  o >= nSeg */.  i
11740 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20  nt iIter = 0;   
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11760 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b  * */.  int iSeg;
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
11790 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
117a0 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  h segments */.  
117b0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
117c0 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35  el *pLvl;.  Fts5
117d0 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4e  MultiSegIter *pN
117e0 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  ew;..  assert( (
117f0 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72  pTerm==0 && nTer
11800 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c  m==0) || iLevel<
11810 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  0 );..  /* Alloc
11820 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
11830 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d  e new multi-seg-
11840 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69  iterator. */.  i
11850 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20  f( iLevel<0 ){. 
11860 20 20 20 6e 53 65 67 20 3d 20 66 74 73 35 53 74     nSeg = fts5St
11870 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
11880 65 6e 74 73 28 70 53 74 72 75 63 74 29 3b 0a 20  ents(pStruct);. 
11890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 53 65 67   }else{.    nSeg
118a0 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e   = MIN(pStruct->
118b0 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e  aLevel[iLevel].n
118c0 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a  Seg, nSegment);.
118d0 20 20 7d 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d    }.  for(nSlot=
118e0 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e  2; nSlot<nSeg; n
118f0 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20  Slot=nSlot*2);. 
11900 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d   *ppOut = pNew =
11910 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
11920 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  , .      sizeof(
11930 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
11940 29 20 2b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ) +          /* 
11950 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69  pNew */.      si
11960 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72  zeof(Fts5SegIter
11970 29 20 2a 20 6e 53 6c 6f 74 20 2b 20 20 20 20 20  ) * nSlot +     
11980 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b    /* pNew->aSeg[
11990 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f  ] */.      sizeo
119a0 66 28 75 31 36 29 20 2a 20 6e 53 6c 6f 74 20 20  f(u16) * nSlot  
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
119c0 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d  * pNew->aFirst[]
119d0 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70   */.  );.  if( p
119e0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
119f0 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20  .  pNew->nSeg = 
11a00 6e 53 6c 6f 74 3b 0a 20 20 70 4e 65 77 2d 3e 61  nSlot;.  pNew->a
11a10 53 65 67 20 3d 20 28 46 74 73 35 53 65 67 49 74  Seg = (Fts5SegIt
11a20 65 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  er*)&pNew[1];.  
11a30 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d 20 28  pNew->aFirst = (
11a40 75 31 36 2a 29 26 70 4e 65 77 2d 3e 61 53 65 67  u16*)&pNew->aSeg
11a50 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 70 4e 65 77 2d  [nSlot];.  pNew-
11a60 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61  >bRev = (0!=(fla
11a70 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
11a80 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70  UERY_DESC));.  p
11a90 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
11aa0 3d 20 62 53 6b 69 70 45 6d 70 74 79 3b 0a 0a 20  = bSkipEmpty;.. 
11ab0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65   /* Initialize e
11ac0 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  ach of the compo
11ad0 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65  nent segment ite
11ae0 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28  rators. */.  if(
11af0 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20   iLevel<0 ){.   
11b00 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
11b10 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74  vel *pEnd = &pSt
11b20 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74  ruct->aLevel[pSt
11b30 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20  ruct->nLevel];. 
11b40 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74     for(pLvl=&pSt
11b50 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b  ruct->aLevel[0];
11b60 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c   pLvl<pEnd; pLvl
11b70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
11b80 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31  Seg=pLvl->nSeg-1
11b90 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
11ba0 2d 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35  -){.        Fts5
11bb0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
11bc0 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e   *pSeg = &pLvl->
11bd0 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
11be0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
11bf0 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e  *pIter = &pNew->
11c00 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20  aSeg[iIter++];. 
11c10 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
11c20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
11c30 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
11c40 28 70 2c 20 69 49 64 78 2c 20 70 53 65 67 2c 20  (p, iIdx, pSeg, 
11c50 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  pIter);.        
11c60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11c70 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b   fts5SegIterSeek
11c80 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 70 54  Init(p, iIdx, pT
11c90 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67  erm, nTerm, flag
11ca0 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  s, pSeg, pIter);
11cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11cc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
11cd0 7b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53  {.    pLvl = &pS
11ce0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
11cf0 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69  evel];.    for(i
11d00 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67  Seg=nSeg-1; iSeg
11d10 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20  >=0; iSeg--){.  
11d20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
11d30 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 26 70 4c  nit(p, iIdx, &pL
11d40 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20  vl->aSeg[iSeg], 
11d50 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
11d60 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  r++]);.    }.  }
11d70 0a 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72  .  assert( iIter
11d80 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20  ==nSeg );..  /* 
11d90 49 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73  If the above was
11da0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63   successful, eac
11db0 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72  h component iter
11dc0 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73  ators now points
11dd0 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69   .  ** to the fi
11de0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73  rst entry in its
11df0 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69   segment. In thi
11e00 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a  s case initializ
11e10 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72  e the .  ** aFir
11e20 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20  st[] array. Or, 
11e30 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
11e40 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74  occurred, free t
11e50 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a  he iterator.  **
11e60 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20   object and set 
11e70 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
11e80 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f  ble to NULL.  */
11e90 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
11ea0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
11eb0 6f 72 28 69 49 74 65 72 3d 6e 53 6c 6f 74 2d 31  or(iIter=nSlot-1
11ec0 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72  ; iIter>0; iIter
11ed0 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  --){.      int i
11ee0 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  Eq;.      if( (i
11ef0 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
11f00 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77  erDoCompare(pNew
11f10 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20  , iIter)) ){.   
11f20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
11f30 4e 65 78 74 28 70 2c 20 26 70 4e 65 77 2d 3e 61  Next(p, &pNew->a
11f40 53 65 67 5b 69 45 71 5d 29 3b 0a 20 20 20 20 20  Seg[iEq]);.     
11f50 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
11f60 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65 77  Advanced(p, pNew
11f70 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a 20  , iEq, iIter);. 
11f80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
11f90 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
11fa0 70 45 6d 70 74 79 20 0a 20 20 20 20 20 26 26 20  pEmpty .     && 
11fb0 66 74 73 35 53 65 67 49 74 65 72 49 73 44 65 6c  fts5SegIterIsDel
11fc0 65 74 65 28 70 2c 20 26 70 4e 65 77 2d 3e 61 53  ete(p, &pNew->aS
11fd0 65 67 5b 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b  eg[pNew->aFirst[
11fe0 31 5d 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  1]]) .    ){.   
11ff0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
12000 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c  Next(p, pNew, 0,
12010 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
12020 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  se{.    fts5Mult
12030 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65  iIterFree(p, pNe
12040 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d  w);.    *ppOut =
12050 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
12060 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
12070 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
12080 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20  at EOF or if an 
12090 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
120a0 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74  ed. .** False ot
120b0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
120c0 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
120d0 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
120e0 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53  x *p, Fts5MultiS
120f0 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
12100 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20    return (p->rc 
12110 7c 7c 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  || pIter->aSeg[ 
12120 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
12130 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a   ].pLeaf==0);.}.
12140 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12150 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65  e rowid of the e
12160 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
12170 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
12180 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49   points.** to. I
12190 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
121a0 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65  oints to EOF whe
121b0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
121c0 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a  is called the.**
121d0 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64   results are und
121e0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
121f0 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49  c i64 fts5MultiI
12200 74 65 72 52 6f 77 69 64 28 46 74 73 35 4d 75 6c  terRowid(Fts5Mul
12210 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
12220 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
12230 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
12240 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e 70 4c 65  >aFirst[1] ].pLe
12250 61 66 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  af );.  return p
12260 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
12270 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e 69  r->aFirst[1] ].i
12280 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
12290 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
122a0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
122b0 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77  try at or follow
122c0 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73  ing iMatch..*/.s
122d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
122e0 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
122f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
12300 2c 20 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  , .  Fts5MultiSe
12310 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20  gIter *pIter, . 
12320 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20   i64 iMatch.){. 
12330 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
12340 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
12350 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
12360 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20  xt(p, pIter, 1, 
12370 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28  iMatch);.    if(
12380 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
12390 66 28 70 2c 20 70 49 74 65 72 29 20 29 20 62 72  f(p, pIter) ) br
123a0 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20  eak;.    iRowid 
123b0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
123c0 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
123d0 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76   if( pIter->bRev
123e0 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69  ==0 && iRowid>=i
123f0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
12400 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
12410 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c  ev!=0 && iRowid<
12420 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
12430 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
12440 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
12450 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
12460 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61  ining the term a
12470 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
12480 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61  he .** entry tha
12490 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
124a0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
124b0 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  to..*/.static co
124c0 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74  nst u8 *fts5Mult
124d0 69 49 74 65 72 54 65 72 6d 28 46 74 73 35 4d 75  iIterTerm(Fts5Mu
124e0 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
124f0 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46  r, int *pn){.  F
12500 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20  ts5SegIter *p = 
12510 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
12520 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d  ter->aFirst[1] ]
12530 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72  ;.  *pn = p->ter
12540 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  m.n;.  return p-
12550 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  >term.p;.}../*.*
12560 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
12570 20 74 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61   the chunk itera
12580 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
12590 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
125a0 74 20 69 73 0a 2a 2a 20 61 74 20 45 4f 46 2e 20  t is.** at EOF. 
125b0 4f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  Or if an error h
125c0 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
125d0 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  red. Otherwise, 
125e0 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f  return false..*/
125f0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
12600 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 46 74 73  ChunkIterEof(Fts
12610 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 43  5Index *p, Fts5C
12620 68 75 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 29  hunkIter *pIter)
12630 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  {.  return (p->r
12640 63 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61  c || pIter->pLea
12650 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f==0);.}../*.** 
12660 41 64 76 61 6e 63 65 20 74 68 65 20 63 68 75 6e  Advance the chun
12670 6b 2d 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  k-iterator to th
12680 65 20 6e 65 78 74 20 63 68 75 6e 6b 20 6f 66 20  e next chunk of 
12690 64 61 74 61 20 74 6f 20 72 65 61 64 2e 0a 2a 2f  data to read..*/
126a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
126b0 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 46  5ChunkIterNext(F
126c0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
126d0 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74 65  5ChunkIter *pIte
126e0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  r){.  assert( pI
126f0 74 65 72 2d 3e 6e 52 65 6d 3e 3d 70 49 74 65 72  ter->nRem>=pIter
12700 2d 3e 6e 20 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ->n );.  pIter->
12710 6e 52 65 6d 20 2d 3d 20 70 49 74 65 72 2d 3e 6e  nRem -= pIter->n
12720 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
12730 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
12740 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
12750 66 20 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e  f = 0;.  pIter->
12760 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 74  p = 0;.  if( pIt
12770 65 72 2d 3e 6e 52 65 6d 3e 30 20 29 7b 0a 20 20  er->nRem>0 ){.  
12780 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
12790 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  f;.    pIter->iL
127a0 65 61 66 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20  eafRowid++;.    
127b0 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
127c0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
127d0 65 61 64 28 70 2c 20 70 49 74 65 72 2d 3e 69 4c  ead(p, pIter->iL
127e0 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 69  eafRowid);.    i
127f0 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
12800 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e    pIter->n = MIN
12810 28 70 49 74 65 72 2d 3e 6e 52 65 6d 2c 20 70 4c  (pIter->nRem, pL
12820 65 61 66 2d 3e 6e 2d 34 29 3b 0a 20 20 20 20 20  eaf->n-4);.     
12830 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 4c 65 61   pIter->p = pLea
12840 66 2d 3e 70 2b 34 3b 0a 20 20 20 20 7d 0a 20 20  f->p+4;.    }.  
12850 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 69 61  }.}../*.** Intia
12860 6c 69 7a 65 20 74 68 65 20 63 68 75 6e 6b 20 69  lize the chunk i
12870 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20  terator to read 
12880 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
12890 74 20 64 61 74 61 20 66 6f 72 20 77 68 69 63 68  t data for which
128a0 20 0a 2a 2a 20 74 68 65 20 73 69 7a 65 20 66 69   .** the size fi
128b0 65 6c 64 20 69 73 20 61 74 20 6f 66 66 73 65 74  eld is at offset
128c0 20 69 4f 66 66 20 6f 66 20 6c 65 61 66 20 70 4c   iOff of leaf pL
128d0 65 61 66 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  eaf. .*/.static 
128e0 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74  void fts5ChunkIt
128f0 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  erInit(.  Fts5In
12900 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
12910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
12920 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
12930 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
12940 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20  r *pSeg,        
12950 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
12960 20 69 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61   iterator to rea
12970 64 20 70 6f 73 6c 69 73 74 20 66 72 6f 6d 20 2a  d poslist from *
12980 2f 0a 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65  /.  Fts5ChunkIte
12990 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
129a0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
129b0 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
129c0 0a 29 7b 0a 20 20 69 6e 74 20 69 49 64 20 3d 20  .){.  int iId = 
129d0 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67  pSeg->pSeg->iSeg
129e0 69 64 3b 0a 20 20 69 36 34 20 72 6f 77 69 64 20  id;.  i64 rowid 
129f0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
12a00 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c  OWID(pSeg->iIdx,
12a10 20 69 49 64 2c 20 30 2c 20 70 53 65 67 2d 3e 69   iId, 0, pSeg->i
12a20 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 46 74 73  LeafPgno);.  Fts
12a30 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70  5Data *pLeaf = p
12a40 53 65 67 2d 3e 70 4c 65 61 66 3b 0a 20 20 69 6e  Seg->pLeaf;.  in
12a50 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69  t iOff = pSeg->i
12a60 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 6d  LeafOffset;..  m
12a70 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
12a80 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
12a90 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52  .  pIter->iLeafR
12aa0 6f 77 69 64 20 3d 20 72 6f 77 69 64 3b 0a 20 20  owid = rowid;.  
12ab0 69 66 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e  if( iOff<pLeaf->
12ac0 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74  n ){.    fts5Dat
12ad0 61 52 65 66 65 72 65 6e 63 65 28 70 4c 65 61 66  aReference(pLeaf
12ae0 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  );.    pIter->pL
12af0 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20 7d  eaf = pLeaf;.  }
12b00 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
12b10 3e 6e 52 65 6d 20 3d 20 31 3b 0a 20 20 20 20 66  >nRem = 1;.    f
12b20 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74  ts5ChunkIterNext
12b30 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12b40 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
12b50 72 6e 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 34  rn;.    iOff = 4
12b60 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49  ;.    pLeaf = pI
12b70 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 7d 0a  ter->pLeaf;.  }.
12b80 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  .  iOff += fts5G
12b90 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
12ba0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 70 49 74 65  f->p[iOff], pIte
12bb0 72 2d 3e 6e 52 65 6d 29 3b 0a 20 20 70 49 74 65  r->nRem);.  pIte
12bc0 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 4c 65 61 66  r->n = MIN(pLeaf
12bd0 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20 70 49 74 65  ->n - iOff, pIte
12be0 72 2d 3e 6e 52 65 6d 29 3b 0a 20 20 70 49 74 65  r->nRem);.  pIte
12bf0 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70 20  r->p = pLeaf->p 
12c00 2b 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70  + iOff;..  if( p
12c10 49 74 65 72 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Iter->n==0 ){.  
12c20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e    fts5ChunkIterN
12c30 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ext(p, pIter);. 
12c40 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
12c50 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52  d fts5ChunkIterR
12c60 65 6c 65 61 73 65 28 46 74 73 35 43 68 75 6e 6b  elease(Fts5Chunk
12c70 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
12c80 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
12c90 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
12ca0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
12cb0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  0;.}../*.** Read
12cc0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
12cd0 6e 65 78 74 20 33 32 2d 62 69 74 20 76 61 72 69  next 32-bit vari
12ce0 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  nt from the posi
12cf0 74 69 6f 6e 2d 6c 69 73 74 20 69 74 65 72 61 74  tion-list iterat
12d00 6f 72 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  or .** passed as
12d10 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12d20 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
12d30 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12d40 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
12d50 20 61 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   an an error cod
12d60 65 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20 46 74  e left in .** Ft
12d70 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61  s5Index.rc. If a
12d80 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
12d90 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
12da0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
12db0 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74  is.** called, it
12dc0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12dd0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
12de0 6f 73 49 74 65 72 52 65 61 64 56 61 72 69 6e 74  osIterReadVarint
12df0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
12e00 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74 65  ts5PosIter *pIte
12e10 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 20 3d  r){.  int iVal =
12e20 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
12e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12e40 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66    if( pIter->iOf
12e50 66 3e 3d 70 49 74 65 72 2d 3e 63 68 75 6e 6b 2e  f>=pIter->chunk.
12e60 6e 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 43  n ){.      fts5C
12e70 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20  hunkIterNext(p, 
12e80 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3b 0a  &pIter->chunk);.
12e90 20 20 20 20 20 20 69 66 28 20 66 74 73 35 43 68        if( fts5Ch
12ea0 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 70  unkIterEof(p, &p
12eb0 49 74 65 72 2d 3e 63 68 75 6e 6b 29 20 29 20 72  Iter->chunk) ) r
12ec0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 70  eturn 0;.      p
12ed0 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 30 3b 0a  Iter->iOff = 0;.
12ee0 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d      }.    pIter-
12ef0 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  >iOff += fts5Get
12f00 56 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d  Varint32(&pIter-
12f10 3e 63 68 75 6e 6b 2e 70 5b 70 49 74 65 72 2d 3e  >chunk.p[pIter->
12f20 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20  iOff], iVal);.  
12f30 7d 0a 20 20 72 65 74 75 72 6e 20 69 56 61 6c 3b  }.  return iVal;
12f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
12f50 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  e the position l
12f60 69 73 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20  ist iterator to 
12f70 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a  the next entry..
12f80 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
12f90 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28 46  ts5PosIterNext(F
12fa0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
12fb0 35 50 6f 73 49 74 65 72 20 2a 70 49 74 65 72 29  5PosIter *pIter)
12fc0 7b 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20  {.  int iVal;.  
12fd0 61 73 73 65 72 74 28 20 66 74 73 35 43 68 75 6e  assert( fts5Chun
12fe0 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 70 49 74  kIterEof(p, &pIt
12ff0 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30 20 29 3b  er->chunk)==0 );
13000 0a 20 20 69 56 61 6c 20 3d 20 66 74 73 35 50 6f  .  iVal = fts5Po
13010 73 49 74 65 72 52 65 61 64 56 61 72 69 6e 74 28  sIterReadVarint(
13020 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 69 66 28  p, pIter);.  if(
13030 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f   fts5ChunkIterEo
13040 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75  f(p, &pIter->chu
13050 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  nk)==0 ){.    if
13060 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a 20 20 20  ( iVal==1 ){.   
13070 20 20 20 70 49 74 65 72 2d 3e 69 43 6f 6c 20 3d     pIter->iCol =
13080 20 66 74 73 35 50 6f 73 49 74 65 72 52 65 61 64   fts5PosIterRead
13090 56 61 72 69 6e 74 28 70 2c 20 70 49 74 65 72 29  Varint(p, pIter)
130a0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
130b0 50 6f 73 20 3d 20 66 74 73 35 50 6f 73 49 74 65  Pos = fts5PosIte
130c0 72 52 65 61 64 56 61 72 69 6e 74 28 70 2c 20 70  rReadVarint(p, p
130d0 49 74 65 72 29 20 2d 20 32 3b 0a 20 20 20 20 7d  Iter) - 2;.    }
130e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
130f0 72 2d 3e 69 50 6f 73 20 2b 3d 20 28 69 56 61 6c  r->iPos += (iVal
13100 20 2d 20 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   - 2);.    }.  }
13110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
13120 6c 69 7a 65 20 74 68 65 20 46 74 73 35 50 6f 73  lize the Fts5Pos
13130 49 74 65 72 20 6f 62 6a 65 63 74 20 70 61 73 73  Iter object pass
13140 65 64 20 61 73 20 74 68 65 20 66 69 6e 61 6c 20  ed as the final 
13150 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 65 72  argument to iter
13160 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74  ate.** through t
13170 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
13180 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13190 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
131a0 20 74 68 61 74 20 69 74 65 72 61 74 6f 72 20 0a   that iterator .
131b0 2a 2a 20 70 4d 75 6c 74 69 20 63 75 72 72 65 6e  ** pMulti curren
131c0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
131d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
131e0 73 35 50 6f 73 49 74 65 72 49 6e 69 74 28 0a 20  s5PosIterInit(. 
131f0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13210 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
13220 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
13230 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
13240 4d 75 6c 74 69 2c 20 20 20 20 20 20 20 2f 2a 20  Multi,       /* 
13250 4d 75 6c 74 69 2d 73 65 67 20 69 74 65 72 61 74  Multi-seg iterat
13260 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73 2d 6c  or to read pos-l
13270 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 74  ist from */.  Ft
13280 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74 65 72  s5PosIter *pIter
13290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
132a0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
132b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
132c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
132d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
132e0 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
132f0 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70  &pMulti->aSeg[ p
13300 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d  Multi->aFirst[1]
13310 20 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ];.    memset(p
13320 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
13330 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66 74  *pIter));.    ft
13340 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69 74 28  s5ChunkIterInit(
13350 70 2c 20 70 53 65 67 2c 20 26 70 49 74 65 72 2d  p, pSeg, &pIter-
13360 3e 63 68 75 6e 6b 29 3b 0a 20 20 20 20 69 66 28  >chunk);.    if(
13370 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f   fts5ChunkIterEo
13380 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75  f(p, &pIter->chu
13390 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nk)==0 ){.      
133a0 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28  fts5PosIterNext(
133b0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
133c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
133d0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
133e0 20 70 6f 73 69 74 69 6f 6e 20 69 74 65 72 61 74   position iterat
133f0 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
13400 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13410 20 69 73 0a 2a 2a 20 61 74 20 45 4f 46 2e 20 4f   is.** at EOF. O
13420 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  r if an error ha
13430 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
13440 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ed. Otherwise, r
13450 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a  eturn false..*/.
13460 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
13470 6f 73 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  osIterEof(Fts5In
13480 64 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73 49  dex *p, Fts5PosI
13490 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
134a0 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20  eturn (p->rc || 
134b0 70 49 74 65 72 2d 3e 63 68 75 6e 6b 2e 70 4c 65  pIter->chunk.pLe
134c0 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  af==0);.}../*.**
134d0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
134e0 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74  segment-id for t
134f0 68 65 20 73 74 72 75 63 74 75 72 65 20 70 53 74  he structure pSt
13500 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ruct..**.** If a
13510 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
13520 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
13530 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
13540 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a   no-op. 0 is .**
13550 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68 69   returned in thi
13560 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
13570 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61  c int fts5Alloca
13580 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64 65  teSegid(Fts5Inde
13590 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
135a0 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
135b0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
135c0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
135d0 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 66 6f   return 0;..  fo
135e0 72 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20 69 2b  r(i=0; i<100; i+
135f0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  +){.    int iSeg
13600 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  id;.    sqlite3_
13610 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
13620 66 28 69 6e 74 29 2c 20 28 76 6f 69 64 2a 29 26  f(int), (void*)&
13630 69 53 65 67 69 64 29 3b 0a 20 20 20 20 69 53 65  iSegid);.    iSe
13640 67 69 64 20 3d 20 69 53 65 67 69 64 20 26 20 28  gid = iSegid & (
13650 28 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  (1 << FTS5_DATA_
13660 49 44 5f 42 29 2d 31 29 3b 0a 20 20 20 20 69 66  ID_B)-1);.    if
13670 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20  ( iSegid ){.    
13680 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
13690 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c  ;.      for(iLvl
136a0 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
136b0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
136c0 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
136d0 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72  Seg=0; iSeg<pStr
136e0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
136f0 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ].nSeg; iSeg++){
13700 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
13710 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74 2d 3e  Segid==pStruct->
13720 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
13730 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20 29  g[iSeg].iSegid )
13740 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 53  {.            iS
13750 65 67 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  egid = 0;.      
13760 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
13770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13780 20 20 69 66 28 20 69 53 65 67 69 64 20 29 20 72    if( iSegid ) r
13790 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 20 20  eturn iSegid;.  
137a0 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  }..  p->rc = SQL
137b0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  ITE_ERROR;.  ret
137c0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
137d0 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61  Discard all data
137e0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65   currently cache
137f0 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61  d in the hash-ta
13800 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
13810 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44 69  void fts5IndexDi
13820 73 63 61 72 64 44 61 74 61 28 46 74 73 35 49 6e  scardData(Fts5In
13830 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dex *p){.  asser
13840 74 28 20 70 2d 3e 61 70 48 61 73 68 20 7c 7c 20  t( p->apHash || 
13850 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
13860 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
13870 70 48 61 73 68 20 29 7b 0a 20 20 20 20 46 74 73  pHash ){.    Fts
13880 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
13890 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
138a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
138b0 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69  r(i=0; i<=pConfi
138c0 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29  g->nPrefix; i++)
138d0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  {.      if( p->a
138e0 70 48 61 73 68 5b 69 5d 20 29 20 73 71 6c 69 74  pHash[i] ) sqlit
138f0 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
13900 70 2d 3e 61 70 48 61 73 68 5b 69 5d 29 3b 0a 20  p->apHash[i]);. 
13910 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 50 65 6e     }.    p->nPen
13920 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20  dingData = 0;.  
13930 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
13940 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
13950 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74  e prefix, in byt
13960 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20  es, that buffer 
13970 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72  (nNew/pNew) shar
13980 65 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65  es.** with buffe
13990 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a  r (nOld/pOld)..*
139a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
139b0 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
139c0 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e  .  int nOld, con
139d0 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69  st u8 *pOld,.  i
139e0 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75  nt nNew, const u
139f0 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74  8 *pNew.){.  int
13a00 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
13a10 3c 6e 4e 65 77 20 26 26 20 69 3c 6e 4f 6c 64 3b  <nNew && i<nOld;
13a20 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
13a30 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20  Old[i]!=pNew[i] 
13a40 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
13a50 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn i;.}../*.*
13a60 2a 20 49 66 20 61 6e 20 22 6e 45 6d 70 74 79 22  * If an "nEmpty"
13a70 20 72 65 63 6f 72 64 20 6d 75 73 74 20 62 65 20   record must be 
13a80 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62  written to the b
13a90 2d 74 72 65 65 20 62 65 66 6f 72 65 20 74 68 65  -tree before the
13aa0 20 6e 65 78 74 0a 2a 2a 20 74 65 72 6d 2c 20 77   next.** term, w
13ab0 72 69 74 65 20 69 74 20 6e 6f 77 2e 0a 2a 2f 0a  rite it now..*/.
13ac0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
13ad0 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79  WriteBtreeNEmpty
13ae0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
13af0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
13b00 72 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57  riter){.  if( pW
13b10 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 29 7b  riter->nEmpty ){
13b20 0a 20 20 20 20 69 6e 74 20 62 46 6c 61 67 20 3d  .    int bFlag =
13b30 20 30 3b 0a 20 20 20 20 46 74 73 35 50 61 67 65   0;.    Fts5Page
13b40 57 72 69 74 65 72 20 2a 70 50 67 3b 0a 20 20 20  Writer *pPg;.   
13b50 20 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d   pPg = &pWriter-
13b60 3e 61 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 20  >aWriter[1];.   
13b70 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 45   if( pWriter->nE
13b80 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44  mpty>=FTS5_MIN_D
13b90 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20  LIDX_SIZE ){.   
13ba0 20 20 20 69 36 34 20 69 4b 65 79 20 3d 20 46 54     i64 iKey = FT
13bb0 53 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52  S5_DOCLIST_IDX_R
13bc0 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20  OWID(.          
13bd0 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70  pWriter->iIdx, p
13be0 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
13bf0 0a 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74  .          pWrit
13c00 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70  er->aWriter[0].p
13c10 67 6e 6f 20 2d 20 31 20 2d 20 70 57 72 69 74 65  gno - 1 - pWrite
13c20 72 2d 3e 6e 45 6d 70 74 79 0a 20 20 20 20 20 20  r->nEmpty.      
13c30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13c40 20 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78   pWriter->cdlidx
13c50 2e 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 74  .n>0 );.      ft
13c60 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69  s5DataWrite(p, i
13c70 4b 65 79 2c 20 70 57 72 69 74 65 72 2d 3e 63 64  Key, pWriter->cd
13c80 6c 69 64 78 2e 70 2c 20 70 57 72 69 74 65 72 2d  lidx.p, pWriter-
13c90 3e 63 64 6c 69 64 78 2e 6e 29 3b 0a 20 20 20 20  >cdlidx.n);.    
13ca0 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20    bFlag = 1;.   
13cb0 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
13cc0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
13cd0 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c  ->rc, &pPg->buf,
13ce0 20 62 46 6c 61 67 29 3b 0a 20 20 20 20 66 74 73   bFlag);.    fts
13cf0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
13d00 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67  int(&p->rc, &pPg
13d10 2d 3e 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e  ->buf, pWriter->
13d20 6e 45 6d 70 74 79 29 3b 0a 20 20 20 20 70 57 72  nEmpty);.    pWr
13d30 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30  iter->nEmpty = 0
13d40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 74  ;.  }..  /* Whet
13d50 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 77 61  her or not it wa
13d60 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  s written to dis
13d70 6b 2c 20 7a 65 72 6f 20 74 68 65 20 64 6f 63 6c  k, zero the docl
13d80 69 73 74 20 69 6e 64 65 78 20 61 74 20 74 68 69  ist index at thi
13d90 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 20 2a 2f 0a  s.  ** point */.
13da0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
13db0 66 65 72 5a 65 72 6f 28 26 70 57 72 69 74 65 72  ferZero(&pWriter
13dc0 2d 3e 63 64 6c 69 64 78 29 3b 0a 20 20 70 57 72  ->cdlidx);.  pWr
13dd0 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76  iter->bDlidxPrev
13de0 56 61 6c 69 64 20 3d 20 30 3b 0a 7d 0a 0a 73 74  Valid = 0;.}..st
13df0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
13e00 69 74 65 42 74 72 65 65 47 72 6f 77 28 46 74 73  iteBtreeGrow(Fts
13e10 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
13e20 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
13e30 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
13e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13e50 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
13e60 20 2a 61 4e 65 77 3b 0a 20 20 20 20 46 74 73 35   *aNew;.    Fts5
13e70 50 61 67 65 57 72 69 74 65 72 20 2a 70 4e 65 77  PageWriter *pNew
13e80 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d  ;.    int nNew =
13e90 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65   sizeof(Fts5Page
13ea0 57 72 69 74 65 72 29 20 2a 20 28 70 57 72 69 74  Writer) * (pWrit
13eb0 65 72 2d 3e 6e 57 72 69 74 65 72 2b 31 29 3b 0a  er->nWriter+1);.
13ec0 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 46 74 73  .    aNew = (Fts
13ed0 35 50 61 67 65 57 72 69 74 65 72 2a 29 73 71 6c  5PageWriter*)sql
13ee0 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72  ite3_realloc(pWr
13ef0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 2c 20 6e  iter->aWriter, n
13f00 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  New);.    if( aN
13f10 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ew==0 ){.      p
13f20 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
13f30 4d 45 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  MEM;.      retur
13f40 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e  n;.    }..    pN
13f50 65 77 20 3d 20 26 61 4e 65 77 5b 70 57 72 69 74  ew = &aNew[pWrit
13f60 65 72 2d 3e 6e 57 72 69 74 65 72 5d 3b 0a 20 20  er->nWriter];.  
13f70 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
13f80 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67  , sizeof(Fts5Pag
13f90 65 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 70  eWriter));.    p
13fa0 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20  New->pgno = 1;. 
13fb0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
13fc0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
13fd0 2c 20 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29  , &pNew->buf, 1)
13fe0 3b 0a 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  ;..    pWriter->
13ff0 6e 57 72 69 74 65 72 2b 2b 3b 0a 20 20 20 20 70  nWriter++;.    p
14000 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20  Writer->aWriter 
14010 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = aNew;.  }.}../
14020 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
14030 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
14040 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65  h leaf page exce
14050 70 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61  pt the first tha
14060 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74  t contains.** at
14070 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
14080 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d   Argument (nTerm
14090 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73  /pTerm) is the s
140a0 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72  plit-key - a ter
140b0 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  m that.** is lar
140c0 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72  ger than all ter
140d0 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61  ms written to ea
140e0 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e  rlier leaves, an
140f0 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a  d equal to or.**
14100 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
14110 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
14120 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a  the new leaf..**
14130 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
14140 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
14150 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
14160 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
14170 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61  f an error.** ha
14180 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
14190 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
141a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
141b0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
141c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
141d0 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72  ts5WriteBtreeTer
141e0 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
141f0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14200 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
14210 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
14220 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
14230 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
14240 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
14250 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  t */.  int nTerm
14260 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
14270 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  m      /* First 
14280 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65  term on new page
14290 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65   */.){.  int iHe
142a0 69 67 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69  ight;.  for(iHei
142b0 67 68 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68  ght=1; 1; iHeigh
142c0 74 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61  t++){.    Fts5Pa
142d0 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b  geWriter *pPage;
142e0 0a 0a 20 20 20 20 69 66 28 20 69 48 65 69 67 68  ..    if( iHeigh
142f0 74 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69  t>=pWriter->nWri
14300 74 65 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ter ){.      fts
14310 35 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28  5WriteBtreeGrow(
14320 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
14330 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
14340 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
14350 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
14360 72 2d 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67  r->aWriter[iHeig
14370 68 74 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  ht];..    fts5Wr
14380 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70  iteBtreeNEmpty(p
14390 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20  , pWriter);..   
143a0 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
143b0 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
143c0 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  gsz ){.      /* 
143d0 70 50 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72  pPage will be wr
143e0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54  itten to disk. T
143f0 68 65 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20  he term will be 
14400 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
14410 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74  .      ** parent
14420 20 6f 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20   of pPage.  */. 
14430 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
14440 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
14450 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20  OWID(.          
14460 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70  pWriter->iIdx, p
14470 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
14480 69 48 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e  iHeight, pPage->
14490 70 67 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20  pgno.      );.  
144a0 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
144b0 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61  e(p, iRowid, pPa
144c0 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65  ge->buf.p, pPage
144d0 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  ->buf.n);.      
144e0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
144f0 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20  pPage->buf);.   
14500 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
14510 6f 28 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b  o(&pPage->term);
14520 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
14530 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
14540 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
14550 66 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e  f, pPage[-1].pgn
14560 6f 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  o);.      pPage-
14570 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >pgno++;.    }el
14580 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50  se{.      int nP
14590 72 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  re = fts5PrefixC
145a0 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74  ompress(pPage->t
145b0 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65  erm.n, pPage->te
145c0 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65  rm.p, nTerm, pTe
145d0 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  rm);.      fts5B
145e0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
145f0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
14600 2d 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a  ->buf, nPre+2);.
14610 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
14620 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
14630 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
14640 2c 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20  , nTerm-nPre);. 
14650 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
14660 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
14670 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
14680 54 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d  Term-nPre, pTerm
14690 2b 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74  +nPre);.      ft
146a0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
146b0 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d  rc, &pPage->term
146c0 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
146d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
146e0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
146f0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
14700 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46  BtreeNoTerm(.  F
14710 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14730 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
14740 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
14750 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
14760 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r          /* Wr
14770 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  iter object */.)
14780 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  {.  if( pWriter-
14790 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
147a0 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  ge ){.    /* No 
147b0 72 6f 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70  rowids on this p
147c0 61 67 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30  age. Append an 0
147d0 78 30 30 20 62 79 74 65 20 74 6f 20 74 68 65 20  x00 byte to the 
147e0 63 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20  current .    ** 
147f0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f  doclist-index */
14800 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
14810 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69  ->bDlidxPrevVali
14820 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 36  d==0 ){.      i6
14830 34 20 69 52 6f 77 69 64 20 3d 20 70 57 72 69 74  4 iRowid = pWrit
14840 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 3b 0a  er->iPrevRowid;.
14850 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
14860 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
14870 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  int(&p->rc, &pWr
14880 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c 20 69 52  iter->cdlidx, iR
14890 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70 57 72  owid);.      pWr
148a0 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76  iter->bDlidxPrev
148b0 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20  Valid = 1;.     
148c0 20 70 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78   pWriter->iDlidx
148d0 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20  Prev = iRowid;. 
148e0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
148f0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
14900 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
14910 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c  pWriter->cdlidx,
14920 20 30 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74   0);.  }.  pWrit
14930 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a  er->nEmpty++;.}.
14940 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f  ./*.** Rowid iRo
14950 77 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65  wid has just bee
14960 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  n appended to th
14970 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  e current leaf p
14980 61 67 65 2e 20 41 73 20 69 74 20 69 73 0a 2a 2a  age. As it is.**
14990 20 74 68 65 20 66 69 72 73 74 20 6f 6e 20 69 74   the first on it
149a0 73 20 70 61 67 65 2c 20 61 70 70 65 6e 64 20 61  s page, append a
149b0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63  n entry to the c
149c0 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69  urrent doclist-i
149d0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
149e0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c  void fts5WriteDl
149f0 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73  idxAppend(.  Fts
14a00 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
14a10 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
14a20 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f  iter, .  i64 iRo
14a30 77 69 64 0a 29 7b 0a 20 20 69 36 34 20 69 56 61  wid.){.  i64 iVa
14a40 6c 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  l;.  if( pWriter
14a50 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69  ->bDlidxPrevVali
14a60 64 20 29 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20  d ){.    iVal = 
14a70 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72  iRowid - pWriter
14a80 2d 3e 69 44 6c 69 64 78 50 72 65 76 3b 0a 20 20  ->iDlidxPrev;.  
14a90 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
14aa0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
14ab0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
14ac0 20 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64   &pWriter->cdlid
14ad0 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  x, iRowid);.    
14ae0 69 56 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  iVal = 1;.  }.  
14af0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
14b00 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
14b10 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e  ->rc, &pWriter->
14b20 63 64 6c 69 64 78 2c 20 69 56 61 6c 29 3b 0a 20  cdlidx, iVal);. 
14b30 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78   pWriter->bDlidx
14b40 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
14b50 20 70 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78   pWriter->iDlidx
14b60 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 7d  Prev = iRowid;.}
14b70 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
14b80 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
14b90 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
14ba0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
14bb0 72 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63  riter){.  static
14bc0 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d   const u8 zero[]
14bd0 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c   = { 0x00, 0x00,
14be0 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20   0x00, 0x00 };. 
14bf0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
14c00 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
14c10 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20  r->aWriter[0];. 
14c20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20   i64 iRowid;..  
14c30 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
14c40 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
14c50 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20  .    /* No term 
14c60 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  was written to t
14c70 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  his page. */.   
14c80 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35   assert( 0==fts5
14c90 47 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  GetU16(&pPage->b
14ca0 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20  uf.p[2]) );.    
14cb0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f  fts5WriteBtreeNo
14cc0 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29  Term(p, pWriter)
14cd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
14ce0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
14cf0 67 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f  ge to the db. */
14d00 0a 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  .  iRowid = FTS5
14d10 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
14d20 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
14d30 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30  riter->iSegid, 0
14d40 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
14d50 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
14d60 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
14d70 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
14d80 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e  buf.n);..  /* In
14d90 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78  itialize the nex
14da0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  t page. */.  fts
14db0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
14dc0 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35  ge->buf);.  fts5
14dd0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
14de0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
14df0 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a  >buf, 4, zero);.
14e00 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b    pPage->pgno++;
14e10 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20  ..  /* Increase 
14e20 74 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74  the leaves writt
14e30 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  en counter */.  
14e40 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72  pWriter->nLeafWr
14e50 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54  itten++;..  /* T
14e60 68 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64  he new leaf hold
14e70 73 20 6e 6f 20 74 65 72 6d 73 20 2a 2f 0a 20 20  s no terms */.  
14e80 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
14e90 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d  ermInPage = 1;.}
14ea0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
14eb0 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
14ec0 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  to the segment b
14ed0 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20  eing written by 
14ee0 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65  the writer passe
14ef0 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f  d.** as the seco
14f00 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
14f10 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
14f20 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
14f30 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
14f40 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
14f50 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
14f60 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
14f70 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
14f80 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
14f90 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
14fa0 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74  AppendTerm(.  Ft
14fb0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
14fc0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
14fd0 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65  riter,.  int nTe
14fe0 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  rm, const u8 *pT
14ff0 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  erm .){.  int nP
15000 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20  refix;          
15010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
15020 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d  es of prefix com
15030 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72  pression for ter
15040 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  m */.  Fts5PageW
15050 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
15060 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
15070 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  [0];..  assert( 
15080 70 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67  pPage==0 || pPag
15090 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70  e->buf.n==0 || p
150a0 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b  Page->buf.n>4 );
150b0 0a 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20  .  if( pPage && 
150c0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20  pPage->buf.n==0 
150d0 29 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74  ){.    /* Zero t
150e0 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 61 6e  he first term an
150f0 64 20 66 69 72 73 74 20 64 6f 63 69 64 20 66 69  d first docid fi
15100 65 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74 61 74  elds */.    stat
15110 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
15120 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30  [] = { 0x00, 0x0
15130 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b  0, 0x00, 0x00 };
15140 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
15150 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
15160 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34  , &pPage->buf, 4
15170 2c 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61 73 73  , zero);.    ass
15180 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 62 46  ert( pWriter->bF
15190 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
151a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72  ;.  }.  if( p->r
151b0 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20  c ) return;.  . 
151c0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
151d0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
151e0 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  {.    /* Update 
151f0 74 68 65 20 22 66 69 72 73 74 20 74 65 72 6d 22  the "first term"
15200 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
15210 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  ge header. */.  
15220 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
15230 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20  >buf.p[2]==0 && 
15240 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d  pPage->buf.p[3]=
15250 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 50 75  =0 );.    fts5Pu
15260 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
15270 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75  .p[2], pPage->bu
15280 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65 66 69  f.n);.    nPrefi
15290 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
152a0 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  Page->pgno!=1 ){
152b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
152c0 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
152d0 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20   on a leaf that 
152e0 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d  is not the leftm
152f0 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20  ost leaf in.    
15300 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74    ** the segment
15310 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73   b-tree. In this
15320 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65   case it is nece
15330 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74  ssary to add a t
15340 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  erm to.      ** 
15350 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
15360 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29  rchy that is (a)
15370 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
15380 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20   largest term . 
15390 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
153a0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
153b0 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73  egment and (b) s
153c0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65  maller than or e
153d0 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  qual to.      **
153e0 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f   this term. In o
153f0 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72  ther words, a pr
15400 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e  efix of (pTerm/n
15410 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e  Term) that is on
15420 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
15430 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
15440 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28  longest prefix (
15450 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61  pTerm/nTerm) sha
15460 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  res with the.   
15470 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74     ** previous t
15480 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  erm. .      **. 
15490 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c       ** Usually,
154a0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
154b0 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  rm is available 
154c0 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20  in pPage->term. 
154d0 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  The exception.  
154e0 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69      ** is if thi
154f0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
15500 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61  erm written in a
15510 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
15520 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20  rge step..      
15530 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
15540 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
15550 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  m is not availab
15560 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74  le, so just writ
15570 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
15580 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  y of (pTerm/nTer
15590 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  m) into the pare
155a0 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  nt node. This is
155b0 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
155c0 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20  ** inefficient, 
155d0 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63  but still correc
155e0 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  t.  */.      int
155f0 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
15600 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
15610 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  m.n ){.        n
15620 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69   = 1 + fts5Prefi
15630 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
15640 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
15650 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
15660 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Term);.      }. 
15670 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
15680 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74  reeTerm(p, pWrit
15690 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20  er, n, pTerm);. 
156a0 20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57       pPage = &pW
156b0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
156c0 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
156d0 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  {.    nPrefix = 
156e0 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
156f0 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  ss(pPage->term.n
15700 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c  , pPage->term.p,
15710 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
15720 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
15730 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
15740 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
15750 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20  nPrefix);.  }.. 
15760 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e   /* Append the n
15770 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
15780 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e  f new data, then
15790 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69   the term data i
157a0 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68  tself.  ** to th
157b0 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  e page. */.  fts
157c0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
157d0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
157e0 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d  ge->buf, nTerm -
157f0 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73   nPrefix);.  fts
15800 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
15810 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
15820 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
15830 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e  Prefix, &pTerm[n
15840 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20  Prefix]);..  /* 
15850 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50  Update the Fts5P
15860 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66  ageWriter.term f
15870 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42  ield. */.  fts5B
15880 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
15890 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e   &pPage->term, n
158a0 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
158b0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
158c0 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a  ermInPage = 0;..
158d0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
158e0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
158f0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
15900 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
15910 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 1;..  /* If 
15920 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
15930 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66   page is full, f
15940 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e  lush it to disk.
15950 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
15960 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
15970 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
15980 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
15990 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
159a0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
159b0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
159c0 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
159d0 20 41 70 70 65 6e 64 20 61 20 64 6f 63 69 64 20   Append a docid 
159e0 74 6f 20 74 68 65 20 77 72 69 74 65 72 73 20 6f  to the writers o
159f0 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  utput. .*/.stati
15a00 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
15a10 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46  AppendRowid(.  F
15a20 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
15a30 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
15a40 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52  Writer,.  i64 iR
15a50 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d  owid.){.  if( p-
15a60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15a70 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
15a80 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
15a90 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
15aa0 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  0];..    /* If t
15ab0 68 69 73 20 69 73 20 74 6f 20 62 65 20 74 68 65  his is to be the
15ac0 20 66 69 72 73 74 20 64 6f 63 69 64 20 77 72 69   first docid wri
15ad0 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65  tten to the page
15ae0 2c 20 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a  , set the .    *
15af0 2a 20 64 6f 63 69 64 2d 70 6f 69 6e 74 65 72 20  * docid-pointer 
15b00 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  in the page-head
15b10 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20  er. Also append 
15b20 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  a value to the d
15b30 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66  lidx.    ** buff
15b40 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f  er, in case a do
15b50 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72  clist-index is r
15b60 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20  equired.  */.   
15b70 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
15b80 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
15b90 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75 74  ){.      fts5Put
15ba0 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70  U16(pPage->buf.p
15bb0 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  , pPage->buf.n);
15bc0 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
15bd0 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70  DlidxAppend(p, p
15be0 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b  Writer, iRowid);
15bf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57  .    }..    /* W
15c00 72 69 74 65 20 74 68 65 20 64 6f 63 69 64 2e 20  rite the docid. 
15c10 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74  */.    if( pWrit
15c20 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
15c30 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69  nDoclist || pWri
15c40 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
15c50 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  InPage ){.      
15c60 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
15c70 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
15c80 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77  pPage->buf, iRow
15c90 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
15ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
15cb0 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57  >rc || iRowid>pW
15cc0 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
15cd0 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  d );.      fts5B
15ce0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
15cf0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
15d00 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20  ->buf, iRowid - 
15d10 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
15d20 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
15d30 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
15d40 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
15d50 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
15d60 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
15d70 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72  = 0;.    pWriter
15d80 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
15d90 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  age = 0;..    if
15da0 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
15db0 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
15dc0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72   ){.      fts5Wr
15dd0 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
15de0 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  pWriter);.      
15df0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
15e00 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a  owidInPage = 1;.
15e10 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
15e20 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
15e30 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49  teAppendPoslistI
15e40 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nt(.  Fts5Index 
15e50 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
15e60 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
15e70 20 69 6e 74 20 69 56 61 6c 0a 29 7b 0a 20 20 69   int iVal.){.  i
15e80 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15e90 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50  _OK ){.    Fts5P
15ea0 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
15eb0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
15ec0 69 74 65 72 5b 30 5d 3b 0a 20 20 20 20 66 74 73  iter[0];.    fts
15ed0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
15ee0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
15ef0 67 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a  ge->buf, iVal);.
15f00 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62      if( pPage->b
15f10 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  uf.n>=p->pConfig
15f20 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  ->pgsz ){.      
15f30 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
15f40 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
15f50 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62        pWriter->b
15f60 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
15f70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
15f80 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
15f90 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
15fa0 73 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73  slistData(.  Fts
15fb0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
15fc0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
15fd0 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75  iter, .  const u
15fe0 38 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74  8 *aData, .  int
15ff0 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35   nData.){.  Fts5
16000 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
16010 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  e = &pWriter->aW
16020 72 69 74 65 72 5b 30 5d 3b 0a 20 20 63 6f 6e 73  riter[0];.  cons
16030 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b  t u8 *a = aData;
16040 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61  .  int n = nData
16050 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
16060 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e  ->pConfig->pgsz>
16070 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
16080 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
16090 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  & (pPage->buf.n 
160a0 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  + n)>=p->pConfig
160b0 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 6e  ->pgsz ){.    in
160c0 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e  t nReq = p->pCon
160d0 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67  fig->pgsz - pPag
160e0 65 2d 3e 62 75 66 2e 6e 3b 0a 20 20 20 20 69 6e  e->buf.n;.    in
160f0 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20  t nCopy = 0;.   
16100 20 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52   while( nCopy<nR
16110 65 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  eq ){.      i64 
16120 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f  dummy;.      nCo
16130 70 79 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  py += getVarint(
16140 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a  &a[nCopy], (u64*
16150 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a  )&dummy);.    }.
16160 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
16170 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
16180 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43   &pPage->buf, nC
16190 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b  opy, a);.    a +
161a0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d  = nCopy;.    n -
161b0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73  = nCopy;.    fts
161c0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
161d0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
161e0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
161f0 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
16200 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
16210 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
16220 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
16230 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
16240 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  n, a);.  }.}..st
16250 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
16260 69 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74  iteAppendZerobyt
16270 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
16280 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
16290 57 72 69 74 65 72 29 7b 0a 20 20 66 74 73 35 42  Writer){.  fts5B
162a0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
162b0 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  t(&p->rc, &pWrit
162c0 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62  er->aWriter[0].b
162d0 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
162e0 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
162f0 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72  cached by the wr
16300 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  iter object to t
16310 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65  he database. Fre
16320 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e any.** allocat
16330 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
16340 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e  with the writer.
16350 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16360 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
16370 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
16380 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
16390 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
163a0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
163b0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
163c0 6e 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20  nHeight,        
163d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
163e0 3a 20 48 65 69 67 68 74 20 6f 66 20 74 68 65 20  : Height of the 
163f0 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
16400 2a 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20  *pnLeaf         
16410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16420 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65  UT: Number of le
16430 61 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72  af pages in b-tr
16440 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ee */.){.  int i
16450 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
16460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16470 2a 70 6e 4c 65 61 66 20 3d 20 70 57 72 69 74 65  *pnLeaf = pWrite
16480 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67  r->aWriter[0].pg
16490 6e 6f 3b 0a 20 20 20 20 69 66 28 20 2a 70 6e 4c  no;.    if( *pnL
164a0 65 61 66 3d 3d 31 20 26 26 20 70 57 72 69 74 65  eaf==1 && pWrite
164b0 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75  r->aWriter[0].bu
164c0 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
164d0 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  *pnLeaf = 0;.   
164e0 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 30     *pnHeight = 0
164f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16500 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
16510 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
16520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 72  );.      if( pWr
16530 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3d 3d 31  iter->nWriter==1
16540 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d   && pWriter->nEm
16550 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c  pty>=FTS5_MIN_DL
16560 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  IDX_SIZE ){.    
16570 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
16580 65 65 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  eeGrow(p, pWrite
16590 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
165a0 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e    if( pWriter->n
165b0 57 72 69 74 65 72 3e 31 20 29 7b 0a 20 20 20 20  Writer>1 ){.    
165c0 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
165d0 65 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72 69  eeNEmpty(p, pWri
165e0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
165f0 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20      *pnHeight = 
16600 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
16610 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  ;..      for(i=1
16620 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72  ; i<pWriter->nWr
16630 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iter; i++){.    
16640 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
16650 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74  er *pPg = &pWrit
16660 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a  er->aWriter[i];.
16670 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
16680 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20  Write(p, .      
16690 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45        FTS5_SEGME
166a0 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72  NT_ROWID(pWriter
166b0 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72 2d  ->iIdx, pWriter-
166c0 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 50 67 2d  >iSegid, i, pPg-
166d0 3e 70 67 6e 6f 29 2c 20 0a 20 20 20 20 20 20 20  >pgno), .       
166e0 20 20 20 20 20 70 50 67 2d 3e 62 75 66 2e 70 2c       pPg->buf.p,
166f0 20 70 50 67 2d 3e 62 75 66 2e 6e 0a 20 20 20 20   pPg->buf.n.    
16700 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
16710 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
16720 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e  =0; i<pWriter->n
16730 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Writer; i++){.  
16740 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
16750 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65 72   *pPg = &pWriter
16760 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20  ->aWriter[i];.  
16770 20 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c    assert( pPg ||
16780 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
16790 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  K );.    if( pPg
167a0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
167b0 66 66 65 72 46 72 65 65 28 26 70 50 67 2d 3e 74  fferFree(&pPg->t
167c0 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35  erm);.      fts5
167d0 42 75 66 66 65 72 46 72 65 65 28 26 70 50 67 2d  BufferFree(&pPg-
167e0 3e 62 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  >buf);.    }.  }
167f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16800 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
16810 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  );.  sqlite3Fts5
16820 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69  BufferFree(&pWri
16830 74 65 72 2d 3e 63 64 6c 69 64 78 29 3b 0a 7d 0a  ter->cdlidx);.}.
16840 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16850 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74  5WriteInit(.  Ft
16860 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
16870 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16880 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 49  riter, .  int iI
16890 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64 0a 29  dx, int iSegid.)
168a0 7b 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74  {.  memset(pWrit
168b0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
168c0 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
168d0 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d   pWriter->iIdx =
168e0 20 69 49 64 78 3b 0a 20 20 70 57 72 69 74 65 72   iIdx;.  pWriter
168f0 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
16900 64 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 61  d;..  pWriter->a
16910 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 50 61  Writer = (Fts5Pa
16920 67 65 57 72 69 74 65 72 2a 29 66 74 73 35 49 64  geWriter*)fts5Id
16930 78 4d 61 6c 6c 6f 63 28 70 2c 73 69 7a 65 6f 66  xMalloc(p,sizeof
16940 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72 29  (Fts5PageWriter)
16950 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  );.  if( pWriter
16960 2d 3e 61 57 72 69 74 65 72 3d 3d 30 20 29 20 72  ->aWriter==0 ) r
16970 65 74 75 72 6e 3b 0a 20 20 70 57 72 69 74 65 72  eturn;.  pWriter
16980 2d 3e 6e 57 72 69 74 65 72 20 3d 20 31 3b 0a 20  ->nWriter = 1;. 
16990 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
169a0 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20  r[0].pgno = 1;. 
169b0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
169c0 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a  TermInPage = 1;.
169d0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
169e0 74 73 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41  ts5WriteInitForA
169f0 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64  ppend(.  Fts5Ind
16a00 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
16a10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
16a20 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
16a30 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
16a40 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20  er *pWriter,    
16a50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 74       /* Writer t
16a60 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a  o initialize */.
16a70 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
16a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a90 20 20 2f 2a 20 49 6e 64 65 78 20 73 65 67 6d 65    /* Index segme
16aa0 6e 74 20 69 73 20 61 20 70 61 72 74 20 6f 66 20  nt is a part of 
16ab0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
16ac0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
16ad0 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
16ae0 6f 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e 64  object to append
16af0 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   to */.){.  int 
16b00 6e 42 79 74 65 20 3d 20 70 53 65 67 2d 3e 6e 48  nByte = pSeg->nH
16b10 65 69 67 68 74 20 2a 20 73 69 7a 65 6f 66 28 46  eight * sizeof(F
16b20 74 73 35 50 61 67 65 57 72 69 74 65 72 29 3b 0a  ts5PageWriter);.
16b30 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72    memset(pWriter
16b40 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
16b50 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70  SegWriter));.  p
16b60 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69  Writer->iIdx = i
16b70 49 64 78 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  Idx;.  pWriter->
16b80 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69  iSegid = pSeg->i
16b90 53 65 67 69 64 3b 0a 20 20 70 57 72 69 74 65 72  Segid;.  pWriter
16ba0 2d 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74 73  ->aWriter = (Fts
16bb0 35 50 61 67 65 57 72 69 74 65 72 2a 29 66 74 73  5PageWriter*)fts
16bc0 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42  5IdxMalloc(p, nB
16bd0 79 74 65 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  yte);.  pWriter-
16be0 3e 6e 57 72 69 74 65 72 20 3d 20 70 53 65 67 2d  >nWriter = pSeg-
16bf0 3e 6e 48 65 69 67 68 74 3b 0a 0a 20 20 69 66 28  >nHeight;..  if(
16c00 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
16c10 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 67 6e  K ){.    int pgn
16c20 6f 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69  o = 1;.    int i
16c30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61  ;.    pWriter->a
16c40 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d  Writer[0].pgno =
16c50 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b   pSeg->pgnoLast+
16c60 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 65  1;.    for(i=pSe
16c70 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20 69 3e  g->nHeight-1; i>
16c80 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69  0; i--){.      i
16c90 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
16ca0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
16cb0 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
16cc0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
16cd0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 46  , pgno);.      F
16ce0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
16cf0 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  Pg = &pWriter->a
16d00 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20  Writer[i];.     
16d10 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
16d20 6f 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  o;.      fts5Dat
16d30 61 42 75 66 66 65 72 28 70 2c 20 26 70 50 67 2d  aBuffer(p, &pPg-
16d40 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20  >buf, iRowid);. 
16d50 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
16d60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16d70 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65       Fts5NodeIte
16d80 72 20 73 73 3b 0a 20 20 20 20 20 20 20 20 66 74  r ss;.        ft
16d90 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
16da0 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e  Pg->buf.p, pPg->
16db0 62 75 66 2e 6e 2c 20 26 73 73 29 3b 0a 20 20 20  buf.n, &ss);.   
16dc0 20 20 20 20 20 77 68 69 6c 65 28 20 73 73 2e 61       while( ss.a
16dd0 44 61 74 61 20 29 20 66 74 73 35 4e 6f 64 65 49  Data ) fts5NodeI
16de0 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20  terNext(&p->rc, 
16df0 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &ss);.        ft
16e00 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
16e10 72 63 2c 20 26 70 50 67 2d 3e 74 65 72 6d 2c 20  rc, &pPg->term, 
16e20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65  ss.term.n, ss.te
16e30 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 70  rm.p);.        p
16e40 67 6e 6f 20 3d 20 73 73 2e 69 43 68 69 6c 64 3b  gno = ss.iChild;
16e50 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64  .        fts5Nod
16e60 65 49 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a  eIterFree(&ss);.
16e70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16e80 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 48 65 69    if( pSeg->nHei
16e90 67 68 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ght==1 ){.      
16ea0 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20  pWriter->nEmpty 
16eb0 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
16ec0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  -1;.    }.    as
16ed0 73 65 72 74 28 20 28 70 67 6e 6f 2b 70 57 72 69  sert( (pgno+pWri
16ee0 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3d 3d 70 53  ter->nEmpty)==pS
16ef0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a  eg->pgnoLast );.
16f00 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
16f10 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
16f20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
16f30 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
16f40 30 5d 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a  0].term.n==0 );.
16f50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65    }.}../*.** Ite
16f60 72 61 74 6f 72 20 70 49 74 65 72 20 77 61 73 20  rator pIter was 
16f70 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
16f80 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75  through the inpu
16f90 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e  t segments of on
16fa0 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74   an.** increment
16fb0 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69  al merge operati
16fc0 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  on. This functio
16fd0 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74  n is called if t
16fe0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a  he incremental.*
16ff0 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68 61 73  * merge step has
17000 20 66 69 6e 69 73 68 65 64 20 62 75 74 20 74 68   finished but th
17010 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20  e input has not 
17020 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20  been completely 
17030 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74  exhausted..*/.st
17040 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72  atic void fts5Tr
17050 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49  imSegments(Fts5I
17060 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c  ndex *p, Fts5Mul
17070 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
17080 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
17090 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20  s5Buffer buf;.  
170a0 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
170b0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
170c0 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  r));.  for(i=0; 
170d0 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
170e0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  ++){.    Fts5Seg
170f0 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
17100 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
17110 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67    if( pSeg->pSeg
17120 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
17130 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c  no-op */.    }el
17140 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65  se if( pSeg->pLe
17150 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  af==0 ){.      p
17160 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c  Seg->pSeg->pgnoL
17170 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ast = 0;.      p
17180 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46  Seg->pSeg->pgnoF
17190 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  irst = 0;.    }e
171a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
171b0 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72  Off = pSeg->iTer
171c0 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20  mLeafOffset;    
171d0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65   /* Offset on ne
171e0 77 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67  w first leaf pag
171f0 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
17200 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20  LeafRowid;.     
17210 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
17220 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 20  ;.      int iId 
17230 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53  = pSeg->pSeg->iS
17240 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61  egid;.      u8 a
17250 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20  Hdr[4] = {0x00, 
17260 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 34  0x00, 0x00, 0x04
17270 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52  };..      iLeafR
17280 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
17290 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
172a0 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 70 53  iIdx, iId, 0, pS
172b0 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e  eg->iTermLeafPgn
172c0 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20  o);.      pData 
172d0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
172e0 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  , iLeafRowid);. 
172f0 20 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29       if( pData )
17300 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
17310 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a  fferZero(&buf);.
17320 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
17330 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
17340 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f  >rc, &buf, sizeo
17350 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a  f(aHdr), aHdr);.
17360 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
17370 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
17380 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
17390 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20  g->term.n);.    
173a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
173b0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
173c0 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
173d0 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  m.n, pSeg->term.
173e0 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  p);.        fts5
173f0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
17400 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
17410 44 61 74 61 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20  Data->n - iOff, 
17420 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29  &pData->p[iOff])
17430 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
17440 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
17450 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e  ;.        pSeg->
17460 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
17470 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61  = pSeg->iTermLea
17480 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66  fPgno;.        f
17490 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c  ts5DataDelete(p,
174a0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
174b0 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c 20  WID(pSeg->iIdx, 
174c0 69 49 64 2c 20 30 2c 20 31 29 2c 69 4c 65 61 66  iId, 0, 1),iLeaf
174d0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
174e0 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
174f0 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75 66   iLeafRowid, buf
17500 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20  .p, buf.n);.    
17510 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
17520 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
17530 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  buf);.}../*.**.*
17540 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
17550 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
17560 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  l(.  Fts5Index *
17570 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
17580 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
17590 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
175a0 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175c0 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f 72   /* Index to wor
175d0 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74  k on */.  Fts5St
175e0 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
175f0 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct,       /* IN/
17600 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66  OUT: Stucture of
17610 20 69 6e 64 65 78 20 69 49 64 78 20 2a 2f 0a 20   index iIdx */. 
17620 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20   int iLvl,      
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17640 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61   /* Level to rea
17650 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a  d input from */.
17660 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20    int *pnRem    
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17680 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f    /* Write up to
17690 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75   this many outpu
176a0 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20  t leaves */.){. 
176b0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
176c0 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
176d0 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63  uct;.  Fts5Struc
176e0 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
176f0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
17700 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35  el[iLvl];.  Fts5
17710 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
17720 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 4d  pLvlOut;.  Fts5M
17730 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
17740 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 74  er = 0;    /* It
17750 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69  erator to read i
17760 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69  nput data */.  i
17770 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20  nt nRem = pnRem 
17780 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f  ? *pnRem : 0;  /
17790 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61  * Output leaf pa
177a0 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74  ges left to writ
177b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75  e */.  int nInpu
177c0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
177d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
177e0 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
177f0 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ts */.  Fts5SegW
17800 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20  riter writer;   
17810 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
17820 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  r object */.  Ft
17830 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
17840 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a  nt *pSeg;     /*
17850 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   Output segment 
17860 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
17870 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 52 65 71  term;.  int bReq
17880 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20  uireDoclistTerm 
17890 3d 20 30 3b 20 20 20 20 2f 2a 20 44 6f 63 6c 69  = 0;    /* Docli
178a0 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 28 30  st terminator (0
178b0 78 30 30 29 20 72 65 71 75 69 72 65 64 20 2a 2f  x00) required */
178c0 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20  .  int bOldest; 
178d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178e0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
178f0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
17900 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a   is the oldest *
17910 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  /..  assert( iLv
17920 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
17930 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
17940 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
17950 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65  l->nSeg );..  me
17960 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
17970 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
17980 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  riter));.  memse
17990 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65  t(&term, 0, size
179a0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
179b0 0a 20 20 77 72 69 74 65 72 2e 69 49 64 78 20 3d  .  writer.iIdx =
179c0 20 69 49 64 78 3b 0a 20 20 69 66 28 20 70 4c 76   iIdx;.  if( pLv
179d0 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20  l->nMerge ){.   
179e0 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72   pLvlOut = &pStr
179f0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
17a00 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  +1];.    assert(
17a10 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30   pLvlOut->nSeg>0
17a20 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d   );.    nInput =
17a30 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20   pLvl->nMerge;. 
17a40 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
17a50 46 6f 72 41 70 70 65 6e 64 28 70 2c 20 26 77 72  ForAppend(p, &wr
17a60 69 74 65 72 2c 20 69 49 64 78 2c 20 26 70 4c 76  iter, iIdx, &pLv
17a70 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
17a80 75 74 2d 3e 6e 53 65 67 2d 31 5d 29 3b 0a 20 20  ut->nSeg-1]);.  
17a90 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
17aa0 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
17ab0 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20 7d 65 6c 73  >nSeg-1];.  }els
17ac0 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  e{.    int iSegi
17ad0 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
17ae0 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
17af0 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e  );..    /* Exten
17b00 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74  d the Fts5Struct
17b10 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65  ure object as re
17b20 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65  quired to ensure
17b30 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
17b40 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74  ** segment exist
17b50 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c  s. */.    if( iL
17b60 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65  vl==pStruct->nLe
17b70 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  vel-1 ){.      f
17b80 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
17b90 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53  evel(&p->rc, ppS
17ba0 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
17bb0 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
17bc0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  t;.    }.    fts
17bd0 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
17be0 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53  Level(&p->rc, pS
17bf0 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31  truct, iLvl+1, 1
17c00 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
17c10 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
17c20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
17c30 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
17c40 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26  .    pLvlOut = &
17c50 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
17c60 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74  iLvl+1];..    ft
17c70 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
17c80 77 72 69 74 65 72 2c 20 69 49 64 78 2c 20 69 53  writer, iIdx, iS
17c90 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  egid);..    /* A
17ca0 64 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65  dd the new segme
17cb0 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  nt to the output
17cc0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
17cd0 28 20 69 4c 76 6c 2b 31 3d 3d 70 53 74 72 75 63  ( iLvl+1==pStruc
17ce0 74 2d 3e 6e 4c 65 76 65 6c 20 29 20 70 53 74 72  t->nLevel ) pStr
17cf0 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20  uct->nLevel++;. 
17d00 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
17d10 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
17d20 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76  ->nSeg];.    pLv
17d30 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20  lOut->nSeg++;.  
17d40 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
17d50 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d  t = 1;.    pSeg-
17d60 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
17d70 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69  ;..    /* Read i
17d80 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65  nput from all se
17d90 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  gments in the in
17da0 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
17db0 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e   nInput = pLvl->
17dc0 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64  nSeg;.  }.  bOld
17dd0 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e  est = (pLvlOut->
17de0 6e 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75  nSeg==1 && pStru
17df0 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c  ct->nLevel==iLvl
17e00 2b 32 29 3b 0a 0a 23 69 66 20 30 0a 66 70 72 69  +2);..#if 0.fpri
17e10 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 6d 65 72  ntf(stdout, "mer
17e20 67 69 6e 67 20 25 64 20 73 65 67 6d 65 6e 74 73  ging %d segments
17e30 20 66 72 6f 6d 20 6c 65 76 65 6c 20 25 64 21 22   from level %d!"
17e40 2c 20 6e 49 6e 70 75 74 2c 20 69 4c 76 6c 29 3b  , nInput, iLvl);
17e50 0a 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  .fflush(stdout);
17e60 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 66  .#endif..  for(f
17e70 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
17e80 70 2c 20 70 53 74 72 75 63 74 2c 20 69 49 64 78  p, pStruct, iIdx
17e90 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c  , 0, 0, 0, 0, iL
17ea0 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74  vl, nInput, &pIt
17eb0 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  er);.      fts5M
17ec0 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
17ed0 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  Iter)==0;.      
17ee0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
17ef0 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
17f00 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53  ).  ){.    Fts5S
17f10 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
17f20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
17f30 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b  er->aFirst[1] ];
17f40 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49 74  .    Fts5ChunkIt
17f50 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20 20  er sPos;        
17f60 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
17f70 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 6f  erate through po
17f80 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a  sition list */..
17f90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
17fa0 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
17fb0 74 65 6e 20 69 73 20 74 68 65 20 6f 6c 64 65 73  ten is the oldes
17fc0 74 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  t in the entire 
17fd0 69 6e 64 65 78 20 61 6e 64 0a 20 20 20 20 2a 2a  index and.    **
17fe0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
17ff0 73 74 20 69 73 20 65 6d 70 74 79 20 28 69 2e 65  st is empty (i.e
18000 2e 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 61  . the entry is a
18010 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 29 2c   delete marker),
18020 20 6e 6f 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79   no.    ** entry
18030 20 6e 65 65 64 20 62 65 20 77 72 69 74 74 65 6e   need be written
18040 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20   to the output. 
18050 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e   */.    fts5Chun
18060 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  kIterInit(p, pSe
18070 67 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20 20 69  g, &sPos);.    i
18080 66 28 20 62 4f 6c 64 65 73 74 3d 3d 30 20 7c 7c  f( bOldest==0 ||
18090 20 73 50 6f 73 2e 6e 52 65 6d 3e 30 20 29 7b 0a   sPos.nRem>0 ){.
180a0 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
180b0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
180c0 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c  *pTerm = fts5Mul
180d0 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
180e0 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  , &nTerm);.     
180f0 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d   if( nTerm!=term
18100 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65  .n || memcmp(pTe
18110 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72  rm, term.p, nTer
18120 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m) ){.        if
18130 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65  ( pnRem && write
18140 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e  r.nLeafWritten>n
18150 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rem ){.         
18160 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65   fts5ChunkIterRe
18170 6c 65 61 73 65 28 26 73 50 6f 73 29 3b 0a 20 20  lease(&sPos);.  
18180 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18190 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
181a0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
181b0 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20  ew term. Append 
181c0 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75  a term to the ou
181d0 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f  tput segment. */
181e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65  .        if( bRe
181f0 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d  quireDoclistTerm
18200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
18210 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72  s5WriteAppendZer
18220 6f 62 79 74 65 28 70 2c 20 26 77 72 69 74 65 72  obyte(p, &writer
18230 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18240 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
18250 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
18260 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
18270 6d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  m);.        fts5
18280 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
18290 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , &term, nTerm, 
182a0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
182b0 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54  bRequireDoclistT
182c0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  erm = 1;.      }
182d0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  ..      /* Appen
182e0 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74  d the rowid to t
182f0 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
18300 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
18310 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74  ndRowid(p, &writ
18320 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  er, fts5MultiIte
18330 72 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b 0a  rRowid(pIter));.
18340 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  .      /* Copy t
18350 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
18360 20 66 72 6f 6d 20 69 6e 70 75 74 20 74 6f 20 6f   from input to o
18370 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 66  utput */.      f
18380 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
18390 73 6c 69 73 74 49 6e 74 28 70 2c 20 26 77 72 69  slistInt(p, &wri
183a0 74 65 72 2c 20 73 50 6f 73 2e 6e 52 65 6d 29 3b  ter, sPos.nRem);
183b0 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f  .      for(/* no
183c0 6f 70 20 2a 2f 3b 20 21 66 74 73 35 43 68 75 6e  op */; !fts5Chun
183d0 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f  kIterEof(p, &sPo
183e0 73 29 3b 20 66 74 73 35 43 68 75 6e 6b 49 74 65  s); fts5ChunkIte
183f0 72 4e 65 78 74 28 70 2c 20 26 73 50 6f 73 29 29  rNext(p, &sPos))
18400 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72  {.        fts5Wr
18410 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
18420 44 61 74 61 28 70 2c 20 26 77 72 69 74 65 72 2c  Data(p, &writer,
18430 20 73 50 6f 73 2e 70 2c 20 73 50 6f 73 2e 6e 29   sPos.p, sPos.n)
18440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18450 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74  .    fts5ChunkIt
18460 65 72 52 65 6c 65 61 73 65 28 26 73 50 6f 73 29  erRelease(&sPos)
18470 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  ;.  }..  /* Flus
18480 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20  h the last leaf 
18490 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65  page to disk. Se
184a0 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  t the output seg
184b0 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67  ment b-tree heig
184c0 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74  ht.  ** and last
184d0 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
184e0 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
184f0 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72  me.  */.  fts5Wr
18500 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
18510 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65  iter, &pSeg->nHe
18520 69 67 68 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e  ight, &pSeg->pgn
18530 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66  oLast);..  if( f
18540 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
18550 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
18560 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
18570 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
18580 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
18590 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
185a0 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ble */.    for(i
185b0 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b  =0; i<nInput; i+
185c0 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
185d0 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
185e0 70 2c 20 69 49 64 78 2c 20 70 4c 76 6c 2d 3e 61  p, iIdx, pLvl->a
185f0 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a  Seg[i].iSegid);.
18600 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
18610 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
18620 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nt segments from
18630 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
18640 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c   */.    if( pLvl
18650 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29  ->nSeg!=nInput )
18660 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76  {.      int nMov
18670 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20  e = (pLvl->nSeg 
18680 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65  - nInput) * size
18690 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
186a0 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Segment);.      
186b0 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53  memmove(pLvl->aS
186c0 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  eg, &pLvl->aSeg[
186d0 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b  nInput], nMove);
186e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d  .    }.    pLvl-
186f0 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b  >nSeg -= nInput;
18700 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  .    pLvl->nMerg
18710 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
18720 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30  Seg->pgnoLast==0
18730 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75   ){.      pLvlOu
18740 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 7d  t->nSeg--;.    }
18750 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
18760 73 65 72 74 28 20 70 53 65 67 2d 3e 6e 48 65 69  sert( pSeg->nHei
18770 67 68 74 3e 30 20 26 26 20 70 53 65 67 2d 3e 70  ght>0 && pSeg->p
18780 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20  gnoLast>0 );.   
18790 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
187a0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
187b0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
187c0 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66  nInput;.  }..  f
187d0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
187e0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74  (p, pIter);.  ft
187f0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
18800 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
18810 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
18820 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
18830 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74  ;.}../*.** A tot
18840 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66  al of nLeaf leaf
18850 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20 68   pages of data h
18860 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75  as just been flu
18870 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d  shed to a level-
18880 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69 6e  0.** segments in
18890 20 69 6e 64 65 78 20 69 49 64 78 20 77 69 74 68   index iIdx with
188a0 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
188b0 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ct. This functio
188c0 6e 20 75 70 64 61 74 65 73 20 74 68 65 0a 2a 2a  n updates the.**
188d0 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61   write-counter a
188e0 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20  ccordingly and, 
188f0 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65  if necessary, pe
18900 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74  rforms increment
18910 61 6c 20 6d 65 72 67 65 0a 2a 2a 20 77 6f 72 6b  al merge.** work
18920 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
18930 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
18940 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
18950 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
18960 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
18970 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
18980 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
18990 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
189a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
189b0 49 6e 64 65 78 57 6f 72 6b 28 0a 20 20 46 74 73  IndexWork(.  Fts
189c0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
189e0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
189f0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ect */.  int iId
18a00 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
18a10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18a20 78 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a  x to work on */.
18a30 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
18a40 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
18a50 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
18a60 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
18a70 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
18a80 20 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   nLeaf          
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18aa0 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
18ab0 20 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69   leaves just wri
18ac0 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  tten */.){.  if(
18ad0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18ae0 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
18af0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
18b00 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
18b10 20 69 36 34 20 6e 57 72 69 74 65 3b 20 20 20 20   i64 nWrite;    
18b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18b30 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
18b40 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  of write-counter
18b50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72   */.    int nWor
18b60 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
18b70 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18b80 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74  of work-quanta t
18b90 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20  o perform */.   
18ba0 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20 20   int nRem;      
18bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18bc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
18bd0 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77   pages left to w
18be0 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rite */..    /* 
18bf0 55 70 64 61 74 65 20 74 68 65 20 77 72 69 74 65  Update the write
18c00 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65 20  -counter. While 
18c10 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57  doing so, set nW
18c20 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69  ork. */.    nWri
18c30 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  te = pStruct->nW
18c40 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20  riteCounter;.   
18c50 20 6e 57 6f 72 6b 20 3d 20 28 28 6e 57 72 69 74   nWork = ((nWrit
18c60 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e  e + nLeaf) / p->
18c70 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57  nWorkUnit) - (nW
18c80 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55  rite / p->nWorkU
18c90 6e 69 74 29 3b 0a 20 20 20 20 70 53 74 72 75 63  nit);.    pStruc
18ca0 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
18cb0 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e   += nLeaf;.    n
18cc0 52 65 6d 20 3d 20 70 2d 3e 6e 57 6f 72 6b 55 6e  Rem = p->nWorkUn
18cd0 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74  it * nWork * pSt
18ce0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 0a 20  ruct->nLevel;.. 
18cf0 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30     while( nRem>0
18d00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   ){.      int iL
18d10 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
18d20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
18d30 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
18d40 6c 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ls */.      int 
18d50 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20  iBestLvl = 0;   
18d60 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
18d70 20 6f 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f   offering the mo
18d80 73 74 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  st input segment
18d90 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
18da0 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
18db0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18dc0 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
18dd0 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c  ts on best level
18de0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65   */..      /* Se
18df0 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68  t iBestLvl to th
18e00 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  e level to read 
18e10 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66  input segments f
18e20 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  rom. */.      as
18e30 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
18e40 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 20  Level>0 );.     
18e50 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
18e60 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
18e70 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
18e80 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
18e90 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
18ea0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
18eb0 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 20 20 69  iLvl];.        i
18ec0 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
18ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
18ee0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42   pLvl->nMerge>nB
18ef0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
18f00 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c     iBestLvl = iL
18f10 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  vl;.            
18f20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d  nBest = pLvl->nM
18f30 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  erge;.          
18f40 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
18f50 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
18f60 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
18f70 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  Seg>nBest ){.   
18f80 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
18f90 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20  Lvl->nSeg;.     
18fa0 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
18fb0 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iLvl;.        }.
18fc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
18fd0 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74  * If nBest is st
18fe0 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20  ill 0, then the 
18ff0 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d  index must be em
19000 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  pty. */.#ifdef S
19010 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
19020 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42    for(iLvl=0; nB
19030 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70  est==0 && iLvl<p
19040 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
19050 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
19060 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
19070 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
19080 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Seg==0 );.      
19090 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  }.#endif..      
190a0 69 66 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f  if( nBest<p->pCo
190b0 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
190c0 20 0a 20 20 20 20 20 20 20 26 26 20 70 53 74 72   .       && pStr
190d0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73  uct->aLevel[iBes
190e0 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20  tLvl].nMerge==0 
190f0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
19100 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
19110 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78  .      fts5Index
19120 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 69 49  MergeLevel(p, iI
19130 64 78 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42  dx, &pStruct, iB
19140 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a  estLvl, &nRem);.
19150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
19160 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 3d 3d  em==0 || p->rc==
19170 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
19180 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
19190 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75  LITE_OK && pStru
191a0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74  ct->aLevel[iBest
191b0 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29  Lvl].nMerge==0 )
191c0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  {.        fts5St
191d0 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
191e0 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53  , iBestLvl+1, pS
191f0 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  truct);.      }.
19200 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74 20        *ppStruct 
19210 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d  = pStruct;.    }
19220 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
19230 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43 72 69  oid fts5IndexCri
19240 73 69 73 4d 65 72 67 65 28 0a 20 20 46 74 73 35  sisMerge(.  Fts5
19250 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
19260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
19270 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
19280 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
19290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
192a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
192b0 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20   to work on */. 
192c0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
192d0 2a 70 70 53 74 72 75 63 74 20 20 20 20 20 20 20  *ppStruct       
192e0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
192f0 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66  ent structure of
19300 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 46   index */.){.  F
19310 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
19320 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
19330 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20  t;.  int iLvl = 
19340 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  0;.  while( p->r
19350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c==SQLITE_OK .  
19360 20 20 20 20 26 26 20 69 4c 76 6c 3c 70 53 74 72      && iLvl<pStr
19370 75 63 74 2d 3e 6e 4c 65 76 65 6c 0a 20 20 20 20  uct->nLevel.    
19380 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c    && pStruct->aL
19390 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e  evel[iLvl].nSeg>
193a0 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72  =p->pConfig->nCr
193b0 69 73 69 73 4d 65 72 67 65 20 0a 20 20 29 7b 0a  isisMerge .  ){.
193c0 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72      fts5IndexMer
193d0 67 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78 2c  geLevel(p, iIdx,
193e0 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c   &pStruct, iLvl,
193f0 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72   0);.    fts5Str
19400 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c  ucturePromote(p,
19410 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74   iLvl+1, pStruct
19420 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20  );.    iLvl++;. 
19430 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d   }.  *ppStruct =
19440 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61   pStruct;.}..sta
19450 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
19460 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e 64 65  xReturn(Fts5Inde
19470 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  x *p){.  int rc 
19480 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63  = p->rc;.  p->rc
19490 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
194a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79  return rc;.}..ty
194b0 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
194c0 35 46 6c 75 73 68 43 74 78 20 46 74 73 35 46 6c  5FlushCtx Fts5Fl
194d0 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74 20 46  ushCtx;.struct F
194e0 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a 20 20  ts5FlushCtx {.  
194f0 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78 3b  Fts5Index *pIdx;
19500 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
19510 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 73 74   writer; .};..st
19520 61 74 69 63 20 69 6e 74 20 66 74 73 35 46 6c 75  atic int fts5Flu
19530 73 68 4e 65 77 54 65 72 6d 28 76 6f 69 64 20 2a  shNewTerm(void *
19540 70 43 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72  pCtx, const char
19550 20 2a 7a 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *zTerm, int nTe
19560 72 6d 29 7b 0a 20 20 46 74 73 35 46 6c 75 73 68  rm){.  Fts5Flush
19570 43 74 78 20 2a 70 20 3d 20 28 46 74 73 35 46 6c  Ctx *p = (Fts5Fl
19580 75 73 68 43 74 78 2a 29 70 43 74 78 3b 0a 20 20  ushCtx*)pCtx;.  
19590 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
195a0 4f 4b 3b 0a 20 20 66 74 73 35 57 72 69 74 65 41  OK;.  fts5WriteA
195b0 70 70 65 6e 64 54 65 72 6d 28 70 2d 3e 70 49 64  ppendTerm(p->pId
195c0 78 2c 20 26 70 2d 3e 77 72 69 74 65 72 2c 20 6e  x, &p->writer, n
195d0 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a  Term, (const u8*
195e0 29 7a 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72  )zTerm);.  retur
195f0 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
19600 69 6e 74 20 66 74 73 35 46 6c 75 73 68 54 65 72  int fts5FlushTer
19610 6d 44 6f 6e 65 28 76 6f 69 64 20 2a 70 43 74 78  mDone(void *pCtx
19620 29 7b 0a 20 20 46 74 73 35 46 6c 75 73 68 43 74  ){.  Fts5FlushCt
19630 78 20 2a 70 20 3d 20 28 46 74 73 35 46 6c 75 73  x *p = (Fts5Flus
19640 68 43 74 78 2a 29 70 43 74 78 3b 0a 20 20 69 6e  hCtx*)pCtx;.  in
19650 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19660 3b 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ;.  /* Write the
19670 20 64 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61   doclist termina
19680 74 6f 72 20 2a 2f 0a 20 20 66 74 73 35 57 72 69  tor */.  fts5Wri
19690 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65  teAppendZerobyte
196a0 28 70 2d 3e 70 49 64 78 2c 20 26 70 2d 3e 77 72  (p->pIdx, &p->wr
196b0 69 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  iter);.  return 
196c0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
196d0 74 20 66 74 73 35 46 6c 75 73 68 4e 65 77 45 6e  t fts5FlushNewEn
196e0 74 72 79 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  try(.  void *pCt
196f0 78 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64  x, .  i64 iRowid
19700 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  , .  const u8 *a
19710 50 6f 73 6c 69 73 74 2c 20 0a 20 20 69 6e 74 20  Poslist, .  int 
19720 6e 50 6f 73 6c 69 73 74 0a 29 7b 0a 20 20 46 74  nPoslist.){.  Ft
19730 73 35 46 6c 75 73 68 43 74 78 20 2a 70 20 3d 20  s5FlushCtx *p = 
19740 28 46 74 73 35 46 6c 75 73 68 43 74 78 2a 29 70  (Fts5FlushCtx*)p
19750 43 74 78 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  Ctx;.  Fts5Index
19760 20 2a 70 49 64 78 20 3d 20 70 2d 3e 70 49 64 78   *pIdx = p->pIdx
19770 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  ;..  /* Append t
19780 68 65 20 72 6f 77 69 64 20 69 74 73 65 6c 66 20  he rowid itself 
19790 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 41 70  */.  fts5WriteAp
197a0 70 65 6e 64 52 6f 77 69 64 28 70 49 64 78 2c 20  pendRowid(pIdx, 
197b0 26 70 2d 3e 77 72 69 74 65 72 2c 20 69 52 6f 77  &p->writer, iRow
197c0 69 64 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  id);..  /* Appen
197d0 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
197e0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
197f0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 66 74  in bytes */.  ft
19800 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
19810 6c 69 73 74 49 6e 74 28 70 49 64 78 2c 20 26 70  listInt(pIdx, &p
19820 2d 3e 77 72 69 74 65 72 2c 20 6e 50 6f 73 6c 69  ->writer, nPosli
19830 73 74 29 3b 0a 0a 20 20 2f 2a 20 41 6e 64 20 74  st);..  /* And t
19840 68 65 20 70 6f 73 6c 69 73 74 20 64 61 74 61 20  he poslist data 
19850 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 41 70  */.  fts5WriteAp
19860 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
19870 70 49 64 78 2c 20 26 70 2d 3e 77 72 69 74 65 72  pIdx, &p->writer
19880 2c 20 61 50 6f 73 6c 69 73 74 2c 20 6e 50 6f 73  , aPoslist, nPos
19890 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  list);.  return 
198a0 70 49 64 78 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a  pIdx->rc;.}../*.
198b0 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e  ** Flush the con
198c0 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f  tents of in-memo
198d0 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69 48  ry hash table iH
198e0 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76  ash to a new lev
198f0 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  el-0 .** segment
19900 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75   on disk. Also u
19910 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65 73  pdate the corres
19920 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72  ponding structur
19930 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  e record..**.** 
19940 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
19950 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
19960 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
19970 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
19980 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
19990 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
199a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
199b0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
199c0 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65  oid fts5FlushOne
199d0 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a  Hash(Fts5Index *
199e0 70 2c 20 69 6e 74 20 69 48 61 73 68 2c 20 69 6e  p, int iHash, in
199f0 74 20 2a 70 6e 4c 65 61 66 29 7b 0a 20 20 46 74  t *pnLeaf){.  Ft
19a00 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
19a10 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65 67  ruct;.  int iSeg
19a20 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61  id;.  int pgnoLa
19a30 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
19a40 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a50 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
19a60 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a   in segment */..
19a70 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72 65    /* Obtain a re
19a80 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69  ference to the i
19a90 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 61  ndex structure a
19aa0 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  nd allocate a ne
19ab0 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a  w segment-id.  *
19ac0 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c 65  * for the new le
19ad0 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20  vel-0 segment.  
19ae0 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  */.  pStruct = f
19af0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
19b00 28 70 2c 20 69 48 61 73 68 29 3b 0a 20 20 69 53  (p, iHash);.  iS
19b10 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63  egid = fts5Alloc
19b20 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72  ateSegid(p, pStr
19b30 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  uct);..  if( iSe
19b40 67 69 64 20 29 7b 0a 20 20 20 20 46 74 73 35 53  gid ){.    Fts5S
19b50 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
19b60 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20  *pSeg;   /* New 
19b70 73 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70  segment within p
19b80 53 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 6e  Struct */.    in
19b90 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20  t nHeight;      
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
19bb0 65 69 67 68 74 20 6f 66 20 6e 65 77 20 73 65 67  eight of new seg
19bc0 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20  ment b-tree */. 
19bd0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46     int rc;.    F
19be0 74 73 35 46 6c 75 73 68 43 74 78 20 63 74 78 3b  ts5FlushCtx ctx;
19bf0 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49  ..    fts5WriteI
19c00 6e 69 74 28 70 2c 20 26 63 74 78 2e 77 72 69 74  nit(p, &ctx.writ
19c10 65 72 2c 20 69 48 61 73 68 2c 20 69 53 65 67 69  er, iHash, iSegi
19c20 64 29 3b 0a 20 20 20 20 63 74 78 2e 70 49 64 78  d);.    ctx.pIdx
19c30 20 3d 20 70 3b 0a 0a 20 20 20 20 72 63 20 3d 20   = p;..    rc = 
19c40 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 49  sqlite3Fts5HashI
19c50 74 65 72 61 74 65 28 20 70 2d 3e 61 70 48 61 73  terate( p->apHas
19c60 68 5b 69 48 61 73 68 5d 2c 20 28 76 6f 69 64 2a  h[iHash], (void*
19c70 29 26 63 74 78 2c 20 0a 20 20 20 20 20 20 20 20  )&ctx, .        
19c80 66 74 73 35 46 6c 75 73 68 4e 65 77 54 65 72 6d  fts5FlushNewTerm
19c90 2c 20 66 74 73 35 46 6c 75 73 68 4e 65 77 45 6e  , fts5FlushNewEn
19ca0 74 72 79 2c 20 66 74 73 35 46 6c 75 73 68 54 65  try, fts5FlushTe
19cb0 72 6d 44 6f 6e 65 0a 20 20 20 20 29 3b 0a 20 20  rmDone.    );.  
19cc0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
19cd0 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d  ITE_OK ) p->rc =
19ce0 20 72 63 3b 0a 20 20 20 20 66 74 73 35 57 72 69   rc;.    fts5Wri
19cf0 74 65 46 69 6e 69 73 68 28 70 2c 20 26 63 74 78  teFinish(p, &ctx
19d00 2e 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67 68  .writer, &nHeigh
19d10 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  t, &pgnoLast);..
19d20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
19d30 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
19d40 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20 62   It is written b
19d50 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62  ack to the datab
19d60 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a  ase by the.    *
19d70 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  * fts5StructureR
19d80 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65  elease() call be
19d90 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  low.  */.    if(
19da0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
19db0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
19dc0 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
19dd0 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72  el(&p->rc, &pStr
19de0 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uct);.    }.    
19df0 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
19e00 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
19e10 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20   pStruct, 0, 1, 
19e20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  0);.    if( p->r
19e30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19e40 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 53        pSeg = &pS
19e50 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
19e60 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e  .aSeg[ pStruct->
19e70 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b  aLevel[0].nSeg++
19e80 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   ];.      pSeg->
19e90 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
19ea0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 6e 48 65  .      pSeg->nHe
19eb0 69 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b 0a  ight = nHeight;.
19ec0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
19ed0 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  First = 1;.     
19ee0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
19ef0 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
19f00 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
19f10 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c  urePromote(p, 0,
19f20 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a   pStruct);.  }..
19f30 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
19f40 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e 30 20 29  ->nAutomerge>0 )
19f50 20 66 74 73 35 49 6e 64 65 78 57 6f 72 6b 28 70   fts5IndexWork(p
19f60 2c 20 69 48 61 73 68 2c 20 26 70 53 74 72 75 63  , iHash, &pStruc
19f70 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  t, pgnoLast);.  
19f80 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 4d  fts5IndexCrisisM
19f90 65 72 67 65 28 70 2c 20 69 48 61 73 68 2c 20 26  erge(p, iHash, &
19fa0 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
19fb0 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
19fc0 2c 20 69 48 61 73 68 2c 20 70 53 74 72 75 63 74  , iHash, pStruct
19fd0 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
19fe0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
19ff0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  t);.}../*.** Flu
1a000 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72  sh any data stor
1a010 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ed in the in-mem
1a020 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
1a030 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1a040 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a050 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46  fts5IndexFlush(F
1a060 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1a070 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1a080 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
1a090 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
1a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a0b0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
1a0c0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69  terate through i
1a0d0 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndexes */.  int 
1a0e0 6e 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20 20  nLeaf = 0;      
1a0f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1a100 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
1a110 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a  written */..  /*
1a120 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
1a130 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64   already occured
1a140 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
1a150 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
1a160 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1a170 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44   || p->nPendingD
1a180 61 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ata==0 ) return;
1a190 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  .  assert( p->ap
1a1a0 48 61 73 68 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c  Hash );..  /* Fl
1a1b0 75 73 68 20 74 68 65 20 74 65 72 6d 73 20 61 6e  ush the terms an
1a1c0 64 20 65 61 63 68 20 70 72 65 66 69 78 20 69 6e  d each prefix in
1a1d0 64 65 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  dex to disk */. 
1a1e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f   for(i=0; i<=pCo
1a1f0 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
1a200 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 46 6c 75  ++){.    fts5Flu
1a210 73 68 4f 6e 65 48 61 73 68 28 70 2c 20 69 2c 20  shOneHash(p, i, 
1a220 26 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a 20 20 70  &nLeaf);.  }.  p
1a230 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
1a240 20 30 3b 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69   0;.}...int sqli
1a250 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69  te3Fts5IndexOpti
1a260 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a  mize(Fts5Index *
1a270 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  p){.  Fts5Config
1a280 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
1a290 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69 3b  Config;.  int i;
1a2a0 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ..  fts5IndexFlu
1a2b0 73 68 28 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30  sh(p);.  for(i=0
1a2c0 3b 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  ; i<=pConfig->nP
1a2d0 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  refix; i++){.   
1a2e0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1a2f0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
1a300 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69  ructureRead(p, i
1a310 29 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  );.    Fts5Struc
1a320 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  ture *pNew = 0;.
1a330 20 20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30      int nSeg = 0
1a340 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63  ;.    if( pStruc
1a350 74 20 29 7b 0a 20 20 20 20 20 20 6e 53 65 67 20  t ){.      nSeg 
1a360 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43  = fts5StructureC
1a370 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74  ountSegments(pSt
1a380 72 75 63 74 29 3b 0a 20 20 20 20 20 20 69 66 28  ruct);.      if(
1a390 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20 20 20 20   nSeg>1 ){.     
1a3a0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
1a3b0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
1a3c0 75 72 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 42  ure);.        nB
1a3d0 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d  yte += (pStruct-
1a3e0 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a  >nLevel+1) * siz
1a3f0 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1a400 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 20  eLevel);.       
1a410 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72   pNew = (Fts5Str
1a420 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46  ucture*)sqlite3F
1a430 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70  ts5MallocZero(&p
1a440 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->rc, nByte);.  
1a450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a460 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
1a470 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
1a480 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
1a490 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 53    int nByte = nS
1a4a0 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  eg * sizeof(Fts5
1a4b0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
1a4c0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  );.      pNew->n
1a4d0 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
1a4e0 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 20  >nLevel+1;.     
1a4f0 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75   pNew->nWriteCou
1a500 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d 3e  nter = pStruct->
1a510 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
1a520 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65       pLvl = &pNe
1a530 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63  w->aLevel[pStruc
1a540 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  t->nLevel];.    
1a550 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
1a560 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1a570 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
1a580 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1a590 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1a5a0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67    if( pLvl->aSeg
1a5b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1a5c0 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
1a5d0 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20      int iSegOut 
1a5e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
1a5f0 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1a600 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1a610 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
1a620 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
1a630 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  eg<pStruct->aLev
1a640 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69  el[iLvl].nSeg; i
1a650 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
1a660 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69      pLvl->aSeg[i
1a670 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63  SegOut] = pStruc
1a680 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1a690 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20  aSeg[iSeg];.    
1a6a0 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b          iSegOut+
1a6b0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
1a6c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a6d0 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53   pLvl->nSeg = nS
1a6e0 65 67 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  eg;.      }else{
1a6f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a700 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20  _free(pNew);.   
1a710 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20       pNew = 0;. 
1a720 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1a730 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
1a740 20 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70      int iLvl = p
1a750 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20  New->nLevel-1;. 
1a760 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
1a770 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a780 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  pNew->aLevel[iLv
1a790 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20  l].nSeg>0 ){.   
1a7a0 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20       int nRem = 
1a7b0 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e  FTS5_OPT_WORK_UN
1a7c0 49 54 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  IT;.        fts5
1a7d0 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1a7e0 70 2c 20 69 2c 20 26 70 4e 65 77 2c 20 69 4c 76  p, i, &pNew, iLv
1a7f0 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 20  l, &nRem);.     
1a800 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 53 74   }..      fts5St
1a810 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
1a820 69 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  i, pNew);.      
1a830 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1a840 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
1a850 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  }..    fts5Struc
1a860 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1a870 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  uct);.  }..  ret
1a880 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
1a890 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 0a 0a 2f 2a  urn(p); .}..../*
1a8a0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d  .** Return a sim
1a8b0 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  ple checksum val
1a8c0 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ue based on the 
1a8d0 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  arguments..*/.st
1a8e0 61 74 69 63 20 75 36 34 20 66 74 73 35 49 6e 64  atic u64 fts5Ind
1a8f0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20  exEntryCksum(.  
1a900 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69  i64 iRowid, .  i
1a910 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20  nt iCol, .  int 
1a920 69 50 6f 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63  iPos, .  const c
1a930 68 61 72 20 2a 70 54 65 72 6d 2c 20 0a 20 20 69  har *pTerm, .  i
1a940 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e  nt nTerm.){.  in
1a950 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d  t i;.  u64 ret =
1a960 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b   iRowid;.  ret +
1a970 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f  = (ret<<3) + iCo
1a980 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74  l;.  ret += (ret
1a990 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66  <<3) + iPos;.  f
1a9a0 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
1a9b0 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65   i++) ret += (re
1a9c0 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d  t<<3) + pTerm[i]
1a9d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
1a9e0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1a9f0 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69 74  ts5BtreeIterInit
1aa00 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1aa10 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20  , .  int iIdx,. 
1aa20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
1aa30 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 0a 20 20  gment *pSeg, .  
1aa40 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a 70  Fts5BtreeIter *p
1aa50 49 74 65 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  Iter.){.  int nB
1aa60 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
1aa70 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 70  nByte = sizeof(p
1aa80 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 29 20 2a  Iter->aLvl[0]) *
1aa90 20 28 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d   (pSeg->nHeight-
1aaa0 31 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  1);.  memset(pIt
1aab0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
1aac0 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d  Iter));.  pIter-
1aad0 3e 6e 4c 76 6c 20 3d 20 70 53 65 67 2d 3e 6e 48  >nLvl = pSeg->nH
1aae0 65 69 67 68 74 2d 31 3b 0a 20 20 70 49 74 65 72  eight-1;.  pIter
1aaf0 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20  ->iIdx = iIdx;. 
1ab00 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 3b 0a 20   pIter->p = p;. 
1ab10 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
1ab20 53 65 67 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  Seg;.  if( nByte
1ab30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
1ab40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65  E_OK ){.    pIte
1ab50 72 2d 3e 61 4c 76 6c 20 3d 20 28 46 74 73 35 42  r->aLvl = (Fts5B
1ab60 74 72 65 65 49 74 65 72 4c 65 76 65 6c 2a 29 66  treeIterLevel*)f
1ab70 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
1ab80 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  nByte);.  }.  fo
1ab90 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
1aba0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74  LITE_OK && i<pIt
1abb0 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a  er->nLvl; i++){.
1abc0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
1abd0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1abe0 57 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e  WID(iIdx, pSeg->
1abf0 69 53 65 67 69 64 2c 20 69 2b 31 2c 20 31 29 3b  iSegid, i+1, 1);
1ac00 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
1ac10 44 61 74 61 3b 0a 20 20 20 20 70 49 74 65 72 2d  Data;.    pIter-
1ac20 3e 61 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 20 3d  >aLvl[i].pData =
1ac30 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
1ac40 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29  aRead(p, iRowid)
1ac50 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 20  ;.    if( pData 
1ac60 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64  ){.      fts5Nod
1ac70 65 49 74 65 72 49 6e 69 74 28 70 44 61 74 61 2d  eIterInit(pData-
1ac80 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26 70  >p, pData->n, &p
1ac90 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 73 29  Iter->aLvl[i].s)
1aca0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1acb0 66 28 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 3d 3d  f( pIter->nLvl==
1acc0 30 20 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20  0 || p->rc ){.  
1acd0 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
1ace0 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  1;.    pIter->iL
1acf0 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  eaf = pSeg->pgno
1ad00 4c 61 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Last;.  }else{. 
1ad10 20 20 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79     pIter->nEmpty
1ad20 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30   = pIter->aLvl[0
1ad30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 20 20  ].s.nEmpty;.    
1ad40 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70  pIter->iLeaf = p
1ad50 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
1ad60 69 43 68 69 6c 64 3b 0a 20 20 20 20 70 49 74 65  iChild;.    pIte
1ad70 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65  r->bDlidx = pIte
1ad80 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c  r->aLvl[0].s.bDl
1ad90 69 64 78 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  idx;.  }.}..stat
1ada0 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72 65  ic void fts5Btre
1adb0 65 49 74 65 72 4e 65 78 74 28 46 74 73 35 42 74  eIterNext(Fts5Bt
1adc0 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b  reeIter *pIter){
1add0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20  .  Fts5Index *p 
1ade0 3d 20 70 49 74 65 72 2d 3e 70 3b 0a 20 20 69 6e  = pIter->p;.  in
1adf0 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
1ae00 70 49 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 26  pIter->bEof==0 &
1ae10 26 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  & pIter->aLvl[0]
1ae20 2e 73 2e 61 44 61 74 61 20 29 3b 0a 20 20 66 6f  .s.aData );.  fo
1ae30 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
1ae40 6e 4c 76 6c 20 26 26 20 70 2d 3e 72 63 3d 3d 53  nLvl && p->rc==S
1ae50 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
1ae60 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74 65      Fts5BtreeIte
1ae70 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  rLevel *pLvl = &
1ae80 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  pIter->aLvl[i];.
1ae90 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
1aea0 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26 70 4c  Next(&p->rc, &pL
1aeb0 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20  vl->s);.    if( 
1aec0 70 4c 76 6c 2d 3e 73 2e 61 44 61 74 61 20 29 7b  pLvl->s.aData ){
1aed0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1aee0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
1aef0 74 65 72 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c 2d  ter->term, pLvl-
1af00 3e 73 2e 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c 2d  >s.term.n, pLvl-
1af10 3e 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20  >s.term.p);.    
1af20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
1af30 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f  se{.      fts5No
1af40 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c  deIterFree(&pLvl
1af50 2d 3e 73 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ->s);.      fts5
1af60 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c  DataRelease(pLvl
1af70 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
1af80 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30 3b  pLvl->pData = 0;
1af90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1afa0 20 69 3d 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 20   i==pIter->nLvl 
1afb0 7c 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  || p->rc ){.    
1afc0 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b  pIter->bEof = 1;
1afd0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1afe0 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72  t iSegid = pIter
1aff0 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
1b000 20 20 20 20 66 6f 72 28 69 2d 2d 3b 20 69 3e 3d      for(i--; i>=
1b010 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 46  0; i--){.      F
1b020 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
1b030 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
1b040 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20  ->aLvl[i];.     
1b050 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54   i64 iRowid = FT
1b060 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
1b070 28 70 49 74 65 72 2d 3e 69 49 64 78 2c 69 53 65  (pIter->iIdx,iSe
1b080 67 69 64 2c 69 2b 31 2c 70 4c 76 6c 5b 31 5d 2e  gid,i+1,pLvl[1].
1b090 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  s.iChild);.     
1b0a0 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
1b0b0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
1b0c0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
1b0d0 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b  ( pLvl->pData ){
1b0e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64  .        fts5Nod
1b0f0 65 49 74 65 72 49 6e 69 74 28 70 4c 76 6c 2d 3e  eIterInit(pLvl->
1b100 70 44 61 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e  pData->p, pLvl->
1b110 70 44 61 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d  pData->n, &pLvl-
1b120 3e 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >s);.      }.   
1b130 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d   }.  }..  pIter-
1b140 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d  >nEmpty = pIter-
1b150 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74  >aLvl[0].s.nEmpt
1b160 79 3b 0a 20 20 70 49 74 65 72 2d 3e 62 44 6c 69  y;.  pIter->bDli
1b170 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c  dx = pIter->aLvl
1b180 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20  [0].s.bDlidx;.  
1b190 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70  pIter->iLeaf = p
1b1a0 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
1b1b0 69 43 68 69 6c 64 3b 0a 20 20 61 73 73 65 72 74  iChild;.  assert
1b1c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1b1d0 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f  OK || pIter->bEo
1b1e0 66 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  f );.}..static v
1b1f0 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65  oid fts5BtreeIte
1b200 72 46 72 65 65 28 46 74 73 35 42 74 72 65 65 49  rFree(Fts5BtreeI
1b210 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
1b220 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1b230 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20   i<pIter->nLvl; 
1b240 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74  i++){.    Fts5Bt
1b250 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c  reeIterLevel *pL
1b260 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
1b270 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f  l[i];.    fts5No
1b280 64 65 49 74 65 72 46 72 65 65 28 26 70 4c 76 6c  deIterFree(&pLvl
1b290 2d 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ->s);.    if( pL
1b2a0 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20  vl->pData ){.   
1b2b0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
1b2c0 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b  se(pLvl->pData);
1b2d0 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61  .      pLvl->pDa
1b2e0 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ta = 0;.    }.  
1b2f0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1b300 28 70 49 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a 20  (pIter->aLvl);. 
1b310 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1b320 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d  &pIter->term);.}
1b330 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1b340 63 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20  ction is purely 
1b350 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  an internal test
1b360 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  . It does not co
1b370 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20  ntribute to .** 
1b380 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74  FTS functionalit
1b390 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69  y, or even the i
1b3a0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20  ntegrity-check, 
1b3b0 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a  in any way..**.*
1b3c0 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65  * Instead, it te
1b3d0 73 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d  sts that the sam
1b3e0 65 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f  e set of pgno/ro
1b3f0 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  wid combinations
1b400 20 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64   are .** visited
1b410 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
1b420 68 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69  hether the docli
1b430 73 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66  st-index identif
1b440 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
1b450 73 0a 2a 2a 20 69 49 64 78 2f 69 53 65 67 69 64  s.** iIdx/iSegid
1b460 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61 74  /iLeaf is iterat
1b470 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f  ed in forwards o
1b480 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  r reverse order.
1b490 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
1b4a0 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 76  E_DEBUG.static v
1b4b0 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74 65  oid fts5DlidxIte
1b4c0 72 54 65 73 74 52 65 76 65 72 73 65 28 0a 20 20  rTestReverse(.  
1b4d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1b4e0 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6c 6f 61   /* Index to loa
1b510 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  d doclist-index 
1b520 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  from */.  int iS
1b530 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  egid,           
1b540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
1b550 6d 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20  ment id to load 
1b560 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  from */.  int iL
1b570 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
1b580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61            /* Loa
1b590 64 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  d doclist-index 
1b5a0 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
1b5b0 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  .){.  Fts5DlidxI
1b5c0 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b  ter *pDlidx = 0;
1b5d0 0a 20 20 69 36 34 20 63 6b 73 75 6d 31 20 3d 20  .  i64 cksum1 = 
1b5e0 31 33 3b 0a 20 20 69 36 34 20 63 6b 73 75 6d 32  13;.  i64 cksum2
1b5f0 20 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 66 74   = 13;..  for(ft
1b600 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
1b610 70 2c 20 30 2c 20 69 49 64 78 2c 20 69 53 65 67  p, 0, iIdx, iSeg
1b620 69 64 2c 20 69 4c 65 61 66 2c 20 26 70 44 6c 69  id, iLeaf, &pDli
1b630 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  dx);.      fts5D
1b640 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
1b650 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
1b660 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
1b670 78 74 28 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a  xt(pDlidx).  ){.
1b680 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
1b690 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 69 4c  dx->iLeafPgno>iL
1b6a0 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d  eaf );.    cksum
1b6b0 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 28 20  1 = (cksum1 ^ ( 
1b6c0 28 69 36 34 29 28 70 44 6c 69 64 78 2d 3e 69 4c  (i64)(pDlidx->iL
1b6d0 65 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32 20 29  eafPgno) << 32 )
1b6e0 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 3d 20  );.    cksum1 = 
1b6f0 28 63 6b 73 75 6d 31 20 5e 20 70 44 6c 69 64 78  (cksum1 ^ pDlidx
1b700 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  ->iRowid);.  }. 
1b710 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
1b720 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
1b730 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  lidx = 0;..  for
1b740 28 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e  (fts5DlidxIterIn
1b750 69 74 28 70 2c 20 31 2c 20 69 49 64 78 2c 20 69  it(p, 1, iIdx, i
1b760 53 65 67 69 64 2c 20 69 4c 65 61 66 2c 20 26 70  Segid, iLeaf, &p
1b770 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74  Dlidx);.      ft
1b780 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
1b790 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
1b7a0 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
1b7b0 72 50 72 65 76 28 70 44 6c 69 64 78 29 0a 20 20  rPrev(pDlidx).  
1b7c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b7d0 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f  Dlidx->iLeafPgno
1b7e0 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b  >iLeaf );.    ck
1b7f0 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20 5e  sum2 = (cksum2 ^
1b800 20 28 20 28 69 36 34 29 28 70 44 6c 69 64 78 2d   ( (i64)(pDlidx-
1b810 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c 20 33  >iLeafPgno) << 3
1b820 32 20 29 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32  2 ));.    cksum2
1b830 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20 70 44 6c   = (cksum2 ^ pDl
1b840 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  idx->iRowid);.  
1b850 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  }.  fts5DlidxIte
1b860 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
1b870 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20   pDlidx = 0;..  
1b880 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1b890 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d  E_OK && cksum1!=
1b8a0 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d  cksum2 ) p->rc =
1b8b0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 20 0a   FTS5_CORRUPT; .
1b8c0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1b8d0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 54 65   fts5DlidxIterTe
1b8e0 73 74 52 65 76 65 72 73 65 28 77 2c 78 2c 79 2c  stReverse(w,x,y,
1b8f0 7a 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69  z).#endif..stati
1b900 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1b910 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 53 65  IntegrityCheckSe
1b920 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64  gment(.  Fts5Ind
1b930 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1b940 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1b950 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1b960 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68       /* Index th
1b990 61 74 20 70 53 65 67 20 69 73 20 61 20 70 61 72  at pSeg is a par
1b9a0 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53 74  t of */.  Fts5St
1b9b0 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
1b9c0 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
1b9d0 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e  ment to check in
1b9e0 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e  ternal consisten
1b9f0 63 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 42  cy */.){.  Fts5B
1ba00 74 72 65 65 49 74 65 72 20 69 74 65 72 3b 20 20  treeIter iter;  
1ba10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
1ba20 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
1ba30 72 6f 75 67 68 20 62 2d 74 72 65 65 20 68 69 65  rough b-tree hie
1ba40 72 61 72 63 68 79 20 2a 2f 0a 0a 20 20 2f 2a 20  rarchy */..  /* 
1ba50 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
1ba60 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
1ba70 72 63 68 79 2e 20 20 2a 2f 0a 20 20 66 6f 72 28  rchy.  */.  for(
1ba80 66 74 73 35 42 74 72 65 65 49 74 65 72 49 6e 69  fts5BtreeIterIni
1ba90 74 28 70 2c 20 69 49 64 78 2c 20 70 53 65 67 2c  t(p, iIdx, pSeg,
1baa0 20 26 69 74 65 72 29 3b 0a 20 20 20 20 20 20 69   &iter);.      i
1bab0 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20  ter.bEof==0;.   
1bac0 20 20 20 66 74 73 35 42 74 72 65 65 49 74 65 72     fts5BtreeIter
1bad0 4e 65 78 74 28 26 69 74 65 72 29 0a 20 20 29 7b  Next(&iter).  ){
1bae0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20  .    i64 iRow;  
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
1bb10 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20  this leaf */.   
1bb20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
1bb30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1bb40 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73 20  * Data for this 
1bb50 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20  leaf */.    int 
1bb60 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
1bb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1bb80 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72  set of first ter
1bb90 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20  m on leaf */.   
1bba0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bbc0 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
1bbd0 65 20 74 68 72 6f 75 67 68 20 65 6d 70 74 79 20  e through empty 
1bbe0 6c 65 61 76 65 73 20 2a 2f 0a 0a 20 20 20 20 2f  leaves */..    /
1bbf0 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20 69 6e  * If the leaf in
1bc00 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20 61 6c   question has al
1bc10 72 65 61 64 79 20 62 65 65 6e 20 74 72 69 6d 6d  ready been trimm
1bc20 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65 67 6d  ed from the segm
1bc30 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e  ent, .    ** ign
1bc40 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65 65 20  ore this b-tree 
1bc50 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69 73 65  entry. Otherwise
1bc60 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d  , load it into m
1bc70 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66  emory. */.    if
1bc80 28 20 69 74 65 72 2e 69 4c 65 61 66 3c 70 53 65  ( iter.iLeaf<pSe
1bc90 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63  g->pgnoFirst ) c
1bca0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f  ontinue;.    iRo
1bcb0 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  w = FTS5_SEGMENT
1bcc0 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65  _ROWID(iIdx, pSe
1bcd0 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 69 74  g->iSegid, 0, it
1bce0 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 70  er.iLeaf);.    p
1bcf0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
1bd00 65 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20  ead(p, iRow);.  
1bd10 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
1bd20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20   break;..    /* 
1bd30 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  Check that the l
1bd40 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  eaf contains at 
1bd50 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20  least one term, 
1bd60 61 6e 64 20 74 68 61 74 20 69 74 20 69 73 20 65  and that it is e
1bd70 71 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f  qual.    ** to o
1bd80 72 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  r larger than th
1bd90 65 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 69  e split-key in i
1bda0 74 65 72 2e 74 65 72 6d 2e 20 20 2a 2f 0a 20 20  ter.term.  */.  
1bdb0 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74    iOff = fts5Get
1bdc0 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d  U16(&pLeaf->p[2]
1bdd0 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3d  );.    if( iOff=
1bde0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
1bdf0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
1be00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1be10 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20     int nTerm;   
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1be30 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f  * Size of term o
1be40 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65 73 20  n leaf in bytes 
1be50 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  */.      int res
1be60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be70 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73       /* Comparis
1be80 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64 20 73  on of term and s
1be90 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 20 20 20 20  plit-key */.    
1bea0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
1beb0 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
1bec0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d  ->p[iOff], nTerm
1bed0 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6d  );.      res = m
1bee0 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b  emcmp(&pLeaf->p[
1bef0 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72 6d  iOff], iter.term
1bf00 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 69  .p, MIN(nTerm, i
1bf10 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20 20  ter.term.n));.  
1bf20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
1bf30 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20 69   res = nTerm - i
1bf40 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20  ter.term.n;.    
1bf50 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
1bf60 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
1bf70 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
1bf80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
1bf90 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
1bfa0 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70  Leaf);.    if( p
1bfb0 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ->rc ) break;.. 
1bfc0 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20     /* Now check 
1bfd0 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45  that the iter.nE
1bfe0 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c  mpty leaves foll
1bff0 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  owing the curren
1c000 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61  t leaf.    ** (a
1c010 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20  ) exist and (b) 
1c020 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
1c030 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31  . */.    for(i=1
1c040 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
1c050 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e 45  OK && i<=iter.nE
1c060 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mpty; i++){.    
1c070 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61    pLeaf = fts5Da
1c080 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b 69  taRead(p, iRow+i
1c090 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
1c0a0 61 66 20 26 26 20 30 21 3d 66 74 73 35 47 65 74  af && 0!=fts5Get
1c0b0 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d  U16(&pLeaf->p[2]
1c0c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
1c0d0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1c0e0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
1c0f0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1c100 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a  (pLeaf);.    }..
1c110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c120 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
1c130 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69  ex, check that i
1c140 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a  t looks right. *
1c150 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e 62  /.    if( iter.b
1c160 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46  Dlidx ){.      F
1c170 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
1c180 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f  lidx = 0;  /* Fo
1c190 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
1c1a0 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ugh doclist inde
1c1b0 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  x */.      int i
1c1c0 50 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72 2e  PrevLeaf = iter.
1c1d0 69 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74  iLeaf;.      int
1c1e0 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e   iSegid = pSeg->
1c1f0 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e  iSegid;.      in
1c200 74 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36 34  t iPg;.      i64
1c210 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f   iKey;..      fo
1c220 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  r(fts5DlidxIterI
1c230 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c 20  nit(p, 0, iIdx, 
1c240 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c 65  iSegid, iter.iLe
1c250 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20 20  af, &pDlidx);.  
1c260 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
1c270 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
1c280 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  dx)==0;.        
1c290 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
1c2a0 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 20 20  ext(pDlidx).    
1c2b0 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    ){..        /*
1c2c0 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64   Check any rowid
1c2d0 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74  -less pages that
1c2e0 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
1c2f0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
1c300 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
1c310 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20  Pg=iPrevLeaf+1; 
1c320 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65 61  iPg<pDlidx->iLea
1c330 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a 20  fPgno; iPg++){. 
1c340 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20           iKey = 
1c350 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1c360 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c  ID(iIdx, iSegid,
1c370 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20   0, iPg);.      
1c380 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
1c390 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79  DataRead(p, iKey
1c3a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1c3b0 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
1c3c0 20 20 20 20 20 20 69 66 28 20 66 74 73 35 47 65        if( fts5Ge
1c3d0 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30  tU16(&pLeaf->p[0
1c3e0 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  ])!=0 ) p->rc = 
1c3f0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
1c400 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
1c410 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
1c420 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c440 69 50 72 65 76 4c 65 61 66 20 3d 20 70 44 6c 69  iPrevLeaf = pDli
1c450 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a  dx->iLeafPgno;..
1c460 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
1c470 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70   that the leaf p
1c480 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  age indicated by
1c490 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
1c4a0 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20  ally does.      
1c4b0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65    ** contain the
1c4c0 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64   rowid suggested
1c4d0 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f   by the same. */
1c4e0 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
1c4f0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1c500 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c  ID(iIdx, iSegid,
1c510 20 30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61   0, pDlidx->iLea
1c520 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  fPgno);.        
1c530 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
1c540 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
1c550 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
1c560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36   ){.          i6
1c570 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  4 iRowid;.      
1c580 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
1c590 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
1c5a0 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20  pLeaf->p[0]);.  
1c5b0 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
1c5c0 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77  t(&pLeaf->p[iRow
1c5d0 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  idOff], (u64*)&i
1c5e0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
1c5f0 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 70 44    if( iRowid!=pD
1c600 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 20 70  lidx->iRowid ) p
1c610 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
1c620 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66  UPT;.          f
1c630 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
1c640 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  Leaf);.        }
1c650 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ..      }..     
1c660 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65   for(iPg=iPrevLe
1c670 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65 72  af+1; iPg<=(iter
1c680 2e 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e 45  .iLeaf + iter.nE
1c690 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a 20  mpty); iPg++){. 
1c6a0 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
1c6b0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
1c6c0 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30  (iIdx, iSegid, 0
1c6d0 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20  , iPg);.        
1c6e0 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
1c6f0 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
1c700 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
1c710 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1c720 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  ( fts5GetU16(&pL
1c730 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20  eaf->p[0])!=0 ) 
1c740 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1c750 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
1c760 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1c770 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
1c780 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
1c790 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
1c7a0 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  ee(pDlidx);.    
1c7b0 20 20 2f 2f 20 66 74 73 35 44 6c 69 64 78 49 74    // fts5DlidxIt
1c7c0 65 72 54 65 73 74 52 65 76 65 72 73 65 28 70 2c  erTestReverse(p,
1c7d0 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69   iIdx, iSegid, i
1c7e0 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20  ter.iLeaf);.    
1c7f0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
1c800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c810 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65   iter.iLeaf!=pSe
1c820 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
1c830 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
1c840 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20  CORRUPT;.  }..  
1c850 66 74 73 35 42 74 72 65 65 49 74 65 72 46 72 65  fts5BtreeIterFre
1c860 65 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  e(&iter);.}../*.
1c870 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c  ** Iterator pMul
1c880 74 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ti currently poi
1c890 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65  nts to a valid e
1c8a0 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20  ntry (not EOF). 
1c8b0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
1c8c0 20 61 70 70 65 6e 64 73 20 61 20 63 6f 70 79 20   appends a copy 
1c8d0 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  of the position-
1c8e0 6c 69 73 74 20 6f 66 20 74 68 65 20 65 6e 74 72  list of the entr
1c8f0 79 20 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72  y pMulti .** cur
1c900 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1c910 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
1c920 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1c930 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
1c940 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
1c950 20 69 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69 73   in p->rc. It is
1c960 20 61 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65   assumed.** no e
1c970 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
1c980 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
1c990 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c9a0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
1c9b0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
1c9c0 49 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46  IterPoslist(.  F
1c9d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
1c9e0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
1c9f0 2a 70 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62  *pMulti,.  int b
1ca00 53 7a 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72  Sz,.  Fts5Buffer
1ca10 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20   *pBuf.){.  if( 
1ca20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ca30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 68 75 6e   ){.    Fts5Chun
1ca40 6b 49 74 65 72 20 69 74 65 72 3b 0a 20 20 20 20  kIter iter;.    
1ca50 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
1ca60 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65  g = &pMulti->aSe
1ca70 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73  g[ pMulti->aFirs
1ca80 74 5b 31 5d 20 5d 3b 0a 20 20 20 20 61 73 73 65  t[1] ];.    asse
1ca90 72 74 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  rt( fts5MultiIte
1caa0 72 45 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d  rEof(p, pMulti)=
1cab0 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 43 68  =0 );.    fts5Ch
1cac0 75 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70  unkIterInit(p, p
1cad0 53 65 67 2c 20 26 69 74 65 72 29 3b 0a 20 20 20  Seg, &iter);.   
1cae0 20 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74   if( fts5ChunkIt
1caf0 65 72 45 6f 66 28 70 2c 20 26 69 74 65 72 29 3d  erEof(p, &iter)=
1cb00 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1cb10 62 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 66  bSz ){.        f
1cb20 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1cb30 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70 42  arint(&p->rc, pB
1cb40 75 66 2c 20 69 74 65 72 2e 6e 52 65 6d 29 3b 0a  uf, iter.nRem);.
1cb50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
1cb60 69 6c 65 28 20 66 74 73 35 43 68 75 6e 6b 49 74  ile( fts5ChunkIt
1cb70 65 72 45 6f 66 28 70 2c 20 26 69 74 65 72 29 3d  erEof(p, &iter)=
1cb80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  =0 ){.        ft
1cb90 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1cba0 6f 62 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ob(&p->rc, pBuf,
1cbb0 20 69 74 65 72 2e 6e 2c 20 69 74 65 72 2e 70 29   iter.n, iter.p)
1cbc0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68  ;.        fts5Ch
1cbd0 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 26  unkIterNext(p, &
1cbe0 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iter);.      }. 
1cbf0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 43 68 75     }.    fts5Chu
1cc00 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 26 69  nkIterRelease(&i
1cc10 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
1cc20 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63  tic void fts5Doc
1cc30 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73  listIterNext(Fts
1cc40 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49  5DoclistIter *pI
1cc50 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
1cc60 72 2d 3e 69 3c 70 49 74 65 72 2d 3e 6e 20 29 7b  r->i<pIter->n ){
1cc70 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
1cc80 69 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  i ){.      i64 i
1cc90 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 70 49 74  Delta;.      pIt
1cca0 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72 69  er->i += getVari
1ccb0 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74  nt(&pIter->a[pIt
1ccc0 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 69  er->i], (u64*)&i
1ccd0 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66  Delta);.      if
1cce0 28 20 70 49 74 65 72 2d 3e 62 44 65 73 63 20 29  ( pIter->bDesc )
1ccf0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
1cd00 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74  >iRowid -= iDelt
1cd10 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  a;.      }else{.
1cd20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
1cd30 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
1cd40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1cd50 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  se{.      pIter-
1cd60 3e 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  >i += getVarint(
1cd70 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d  &pIter->a[pIter-
1cd80 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  >i], (u64*)&pIte
1cd90 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
1cda0 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b  }.    pIter->i +
1cdb0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
1cdc0 32 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  2(&pIter->a[pIte
1cdd0 72 2d 3e 69 5d 2c 20 70 49 74 65 72 2d 3e 6e 50  r->i], pIter->nP
1cde0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
1cdf0 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26  er->aPoslist = &
1ce00 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e  pIter->a[pIter->
1ce10 69 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  i];.    pIter->i
1ce20 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c   += pIter->nPosl
1ce30 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ist;.  }else{.  
1ce40 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73    pIter->aPoslis
1ce50 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  t = 0;.  }.}..st
1ce60 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
1ce70 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20  clistIterInit(. 
1ce80 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
1ce90 66 2c 20 0a 20 20 69 6e 74 20 62 44 65 73 63 2c  f, .  int bDesc,
1cea0 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49   .  Fts5DoclistI
1ceb0 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20  ter *pIter.){.  
1cec0 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
1ced0 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
1cee0 3b 0a 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 70  ;.  pIter->a = p
1cef0 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d  Buf->p;.  pIter-
1cf00 3e 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20  >n = pBuf->n;.  
1cf10 70 49 74 65 72 2d 3e 62 44 65 73 63 20 3d 20 62  pIter->bDesc = b
1cf20 44 65 73 63 3b 0a 20 20 66 74 73 35 44 6f 63 6c  Desc;.  fts5Docl
1cf30 69 73 74 49 74 65 72 4e 65 78 74 28 70 49 74 65  istIterNext(pIte
1cf40 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  r);.}../*.** App
1cf50 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74 6f  end a doclist to
1cf60 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2f   buffer pBuf..*/
1cf70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1cf80 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
1cf90 64 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  d(.  int *pRc,  
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1cfc0 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  Error code */.  
1cfd0 69 6e 74 20 62 44 65 73 63 2c 0a 20 20 46 74 73  int bDesc,.  Fts
1cfe0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20  5Buffer *pBuf,  
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d000 42 75 66 66 65 72 20 74 6f 20 77 72 69 74 65 20  Buffer to write 
1d010 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c  to */.  i64 *piL
1d020 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20  astRowid,       
1d030 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
1d040 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  T: Previous rowi
1d050 64 20 77 72 69 74 74 65 6e 20 28 69 66 20 61 6e  d written (if an
1d060 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  y) */.  i64 iRow
1d070 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
1d080 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1d090 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b   to append */.){
1d0a0 0a 20 20 69 66 28 20 70 42 75 66 2d 3e 6e 3d 3d  .  if( pBuf->n==
1d0b0 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  0 ){.    fts5Buf
1d0c0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d0d0 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69  pRc, pBuf, iRowi
1d0e0 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  d);.  }else if( 
1d0f0 62 44 65 73 63 20 29 7b 0a 20 20 20 20 66 74 73  bDesc ){.    fts
1d100 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d110 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20 2a  int(pRc, pBuf, *
1d120 70 69 4c 61 73 74 52 6f 77 69 64 20 2d 20 69 52  piLastRowid - iR
1d130 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
1d140 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1d150 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20  pendVarint(pRc, 
1d160 70 42 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a  pBuf, iRowid - *
1d170 70 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20  piLastRowid);.  
1d180 7d 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  }.  *piLastRowid
1d190 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a   = iRowid;.}../*
1d1a0 0a 2a 2a 20 42 75 66 66 65 72 73 20 70 31 20 61  .** Buffers p1 a
1d1b0 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f  nd p2 contain do
1d1c0 63 6c 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e  clists. This fun
1d1d0 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65  ction merges the
1d1e0 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74   content.** of t
1d1f0 68 65 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20  he two doclists 
1d200 74 6f 67 65 74 68 65 72 20 61 6e 64 20 73 65 74  together and set
1d210 73 20 62 75 66 66 65 72 20 70 31 20 74 6f 20 74  s buffer p1 to t
1d220 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65  he result before
1d230 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  .** returning..*
1d240 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1d250 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
1d260 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
1d270 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65  n p->rc. If an e
1d280 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65  rror has.** alre
1d290 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
1d2a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1d2b0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1d2c0 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
1d2d0 50 72 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46  PrefixLists(.  F
1d2e0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d300 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1d310 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62  bject */.  int b
1d320 44 65 73 63 2c 0a 20 20 46 74 73 35 42 75 66 66  Desc,.  Fts5Buff
1d330 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20  er *p1,         
1d340 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1d350 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
1d360 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
1d370 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
1d380 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69      /* Second li
1d390 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  st to merge */.)
1d3a0 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b  {.  if( p2->n ){
1d3b0 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
1d3c0 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
1d3d0 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b  5DoclistIter i1;
1d3e0 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
1d3f0 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73  Iter i2;.    Fts
1d400 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20 20  5Buffer out;.   
1d410 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 3b   Fts5Buffer tmp;
1d420 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 75 74  .    memset(&out
1d430 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29  , 0, sizeof(out)
1d440 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  );.    memset(&t
1d450 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 6d  mp, 0, sizeof(tm
1d460 70 29 29 3b 0a 0a 20 20 20 20 66 74 73 35 44 6f  p));..    fts5Do
1d470 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 31  clistIterInit(p1
1d480 2c 20 62 44 65 73 63 2c 20 26 69 31 29 3b 0a 20  , bDesc, &i1);. 
1d490 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
1d4a0 65 72 49 6e 69 74 28 70 32 2c 20 62 44 65 73 63  erInit(p2, bDesc
1d4b0 2c 20 26 69 32 29 3b 0a 20 20 20 20 77 68 69 6c  , &i2);.    whil
1d4c0 65 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 21 3d  e( i1.aPoslist!=
1d4d0 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74  0 || i2.aPoslist
1d4e0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1d4f0 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20   i2.aPoslist==0 
1d500 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 20  || (i1.aPoslist 
1d510 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 28  && .           (
1d520 20 28 62 44 65 73 63 20 26 26 20 69 31 2e 69 52   (bDesc && i1.iR
1d530 6f 77 69 64 3e 69 32 2e 69 52 6f 77 69 64 29 20  owid>i2.iRowid) 
1d540 7c 7c 20 28 21 62 44 65 73 63 20 26 26 20 69 31  || (!bDesc && i1
1d550 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69  .iRowid<i2.iRowi
1d560 64 29 20 29 0a 20 20 20 20 20 20 29 29 7b 0a 20  d) ).      )){. 
1d570 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
1d580 6e 74 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a  ntry from i1 */.
1d590 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
1d5a0 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d  eAppendDocid(&p-
1d5b0 3e 72 63 2c 20 62 44 65 73 63 2c 20 26 6f 75 74  >rc, bDesc, &out
1d5c0 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  , &iLastRowid, i
1d5d0 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  1.iRowid);.     
1d5e0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1d5f0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d600 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73 6c  , &out, i1.nPosl
1d610 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ist);.        ft
1d620 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1d630 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ob(&p->rc, &out,
1d640 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 31   i1.nPoslist, i1
1d650 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
1d660 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
1d670 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
1d680 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
1d690 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74   if( i1.aPoslist
1d6a0 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64  ==0 || i2.iRowid
1d6b0 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20  !=i1.iRowid ){. 
1d6c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
1d6d0 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a  ntry from i2 */.
1d6e0 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
1d6f0 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d  eAppendDocid(&p-
1d700 3e 72 63 2c 20 62 44 65 73 63 2c 20 26 6f 75 74  >rc, bDesc, &out
1d710 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  , &iLastRowid, i
1d720 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
1d730 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1d740 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1d750 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c  , &out, i2.nPosl
1d760 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ist);.        ft
1d770 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1d780 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ob(&p->rc, &out,
1d790 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 32   i2.nPoslist, i2
1d7a0 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
1d7b0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
1d7c0 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20  terNext(&i2);.  
1d7d0 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
1d7e0 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  {.        Fts5Po
1d7f0 73 6c 69 73 74 52 65 61 64 65 72 20 72 31 3b 0a  slistReader r1;.
1d800 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
1d810 69 73 74 52 65 61 64 65 72 20 72 32 3b 0a 20 20  istReader r2;.  
1d820 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
1d830 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  tWriter writer;.
1d840 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
1d850 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  &writer, 0, size
1d860 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20  of(writer));..  
1d870 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74        /* Merge t
1d880 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20  he two position 
1d890 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20  lists. */ .     
1d8a0 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
1d8b0 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20  ndDocid(&p->rc, 
1d8c0 62 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c  bDesc, &out, &iL
1d8d0 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
1d8e0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
1d8f0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d  s5BufferZero(&tm
1d900 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  p);.        sqli
1d910 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
1d920 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e  aderInit(-1, i1.
1d930 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
1d940 73 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20  slist, &r1);.   
1d950 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1d960 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
1d970 74 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73  t(-1, i2.aPoslis
1d980 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20  t, i2.nPoslist, 
1d990 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68  &r2);.        wh
1d9a0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1d9b0 54 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f  TE_OK && (r1.bEo
1d9c0 66 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d  f==0 || r2.bEof=
1d9d0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
1d9e0 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20   i64 iNew;.     
1d9f0 20 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66       if( r2.bEof
1da00 20 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20   || (r1.bEof==0 
1da10 26 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50  && r1.iPos<r2.iP
1da20 6f 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os) ){.         
1da30 20 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f     iNew = r1.iPo
1da40 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  s;.            s
1da50 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1da60 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29  tReaderNext(&r1)
1da70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1da80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e{.            i
1da90 4e 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20  New = r2.iPos;. 
1daa0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1dab0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
1dac0 64 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20  derNext(&r2);.  
1dad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
1dae0 2e 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29  .iPos==r2.iPos )
1daf0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1db00 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72  istReaderNext(&r
1db10 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  1);.          }.
1db20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1db30 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  = sqlite3Fts5Pos
1db40 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64  listWriterAppend
1db50 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20  (&tmp, &writer, 
1db60 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  iNew);.        }
1db70 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ..        fts5Bu
1db80 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1db90 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74  (&p->rc, &out, t
1dba0 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66  mp.n);.        f
1dbb0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1dbc0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  lob(&p->rc, &out
1dbd0 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70 29 3b  , tmp.n, tmp.p);
1dbe0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
1dbf0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
1dc00 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1dc10 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
1dc20 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i2);.      }.   
1dc30 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
1dc40 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31  erSet(&p->rc, p1
1dc50 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b  , out.n, out.p);
1dc60 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
1dc70 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66  ree(&tmp);.    f
1dc80 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f  ts5BufferFree(&o
1dc90 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ut);.  }.}..stat
1dca0 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66  ic void fts5Buff
1dcb0 65 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65  erSwap(Fts5Buffe
1dcc0 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65  r *p1, Fts5Buffe
1dcd0 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75  r *p2){.  Fts5Bu
1dce0 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a  ffer tmp = *p1;.
1dcf0 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a    *p1 = *p2;.  *
1dd00 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61  p2 = tmp;.}..sta
1dd10 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74  tic void fts5Set
1dd20 75 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20  upPrefixIter(.  
1dd30 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64  /* Index to read
1dd60 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62   from */.  int b
1dd70 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20  Desc,           
1dd80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1dd90 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59  ue for "ORDER BY
1dda0 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a   rowid DESC" */.
1ddb0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b    const u8 *pTok
1ddc0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
1ddd0 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
1dde0 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f  aining prefix to
1ddf0 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20   match */.  int 
1de00 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  nToken,         
1de10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1de20 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54  ize of buffer pT
1de30 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  oken in bytes */
1de40 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
1de50 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
1de60 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
1de70 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
1de80 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1de90 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
1dea0 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20  5Buffer *aBuf;. 
1deb0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20   const int nBuf 
1dec0 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66 20 3d 20  = 32;..  aBuf = 
1ded0 28 46 74 73 35 42 75 66 66 65 72 2a 29 66 74 73  (Fts5Buffer*)fts
1dee0 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
1def0 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
1df00 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63  *nBuf);.  pStruc
1df10 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
1df20 65 52 65 61 64 28 70 2c 20 30 29 3b 0a 0a 20 20  eRead(p, 0);..  
1df30 69 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72  if( aBuf && pStr
1df40 75 63 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44  uct ){.    Fts5D
1df50 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 44 6f 63  oclistIter *pDoc
1df60 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  list;.    int i;
1df70 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
1df80 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
1df90 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
1dfa0 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74  1 = 0;     /* It
1dfb0 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67  erator used to g
1dfc0 61 74 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20  ather data from 
1dfd0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73  index */.    Fts
1dfe0 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b  5Buffer doclist;
1dff0 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f  ..    memset(&do
1e000 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  clist, 0, sizeof
1e010 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20  (doclist));.    
1e020 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
1e030 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
1e040 20 30 2c 20 31 2c 20 31 2c 20 70 54 6f 6b 65 6e   0, 1, 1, pToken
1e050 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c  , nToken, -1, 0,
1e060 20 26 70 31 29 3b 0a 20 20 20 20 20 20 20 20 66   &p1);.        f
1e070 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
1e080 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20  p, p1)==0;.     
1e090 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1e0a0 4e 65 78 74 28 70 2c 20 70 31 2c 20 30 2c 20 30  Next(p, p1, 0, 0
1e0b0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
1e0c0 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
1e0d0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
1e0e0 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  1);.      int nT
1e0f0 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  erm;.      const
1e100 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73   u8 *pTerm = fts
1e110 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
1e120 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  1, &nTerm);.    
1e130 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
1e140 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
1e150 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72  MIN(nToken, nTer
1e160 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20  m))<=0 );.      
1e170 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e  if( nTerm<nToken
1e180 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65   || memcmp(pToke
1e190 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e  n, pTerm, nToken
1e1a0 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  ) ) break;..    
1e1b0 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3e    if( doclist.n>
1e1c0 30 20 0a 20 20 20 20 20 20 20 26 26 20 28 28 21  0 .       && ((!
1e1d0 62 44 65 73 63 20 26 26 20 69 52 6f 77 69 64 3c  bDesc && iRowid<
1e1e0 3d 69 4c 61 73 74 52 6f 77 69 64 29 20 7c 7c 20  =iLastRowid) || 
1e1f0 28 62 44 65 73 63 20 26 26 20 69 52 6f 77 69 64  (bDesc && iRowid
1e200 3e 3d 69 4c 61 73 74 52 6f 77 69 64 29 29 0a 20  >=iLastRowid)). 
1e210 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20       ){..       
1e220 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
1e230 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 6f  =SQLITE_OK && do
1e240 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  clist.n; i++){. 
1e250 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1e260 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20 20   i<nBuf );.     
1e270 20 20 20 20 20 69 66 28 20 61 42 75 66 5b 69 5d       if( aBuf[i]
1e280 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
1e290 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1e2a0 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26 61  wap(&doclist, &a
1e2b0 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
1e2c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
1e2d0 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20  ero(&doclist);. 
1e2e0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1e300 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
1e310 28 70 2c 20 62 44 65 73 63 2c 20 26 64 6f 63 6c  (p, bDesc, &docl
1e320 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
1e330 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1e340 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66  BufferZero(&aBuf
1e350 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
1e360 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1e370 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 6f    }.      if( do
1e380 63 6c 69 73 74 2e 6e 3d 3d 30 20 29 7b 0a 20 20  clist.n==0 ){.  
1e390 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1e3a0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1e3b0 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69  >rc, &doclist, i
1e3c0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65  Rowid);.      }e
1e3d0 6c 73 65 20 69 66 28 20 62 44 65 73 63 20 29 7b  lse if( bDesc ){
1e3e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1e3f0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1e400 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74  &p->rc, &doclist
1e410 2c 20 69 4c 61 73 74 52 6f 77 69 64 20 2d 20 69  , iLastRowid - i
1e420 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65  Rowid);.      }e
1e430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
1e440 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1e450 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63  int(&p->rc, &doc
1e460 6c 69 73 74 2c 20 69 52 6f 77 69 64 20 2d 20 69  list, iRowid - i
1e470 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 20 20  LastRowid);.    
1e480 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 52    }.      iLastR
1e490 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1e4a0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1e4b0 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 31 2c  erPoslist(p, p1,
1e4c0 20 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20   1, &doclist);. 
1e4d0 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
1e4e0 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b  0; i<nBuf; i++){
1e4f0 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65  .      fts5Merge
1e500 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20 62  PrefixLists(p, b
1e510 44 65 73 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20  Desc, &doclist, 
1e520 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
1e530 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1e540 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d  &aBuf[i]);.    }
1e550 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
1e560 65 72 46 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a  erFree(p, p1);..
1e570 20 20 20 20 70 44 6f 63 6c 69 73 74 20 3d 20 28      pDoclist = (
1e580 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 2a  Fts5DoclistIter*
1e590 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
1e5a0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6f 63  , sizeof(Fts5Doc
1e5b0 6c 69 73 74 49 74 65 72 29 29 3b 0a 20 20 20 20  listIter));.    
1e5c0 69 66 28 20 21 70 44 6f 63 6c 69 73 74 20 29 7b  if( !pDoclist ){
1e5d0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1e5e0 72 46 72 65 65 28 26 64 6f 63 6c 69 73 74 29 3b  rFree(&doclist);
1e5f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e600 20 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73    pIter->pDoclis
1e610 74 20 3d 20 70 44 6f 63 6c 69 73 74 3b 0a 20 20  t = pDoclist;.  
1e620 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
1e630 74 65 72 49 6e 69 74 28 26 64 6f 63 6c 69 73 74  terInit(&doclist
1e640 2c 20 62 44 65 73 63 2c 20 70 49 74 65 72 2d 3e  , bDesc, pIter->
1e650 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d  pDoclist);.    }
1e660 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 74 72 75  .  }..  fts5Stru
1e670 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1e680 72 75 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ruct);.  sqlite3
1e690 5f 66 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a  _free(aBuf);.}..
1e6a0 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e  /*.** Run intern
1e6b0 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e 73  al checks to ens
1e6c0 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54 53  ure that the FTS
1e6d0 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69 6e   index (a) is in
1e6e0 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e  ternally .** con
1e6f0 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29 20  sistent and (b) 
1e700 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
1e710 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 58   for which the X
1e720 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73  OR of the checks
1e730 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c  ums.** as calcul
1e740 61 74 65 64 20 62 79 20 66 74 73 35 49 6e 64 65  ated by fts5Inde
1e750 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73  xEntryCksum() is
1e760 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65   cksum..**.** Re
1e770 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1e780 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68  UPT if any of th
1e790 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  e internal check
1e7a0 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68  s fail, or if th
1e7b0 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f  e.** checksum do
1e7c0 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65  es not match. Re
1e7d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1e7e0 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73  f all checks pas
1e7f0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72  s without.** err
1e800 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  or, or some othe
1e810 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  r SQLite error c
1e820 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65  ode if another e
1e830 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a  rror (e.g. OOM).
1e840 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
1e850 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
1e860 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
1e870 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75  (Fts5Index *p, u
1e880 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 46 74 73  64 cksum){.  Fts
1e890 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1e8a0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
1e8b0 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20   int iIdx;      
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8d0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
1e8e0 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
1e8f0 78 65 73 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  xes */.  u64 cks
1e900 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um2 = 0;        
1e910 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
1e920 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
1e930 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
1e940 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
1e950 20 74 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e   that the intern
1e960 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68  al nodes of each
1e970 20 73 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74   segment match t
1e980 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 66  he leaves */.  f
1e990 6f 72 28 69 49 64 78 3d 30 3b 20 70 2d 3e 72 63  or(iIdx=0; p->rc
1e9a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1e9b0 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
1e9c0 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
1e9d0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1e9e0 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73  e *pStruct = fts
1e9f0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
1ea00 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , iIdx);.    if(
1ea10 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
1ea20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67    int iLvl, iSeg
1ea30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c  ;.      for(iLvl
1ea40 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
1ea50 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
1ea60 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
1ea70 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72  Seg=0; iSeg<pStr
1ea80 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1ea90 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ].nSeg; iSeg++){
1eaa0 0a 20 20 20 20 20 20 20 20 20 20 46 74 73 35 53  .          Fts5S
1eab0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
1eac0 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74  *pSeg = &pStruct
1ead0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
1eae0 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
1eaf0 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e       fts5IndexIn
1eb00 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
1eb10 65 6e 74 28 70 2c 20 69 49 64 78 2c 20 70 53 65  ent(p, iIdx, pSe
1eb20 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
1eb30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1eb40 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1eb50 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
1eb60 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
1eb70 68 61 74 20 74 68 65 20 63 68 65 63 6b 73 75 6d  hat the checksum
1eb80 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6d 61   of the index ma
1eb90 74 63 68 65 73 20 74 68 65 20 61 72 67 75 6d 65  tches the argume
1eba0 6e 74 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  nt checksum */. 
1ebb0 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49 64   for(iIdx=0; iId
1ebc0 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x<=pConfig->nPre
1ebd0 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20  fix; iIdx++){.  
1ebe0 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
1ebf0 65 72 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 46  er *pIter;.    F
1ec00 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1ec10 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
1ec20 63 74 75 72 65 52 65 61 64 28 70 2c 20 69 49 64  ctureRead(p, iId
1ec30 78 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35  x);.    for(fts5
1ec40 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
1ec50 70 53 74 72 75 63 74 2c 20 69 49 64 78 2c 20 30  pStruct, iIdx, 0
1ec60 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30  , 0, 0, 0, -1, 0
1ec70 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
1ec80 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1ec90 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30  Eof(p, pIter)==0
1eca0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
1ecb0 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
1ecc0 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 20 20  Iter, 0, 0).    
1ecd0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73  ){.      Fts5Pos
1ece0 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20  Iter sPos;      
1ecf0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1ed00 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1ed10 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
1ed20 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20  .      int n;   
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
1ed50 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
1ed60 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
1ed70 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
1ed80 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
1ed90 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
1eda0 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
1edb0 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29  rTerm(pIter, &n)
1edc0 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73  ;..      for(fts
1edd0 35 50 6f 73 49 74 65 72 49 6e 69 74 28 70 2c 20  5PosIterInit(p, 
1ede0 70 49 74 65 72 2c 20 26 73 50 6f 73 29 3b 0a 20  pIter, &sPos);. 
1edf0 20 20 20 20 20 20 20 20 20 66 74 73 35 50 6f 73           fts5Pos
1ee00 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73  IterEof(p, &sPos
1ee10 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
1ee20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28  fts5PosIterNext(
1ee30 70 2c 20 26 73 50 6f 73 29 0a 20 20 20 20 20 20  p, &sPos).      
1ee40 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  ){.        cksum
1ee50 32 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  2 ^= fts5IndexEn
1ee60 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
1ee70 20 73 50 6f 73 2e 69 43 6f 6c 2c 20 73 50 6f 73   sPos.iCol, sPos
1ee80 2e 69 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a 23 69  .iPos, z, n);.#i
1ee90 66 20 30 0a 20 20 20 20 20 20 20 20 66 70 72 69  f 0.        fpri
1eea0 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72 6f 77  ntf(stdout, "row
1eeb0 69 64 3d 25 64 20 22 2c 20 28 69 6e 74 29 69 52  id=%d ", (int)iR
1eec0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
1eed0 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
1eee0 74 65 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e 2c 20  term=%.*s ", n, 
1eef0 7a 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  z);.        fpri
1ef00 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 63 6f 6c  ntf(stdout, "col
1ef10 3d 25 64 20 22 2c 20 73 50 6f 73 2e 69 43 6f 6c  =%d ", sPos.iCol
1ef20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
1ef30 74 66 28 73 74 64 6f 75 74 2c 20 22 6f 66 66 3d  tf(stdout, "off=
1ef40 25 64 5c 6e 22 2c 20 73 50 6f 73 2e 69 50 6f 73  %d\n", sPos.iPos
1ef50 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
1ef60 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69  h(stdout);.#endi
1ef70 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  f.      }.    }.
1ef80 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1ef90 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b  rFree(p, pIter);
1efa0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1efb0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
1efc0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  t);.  }.  if( p-
1efd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1efe0 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20  & cksum!=cksum2 
1eff0 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
1f000 4f 52 52 55 50 54 3b 0a 0a 20 20 72 65 74 75 72  ORRUPT;..  retur
1f010 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
1f020 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n(p);.}.../*.** 
1f030 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c  Indicate that al
1f040 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  l subsequent cal
1f050 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ls to sqlite3Fts
1f060 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65  5IndexWrite() pe
1f070 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  rtain.** to the 
1f080 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f  document with ro
1f090 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69  wid iRowid..*/.i
1f0a0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
1f0b0 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74  dexBeginWrite(Ft
1f0c0 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
1f0d0 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72  iRowid){.  asser
1f0e0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
1f0f0 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _OK );..  /* All
1f100 6f 63 61 74 65 20 68 61 73 68 20 74 61 62 6c 65  ocate hash table
1f110 73 20 69 66 20 74 68 65 79 20 68 61 76 65 20 6e  s if they have n
1f120 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
1f130 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
1f140 66 28 20 70 2d 3e 61 70 48 61 73 68 3d 3d 30 20  f( p->apHash==0 
1f150 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1f160 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f170 45 5f 4f 4b 3b 0a 20 20 20 20 69 6e 74 20 6e 48  E_OK;.    int nH
1f180 61 73 68 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ash = p->pConfig
1f190 2d 3e 6e 50 72 65 66 69 78 20 2b 20 31 3b 0a 20  ->nPrefix + 1;. 
1f1a0 20 20 20 46 74 73 35 48 61 73 68 20 2a 2a 61 70     Fts5Hash **ap
1f1b0 4e 65 77 3b 0a 0a 20 20 20 20 61 70 4e 65 77 20  New;..    apNew 
1f1c0 3d 20 28 46 74 73 35 48 61 73 68 2a 2a 29 73 71  = (Fts5Hash**)sq
1f1d0 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
1f1e0 65 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28  ero(&rc, sizeof(
1f1f0 46 74 73 35 48 61 73 68 2a 29 2a 6e 48 61 73 68  Fts5Hash*)*nHash
1f200 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1f210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1f220 20 69 3c 6e 48 61 73 68 3b 20 69 2b 2b 29 7b 0a   i<nHash; i++){.
1f230 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f240 65 33 46 74 73 35 48 61 73 68 4e 65 77 28 26 61  e3Fts5HashNew(&a
1f250 70 4e 65 77 5b 69 5d 2c 20 26 70 2d 3e 6e 50 65  pNew[i], &p->nPe
1f260 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 20 20  ndingData);.    
1f270 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1f280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f290 20 70 2d 3e 61 70 48 61 73 68 20 3d 20 61 70 4e   p->apHash = apN
1f2a0 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ew;.    }else{. 
1f2b0 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 20 29       if( apNew )
1f2c0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
1f2d0 30 3b 20 69 3c 6e 48 61 73 68 3b 20 69 2b 2b 29  0; i<nHash; i++)
1f2e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1f2f0 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28  te3Fts5HashFree(
1f300 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  apNew[i]);.     
1f310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
1f320 69 74 65 33 5f 66 72 65 65 28 61 70 4e 65 77 29  ite3_free(apNew)
1f330 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f340 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f350 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 52 6f 77  .  }..  if( iRow
1f360 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77  id<=p->iWriteRow
1f370 69 64 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69  id || (p->nPendi
1f380 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e 4d 61 78  ngData > p->nMax
1f390 50 65 6e 64 69 6e 67 44 61 74 61 29 20 29 7b 0a  PendingData) ){.
1f3a0 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75      fts5IndexFlu
1f3b0 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  sh(p);.  }.  p->
1f3c0 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52  iWriteRowid = iR
1f3d0 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 66  owid;.  return f
1f3e0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
1f3f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1f400 69 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e  it data to disk.
1f410 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
1f420 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73  ts5IndexSync(Fts
1f430 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62  5Index *p, int b
1f440 43 6f 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72  Commit){.  asser
1f450 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
1f460 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64  _OK );.  fts5Ind
1f470 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66  exFlush(p);.  if
1f480 28 20 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35  ( bCommit ) fts5
1f490 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
1f4a0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
1f4b0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
1f4c0 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e  /*.** Discard an
1f4d0 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
1f4e0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
1f4f0 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e  ash tables. Do n
1f500 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74  ot write it.** t
1f510 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
1f520 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73  Additionally, as
1f530 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f  sume that the co
1f540 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f  ntents of the %_
1f550 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61  data.** table ma
1f560 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f  y have changed o
1f570 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69  n disk. So any i
1f580 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20  n-memory caches 
1f590 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65  of %_data .** re
1f5a0 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e  cords must be in
1f5b0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e  validated..*/.in
1f5c0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
1f5d0 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49  exRollback(Fts5I
1f5e0 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35  ndex *p){.  fts5
1f5f0 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
1f600 20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61    fts5IndexDisca
1f610 72 64 44 61 74 61 28 70 29 3b 0a 20 20 61 73 73  rdData(p);.  ass
1f620 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
1f630 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
1f640 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f650 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61  /*.** The %_data
1f660 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65   table is comple
1f670 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20  tely empty when 
1f680 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1f690 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a   called. This.**
1f6a0 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
1f6b0 74 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20  tes it with the 
1f6c0 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72  initial structur
1f6d0 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  e objects for ea
1f6e0 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64  ch index,.** and
1f6f0 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72   the initial ver
1f700 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65  sion of the "ave
1f710 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61  rages" record (a
1f720 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29   zero-byte blob)
1f730 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f740 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28  Fts5IndexReinit(
1f750 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
1f760 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 53 74   int i;.  Fts5St
1f770 72 75 63 74 75 72 65 20 73 3b 0a 0a 20 20 6d 65  ructure s;..  me
1f780 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
1f790 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
1f7a0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ));.  for(i=0; i
1f7b0 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  <p->pConfig->nPr
1f7c0 65 66 69 78 2b 31 3b 20 69 2b 2b 29 7b 0a 20 20  efix+1; i++){.  
1f7d0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57    fts5StructureW
1f7e0 72 69 74 65 28 70 2c 20 69 2c 20 26 73 29 3b 0a  rite(p, i, &s);.
1f7f0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d    }.  if( p->rc=
1f800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f810 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
1f820 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65  3Fts5IndexSetAve
1f830 72 61 67 65 73 28 70 2c 20 28 63 6f 6e 73 74 20  rages(p, (const 
1f840 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 7d 0a  u8*)"", 0);.  }.
1f850 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
1f860 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
1f870 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
1f880 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  w Fts5Index hand
1f890 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65 61  le. If the bCrea
1f8a0 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  te argument is t
1f8b0 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61  rue, create.** a
1f8c0 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
1f8d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64  e underlying %_d
1f8e0 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ata table..**.**
1f8f0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1f900 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
1f910 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
1f920 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
1f930 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65  LITE_OK..** Othe
1f940 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74  rwise, set *pp t
1f950 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72  o NULL and retur
1f960 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
1f970 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
1f980 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
1f990 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  pen(.  Fts5Confi
1f9a0 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69  g *pConfig, .  i
1f9b0 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46  nt bCreate, .  F
1f9c0 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20  ts5Index **pp,. 
1f9d0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
1f9e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f9f0 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64  TE_OK;.  Fts5Ind
1fa00 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ex *p;          
1fa10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
1fa20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70  object */..  *pp
1fa30 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65   = p = (Fts5Inde
1fa40 78 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  x*)sqlite3_mallo
1fa50 63 28 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  c(sizeof(Fts5Ind
1fa60 65 78 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ex));.  if( !p )
1fa70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1fa80 4f 4d 45 4d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  OMEM;..  memset(
1fa90 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  p, 0, sizeof(Fts
1faa0 35 49 6e 64 65 78 29 29 3b 0a 20 20 70 2d 3e 70  5Index));.  p->p
1fab0 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67  Config = pConfig
1fac0 3b 0a 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  ;.  p->nWorkUnit
1fad0 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49   = FTS5_WORK_UNI
1fae0 54 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64  T;.  p->nMaxPend
1faf0 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31  ingData = 1024*1
1fb00 30 32 34 3b 0a 20 20 70 2d 3e 7a 44 61 74 61 54  024;.  p->zDataT
1fb10 62 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  bl = sqlite3_mpr
1fb20 69 6e 74 66 28 22 25 73 5f 64 61 74 61 22 2c 20  intf("%s_data", 
1fb30 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b  pConfig->zName);
1fb40 0a 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54  .  if( p->zDataT
1fb50 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  bl==0 ){.    rc 
1fb60 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1fb70 20 20 7d 65 6c 73 65 20 69 66 28 20 62 43 72 65    }else if( bCre
1fb80 61 74 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ate ){.    rc = 
1fb90 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
1fba0 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20  eTable(.        
1fbb0 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c  pConfig, "data",
1fbc0 20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   "id INTEGER PRI
1fbd0 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20  MARY KEY, block 
1fbe0 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a  BLOB", 0, pzErr.
1fbf0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
1fc00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fc10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fc20 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69  e3Fts5IndexReini
1fc30 74 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(p);.    }.  }.
1fc40 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1fc50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72  ==SQLITE_OK || r
1fc60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1fc70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1fc80 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
1fc90 43 6c 6f 73 65 28 70 2c 20 30 29 3b 0a 20 20 20  Close(p, 0);.   
1fca0 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
1fcb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1fcc0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64  .** Close a hand
1fcd0 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  le opened by an 
1fce0 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
1fcf0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
1fd00 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Open()..*/.int s
1fd10 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
1fd20 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  lose(Fts5Index *
1fd30 70 2c 20 69 6e 74 20 62 44 65 73 74 72 6f 79 29  p, int bDestroy)
1fd40 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1fd50 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1fd60 29 7b 0a 20 20 20 20 69 66 28 20 62 44 65 73 74  ){.    if( bDest
1fd70 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  roy ){.      rc 
1fd80 3d 20 73 71 6c 69 74 65 33 46 74 73 35 44 72 6f  = sqlite3Fts5Dro
1fd90 70 54 61 62 6c 65 28 70 2d 3e 70 43 6f 6e 66 69  pTable(p->pConfi
1fda0 67 2c 20 22 64 61 74 61 22 29 3b 0a 20 20 20 20  g, "data");.    
1fdb0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  }.    assert( p-
1fdc0 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20  >pReader==0 );. 
1fdd0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1fde0 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  ize(p->pWriter);
1fdf0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
1fe00 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65  alize(p->pDelete
1fe10 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  r);.    if( p->a
1fe20 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 69  pHash ){.      i
1fe30 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
1fe40 69 3d 30 3b 20 69 3c 3d 70 2d 3e 70 43 6f 6e 66  i=0; i<=p->pConf
1fe50 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b  ig->nPrefix; i++
1fe60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1fe70 65 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70  e3Fts5HashFree(p
1fe80 2d 3e 61 70 48 61 73 68 5b 69 5d 29 3b 0a 20 20  ->apHash[i]);.  
1fe90 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1fea0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 48 61  te3_free(p->apHa
1feb0 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  sh);.    }.    s
1fec0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
1fed0 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71  DataTbl);.    sq
1fee0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1fef0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ff00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  }../*.** Argumen
1ff10 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  t p points to a 
1ff20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
1ff30 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68 61  g utf-8 text tha
1ff40 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20  t is n bytes in 
1ff50 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e  .** size. Return
1ff60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1ff70 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61  ytes in the nCha
1ff80 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65 66  r character pref
1ff90 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66  ix of the.** buf
1ffa0 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65  fer, or 0 if the
1ffb0 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e  re are less than
1ffc0 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72   nChar character
1ffd0 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73  s in total..*/.s
1ffe0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
1fff0 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
20000 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  len(const char *
20010 70 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  p, int nByte, in
20020 74 20 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74 20  t nChar){.  int 
20030 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  n = 0;.  int i;.
20040 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68    for(i=0; i<nCh
20050 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ar; i++){.    if
20060 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74  ( n>=nByte ) ret
20070 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49  urn 0;      /* I
20080 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65  nput contains fe
20090 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63  wer than nChar c
200a0 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  hars */.    if( 
200b0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
200c0 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20  [n++]>=0xc0 ){. 
200d0 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e       while( (p[n
200e0 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
200f0 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ) n++;.    }.  }
20100 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
20110 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55  /*.** pIn is a U
20120 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  TF-8 encoded str
20130 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69  ing, nIn bytes i
20140 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74  n size. Return t
20150 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
20160 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
20170 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67  rs in the string
20180 2e 0a 2a 2f 0a 69 6e 74 20 66 74 73 35 49 6e 64  ..*/.int fts5Ind
20190 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20  exCharlen(const 
201a0 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e  char *pIn, int n
201b0 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  In){.  int nChar
201c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
201d0 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20   .  int i = 0;. 
201e0 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b   while( i<nIn ){
201f0 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e  .    if( (unsign
20200 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d  ed char)pIn[i++]
20210 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
20220 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20  while( i<nIn && 
20230 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d  (pIn[i] & 0xc0)=
20240 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20  =0x80 ) i++;.   
20250 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a   }.    nChar++;.
20260 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68    }.  return nCh
20270 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  ar;.}../*.** Cal
20280 63 75 6c 61 74 65 20 61 6e 64 20 72 65 74 75 72  culate and retur
20290 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 74 68 61  n a checksum tha
202a0 74 20 69 73 20 74 68 65 20 58 4f 52 20 6f 66 20  t is the XOR of 
202b0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
202c0 2a 2a 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61  ** checksum of a
202d0 6c 6c 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ll entries that 
202e0 77 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  would be generat
202f0 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 20  ed by the token 
20300 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
20310 74 68 65 20 66 69 6e 61 6c 20 35 20 61 72 67 75  the final 5 argu
20320 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71  ments..*/.u64 sq
20330 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6b  lite3Fts5IndexCk
20340 73 75 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  sum(.  Fts5Confi
20350 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20  g *pConfig,     
20360 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
20370 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a  uration object *
20380 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20  /.  i64 iRowid, 
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20      /* Document 
203b0 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
203c0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203e0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
203f0 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a  erm appears in *
20400 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20  /.  int iPos,   
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20420 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
20430 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20  term appears in 
20440 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
20450 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
20460 6d 20 20 20 20 2f 2a 20 54 65 72 6d 20 61 74 20  m    /* Term at 
20470 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  iPos */.){.  u64
20480 20 72 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20   ret = 0;       
20490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
204a0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
204b0 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20    int iIdx;     
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69    /* For iterati
204e0 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  ng through index
204f0 65 73 20 2a 2f 0a 0a 20 20 72 65 74 20 3d 20 66  es */..  ret = f
20500 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
20510 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  um(iRowid, iCol,
20520 20 69 50 6f 73 2c 20 70 54 65 72 6d 2c 20 6e 54   iPos, pTerm, nT
20530 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 49 64  erm);..  for(iId
20540 78 3d 30 3b 20 69 49 64 78 3c 70 43 6f 6e 66 69  x=0; iIdx<pConfi
20550 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78  g->nPrefix; iIdx
20560 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  ++){.    int nBy
20570 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68  te = fts5IndexCh
20580 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70  arlenToBytelen(p
20590 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 43 6f  Term, nTerm, pCo
205a0 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49  nfig->aPrefix[iI
205b0 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  dx]);.    if( nB
205c0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  yte ){.      ret
205d0 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74   ^= fts5IndexEnt
205e0 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20  ryCksum(iRowid, 
205f0 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 65 72  iCol, iPos, pTer
20600 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  m, nByte);.    }
20610 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
20620 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  et;.}../*.** Ins
20630 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61  ert or remove da
20640 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ta to or from th
20650 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69  e index. Each ti
20660 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73  me a document is
20670 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72   .** added to or
20680 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
20690 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75  e index, this fu
206a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
206b0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
206c0 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  times..**.** For
206d0 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d   an insert, it m
206e0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  ust be called on
206f0 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65  ce for each toke
20700 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63  n in the new doc
20710 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65  ument..** If the
20720 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
20730 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20  delete, it must 
20740 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65  be called (at le
20750 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61  ast) once for ea
20760 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b  ch.** unique tok
20770 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  en in the docume
20780 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20  nt with an iCol 
20790 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20  value less than 
207a0 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a  zero. The iPos.*
207b0 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67  * argument is ig
207c0 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65  nored for a dele
207d0 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  te..*/.int sqlit
207e0 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
207f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
20800 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20810 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
20820 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  write to */.  in
20830 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20850 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70   Column token ap
20860 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e  pears in (-ve ->
20870 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e   delete) */.  in
20880 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  t iPos,         
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
208a0 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b   Position of tok
208b0 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e  en within column
208c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
208d0 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54   *pToken, int nT
208e0 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74  oken  /* Token t
208f0 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  o add or remove 
20900 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78  to or from index
20910 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
20940 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
20950 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  ugh indexes */. 
20960 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
20990 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
209a0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
209b0 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74  onfig;..  assert
209c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
209d0 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  OK );..  /* Add 
209e0 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20 74 6f  the new token to
209f0 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20   the main terms 
20a00 68 61 73 68 20 74 61 62 6c 65 2e 20 41 6e 64 20  hash table. And 
20a10 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 20  to each of the. 
20a20 20 2a 2a 20 70 72 65 66 69 78 20 68 61 73 68 20   ** prefix hash 
20a30 74 61 62 6c 65 73 20 74 68 61 74 20 69 74 20 69  tables that it i
20a40 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
20a50 6f 72 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  or. */.  rc = sq
20a60 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
20a70 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 61 70 48  te(.      p->apH
20a80 61 73 68 5b 30 5d 2c 20 70 2d 3e 69 57 72 69 74  ash[0], p->iWrit
20a90 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
20aa0 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  os, pToken, nTok
20ab0 65 6e 0a 20 20 29 3b 0a 20 20 66 6f 72 28 69 3d  en.  );.  for(i=
20ac0 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50  0; i<pConfig->nP
20ad0 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c  refix && rc==SQL
20ae0 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
20af0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74    int nByte = ft
20b00 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
20b10 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20  Bytelen(pToken, 
20b20 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69 67 2d  nToken, pConfig-
20b30 3e 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20  >aPrefix[i]);.  
20b40 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
20b50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20b60 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a  3Fts5HashWrite(.
20b70 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 48            p->apH
20b80 61 73 68 5b 69 2b 31 5d 2c 20 70 2d 3e 69 57 72  ash[i+1], p->iWr
20b90 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  iteRowid, iCol, 
20ba0 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42  iPos, pToken, nB
20bb0 79 74 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  yte.      );.   
20bc0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
20bd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
20be0 65 6e 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f  en a new iterato
20bf0 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f  r to iterate tho
20c00 75 67 68 20 61 6c 6c 20 64 6f 63 69 64 73 20 74  ugh all docids t
20c10 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 0a 2a  hat match the .*
20c20 2a 20 73 70 65 63 69 66 69 65 64 20 74 6f 6b 65  * specified toke
20c30 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72 65 66 69  n or token prefi
20c40 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  x..*/.int sqlite
20c50 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
20c60 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
20c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c80 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
20c90 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f  to query */.  co
20ca0 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
20cb0 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a  , int nToken, /*
20cc0 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69   Token (or prefi
20cd0 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  x) to query for 
20ce0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
20d10 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
20d20 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
20d30 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49  5IndexIter **ppI
20d40 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
20d50 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f  OUT: New iterato
20d60 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
20d70 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
20d80 70 52 65 74 3b 0a 20 20 69 6e 74 20 69 49 64 78  pRet;.  int iIdx
20d90 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 66 6c 61   = 0;..  if( fla
20da0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
20db0 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20  UERY_PREFIX ){. 
20dc0 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
20dd0 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
20de0 66 69 67 3b 0a 20 20 20 20 69 6e 74 20 6e 43 68  fig;.    int nCh
20df0 61 72 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68  ar = fts5IndexCh
20e00 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54  arlen(pToken, nT
20e10 6f 6b 65 6e 29 3b 0a 20 20 20 20 66 6f 72 28 69  oken);.    for(i
20e20 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f  Idx=1; iIdx<=pCo
20e30 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
20e40 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Idx++){.      if
20e50 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  ( pConfig->aPref
20e60 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61  ix[iIdx-1]==nCha
20e70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
20e80 0a 20 20 20 20 69 66 28 20 69 49 64 78 3e 70 43  .    if( iIdx>pC
20e90 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29  onfig->nPrefix )
20ea0 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 2d  {.      iIdx = -
20eb0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
20ec0 70 52 65 74 20 3d 20 28 46 74 73 35 49 6e 64 65  pRet = (Fts5Inde
20ed0 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 46 74  xIter*)sqlite3Ft
20ee0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
20ef0 3e 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  >rc, sizeof(Fts5
20f00 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 20 20 69  IndexIter));.  i
20f10 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 6d  f( pRet ){.    m
20f20 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 73  emset(pRet, 0, s
20f30 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49  izeof(Fts5IndexI
20f40 74 65 72 29 29 3b 0a 0a 20 20 20 20 70 52 65 74  ter));..    pRet
20f50 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20  ->pIndex = p;.  
20f60 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 7b    if( iIdx>=0 ){
20f70 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 70 53 74  .      pRet->pSt
20f80 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
20f90 74 75 72 65 52 65 61 64 28 70 2c 20 69 49 64 78  tureRead(p, iIdx
20fa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
20fb0 74 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a 20 20  t->pStruct ){.  
20fc0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
20fd0 74 65 72 4e 65 77 28 70 2c 20 70 52 65 74 2d 3e  terNew(p, pRet->
20fe0 70 53 74 72 75 63 74 2c 20 0a 20 20 20 20 20 20  pStruct, .      
20ff0 20 20 20 20 20 20 69 49 64 78 2c 20 31 2c 20 66        iIdx, 1, f
21000 6c 61 67 73 2c 20 28 63 6f 6e 73 74 20 75 38 2a  lags, (const u8*
21010 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c  )pToken, nToken,
21020 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 2d 3e 70   -1, 0, &pRet->p
21030 4d 75 6c 74 69 0a 20 20 20 20 20 20 20 20 29 3b  Multi.        );
21040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
21050 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44  se{.      int bD
21060 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46  esc = (flags & F
21070 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
21080 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 66  ESC)!=0;.      f
21090 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
210a0 65 72 28 70 2c 20 62 44 65 73 63 2c 20 28 63 6f  er(p, bDesc, (co
210b0 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20  nst u8*)pToken, 
210c0 6e 54 6f 6b 65 6e 2c 20 70 52 65 74 29 3b 0a 20  nToken, pRet);. 
210d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
210e0 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  p->rc ){.    sql
210f0 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
21100 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52 65  e(pRet);.    pRe
21110 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70  t = 0;.  }.  *pp
21120 49 74 65 72 20 3d 20 70 52 65 74 3b 0a 20 20 72  Iter = pRet;.  r
21130 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
21140 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
21150 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
21160 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
21170 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
21180 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74  y argument is at
21190 20 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   EOF..*/.int sql
211a0 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
211b0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
211c0 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
211d0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
211e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
211f0 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44  .  if( pIter->pD
21200 6f 63 6c 69 73 74 20 29 7b 20 0a 20 20 20 20 72  oclist ){ .    r
21210 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f  eturn pIter->pDo
21220 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3d  clist->aPoslist=
21230 3d 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  =0; .  }else{.  
21240 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c    return fts5Mul
21250 74 69 49 74 65 72 45 6f 66 28 70 49 74 65 72 2d  tiIterEof(pIter-
21260 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e  >pIndex, pIter->
21270 70 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pMulti);.  }.}..
21280 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
21290 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
212a0 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  rowid. .*/.int s
212b0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
212c0 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  xt(Fts5IndexIter
212d0 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
212e0 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
212f0 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
21300 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d   );.  if( pIter-
21310 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  >pDoclist ){.   
21320 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
21330 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 44 6f 63  Next(pIter->pDoc
21340 6c 69 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  list);.  }else{.
21350 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
21360 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
21370 73 74 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  st);.    fts5Mul
21380 74 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  tiIterNext(pIter
21390 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d  ->pIndex, pIter-
213a0 3e 70 4d 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a  >pMulti, 0, 0);.
213b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
213c0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
213d0 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
213e0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 64  /*.** Move the d
213f0 6f 63 6c 69 73 74 2d 69 74 65 72 20 70 61 73 73  oclist-iter pass
21400 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
21410 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
21420 6e 65 78 74 20 0a 2a 2a 20 6d 61 74 63 68 69 6e  next .** matchin
21430 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63  g rowid that occ
21440 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20  urs at or after 
21450 69 4d 61 74 63 68 2e 20 54 68 65 20 64 65 66 69  iMatch. The defi
21460 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 0a 2a  nition of "at .*
21470 2a 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65  * or after" depe
21480 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74  nds on whether t
21490 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65  his iterator ite
214a0 72 61 74 65 73 20 69 6e 20 61 73 63 65 6e 64 69  rates in ascendi
214b0 6e 67 20 6f 72 20 0a 2a 2a 20 64 65 73 63 65 6e  ng or .** descen
214c0 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72  ding rowid order
214d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
214e0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
214f0 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 44 6f 63  NextFrom(Fts5Doc
21500 6c 69 73 74 49 74 65 72 20 2a 70 2c 20 69 36 34  listIter *p, i64
21510 20 69 4d 61 74 63 68 29 7b 0a 20 20 64 6f 7b 0a   iMatch){.  do{.
21520 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
21530 20 70 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20   p->iRowid;.    
21540 69 66 28 20 70 2d 3e 62 44 65 73 63 3d 3d 30 20  if( p->bDesc==0 
21550 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63  && iRowid>=iMatc
21560 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  h ) break;.    i
21570 66 28 20 70 2d 3e 62 44 65 73 63 21 3d 30 20 26  f( p->bDesc!=0 &
21580 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68  & iRowid<=iMatch
21590 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 66 74   ) break;.    ft
215a0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
215b0 74 28 70 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  t(p);.  }while( 
215c0 70 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 7d  p->aPoslist );.}
215d0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
215e0 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
215f0 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63  g rowid that occ
21600 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72 20  urs at or after 
21610 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64  iMatch. The.** d
21620 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74  efinition of "at
21630 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65 6e   or after" depen
21640 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68  ds on whether th
21650 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65 72  is iterator iter
21660 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  ates.** in ascen
21670 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69  ding or descendi
21680 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a  ng rowid order..
21690 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
216a0 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46  s5IterNextFrom(F
216b0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
216c0 74 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29  ter, i64 iMatch)
216d0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  {.  if( pIter->p
216e0 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 66  Doclist ){.    f
216f0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
21700 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70 44  xtFrom(pIter->pD
21710 6f 63 6c 69 73 74 2c 20 69 4d 61 74 63 68 29 3b  oclist, iMatch);
21720 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
21730 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46  s5MultiIterNextF
21740 72 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  rom(pIter->pInde
21750 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  x, pIter->pMulti
21760 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 7d 0a 20  , iMatch);.  }. 
21770 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
21780 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
21790 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
217a0 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
217b0 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36  ent rowid..*/.i6
217c0 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  4 sqlite3Fts5Ite
217d0 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78  rRowid(Fts5Index
217e0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
217f0 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
21800 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
21810 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  n pIter->pDoclis
21820 74 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 7d 65 6c  t->iRowid;.  }el
21830 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66  se{.    return f
21840 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
21850 64 28 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29  d(pIter->pMulti)
21860 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
21870 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21880 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
21890 74 61 69 6e 69 6e 67 20 61 20 63 6f 70 79 20 6f  taining a copy o
218a0 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
218b0 69 73 74 20 66 6f 72 0a 2a 2a 20 74 68 65 20 63  ist for.** the c
218c0 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 4f 75  urrent entry. Ou
218d0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
218e0 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
218f0 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
21900 65 72 20 0a 2a 2a 20 69 6e 20 62 79 74 65 73 20  er .** in bytes 
21910 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
21920 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
21930 72 6e 65 64 20 62 75 66 66 65 72 20 64 6f 65 73  rned buffer does
21940 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
21950 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72   0x00 terminator
21960 20 62 79 74 65 20 73 74 6f 72 65 64 20 6f 6e 0a   byte stored on.
21970 2a 2a 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  ** disk..*/.int 
21980 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
21990 6f 73 6c 69 73 74 28 46 74 73 35 49 6e 64 65 78  oslist(Fts5Index
219a0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 63 6f 6e  Iter *pIter, con
219b0 73 74 20 75 38 20 2a 2a 70 70 2c 20 69 6e 74 20  st u8 **pp, int 
219c0 2a 70 6e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  *pn){.  assert( 
219d0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
219e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
219f0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
21a00 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 2a 70 6e  clist ){.    *pn
21a10 20 3d 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69   = pIter->pDocli
21a20 73 74 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20  st->nPoslist;.  
21a30 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e 70    *pp = pIter->p
21a40 44 6f 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73  Doclist->aPoslis
21a50 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
21a60 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70  Fts5Index *p = p
21a70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Iter->pIndex;.  
21a80 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
21a90 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
21aa0 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  );.    fts5Multi
21ab0 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70  IterPoslist(p, p
21ac0 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 30 2c  Iter->pMulti, 0,
21ad0 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
21ae0 29 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49 74  );.    *pn = pIt
21af0 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20  er->poslist.n;. 
21b00 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e     *pp = pIter->
21b10 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 20  poslist.p;.  }. 
21b20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
21b30 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
21b40 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
21b50 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74   Close an iterat
21b60 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  or opened by an 
21b70 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
21b80 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
21b90 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Query()..*/.void
21ba0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
21bb0 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49  Close(Fts5IndexI
21bc0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
21bd0 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
21be0 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
21bf0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ist ){.      sql
21c00 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
21c10 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 29 3b 0a 20  >pDoclist->a);. 
21c20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21c30 65 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  e(pIter->pDoclis
21c40 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
21c50 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
21c60 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 49  erFree(pIter->pI
21c70 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75  ndex, pIter->pMu
21c80 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 74 73 35  lti);.      fts5
21c90 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
21ca0 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29  (pIter->pStruct)
21cb0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
21cc0 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70  erFree(&pIter->p
21cd0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  oslist);.    }. 
21ce0 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
21cf0 65 72 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  er(pIter->pIndex
21d00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
21d10 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ree(pIter);.  }.
21d20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  }../*.** Read th
21d30 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  e "averages" rec
21d40 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ord into the buf
21d50 66 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20  fer supplied as 
21d60 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
21d70 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
21d80 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
21d90 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
21da0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
21db0 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72 20  .** if an error 
21dc0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
21dd0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 47  qlite3Fts5IndexG
21de0 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
21df0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66  ndex *p, Fts5Buf
21e00 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  fer *pBuf){.  as
21e10 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
21e20 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
21e30 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72  DataReadOrBuffer
21e40 28 70 2c 20 70 42 75 66 2c 20 46 54 53 35 5f 41  (p, pBuf, FTS5_A
21e50 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a  VERAGES_ROWID);.
21e60 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
21e70 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
21e80 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68  /*.** Replace th
21e90 65 20 63 75 72 72 65 6e 74 20 22 61 76 65 72 61  e current "avera
21ea0 67 65 73 22 20 72 65 63 6f 72 64 20 77 69 74 68  ges" record with
21eb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
21ec0 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20   the buffer .** 
21ed0 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20  supplied as the 
21ee0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
21ef0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
21f00 74 73 35 49 6e 64 65 78 53 65 74 41 76 65 72 61  ts5IndexSetAvera
21f10 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ges(Fts5Index *p
21f20 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74  , const u8 *pDat
21f30 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20  a, int nData){. 
21f40 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
21f50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
21f60 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
21f70 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
21f80 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74  WID, pData, nDat
21f90 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  a);.  return fts
21fa0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
21fb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21fc0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
21fd0 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73  r of blocks this
21fe0 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64   module has read
21ff0 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
22000 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20  .** table since 
22010 69 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  it was created..
22020 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22030 73 35 49 6e 64 65 78 52 65 61 64 73 28 46 74 73  s5IndexReads(Fts
22040 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65  5Index *p){.  re
22050 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d  turn p->nRead;.}
22060 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
22070 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61  32-bit cookie va
22080 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  lue stored at th
22090 65 20 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73  e start of all s
220a0 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63  tructure .** rec
220b0 6f 72 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75  ords to the valu
220c0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
220d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
220e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
220f0 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
22100 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
22110 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
22120 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
22130 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
22140 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
22150 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78  Cookie(Fts5Index
22160 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a   *p, int iNew){.
22170 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22180 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 43 6f 6e 66  E_OK;.  Fts5Conf
22190 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
221a0 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 75 38 20 61  >pConfig;.  u8 a
221b0 43 6f 6f 6b 69 65 5b 34 5d 3b 0a 20 20 69 6e 74  Cookie[4];.  int
221c0 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   i;..  assert( p
221d0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
221e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  );.  sqlite3Fts5
221f0 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20 69  Put32(aCookie, i
22200 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  New);.  for(i=0;
22210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
22220 26 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  & i<=pConfig->nP
22230 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  refix; i++){.   
22240 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
22250 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 20 20 69 36  Blob = 0;.    i6
22260 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  4 iRowid = FTS5_
22270 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28  STRUCTURE_ROWID(
22280 69 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  i);.    rc = sql
22290 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 0a  ite3_blob_open(.
222a0 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
222b0 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44  >db, pConfig->zD
222c0 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
222d0 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
222e0 20 31 2c 20 26 70 42 6c 6f 62 0a 20 20 20 20 29   1, &pBlob.    )
222f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
22300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22310 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
22320 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b  ite(pBlob, aCook
22330 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 20  ie, 4, 0);.     
22340 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
22350 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b  ob_close(pBlob);
22360 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
22370 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
22380 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
22390 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49  LoadConfig(Fts5I
223a0 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
223b0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
223c0 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  ct;.  pStruct = 
223d0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
223e0 64 28 70 2c 20 30 29 3b 0a 20 20 66 74 73 35 53  d(p, 0);.  fts5S
223f0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
22400 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75  pStruct);.  retu
22410 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
22420 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn(p);.}../*****
22430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22470 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
22480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
224a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
224b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
224c0 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f  ** Below this po
224d0 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65  int is the imple
224e0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
224f0 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 73   fts5_decode() s
22500 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f  calar.** functio
22510 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  n only..*/../*.*
22520 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65  * Decode a segme
22530 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72  nt-data rowid fr
22540 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
22550 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
22560 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70  on is.** the opp
22570 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46  osite of macro F
22580 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
22590 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  D()..*/.static v
225a0 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f  oid fts5DecodeRo
225b0 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69  wid(.  i64 iRowi
225c0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
225d0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
225e0 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c  from %_data tabl
225f0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 49 64  e */.  int *piId
22600 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
22610 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 49         /* OUT: I
22620 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ndex */.  int *p
22630 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20  iSegid,         
22640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
22650 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  : Segment id */.
22660 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c    int *piHeight,
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74    /* OUT: Height
22690 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e   */.  int *piPgn
226a0 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
226b0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61        /* OUT: Pa
226c0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
226d0 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74    *piPgno = (int
226e0 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
226f0 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
22700 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a  _PAGE_B) - 1));.
22710 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
22720 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a  5_DATA_PAGE_B;..
22730 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69    *piHeight = (i
22740 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
22750 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
22760 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31  TA_HEIGHT_B) - 1
22770 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
22780 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48   FTS5_DATA_HEIGH
22790 54 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64  T_B;..  *piSegid
227a0 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
227b0 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
227c0 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20  S5_DATA_ID_B) - 
227d0 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  1));.  iRowid >>
227e0 3d 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  = FTS5_DATA_ID_B
227f0 3b 0a 0a 20 20 2a 70 69 49 64 78 20 3d 20 28 69  ;..  *piIdx = (i
22800 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
22810 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
22820 54 41 5f 49 44 58 5f 42 29 20 2d 20 31 29 29 3b  TA_IDX_B) - 1));
22830 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
22840 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 69  fts5DebugRowid(i
22850 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
22860 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69  fer *pBuf, i64 i
22870 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 49 64 78  Key){.  int iIdx
22880 2c 69 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c  ,iSegid,iHeight,
22890 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f 77 69 64  iPgno;  /* Rowid
228a0 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20   compenents */. 
228b0 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64   fts5DecodeRowid
228c0 28 69 4b 65 79 2c 20 26 69 49 64 78 2c 20 26 69  (iKey, &iIdx, &i
228d0 53 65 67 69 64 2c 20 26 69 48 65 69 67 68 74 2c  Segid, &iHeight,
228e0 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28   &iPgno);..  if(
228f0 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
22900 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35    if( iKey==FTS5
22910 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
22920 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
22930 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
22940 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
22950 2c 20 22 28 61 76 65 72 61 67 65 73 29 20 22 29  , "(averages) ")
22960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22970 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
22980 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
22990 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20  (pRc, pBuf, .   
229a0 20 20 20 20 20 20 20 22 7b 73 74 72 75 63 74 75         "{structu
229b0 72 65 20 69 64 78 3d 25 64 7d 22 2c 20 28 69 6e  re idx=%d}", (in
229c0 74 29 28 69 4b 65 79 2d 31 30 29 0a 20 20 20 20  t)(iKey-10).    
229d0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    );.    }.  }. 
229e0 20 65 6c 73 65 20 69 66 28 20 69 48 65 69 67 68   else if( iHeigh
229f0 74 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  t==FTS5_SEGMENT_
22a00 4d 41 58 5f 48 45 49 47 48 54 20 29 7b 0a 20 20  MAX_HEIGHT ){.  
22a10 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
22a20 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
22a30 70 52 63 2c 20 70 42 75 66 2c 20 22 28 64 6c 69  pRc, pBuf, "(dli
22a40 64 78 20 69 64 78 3d 25 64 20 73 65 67 69 64 3d  dx idx=%d segid=
22a50 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20 20  %d pgno=%d)",.  
22a60 20 20 20 20 20 20 69 49 64 78 2c 20 69 53 65 67        iIdx, iSeg
22a70 69 64 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b  id, iPgno.    );
22a80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
22a90 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
22aa0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
22ab0 20 70 42 75 66 2c 20 22 28 69 64 78 3d 25 64 20   pBuf, "(idx=%d 
22ac0 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67  segid=%d h=%d pg
22ad0 6e 6f 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20  no=%d)",.       
22ae0 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69   iIdx, iSegid, i
22af0 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20 20  Height, iPgno.  
22b00 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74    );.  }.}..stat
22b10 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75  ic void fts5Debu
22b20 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  gStructure(.  in
22b30 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b50 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
22b60 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
22b70 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74 73  fer *pBuf,.  Fts
22b80 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29 7b  5Structure *p.){
22b90 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65  .  int iLvl, iSe
22ba0 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
22bb0 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68     /* Iterate th
22bc0 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73 65  rough levels, se
22bd0 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f 72  gments */..  for
22be0 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d  (iLvl=0; iLvl<p-
22bf0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
22c00 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
22c10 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
22c20 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c   &p->aLevel[iLvl
22c30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ];.    sqlite3Ft
22c40 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
22c50 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
22c60 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c 3d  .        " {lvl=
22c70 25 64 20 6e 4d 65 72 67 65 3d 25 64 22 2c 20 69  %d nMerge=%d", i
22c80 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  Lvl, pLvl->nMerg
22c90 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72  e.    );.    for
22ca0 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c  (iSeg=0; iSeg<pL
22cb0 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl->nSeg; iSeg++
22cc0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
22cd0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
22ce0 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
22cf0 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 73  g[iSeg];.      s
22d00 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
22d10 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
22d20 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20  , pBuf, .       
22d30 20 20 20 22 20 7b 69 64 3d 25 64 20 68 3d 25 64     " {id=%d h=%d
22d40 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22   leaves=%d..%d}"
22d50 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
22d60 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20 0a  pSeg->nHeight, .
22d70 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e            pSeg->
22d80 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65 67 2d  pgnoFirst, pSeg-
22d90 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20  >pgnoLast.      
22da0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22db0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
22dc0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
22dd0 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a  pBuf, "}");.  }.
22de0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
22df0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 74 73   part of the fts
22e00 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75 67  5_decode() debug
22e10 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20  ging aid..**.** 
22e20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f  Arguments pBlob/
22e30 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 20  nBlob contain a 
22e40 73 65 72 69 61 6c 69 7a 65 64 20 46 74 73 35 53  serialized Fts5S
22e50 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 2e  tructure object.
22e60 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
22e70 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61  n appends a huma
22e80 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65  n-readable repre
22e90 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
22ea0 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a 20   same object.** 
22eb0 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 61  to the buffer pa
22ec0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
22ed0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f  nd argument. .*/
22ee0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
22ef0 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65  5DecodeStructure
22f00 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
22f30 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
22f40 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
22f50 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c  .  const u8 *pBl
22f60 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b  ob, int nBlob.){
22f70 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22fa0 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  e */.  Fts5Struc
22fb0 74 75 72 65 20 2a 70 20 3d 20 30 3b 20 20 20 20  ture *p = 0;    
22fc0 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 64 65         /* Decode
22fd0 64 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  d structure obje
22fe0 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74  ct */..  rc = ft
22ff0 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
23000 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20  e(pBlob, nBlob, 
23010 30 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63  0, &p);.  if( rc
23020 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23030 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
23040 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
23050 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
23060 75 72 65 28 70 52 63 2c 20 70 42 75 66 2c 20 70  ure(pRc, pBuf, p
23070 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
23080 72 65 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a  reRelease(p);.}.
23090 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61  ./*.** Buffer (a
230a0 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20 74  /n) is assumed t
230b0 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74  o contain a list
230c0 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76   of serialized v
230d0 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20  arints. Read.** 
230e0 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20  each varint and 
230f0 61 70 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e  append its strin
23100 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
23110 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
23120 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72   Return.** after
23130 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 70 75   either the inpu
23140 74 20 62 75 66 66 65 72 20 69 73 20 65 78 68 61  t buffer is exha
23150 75 73 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c  usted or a 0 val
23160 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ue is read..**.*
23170 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
23180 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
23190 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66   of bytes read f
231a0 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75  rom the input bu
231b0 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ffer..*/.static 
231c0 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f  int fts5DecodePo
231d0 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20  slist(int *pRc, 
231e0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
231f0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69  , const u8 *a, i
23200 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66  nt n){.  int iOf
23210 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  f = 0;.  while( 
23220 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e  iOff<n ){.    in
23230 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66  t iVal;.    iOff
23240 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
23250 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56  t32(&a[iOff], iV
23260 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
23270 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
23280 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
23290 2c 20 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a  , " %d", iVal);.
232a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66    }.  return iOf
232b0 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f;.}../*.** The 
232c0 73 74 61 72 74 20 6f 66 20 62 75 66 66 65 72 20  start of buffer 
232d0 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74  (a/n) contains t
232e0 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f  he start of a do
232f0 63 6c 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69  clist. The docli
23300 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79  st.** may or may
23310 20 6e 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68   not finish with
23320 69 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20 54  in the buffer. T
23330 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
23340 65 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72  ends a text.** r
23350 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
23360 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68 65   the part of the
23370 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73   doclist that is
23380 20 70 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66   present to buff
23390 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a  er.** pBuf. .**.
233a0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
233b0 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
233c0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20  r of bytes read 
233d0 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
233e0 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
233f0 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44   int fts5DecodeD
23400 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c  oclist(int *pRc,
23410 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
23420 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  f, const u8 *a, 
23430 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44  int n){.  i64 iD
23440 6f 63 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66  ocid;.  int iOff
23450 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 4f 66   = 0;..  if( iOf
23460 66 3c 6e 20 29 7b 0a 20 20 20 20 69 4f 66 66 20  f<n ){.    iOff 
23470 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
23480 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75  int(&a[iOff], (u
23490 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20 20  64*)&iDocid);.  
234a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
234b0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
234c0 70 52 63 2c 20 70 42 75 66 2c 20 22 20 72 6f 77  pRc, pBuf, " row
234d0 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64  id=%lld", iDocid
234e0 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
234f0 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e  iOff<n ){.    in
23500 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 4f 66 66  t nPos;.    iOff
23510 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
23520 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 50  t32(&a[iOff], nP
23530 6f 73 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  os);.    iOff +=
23540 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
23550 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61  st(pRc, pBuf, &a
23560 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f  [iOff], MIN(n-iO
23570 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20  ff, nPos));.    
23580 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  if( iOff<n ){.  
23590 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
235a0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71        iOff += sq
235b0 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26  lite3GetVarint(&
235c0 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
235d0 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69  iDelta);.      i
235e0 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72  f( iDelta==0 ) r
235f0 65 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20  eturn iOff;.    
23600 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c    iDocid += iDel
23610 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ta;.      sqlite
23620 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
23630 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
23640 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22  f, " rowid=%lld"
23650 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d  , iDocid);.    }
23660 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69  .  }..  return i
23670 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Off;.}../*.** Th
23680 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
23690 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
236a0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
236b0 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a   fts5_decode()..
236c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
236d0 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f  ts5DecodeFunctio
236e0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
236f0 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
23700 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
23710 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f   call context */
23720 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23740 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23750 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20  args (always 2) 
23760 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
23770 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20  ue **apVal      
23780 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
23790 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
237a0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20  .  i64 iRowid;  
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237c0 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
237d0 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63  record being dec
237e0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49  oded */.  int iI
237f0 64 78 2c 69 53 65 67 69 64 2c 69 48 65 69 67 68  dx,iSegid,iHeigh
23800 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f 77  t,iPgno;  /* Row
23810 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f  id components */
23820 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c  .  const u8 *aBl
23830 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  ob; int n;      
23840 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20     /* Record to 
23850 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a  decode */.  u8 *
23860 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66  a = 0;.  Fts5Buf
23870 66 65 72 20 73 3b 20 20 20 20 20 20 20 20 20 20  fer s;          
23880 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c           /* Buil
23890 64 20 75 70 20 74 65 78 74 20 74 6f 20 72 65 74  d up text to ret
238a0 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  urn here */.  in
238b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
238c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
238d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
238e0 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 30    int nSpace = 0
238f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  ;..  assert( nAr
23900 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74  g==2 );.  memset
23910 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
23920 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
23930 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
23940 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61  value_int64(apVa
23950 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  l[0]);.  n = sql
23960 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
23970 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42  (apVal[1]);.  aB
23980 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
23990 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31  lue_blob(apVal[1
239a0 5d 29 3b 0a 0a 20 20 6e 53 70 61 63 65 20 3d 20  ]);..  nSpace = 
239b0 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45  n + FTS5_DATA_ZE
239c0 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20  RO_PADDING;.  a 
239d0 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74  = (u8*)sqlite3Ft
239e0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
239f0 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28  , nSpace);.  if(
23a00 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63   a==0 ) goto dec
23a10 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70  ode_out;.  memcp
23a20 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a  y(a, aBlob, n);.
23a30 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
23a40 64 28 69 52 6f 77 69 64 2c 20 26 69 49 64 78 2c  d(iRowid, &iIdx,
23a50 20 26 69 53 65 67 69 64 2c 20 26 69 48 65 69 67   &iSegid, &iHeig
23a60 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
23a70 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26  fts5DebugRowid(&
23a80 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b  rc, &s, iRowid);
23a90 0a 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d  .  if( iHeight==
23aa0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58  FTS5_SEGMENT_MAX
23ab0 5f 48 45 49 47 48 54 20 29 7b 0a 20 20 20 20 46  _HEIGHT ){.    F
23ac0 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20  ts5Data dlidx;. 
23ad0 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72     Fts5DlidxIter
23ae0 20 69 74 65 72 3b 0a 0a 20 20 20 20 64 6c 69 64   iter;..    dlid
23af0 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69  x.p = a;.    dli
23b00 64 78 2e 6e 20 3d 20 6e 3b 0a 20 20 20 20 64 6c  dx.n = n;.    dl
23b10 69 64 78 2e 6e 52 65 66 20 3d 20 32 3b 0a 0a 20  idx.nRef = 2;.. 
23b20 20 20 20 6d 65 6d 73 65 74 28 26 69 74 65 72 2c     memset(&iter,
23b30 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
23b40 6c 69 64 78 49 74 65 72 29 29 3b 0a 20 20 20 20  lidxIter));.    
23b50 69 74 65 72 2e 70 44 61 74 61 20 3d 20 26 64 6c  iter.pData = &dl
23b60 69 64 78 3b 0a 20 20 20 20 69 74 65 72 2e 69 4c  idx;.    iter.iL
23b70 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b  eafPgno = iPgno;
23b80 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c  ..    for(fts5Dl
23b90 69 64 78 49 74 65 72 46 69 72 73 74 28 26 69 74  idxIterFirst(&it
23ba0 65 72 29 3b 20 69 74 65 72 2e 62 45 6f 66 3d 3d  er); iter.bEof==
23bb0 30 3b 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  0; fts5DlidxIter
23bc0 4e 65 78 74 28 26 69 74 65 72 29 29 7b 0a 20 20  Next(&iter)){.  
23bd0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
23be0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
23bf0 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20  f(&rc, &s, .    
23c00 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29        " %d(%lld)
23c10 22 2c 20 69 74 65 72 2e 69 4c 65 61 66 50 67 6e  ", iter.iLeafPgn
23c20 6f 2c 20 69 74 65 72 2e 69 52 6f 77 69 64 0a 20  o, iter.iRowid. 
23c30 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
23c40 7d 65 6c 73 65 20 69 66 28 20 69 53 65 67 69 64  }else if( iSegid
23c50 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ==0 ){.    if( i
23c60 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52  Rowid==FTS5_AVER
23c70 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20  AGES_ROWID ){.  
23c80 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20      /* todo */. 
23c90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23ca0 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
23cb0 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ure(&rc, &s, a, 
23cc0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
23cd0 65 7b 0a 0a 20 20 20 20 46 74 73 35 42 75 66 66  e{..    Fts5Buff
23ce0 65 72 20 74 65 72 6d 3b 0a 20 20 20 20 6d 65 6d  er term;.    mem
23cf0 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
23d00 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
23d10 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65 69  );..    if( iHei
23d20 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
23d30 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30  int iTermOff = 0
23d40 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77  ;.      int iRow
23d50 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  idOff = 0;.     
23d60 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
23d70 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a   int nKeep = 0;.
23d80 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 3d 34 20  .      if( n>=4 
23d90 29 7b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69  ){.        iRowi
23da0 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  dOff = fts5GetU1
23db0 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  6(&a[0]);.      
23dc0 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 66 74 73    iTermOff = fts
23dd0 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a  5GetU16(&a[2]);.
23de0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23df0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
23e00 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 26  BufferSet(&rc, &
23e10 73 2c 20 38 2c 20 28 63 6f 6e 73 74 20 75 38 2a  s, 8, (const u8*
23e20 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20 20  )"corrupt");.   
23e30 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65       goto decode
23e40 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
23e50 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
23e60 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  ff ){.        iO
23e70 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a  ff = iRowidOff;.
23e80 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
23e90 69 54 65 72 6d 4f 66 66 20 29 7b 0a 20 20 20 20  iTermOff ){.    
23ea0 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d      iOff = iTerm
23eb0 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
23ec0 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  {.        iOff =
23ed0 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
23ee0 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c    fts5DecodePosl
23ef0 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
23f00 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20  4], iOff-4);..  
23f10 20 20 20 20 61 73 73 65 72 74 28 20 69 52 6f 77      assert( iRow
23f20 69 64 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66  idOff==0 || iOff
23f30 3d 3d 69 52 6f 77 69 64 4f 66 66 20 29 3b 0a 20  ==iRowidOff );. 
23f40 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f       if( iRowidO
23f50 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  ff ){.        iO
23f60 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65  ff += fts5Decode
23f70 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c  Doclist(&rc, &s,
23f80 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66   &a[iOff], n-iOf
23f90 66 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  f);.      }..   
23fa0 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d     assert( iTerm
23fb0 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d  Off==0 || iOff==
23fc0 69 54 65 72 6d 4f 66 66 20 29 3b 0a 20 20 20 20  iTermOff );.    
23fd0 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20    while( iOff<n 
23fe0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
23ff0 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69 4f  Byte;.        iO
24000 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
24010 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
24020 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
24030 74 65 72 6d 2e 6e 3d 20 6e 4b 65 65 70 3b 0a 20  term.n= nKeep;. 
24040 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
24050 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c  rAppendBlob(&rc,
24060 20 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26   &term, nByte, &
24070 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  a[iOff]);.      
24080 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65 3b    iOff += nByte;
24090 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
240a0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
240b0 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  dPrintf(.       
240c0 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20       &rc, &s, " 
240d0 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d  term=%.*s", term
240e0 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  .n, (const char*
240f0 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 20 20  )term.p.        
24100 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  );.        iOff 
24110 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  += fts5DecodeDoc
24120 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
24130 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b  [iOff], n-iOff);
24140 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
24150 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f<n ){.         
24160 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
24170 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
24180 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  ], nKeep);.     
24190 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
241a0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
241b0 65 28 26 74 65 72 6d 29 3b 0a 20 20 20 20 7d 65  e(&term);.    }e
241c0 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 4e  lse{.      Fts5N
241d0 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20  odeIter ss;.    
241e0 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65 49 74    for(fts5NodeIt
241f0 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 73 73  erInit(a, n, &ss
24200 29 3b 20 73 73 2e 61 44 61 74 61 3b 20 66 74 73  ); ss.aData; fts
24210 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 72  5NodeIterNext(&r
24220 63 2c 20 26 73 73 29 29 7b 0a 20 20 20 20 20 20  c, &ss)){.      
24230 20 20 69 66 28 20 73 73 2e 74 65 72 6d 2e 6e 3d    if( ss.term.n=
24240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
24250 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
24260 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
24270 63 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d 25 64  c, &s, " left=%d
24280 22 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b 0a 20  ", ss.iChild);. 
24290 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
242a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
242b0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
242c0 72 69 6e 74 66 28 26 72 63 2c 26 73 2c 20 22 20  rintf(&rc,&s, " 
242d0 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20 20 20  \"%.*s\"", .    
242e0 20 20 20 20 20 20 20 20 20 20 73 73 2e 74 65 72            ss.ter
242f0 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 0a 20  m.n, ss.term.p. 
24300 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
24310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
24320 28 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b 0a 20  ( ss.nEmpty ){. 
24330 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24340 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
24350 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20  Printf(&rc, &s, 
24360 22 20 65 6d 70 74 79 3d 25 64 25 73 22 2c 20 73  " empty=%d%s", s
24370 73 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20 20 20  s.nEmpty,.      
24380 20 20 20 20 20 20 20 20 73 73 2e 62 44 6c 69 64          ss.bDlid
24390 78 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20 20 20  x ? "*" : "".   
243a0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
243b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
243c0 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72    fts5NodeIterFr
243d0 65 65 28 26 73 73 29 3b 0a 20 20 20 20 7d 0a 20  ee(&ss);.    }. 
243e0 20 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f 75   }.  . decode_ou
243f0 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  t:.  sqlite3_fre
24400 65 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  e(a);.  if( rc==
24410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24420 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
24430 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73  text(pCtx, (cons
24440 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e  t char*)s.p, s.n
24450 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
24460 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
24470 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
24480 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78  _error_code(pCtx
24490 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73  , rc);.  }.  fts
244a0 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b  5BufferFree(&s);
244b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  .}../*.** The im
244c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
244d0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61  user-defined sca
244e0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73  lar function fts
244f0 35 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73 74  5_rowid()..*/.st
24500 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 52 6f  atic void fts5Ro
24510 77 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  widFunction(.  s
24520 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
24530 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
24540 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  * Function call 
24550 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
24560 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24580 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28  Number of args (
24590 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73  always 2) */.  s
245a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
245b0 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
245c0 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
245d0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ents */.){.  con
245e0 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20  st char *zArg;. 
245f0 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a   if( nArg==0 ){.
24600 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
24610 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22  lt_error(pCtx, "
24620 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f  should be: fts5_
24630 72 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20 2e  rowid(subject, .
24640 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d 65  ...)", -1);.  }e
24650 6c 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20  lse{.    zArg = 
24660 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
24670 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
24680 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69  apVal[0]);.    i
24690 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74  f( 0==sqlite3_st
246a0 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65 67  ricmp(zArg, "seg
246b0 6d 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  ment") ){.      
246c0 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
246d0 20 20 69 6e 74 20 69 64 78 2c 20 73 65 67 69 64    int idx, segid
246e0 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 3b 0a  , height, pgno;.
246f0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d        if( nArg!=
24700 35 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  5 ){.        sql
24710 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
24720 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20  r(pCtx, .       
24730 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62 65 3a       "should be:
24740 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73 65 67   fts5_rowid('seg
24750 6d 65 6e 74 27 2c 20 69 64 78 2c 20 73 65 67 69  ment', idx, segi
24760 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  d, height, pgno)
24770 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20 20 29  )", -1.        )
24780 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24790 20 20 20 20 20 20 20 69 64 78 20 3d 20 73 71 6c         idx = sql
247a0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61  ite3_value_int(a
247b0 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20  pVal[1]);.      
247c0 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65    segid = sqlite
247d0 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61  3_value_int(apVa
247e0 6c 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 68  l[2]);.        h
247f0 65 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 5f  eight = sqlite3_
24800 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
24810 33 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67 6e  3]);.        pgn
24820 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  o = sqlite3_valu
24830 65 5f 69 6e 74 28 61 70 56 61 6c 5b 34 5d 29 3b  e_int(apVal[4]);
24840 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20  .        iRowid 
24850 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
24860 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c  OWID(idx, segid,
24870 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 3b 0a   height, pgno);.
24880 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
24890 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74  result_int64(pCt
248a0 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  x, iRowid);.    
248b0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
248c0 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
248d0 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 74 61 72  icmp(zArg, "star
248e0 74 2d 6f 66 2d 69 6e 64 65 78 22 29 20 29 7b 0a  t-of-index") ){.
248f0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
24900 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 3b  ;.      int idx;
24910 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 21  .      if( nArg!
24920 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =2 ){.        sq
24930 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
24940 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20  or(pCtx, .      
24950 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62 65        "should be
24960 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73 74  : fts5_rowid('st
24970 61 72 74 2d 6f 66 2d 69 6e 64 65 78 27 2c 20 69  art-of-index', i
24980 64 78 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20  dx)", -1.       
24990 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
249a0 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 73  .        idx = s
249b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
249c0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20  (apVal[1]);.    
249d0 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53      iRowid = FTS
249e0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
249f0 69 64 78 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20  idx, 1, 0, 0);. 
24a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
24a10 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
24a20 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
24a30 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20   }.    }else {. 
24a40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
24a50 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20  ult_error(pCtx, 
24a60 0a 20 20 20 20 20 20 20 20 22 66 69 72 73 74 20  .        "first 
24a70 61 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69  arg to fts5_rowi
24a80 64 28 29 20 6d 75 73 74 20 62 65 20 27 73 65 67  d() must be 'seg
24a90 6d 65 6e 74 27 20 22 0a 20 20 20 20 20 20 20 20  ment' ".        
24aa0 22 6f 72 20 27 73 74 61 72 74 2d 6f 66 2d 69 6e  "or 'start-of-in
24ab0 64 65 78 27 22 0a 20 20 20 20 20 20 20 20 2c 20  dex'".        , 
24ac0 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  -1.      );.    
24ad0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
24ae0 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73  his is called as
24af0 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74 65   part of registe
24b00 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f  ring the FTS5 mo
24b10 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61  dule with databa
24b20 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
24b30 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65 72   db. It register
24b40 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64  s several user-d
24b50 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
24b60 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a  nctions useful.*
24b70 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a  * with FTS5..**.
24b80 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
24b90 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
24ba0 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
24bb0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d  rror occurs, som
24bc0 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74  e other.** SQLit
24bd0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
24be0 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
24bf0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24c00 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71  Fts5IndexInit(sq
24c10 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
24c20 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  t rc = sqlite3_c
24c30 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
24c40 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
24c50 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49  decode", 2, SQLI
24c60 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
24c70 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20  DecodeFunction, 
24c80 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20  0, 0.  );.  if( 
24c90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24ca0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24cb0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
24cc0 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  n(.        db, "
24cd0 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c  fts5_rowid", -1,
24ce0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
24cf0 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
24d00 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  on, 0, 0.    );.
24d10 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24d20 0a 7d 0a 0a                                      .}..