/ Hex Artifact Content
Login

Artifact 7a9de0c033a8f702f8e3659a23c2ea31bbbb789b:


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 6e 65 78 74 20    poslist: next 
10b0: 70 6f 73 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  poslist.**      
10c0: 20 20 20 7d 0a 2a 2a 20 20 20 20 20 20 20 20 20     }.**         
10d0: 30 78 30 30 20 62 79 74 65 0a 2a 2a 0a 2a 2a 20  0x00 byte.**.** 
10e0: 20 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d      poslist form
10f0: 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  at:.**.**       
1100: 20 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f    varint: size o
1110: 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74  f poslist in byt
1120: 65 73 2e 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e  es. not includin
1130: 67 20 74 68 69 73 20 66 69 65 6c 64 2e 0a 2a 2a  g this field..**
1140: 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74           collist
1150: 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f  : collist for co
1160: 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20 20 20  lumn 0.**       
1170: 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b    zero-or-more {
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 30 78  .**           0x
1190: 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  01 byte.**      
11a0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63 6f 6c       varint: col
11b0: 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29 0a 2a  umn number (I).*
11c0: 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 6c  *           coll
11d0: 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72  ist: collist for
11e0: 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20 20 20   column I.**    
11f0: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20       }.**.**    
1200: 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61 74 3a   collist format:
1210: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76  .**.**         v
1220: 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f 66 66  arint: first off
1230: 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20 20 20  set + 2.**      
1240: 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20     zero-or-more 
1250: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76  {.**           v
1260: 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20 64 65  arint: offset de
1270: 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20 20 20  lta + 2.**      
1280: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47     }.**.**   PAG
1290: 49 4e 41 54 49 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20  INATION.**.**   
12a0: 20 20 54 68 65 20 66 6f 72 6d 61 74 20 64 65 73    The format des
12b0: 63 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20  cribed above is 
12c0: 6f 6e 6c 79 20 61 63 63 75 72 61 74 65 20 69 66  only accurate if
12d0: 20 74 68 65 20 65 6e 74 69 72 65 20 74 65 72 6d   the entire term
12e0: 2f 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20  /doclist.**     
12f0: 64 61 74 61 20 66 69 74 73 20 6f 6e 20 61 20 73  data fits on a s
1300: 69 6e 67 6c 65 20 6c 65 61 66 20 70 61 67 65 2e  ingle leaf page.
1310: 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
1320: 74 68 65 20 63 61 73 65 2c 20 74 68 65 20 66 6f  the case, the fo
1330: 72 6d 61 74 0a 2a 2a 20 20 20 20 20 69 73 20 63  rmat.**     is c
1340: 68 61 6e 67 65 64 20 69 6e 20 74 77 6f 20 77 61  hanged in two wa
1350: 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ys:.**.**       
1360: 2b 20 69 66 20 74 68 65 20 66 69 72 73 74 20 72  + if the first r
1370: 6f 77 69 64 20 6f 6e 20 61 20 70 61 67 65 20 6f  owid on a page o
1380: 63 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65  ccurs before the
1390: 20 66 69 72 73 74 20 74 65 72 6d 2c 20 69 74 0a   first term, it.
13a0: 2a 2a 20 20 20 20 20 20 20 20 20 69 73 20 73 74  **         is st
13b0: 6f 72 65 64 20 61 73 20 61 20 6c 69 74 65 72 61  ored as a litera
13c0: 6c 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  l value:.**.**  
13d0: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
13e0: 74 3a 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a  t:  first rowid.
13f0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 74 68  **.**       + th
1400: 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
1410: 65 61 63 68 20 70 61 67 65 20 69 73 20 73 74 6f  each page is sto
1420: 72 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  red in the same 
1430: 77 61 79 20 61 73 20 74 68 65 0a 2a 2a 20 20 20  way as the.**   
1440: 20 20 20 20 20 20 76 65 72 79 20 66 69 72 73 74        very first
1450: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 67   term of the seg
1460: 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment:.**.**     
1470: 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 20 3a          varint :
1480: 20 73 69 7a 65 20 6f 66 20 66 69 72 73 74 20 74   size of first t
1490: 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  erm.**          
14a0: 20 20 20 62 6c 6f 62 3a 20 20 20 20 66 69 72 73     blob:    firs
14b0: 74 20 74 65 72 6d 20 64 61 74 61 0a 2a 2a 0a 2a  t term data.**.*
14c0: 2a 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20  *     Each leaf 
14d0: 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68  page begins with
14e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20  :.**.**       + 
14f0: 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  2-byte unsigned 
1500: 63 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65  containing offse
1510: 74 20 74 6f 20 66 69 72 73 74 20 72 6f 77 69 64  t to first rowid
1520: 20 28 6f 72 20 30 29 2e 0a 2a 2a 20 20 20 20 20   (or 0)..**     
1530: 20 20 2b 20 32 2d 62 79 74 65 20 75 6e 73 69 67    + 2-byte unsig
1540: 6e 65 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6f  ned containing o
1550: 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 74  ffset to first t
1560: 65 72 6d 20 28 6f 72 20 30 29 2e 0a 2a 2a 0a 2a  erm (or 0)..**.*
1570: 2a 20 20 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  *   Followed by 
1580: 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74  term/doclist dat
1590: 61 2e 0a 2a 2a 0a 2a 2a 20 34 2e 20 53 65 67 6d  a..**.** 4. Segm
15a0: 65 6e 74 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  ent interior nod
15b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  es:.**.**   The 
15c0: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 74  interior nodes t
15d0: 75 72 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20  urn the list of 
15e0: 6c 65 61 76 65 73 20 69 6e 74 6f 20 61 20 62 2b  leaves into a b+
15f0: 74 72 65 65 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 45  tree. .**.**   E
1600: 61 63 68 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  ach interior nod
1610: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  e begins with a 
1620: 76 61 72 69 6e 74 20 2d 20 74 68 65 20 70 61 67  varint - the pag
1630: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1640: 6c 65 66 74 0a 2a 2a 20 20 20 6d 6f 73 74 20 63  left.**   most c
1650: 68 69 6c 64 20 6e 6f 64 65 2e 20 46 6f 6c 6c 6f  hild node. Follo
1660: 77 69 6e 67 20 74 68 69 73 2c 20 66 6f 72 20 65  wing this, for e
1670: 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 65 78  ach leaf page ex
1680: 63 65 70 74 20 74 68 65 20 66 69 72 73 74 2c 0a  cept the first,.
1690: 2a 2a 20 20 20 74 68 65 20 69 6e 74 65 72 69 6f  **   the interio
16a0: 72 20 6e 6f 64 65 73 20 63 6f 6e 74 61 69 6e 3a  r nodes contain:
16b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 29 20 49 66  .**.**     a) If
16c0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 63   the leaf page c
16d0: 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74  ontains at least
16e0: 20 6f 6e 65 20 74 65 72 6d 2c 20 74 68 65 6e 20   one term, then 
16f0: 61 20 74 65 72 6d 2d 70 72 65 66 69 78 20 74 68  a term-prefix th
1700: 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 69 73 20  at.**        is 
1710: 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
1720: 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 73 2c   previous terms,
1730: 20 61 6e 64 20 6c 65 73 73 20 74 68 61 6e 20 6f   and less than o
1740: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a  r equal to the.*
1750: 2a 20 20 20 20 20 20 20 20 66 69 72 73 74 20 74  *        first t
1760: 65 72 6d 20 6f 6e 20 74 68 65 20 6c 65 61 66 20  erm on the leaf 
1770: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  page..**.**     
1780: 62 29 20 49 66 20 74 68 65 20 6c 65 61 66 20 70  b) If the leaf p
1790: 61 67 65 20 6e 6f 20 74 65 72 6d 73 2c 20 61 20  age no terms, a 
17a0: 72 65 63 6f 72 64 20 69 6e 64 69 63 61 74 69 6e  record indicatin
17b0: 67 20 68 6f 77 20 6d 61 6e 79 20 63 6f 6e 73 65  g how many conse
17c0: 63 75 74 69 76 65 0a 2a 2a 20 20 20 20 20 20 20  cutive.**       
17d0: 20 6c 65 61 76 65 73 20 63 6f 6e 74 61 69 6e 20   leaves contain 
17e0: 6e 6f 20 74 65 72 6d 73 2c 20 61 6e 64 20 77 68  no terms, and wh
17f0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1800: 72 65 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61  re is an associa
1810: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 62 79  ted.**        by
1820: 2d 72 6f 77 69 64 20 69 6e 64 65 78 20 72 65 63  -rowid index rec
1830: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 42 79 20  ord..**.**   By 
1840: 64 65 66 69 6e 69 74 69 6f 6e 2c 20 74 68 65 72  definition, ther
1850: 65 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  e is never more 
1860: 74 68 61 6e 20 6f 6e 65 20 74 79 70 65 20 28 62  than one type (b
1870: 29 20 72 65 63 6f 72 64 20 69 6e 20 61 20 72 6f  ) record in a ro
1880: 77 2e 0a 2a 2a 20 20 20 54 79 70 65 20 28 62 29  w..**   Type (b)
1890: 20 72 65 63 6f 72 64 73 20 6f 6e 6c 79 20 65 76   records only ev
18a0: 65 72 20 61 70 70 65 61 72 20 6f 6e 20 68 65 69  er appear on hei
18b0: 67 68 74 3d 31 20 70 61 67 65 73 20 2d 20 69 6d  ght=1 pages - im
18c0: 6d 65 64 69 61 74 65 20 70 61 72 65 6e 74 73 0a  mediate parents.
18d0: 2a 2a 20 20 20 6f 66 20 6c 65 61 76 65 73 2e 20  **   of leaves. 
18e0: 4f 6e 6c 79 20 74 79 70 65 20 28 61 29 20 72 65  Only type (a) re
18f0: 63 6f 72 64 73 20 61 72 65 20 70 75 73 68 65 64  cords are pushed
1900: 20 74 6f 20 68 69 67 68 65 72 20 6c 65 76 65 6c   to higher level
1910: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 65 72 6d 20  s..**.**   Term 
1920: 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  format:.**.**   
1930: 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79    * Number of by
1940: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
1950: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
1960: 20 70 6c 75 73 20 32 2c 20 61 73 20 61 20 76 61   plus 2, as a va
1970: 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 4e  rint..**     * N
1980: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1990: 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2c  f new term data,
19a0: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
19b0: 20 20 20 20 20 2a 20 6e 65 77 20 74 65 72 6d 20       * new term 
19c0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f  data..**.**   No
19d0: 2d 74 65 72 6d 20 66 6f 72 6d 61 74 3a 0a 2a 2a  -term format:.**
19e0: 0a 2a 2a 20 20 20 20 20 2a 20 65 69 74 68 65 72  .**     * either
19f0: 20 61 6e 20 30 78 30 30 20 6f 72 20 30 78 30 31   an 0x00 or 0x01
1a00: 20 62 79 74 65 2e 20 49 66 20 74 68 65 20 76 61   byte. If the va
1a10: 6c 75 65 20 30 78 30 31 20 69 73 20 75 73 65 64  lue 0x01 is used
1a20: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 0a 2a 2a  , then there .**
1a30: 20 20 20 20 20 20 20 69 73 20 61 6e 20 61 73 73         is an ass
1a40: 6f 63 69 61 74 65 64 20 69 6e 64 65 78 2d 62 79  ociated index-by
1a50: 2d 72 6f 77 69 64 20 72 65 63 6f 72 64 2e 0a 2a  -rowid record..*
1a60: 2a 20 20 20 20 20 2a 20 74 68 65 20 6e 75 6d 62  *     * the numb
1a70: 65 72 20 6f 66 20 7a 65 72 6f 2d 74 65 72 6d 20  er of zero-term 
1a80: 6c 65 61 76 65 73 20 61 73 20 61 20 76 61 72 69  leaves as a vari
1a90: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 35 2e 20 53 65 67  nt..**.** 5. Seg
1aa0: 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69 6e 64  ment doclist ind
1ab0: 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20  exes:.**.**   A 
1ac0: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
1ad0: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 74 65   If the first te
1ae0: 72 6d 6c 65 73 73 20 70 61 67 65 20 63 6f 6e 74  rmless page cont
1af0: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
1b00: 65 0a 2a 2a 20 20 20 64 6f 63 69 64 2c 20 74 68  e.**   docid, th
1b10: 65 20 6c 69 73 74 20 62 65 67 69 6e 73 20 77 69  e list begins wi
1b20: 74 68 20 74 68 61 74 20 64 6f 63 69 64 20 61 73  th that docid as
1b30: 20 61 20 76 61 72 69 6e 74 20 66 6f 6c 6c 6f 77   a varint follow
1b40: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 20 20 76  ed by the.**   v
1b50: 61 6c 75 65 20 31 20 28 30 78 30 31 29 2e 20 4f  alue 1 (0x01). O
1b60: 72 2c 20 69 66 20 74 68 65 20 66 69 72 73 74 20  r, if the first 
1b70: 74 65 72 6d 6c 65 73 73 20 70 61 67 65 20 63 6f  termless page co
1b80: 6e 74 61 69 6e 73 20 6e 6f 20 64 6f 63 69 64 73  ntains no docids
1b90: 2c 0a 2a 2a 20 20 20 61 20 76 61 72 69 6e 74 20  ,.**   a varint 
1ba0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
1bb0: 61 73 74 20 64 6f 63 69 64 20 73 74 6f 72 65 64  ast docid stored
1bc0: 20 6f 6e 20 74 68 65 20 74 65 72 6d 20 70 61 67   on the term pag
1bd0: 65 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 20 20  e followed.**   
1be0: 62 79 20 61 20 30 20 28 30 78 30 30 29 20 76 61  by a 0 (0x00) va
1bf0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 72  lue..**.**   For
1c00: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c10: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 6f 63   page in the doc
1c20: 6c 69 73 74 2c 20 65 69 74 68 65 72 20 61 20 30  list, either a 0
1c30: 78 30 30 20 62 79 74 65 20 69 66 20 74 68 65 0a  x00 byte if the.
1c40: 2a 2a 20 20 20 70 61 67 65 20 63 6f 6e 74 61 69  **   page contai
1c50: 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 20  ns no terms, or 
1c60: 61 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20  a delta-encoded 
1c70: 64 6f 63 69 64 20 28 61 6c 77 61 79 73 20 2b 76  docid (always +v
1c80: 65 29 20 0a 2a 2a 20 20 20 72 65 70 72 65 73 65  e) .**   represe
1c90: 6e 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  nting the first 
1ca0: 64 6f 63 69 64 20 6f 6e 20 74 68 65 20 70 61 67  docid on the pag
1cb0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1cc0: 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f  ./*.** Rowids fo
1cd0: 72 20 74 68 65 20 61 76 65 72 61 67 65 73 20 61  r the averages a
1ce0: 6e 64 20 73 74 72 75 63 74 75 72 65 20 72 65 63  nd structure rec
1cf0: 6f 72 64 73 20 69 6e 20 74 68 65 20 25 5f 64 61  ords in the %_da
1d00: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65  ta table..*/.#de
1d10: 66 69 6e 65 20 46 54 53 35 5f 41 56 45 52 41 47  fine FTS5_AVERAG
1d20: 45 53 5f 52 4f 57 49 44 20 20 20 20 20 31 20 20  ES_ROWID     1  
1d30: 20 20 2f 2a 20 52 6f 77 69 64 20 75 73 65 64 20    /* Rowid used 
1d40: 66 6f 72 20 74 68 65 20 61 76 65 72 61 67 65 73  for the averages
1d50: 20 72 65 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69   record */.#defi
1d60: 6e 65 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  ne FTS5_STRUCTUR
1d70: 45 5f 52 4f 57 49 44 28 69 49 64 78 29 20 28 31  E_ROWID(iIdx) (1
1d80: 30 20 2b 20 28 69 49 64 78 29 29 20 20 20 20 20  0 + (iIdx))     
1d90: 2f 2a 20 46 6f 72 20 73 74 72 75 63 74 75 72 65  /* For structure
1da0: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 0a 2f 2a 0a   records */../*.
1db0: 2a 2a 20 4d 61 63 72 6f 73 20 64 65 74 65 72 6d  ** Macros determ
1dc0: 69 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 73  ining the rowids
1dd0: 20 75 73 65 64 20 62 79 20 73 65 67 6d 65 6e 74   used by segment
1de0: 20 6e 6f 64 65 73 2e 20 41 6c 6c 20 6e 6f 64 65   nodes. All node
1df0: 73 20 69 6e 20 61 6c 6c 0a 2a 2a 20 73 65 67 6d  s in all.** segm
1e00: 65 6e 74 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64  ents for all ind
1e10: 65 78 65 73 20 28 74 68 65 20 72 65 67 75 6c 61  exes (the regula
1e20: 72 20 46 54 53 20 69 6e 64 65 78 20 61 6e 64 20  r FTS index and 
1e30: 61 6e 79 20 70 72 65 66 69 78 20 69 6e 64 65 78  any prefix index
1e40: 65 73 29 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es).** are store
1e50: 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  d in the %_data 
1e60: 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67 65  table with large
1e70: 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 73   positive rowids
1e80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61  ..**.** The %_da
1e90: 74 61 20 74 61 62 6c 65 20 6d 61 79 20 63 6f 6e  ta table may con
1ea0: 74 61 69 6e 20 75 70 20 74 6f 20 28 31 3c 3c 46  tain up to (1<<F
1eb0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 49 4e 44 45  TS5_SEGMENT_INDE
1ec0: 58 5f 42 49 54 53 29 20 0a 2a 2a 20 69 6e 64 65  X_BITS) .** inde
1ed0: 78 65 73 20 2d 20 6f 6e 65 20 72 65 67 75 6c 61  xes - one regula
1ee0: 72 20 74 65 72 6d 20 69 6e 64 65 78 20 61 6e 64  r term index and
1ef0: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 72   zero or more pr
1f00: 65 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a  efix indexes..**
1f10: 0a 2a 2a 20 45 61 63 68 20 73 65 67 6d 65 6e 74  .** Each segment
1f20: 20 69 6e 20 61 6e 20 69 6e 64 65 78 20 68 61 73   in an index has
1f30: 20 61 20 75 6e 69 71 75 65 20 69 64 20 67 72 65   a unique id gre
1f40: 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 0a  ater than zero..
1f50: 2a 2a 0a 2a 2a 20 45 61 63 68 20 6e 6f 64 65 20  **.** Each node 
1f60: 69 6e 20 61 20 73 65 67 6d 65 6e 74 20 62 2d 74  in a segment b-t
1f70: 72 65 65 20 69 73 20 61 73 73 69 67 6e 65 64 20  ree is assigned 
1f80: 61 20 22 70 61 67 65 20 6e 75 6d 62 65 72 22 20  a "page number" 
1f90: 74 68 61 74 20 69 73 20 75 6e 69 71 75 65 0a 2a  that is unique.*
1fa0: 2a 20 77 69 74 68 69 6e 20 6e 6f 64 65 73 20 6f  * within nodes o
1fb0: 66 20 69 74 73 20 68 65 69 67 68 74 20 77 69 74  f its height wit
1fc0: 68 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20  hin the segment 
1fd0: 28 6c 65 61 66 20 6e 6f 64 65 73 20 68 61 76 65  (leaf nodes have
1fe0: 20 61 20 68 65 69 67 68 74 20 0a 2a 2a 20 6f 66   a height .** of
1ff0: 20 30 2c 20 70 61 72 65 6e 74 73 20 31 2c 20 65   0, parents 1, e
2000: 74 63 2e 29 2e 20 50 61 67 65 20 6e 75 6d 62 65  tc.). Page numbe
2010: 72 73 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64  rs are allocated
2020: 20 73 65 71 75 65 6e 74 69 61 6c 6c 79 20 73 6f   sequentially so
2030: 20 74 68 61 74 0a 2a 2a 20 61 20 6e 6f 64 65 73   that.** a nodes
2040: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
2050: 61 6c 77 61 79 73 20 6f 6e 65 20 6d 6f 72 65 20  always one more 
2060: 74 68 61 6e 20 69 74 73 20 6c 65 66 74 20 73 69  than its left si
2070: 62 6c 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bling..**.** The
2080: 20 72 6f 77 69 64 20 66 6f 72 20 61 20 6e 6f 64   rowid for a nod
2090: 65 20 69 73 20 74 68 65 6e 20 66 6f 75 6e 64 20  e is then found 
20a0: 75 73 69 6e 67 20 74 68 65 20 46 54 53 35 5f 53  using the FTS5_S
20b0: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 6d  EGMENT_ROWID() m
20c0: 61 63 72 6f 0a 2a 2a 20 62 65 6c 6f 77 2e 20 54  acro.** below. T
20d0: 68 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  he FTS5_SEGMENT_
20e0: 2a 5f 42 49 54 53 20 6d 61 63 72 6f 73 20 64 65  *_BITS macros de
20f0: 66 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20  fine the number 
2100: 6f 66 20 62 69 74 73 20 75 73 65 64 0a 2a 2a 20  of bits used.** 
2110: 74 6f 20 65 6e 63 6f 64 65 20 74 68 65 20 74 68  to encode the th
2120: 72 65 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  ree FTS5_SEGMENT
2130: 5f 52 4f 57 49 44 28 29 20 61 72 67 75 6d 65 6e  _ROWID() argumen
2140: 74 73 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  ts. This module 
2150: 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c 49 54  returns.** SQLIT
2160: 45 5f 46 55 4c 4c 20 61 6e 64 20 66 61 69 6c 73  E_FULL and fails
2170: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 70 65   the current ope
2180: 72 61 74 69 6f 6e 20 69 66 20 74 68 65 79 20 65  ration if they e
2190: 76 65 72 20 70 72 6f 76 65 20 74 6f 6f 20 73 6d  ver prove too sm
21a0: 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
21b0: 46 54 53 35 5f 44 41 54 41 5f 49 44 58 5f 42 20  FTS5_DATA_IDX_B 
21c0: 20 20 20 20 35 20 20 20 20 20 2f 2a 20 4d 61 78      5     /* Max
21d0: 20 6f 66 20 33 31 20 70 72 65 66 69 78 20 69 6e   of 31 prefix in
21e0: 64 65 78 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65  dexes */.#define
21f0: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
2200: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
2210: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
2220: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
2230: 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48   FTS5_DATA_HEIGH
2240: 54 5f 42 20 20 35 20 20 20 20 20 2f 2a 20 4d 61  T_B  5     /* Ma
2250: 78 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 20  x b-tree height 
2260: 6f 66 20 33 32 20 2a 2f 0a 23 64 65 66 69 6e 65  of 32 */.#define
2270: 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
2280: 42 20 20 20 33 31 20 20 20 20 20 2f 2a 20 4d 61  B   31     /* Ma
2290: 78 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  x page number of
22a0: 20 32 31 34 37 34 38 33 36 34 38 20 2a 2f 0a 0a   2147483648 */..
22b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47  #define FTS5_SEG
22c0: 4d 45 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20  MENT_ROWID(idx, 
22d0: 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70  segid, height, p
22e0: 67 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20  gno) (          
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2300: 0a 20 28 28 69 36 34 29 28 69 64 78 29 20 20 20  . ((i64)(idx)   
2310: 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 49   << (FTS5_DATA_I
2320: 44 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  D_B + FTS5_DATA_
2330: 50 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41  PAGE_B + FTS5_DA
2340: 54 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20  TA_HEIGHT_B)) + 
2350: 5c 0a 20 28 28 69 36 34 29 28 73 65 67 69 64 29  \. ((i64)(segid)
2360: 20 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41 5f    << (FTS5_DATA_
2370: 50 41 47 45 5f 42 20 2b 20 46 54 53 35 5f 44 41  PAGE_B + FTS5_DA
2380: 54 41 5f 48 45 49 47 48 54 5f 42 29 29 20 2b 20  TA_HEIGHT_B)) + 
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 5c 0a 20 28 28 69 36 34 29 28 68 65 69 67 68   \. ((i64)(heigh
23b0: 74 29 20 3c 3c 20 28 46 54 53 35 5f 44 41 54 41  t) << (FTS5_DATA
23c0: 5f 50 41 47 45 5f 42 29 29 20 2b 20 20 20 20 20  _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 5c 0a 20 28 28 69 36 34 29 28 70 67 6e 6f    \. ((i64)(pgno
2400: 29 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ))              
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 5c 0a 29 0a 0a 23 69 66 20 46 54 53 35     \.)..#if FTS5
2450: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
2460: 58 45 53 20 3e 20 28 28 31 3c 3c 46 54 53 35 5f  XES > ((1<<FTS5_
2470: 44 41 54 41 5f 49 44 58 5f 42 29 2d 31 29 20 0a  DATA_IDX_B)-1) .
2480: 23 20 65 72 72 6f 72 20 22 46 54 53 35 5f 4d 41  # error "FTS5_MA
2490: 58 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53  X_PREFIX_INDEXES
24a0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 22 0a 23   is too large".#
24b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
24c0: 20 68 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65   height of segme
24d0: 6e 74 20 62 2d 74 72 65 65 73 20 69 73 20 61 63  nt b-trees is ac
24e0: 74 75 61 6c 6c 79 20 6c 69 6d 69 74 65 64 20 74  tually limited t
24f0: 6f 20 6f 6e 65 20 6c 65 73 73 20 74 68 61 6e 20  o one less than 
2500: 0a 2a 2a 20 28 31 3c 3c 48 45 49 47 48 54 5f 42  .** (1<<HEIGHT_B
2510: 49 54 53 29 2e 20 54 68 69 73 20 69 73 20 62 65  ITS). This is be
2520: 63 61 75 73 65 20 74 68 65 20 72 6f 77 69 64 20  cause the rowid 
2530: 61 64 64 72 65 73 73 20 73 70 61 63 65 20 66 6f  address space fo
2540: 72 20 6e 6f 64 65 73 0a 2a 2a 20 77 69 74 68 20  r nodes.** with 
2550: 73 75 63 68 20 61 20 68 65 69 67 68 74 20 69 73  such a height is
2560: 20 75 73 65 64 20 62 79 20 64 6f 63 6c 69 73 74   used by doclist
2570: 20 69 6e 64 65 78 65 73 2e 0a 2a 2f 0a 23 64 65   indexes..*/.#de
2580: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d 45 4e  fine FTS5_SEGMEN
2590: 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 28 28 31  T_MAX_HEIGHT ((1
25a0: 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45   << FTS5_DATA_HE
25b0: 49 47 48 54 5f 42 29 2d 31 29 0a 0a 2f 2a 0a 2a  IGHT_B)-1)../*.*
25c0: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
25d0: 74 68 65 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  the doclist inde
25e0: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
25f0: 68 20 6c 65 61 66 20 70 61 67 65 20 70 67 6e 6f  h leaf page pgno
2600: 20 6f 66 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 73   of segment.** s
2610: 65 67 69 64 20 69 6e 20 69 6e 64 65 78 20 69 64  egid in index id
2620: 78 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  x..*/.#define FT
2630: 53 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52  S5_DOCLIST_IDX_R
2640: 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c  OWID(idx, segid,
2650: 20 70 67 6e 6f 29 20 5c 0a 20 20 20 20 20 20 20   pgno) \.       
2660: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
2670: 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20  WID(idx, segid, 
2680: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58  FTS5_SEGMENT_MAX
2690: 5f 48 45 49 47 48 54 2c 20 70 67 6e 6f 29 0a 0a  _HEIGHT, pgno)..
26a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
26b0: 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  BUG.int sqlite3F
26c0: 74 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72  ts5Corrupt() { r
26d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26e0: 52 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e  RUPT_VTAB; }.#en
26f0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  dif.../*.** Each
2700: 20 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20   time a blob is 
2710: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  read from the %_
2720: 64 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69  data table, it i
2730: 73 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68  s padded with th
2740: 69 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20  is.** many zero 
2750: 62 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65  bytes. This make
2760: 73 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64  s it easier to d
2770: 65 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75  ecode the variou
2780: 73 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73  s record formats
2790: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72  .** without over
27a0: 72 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72  reading if the r
27b0: 65 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75  ecords are corru
27c0: 70 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46  pt..*/.#define F
27d0: 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
27e0: 44 44 49 4e 47 20 38 0a 0a 74 79 70 65 64 65 66  DDING 8..typedef
27f0: 20 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65   struct Fts5Btre
2800: 65 49 74 65 72 20 46 74 73 35 42 74 72 65 65 49  eIter Fts5BtreeI
2810: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2820: 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74 65  uct Fts5BtreeIte
2830: 72 4c 65 76 65 6c 20 46 74 73 35 42 74 72 65 65  rLevel Fts5Btree
2840: 49 74 65 72 4c 65 76 65 6c 3b 0a 74 79 70 65 64  IterLevel;.typed
2850: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43 68  ef struct Fts5Ch
2860: 75 6e 6b 49 74 65 72 20 46 74 73 35 43 68 75 6e  unkIter Fts5Chun
2870: 6b 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  kIter;.typedef s
2880: 74 72 75 63 74 20 46 74 73 35 44 61 74 61 20 46  truct Fts5Data F
2890: 74 73 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66  ts5Data;.typedef
28a0: 20 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64   struct Fts5Dlid
28b0: 78 49 74 65 72 20 46 74 73 35 44 6c 69 64 78 49  xIter Fts5DlidxI
28c0: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
28d0: 75 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67  uct Fts5MultiSeg
28e0: 49 74 65 72 20 46 74 73 35 4d 75 6c 74 69 53 65  Iter Fts5MultiSe
28f0: 67 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  gIter;.typedef s
2900: 74 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74  truct Fts5NodeIt
2910: 65 72 20 46 74 73 35 4e 6f 64 65 49 74 65 72 3b  er Fts5NodeIter;
2920: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2930: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 46  Fts5PageWriter F
2940: 74 73 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74  ts5PageWriter;.t
2950: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2960: 73 35 50 6f 73 49 74 65 72 20 46 74 73 35 50 6f  s5PosIter Fts5Po
2970: 73 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  sIter;.typedef s
2980: 74 72 75 63 74 20 46 74 73 35 53 65 67 49 74 65  truct Fts5SegIte
2990: 72 20 46 74 73 35 53 65 67 49 74 65 72 3b 0a 74  r Fts5SegIter;.t
29a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
29b0: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 46 74  s5DoclistIter Ft
29c0: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74  s5DoclistIter;.t
29d0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
29e0: 73 35 53 65 67 57 72 69 74 65 72 20 46 74 73 35  s5SegWriter Fts5
29f0: 53 65 67 57 72 69 74 65 72 3b 0a 74 79 70 65 64  SegWriter;.typed
2a00: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
2a10: 72 75 63 74 75 72 65 20 46 74 73 35 53 74 72 75  ructure Fts5Stru
2a20: 63 74 75 72 65 3b 0a 74 79 70 65 64 65 66 20 73  cture;.typedef s
2a30: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2a40: 75 72 65 4c 65 76 65 6c 20 46 74 73 35 53 74 72  ureLevel Fts5Str
2a50: 75 63 74 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70  uctureLevel;.typ
2a60: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2a70: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
2a80: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2a90: 67 6d 65 6e 74 3b 0a 0a 73 74 72 75 63 74 20 46  gment;..struct F
2aa0: 74 73 35 44 61 74 61 20 7b 0a 20 20 75 38 20 2a  ts5Data {.  u8 *
2ab0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2ad0: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
2ae0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f   containing reco
2af0: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  rd */.  int n;  
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2b20: 6f 66 20 72 65 63 6f 72 64 20 69 6e 20 62 79 74  of record in byt
2b30: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
2b40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b50: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 20 63          /* Ref c
2b60: 6f 75 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ount */.};../*.*
2b70: 2a 20 4f 6e 65 20 6f 62 6a 65 63 74 20 70 65 72  * One object per
2b80: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
2b90: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e 64  /.struct Fts5Ind
2ba0: 65 78 20 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  ex {.  Fts5Confi
2bb0: 67 20 2a 70 43 6f 6e 66 69 67 3b 20 20 20 20 20  g *pConfig;     
2bc0: 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74 75 61         /* Virtua
2bd0: 6c 20 74 61 62 6c 65 20 63 6f 6e 66 69 67 75 72  l table configur
2be0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ation */.  char 
2bf0: 2a 7a 44 61 74 61 54 62 6c 3b 20 20 20 20 20 20  *zDataTbl;      
2c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2c10: 6d 65 20 6f 66 20 25 5f 64 61 74 61 20 74 61 62  me of %_data tab
2c20: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72  le */.  int nWor
2c30: 6b 55 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  kUnit;          
2c40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20          /* Leaf 
2c50: 70 61 67 65 73 20 69 6e 20 61 20 22 75 6e 69 74  pages in a "unit
2c60: 22 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20  " of work */..  
2c70: 2f 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65  /*.  ** Variable
2c80: 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  s related to the
2c90: 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 20 6f 66   accumulation of
2ca0: 20 74 6f 6b 65 6e 73 20 61 6e 64 20 64 6f 63 6c   tokens and docl
2cb0: 69 73 74 73 20 77 69 74 68 69 6e 20 74 68 65 0a  ists within the.
2cc0: 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68    ** in-memory h
2cd0: 61 73 68 20 74 61 62 6c 65 73 20 62 65 66 6f 72  ash tables befor
2ce0: 65 20 74 68 65 79 20 61 72 65 20 66 6c 75 73 68  e they are flush
2cf0: 65 64 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f  ed to disk..  */
2d00: 0a 20 20 46 74 73 35 48 61 73 68 20 2a 2a 61 70  .  Fts5Hash **ap
2d10: 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  Hash;           
2d20: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 68     /* Array of h
2d30: 61 73 68 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ash tables */.  
2d40: 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67 44  int nMaxPendingD
2d50: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2d60: 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67 20 64  /* Max pending d
2d70: 61 74 61 20 62 65 66 6f 72 65 20 66 6c 75 73 68  ata before flush
2d80: 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e   to disk */.  in
2d90: 74 20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b 20  t nPendingData; 
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2db0: 20 43 75 72 72 65 6e 74 20 62 79 74 65 73 20 6f   Current bytes o
2dc0: 66 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a  f pending data *
2dd0: 2f 0a 20 20 69 36 34 20 69 57 72 69 74 65 52 6f  /.  i64 iWriteRo
2de0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
2df0: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72      /* Rowid for
2e00: 20 63 75 72 72 65 6e 74 20 64 6f 63 20 62 65 69   current doc bei
2e10: 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20  ng written */.. 
2e20: 20 2f 2a 20 45 72 72 6f 72 20 73 74 61 74 65 2e   /* Error state.
2e30: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2e60: 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a   error code */..
2e70: 20 20 2f 2a 20 53 74 61 74 65 20 75 73 65 64 20    /* State used 
2e80: 62 79 20 74 68 65 20 66 74 73 35 44 61 74 61 58  by the fts5DataX
2e90: 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  XX() functions. 
2ea0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
2eb0: 62 20 2a 70 52 65 61 64 65 72 3b 20 20 20 20 20  b *pReader;     
2ec0: 20 20 20 20 20 2f 2a 20 52 4f 20 69 6e 63 72 2d       /* RO incr-
2ed0: 62 6c 6f 62 20 6f 70 65 6e 20 6f 6e 20 25 5f 64  blob open on %_d
2ee0: 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  ata table */.  s
2ef0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72  qlite3_stmt *pWr
2f00: 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f  iter;          /
2f10: 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f  * "INSERT ... %_
2f20: 64 61 74 61 20 56 41 4c 55 45 53 28 3f 2c 3f 29  data VALUES(?,?)
2f30: 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  " */.  sqlite3_s
2f40: 74 6d 74 20 2a 70 44 65 6c 65 74 65 72 3b 20 20  tmt *pDeleter;  
2f50: 20 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45 54         /* "DELET
2f60: 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 2e 2e  E FROM %_data ..
2f70: 2e 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d  . id>=? AND id<=
2f80: 3f 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61  ?" */.  int nRea
2f90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
2fb0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b   number of block
2fc0: 73 20 72 65 61 64 20 2a 2f 0a 7d 3b 0a 0a 73 74  s read */.};..st
2fd0: 72 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74  ruct Fts5Doclist
2fe0: 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 62 44 65  Iter {.  int bDe
2ff0: 73 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sc;             
3000: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3010: 20 66 6f 72 20 44 45 53 43 20 6f 72 64 65 72 2c   for DESC order,
3020: 20 66 61 6c 73 65 20 66 6f 72 20 41 53 43 20 2a   false for ASC *
3030: 2f 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74  /.  u8 *a;.  int
3040: 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   n;.  int i;..  
3050: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
3060: 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30  les. aPoslist==0
3070: 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34   at EOF */.  i64
3080: 20 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61   iRowid;.  u8 *a
3090: 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e  Poslist;.  int n
30a0: 50 6f 73 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a  Poslist;.};../*.
30b0: 2a 2a 20 45 61 63 68 20 69 74 65 72 61 74 6f 72  ** Each iterator
30c0: 20 75 73 65 64 20 62 79 20 65 78 74 65 72 6e 61   used by externa
30d0: 6c 20 6d 6f 64 75 6c 65 73 20 69 73 20 61 6e 20  l modules is an 
30e0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
30f0: 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   type..*/.struct
3100: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b   Fts5IndexIter {
3110: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
3120: 6e 64 65 78 3b 0a 20 20 46 74 73 35 53 74 72 75  ndex;.  Fts5Stru
3130: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
3140: 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
3150: 65 72 20 2a 70 4d 75 6c 74 69 3b 0a 20 20 46 74  er *pMulti;.  Ft
3160: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
3170: 44 6f 63 6c 69 73 74 3b 0a 20 20 46 74 73 35 42  Doclist;.  Fts5B
3180: 75 66 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20  uffer poslist;  
3190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
31a0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
31b0: 63 75 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20  current poslist 
31c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
31d0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
31e0: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
31f0: 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ord for each ind
3200: 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ex are represent
3210: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46  ed.** using an F
3220: 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63  ts5Structure rec
3230: 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57  ord in memory. W
3240: 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e  hich uses instan
3250: 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f  ces of the .** o
3260: 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75  ther Fts5Structu
3270: 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63  reXXX types as c
3280: 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74  omponents..*/.st
3290: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
32a0: 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e  reSegment {.  in
32b0: 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20  t iSegid;       
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32d0: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
32e0: 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20   int nHeight;   
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73 65   /* Height of se
3310: 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a  gment b-tree */.
3320: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
3350: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
3360: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
3370: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
3380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3390: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
33a0: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
33b0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
33c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
33d0: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3400: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
3410: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
3420: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3440: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
3450: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3460: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3470: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3480: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3490: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
34a0: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
34b0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
34c0: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 75  5Structure {.  u
34d0: 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  64 nWriteCounter
34e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
34f0: 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77  * Total leaves w
3500: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
3510: 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76 65  0 */.  int nLeve
3520: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3530: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3540: 20 6f 66 20 6c 65 76 65 6c 73 20 69 6e 20 74 68   of levels in th
3550: 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74  is index */.  Ft
3560: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
3570: 20 61 4c 65 76 65 6c 5b 30 5d 3b 20 20 20 2f 2a   aLevel[0];   /*
3580: 20 41 72 72 61 79 20 6f 66 20 6e 4c 65 76 65 6c   Array of nLevel
3590: 20 6c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20 2a   level objects *
35a0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f  /.};../*.** An o
35b0: 62 6a 65 63 74 20 6f 66 20 74 79 70 65 20 46 74  bject of type Ft
35c0: 73 35 53 65 67 57 72 69 74 65 72 20 69 73 20 75  s5SegWriter is u
35d0: 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  sed to write to 
35e0: 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72  segments..*/.str
35f0: 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69 74  uct Fts5PageWrit
3600: 65 72 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f 3b  er {.  int pgno;
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
3630: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
3640: 61 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  age */.  Fts5Buf
3650: 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20 20  fer buf;        
3660: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
3670: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 61  er containing pa
3680: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73  ge data */.  Fts
3690: 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36b0: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
36c0: 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  g previous term 
36d0: 6f 6e 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 73 74  on page */.};.st
36e0: 72 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74  ruct Fts5SegWrit
36f0: 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78 3b  er {.  int iIdx;
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
3720: 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
3730: 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20   int iSegid;    
3740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3750: 20 2f 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69   /* Segid to wri
3760: 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  te to */.  int n
3770: 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  Writer;         
3780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3790: 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
37a0: 69 6e 20 61 57 72 69 74 65 72 20 2a 2f 0a 20 20  in aWriter */.  
37b0: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
37c0: 61 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20  aWriter;        
37d0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 50 61 67 65  /* Array of Page
37e0: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20 2a  Writer objects *
37f0: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77  /.  i64 iPrevRow
3800: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3810: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
3820: 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74 6f  docid written to
3830: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
3840: 0a 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69  .  u8 bFirstRowi
3850: 64 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20  dInDoclist;     
3860: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
3870: 78 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73  xt rowid is firs
3880: 74 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a  t in doclist */.
3890: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
38a0: 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  InPage;         
38b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
38c0: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
38d0: 20 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   in page */.  u8
38e0: 20 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67   bFirstTermInPag
38f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3900: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 74 65   True if next te
3910: 72 6d 20 77 69 6c 6c 20 62 65 20 66 69 72 73 74  rm will be first
3920: 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e   in leaf */.  in
3930: 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 20  t nLeafWritten; 
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3950: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   Number of leaf 
3960: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a 2f  pages written */
3970: 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20  .  int nEmpty;  
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
39a0: 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72 6d 2d  contiguous term-
39b0: 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 20 20  less nodes */.  
39c0: 46 74 73 35 42 75 66 66 65 72 20 63 64 6c 69 64  Fts5Buffer cdlid
39d0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
39e0: 20 2f 2a 20 44 6f 63 6c 69 73 74 20 69 6e 64 65   /* Doclist inde
39f0: 78 20 2a 2f 0a 20 20 69 36 34 20 69 44 6c 69 64  x */.  i64 iDlid
3a00: 78 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  xPrev;          
3a10: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
3a20: 75 73 20 72 6f 77 69 64 20 61 70 70 65 6e 64 65  us rowid appende
3a30: 64 20 74 6f 20 64 6c 69 64 78 20 2a 2f 0a 20 20  d to dlidx */.  
3a40: 69 6e 74 20 62 44 6c 69 64 78 50 72 65 76 56 61  int bDlidxPrevVa
3a50: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
3a60: 2f 2a 20 54 72 75 65 20 69 66 20 69 44 6c 69 64  /* True if iDlid
3a70: 78 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a  xPrev is valid *
3a80: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  /.};../*.** Obje
3a90: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
3aa0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72   through the mer
3ab0: 67 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f  ged results of o
3ac0: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
3ad0: 6e 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67  nts,.** visiting
3ae0: 20 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64   each term/docid
3af0: 20 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72   pair in the mer
3b00: 67 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ged data..**.** 
3b10: 6e 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61  nSeg is always a
3b20: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72   power of two gr
3b30: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
3b40: 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ual to the numbe
3b50: 72 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73  r of.** segments
3b60: 20 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63   that this objec
3b70: 74 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74  t is merging dat
3b80: 61 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65  a from. Both the
3b90: 20 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61   aSeg[] and.** a
3ba0: 46 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61  First[] arrays a
3bb0: 72 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67  re sized at nSeg
3bc0: 20 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53   entries. The aS
3bd0: 65 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61  eg[] array is pa
3be0: 64 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72  dded.** with zer
3bf0: 6f 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68  oed objects - th
3c00: 65 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ese are handled 
3c10: 61 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20  as if they were 
3c20: 69 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64  iterators opened
3c30: 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67  .** on empty seg
3c40: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
3c50: 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
3c60: 61 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61  aring segments a
3c70: 53 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b  Seg[N] and aSeg[
3c80: 4e 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73  N+1], where N is
3c90: 20 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62   an.** even numb
3ca0: 65 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  er, is stored in
3cb0: 20 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29   aFirst[(nSeg+N)
3cc0: 2f 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74  /2]. The "result
3cd0: 22 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d  " of the .** com
3ce0: 70 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20  parison in this 
3cf0: 63 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69  context is the i
3d00: 6e 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72  ndex of the iter
3d10: 61 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e  ator that curren
3d20: 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  tly.** points to
3d30: 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72   the smaller ter
3d40: 6d 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74  m/rowid combinat
3d50: 69 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61  ion. Iterators a
3d60: 74 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e  t EOF are.** con
3d70: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72  sidered to be gr
3d80: 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f  eater than all o
3d90: 74 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a  ther iterators..
3da0: 2a 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20  **.** aFirst[1] 
3db0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
3dc0: 65 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20  ex in aSeg[] of 
3dd0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61  the iterator tha
3de0: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
3df0: 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
3e00: 6f 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b  overall. aFirst[
3e10: 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a  0] is unused. .*
3e20: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c  /.struct Fts5Mul
3e30: 74 69 53 65 67 49 74 65 72 20 7b 0a 20 20 69 6e  tiSegIter {.  in
3e40: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3e60: 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20   Size of aSeg[] 
3e70: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
3e80: 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
3e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3ea0: 75 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e  ue to iterate in
3eb0: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
3ec0: 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70  /.  int bSkipEmp
3ed0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
3ee0: 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73      /* True to s
3ef0: 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72  kip deleted entr
3f00: 69 65 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ies */.  Fts5Seg
3f10: 49 74 65 72 20 2a 61 53 65 67 3b 20 20 20 20 20  Iter *aSeg;     
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
3f30: 79 20 6f 66 20 73 65 67 6d 65 6e 74 20 69 74 65  y of segment ite
3f40: 72 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20  rators */.  u16 
3f50: 2a 61 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *aFirst;        
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3f70: 75 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61  urrent merge sta
3f80: 74 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a  te (see above) *
3f90: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  /.};../*.** Obje
3fa0: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
3fb0: 20 74 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c   through a singl
3fc0: 65 20 73 65 67 6d 65 6e 74 2c 20 76 69 73 69 74  e segment, visit
3fd0: 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 64 6f  ing each term/do
3fe0: 63 69 64 0a 2a 2a 20 70 61 69 72 20 69 6e 20 74  cid.** pair in t
3ff0: 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  he segment..**.*
4000: 2a 20 70 53 65 67 3a 0a 2a 2a 20 20 20 54 68 65  * pSeg:.**   The
4010: 20 73 65 67 6d 65 6e 74 20 74 6f 20 69 74 65 72   segment to iter
4020: 61 74 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a  ate through..**.
4030: 2a 2a 20 69 4c 65 61 66 50 67 6e 6f 3a 0a 2a 2a  ** iLeafPgno:.**
4040: 20 20 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20     Current leaf 
4050: 70 61 67 65 20 6e 75 6d 62 65 72 20 77 69 74 68  page number with
4060: 69 6e 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a  in segment..**.*
4070: 2a 20 69 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a  * iLeafOffset:.*
4080: 2a 20 20 20 42 79 74 65 20 6f 66 66 73 65 74 20  *   Byte offset 
4090: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
40a0: 6e 74 20 6c 65 61 66 20 74 68 61 74 20 69 73 20  nt leaf that is 
40b0: 6f 6e 65 20 62 79 74 65 20 70 61 73 74 20 74 68  one byte past th
40c0: 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
40d0: 20 20 72 6f 77 69 64 20 66 69 65 6c 64 20 6f 66    rowid field of
40e0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
40f0: 72 79 2e 20 55 73 75 61 6c 6c 79 20 74 68 69 73  ry. Usually this
4100: 20 69 73 20 74 68 65 20 73 69 7a 65 20 66 69 65   is the size fie
4110: 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 70  ld of the.**   p
4120: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
4130: 61 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  a. The exception
4140: 20 69 73 20 69 66 20 74 68 65 20 72 6f 77 69 64   is if the rowid
4150: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
4160: 20 65 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73 20   entry .**   is 
4170: 74 68 65 20 6c 61 73 74 20 74 68 69 6e 67 20 6f  the last thing o
4180: 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e  n the leaf page.
4190: 0a 2a 2a 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a  .**.** pLeaf:.**
41a0: 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69     Buffer contai
41b0: 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 6c 65 61  ning current lea
41c0: 66 20 70 61 67 65 20 64 61 74 61 2e 20 53 65 74  f page data. Set
41d0: 20 74 6f 20 4e 55 4c 4c 20 61 74 20 45 4f 46 2e   to NULL at EOF.
41e0: 0a 2a 2a 0a 2a 2a 20 69 54 65 72 6d 4c 65 61 66  .**.** iTermLeaf
41f0: 50 67 6e 6f 2c 20 69 54 65 72 6d 4c 65 61 66 4f  Pgno, iTermLeafO
4200: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 4c 65 61 66  ffset:.**   Leaf
4210: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 63 6f 6e   page number con
4220: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74  taining the last
4230: 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20   term read from 
4240: 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 41 6e 64  the segment. And
4250: 0a 2a 2a 20 20 20 74 68 65 20 6f 66 66 73 65 74  .**   the offset
4260: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4270: 6c 6f 77 69 6e 67 20 74 68 65 20 74 65 72 6d 20  lowing the term 
4280: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67  data..**.** flag
4290: 73 3a 0a 2a 2a 20 20 20 4d 61 73 6b 20 6f 66 20  s:.**   Mask of 
42a0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 58 58 58  FTS5_SEGITER_XXX
42b0: 20 76 61 6c 75 65 73 2e 20 49 6e 74 65 72 70 72   values. Interpr
42c0: 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
42d0: 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45  .**.**   FTS5_SE
42e0: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a  GITER_ONETERM:.*
42f0: 2a 20 20 20 20 20 49 66 20 73 65 74 2c 20 73 65  *     If set, se
4300: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  t the iterator t
4310: 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20 61  o point to EOF a
4320: 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
4330: 20 64 6f 63 6c 69 73 74 20 0a 2a 2a 20 20 20 20   doclist .**    
4340: 20 68 61 73 20 62 65 65 6e 20 65 78 68 61 75 73   has been exhaus
4350: 74 65 64 2e 20 44 6f 20 6e 6f 74 20 70 72 6f 63  ted. Do not proc
4360: 65 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  eed to the next 
4370: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
4380: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53  ent..**.**   FTS
4390: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
43a0: 45 3a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66  E:.**     This f
43b0: 6c 61 67 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  lag is only ever
43c0: 20 73 65 74 20 69 66 20 46 54 53 35 5f 53 45 47   set if FTS5_SEG
43d0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 69 73 20  ITER_ONETERM is 
43e0: 61 6c 73 6f 20 73 65 74 2e 20 49 66 0a 2a 2a 20  also set. If.** 
43f0: 20 20 20 20 69 74 20 69 73 20 73 65 74 2c 20 69      it is set, i
4400: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64  terate through d
4410: 6f 63 69 64 73 20 69 6e 20 61 73 63 65 6e 64 69  ocids in ascendi
4420: 6e 67 20 6f 72 64 65 72 20 69 6e 73 74 65 61 64  ng order instead
4430: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 64   of the.**     d
4440: 65 66 61 75 6c 74 20 64 65 73 63 65 6e 64 69 6e  efault descendin
4450: 67 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 69  g order..**.** i
4460: 52 6f 77 69 64 4f 66 66 73 65 74 2f 6e 52 6f 77  RowidOffset/nRow
4470: 69 64 4f 66 66 73 65 74 2f 61 52 6f 77 69 64 4f  idOffset/aRowidO
4480: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 20 20 54 68  ffset:.**     Th
4490: 65 73 65 20 61 72 65 20 75 73 65 64 20 69 66 20  ese are used if 
44a0: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
44b0: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
44c0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   set..**.**     
44d0: 45 61 63 68 20 74 69 6d 65 20 61 20 6e 65 77 20  Each time a new 
44e0: 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 2c 20  page is loaded, 
44f0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
4500: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
4510: 74 68 65 0a 2a 2a 20 20 20 20 20 66 69 6e 61 6c  the.**     final
4520: 20 72 6f 77 69 64 2e 20 41 64 64 69 74 69 6f 6e   rowid. Addition
4530: 61 6c 6c 79 2c 20 74 68 65 20 61 52 6f 77 69 64  ally, the aRowid
4540: 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20 69  Offset[] array i
4550: 73 20 70 6f 70 75 6c 61 74 65 64 20 0a 2a 2a 20  s populated .** 
4560: 20 20 20 20 77 69 74 68 20 74 68 65 20 62 79 74      with the byt
4570: 65 20 6f 66 66 73 65 74 73 20 6f 66 20 61 6c 6c  e offsets of all
4580: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
4590: 66 69 65 6c 64 73 20 6f 6e 20 74 68 65 20 70 61  fields on the pa
45a0: 67 65 2e 20 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ge. .*/.struct F
45b0: 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20 46  ts5SegIter {.  F
45c0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
45d0: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
45e0: 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74 65  * Segment to ite
45f0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a  rate through */.
4600: 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20    int iIdx;     
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4620: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
4630: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
4640: 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  leaf */.  int fl
4650: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
4660: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
4670: 6b 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69  k of configurati
4680: 6f 6e 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  on flags */.  in
4690: 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20  t iLeafPgno;    
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
46b0: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   Current leaf pa
46c0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 46  ge number */.  F
46d0: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20  ts5Data *pLeaf; 
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
46f0: 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
4700: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  ata */.  int iLe
4710: 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  afOffset;       
4720: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
4730: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 63   offset within c
4740: 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a  urrent leaf */..
4750: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e    /* The page an
4760: 64 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68  d offset from wh
4770: 69 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ich the current 
4780: 74 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54  term was read. T
4790: 68 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20  he offset .  ** 
47a0: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  is the offset of
47b0: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
47c0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
47d0: 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69  doclist.  */.  i
47e0: 6e 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  nt iTermLeafPgno
47f0: 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61  ;.  int iTermLea
4800: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 54  fOffset;..  /* T
4810: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
4820: 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 68   only used if th
4830: 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  e FTS5_SEGITER_R
4840: 45 56 45 52 53 45 20 66 6c 61 67 20 69 73 20 73  EVERSE flag is s
4850: 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f  et. */.  int iRo
4860: 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20  widOffset;      
4870: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4880: 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61 52 6f  ent entry in aRo
4890: 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f 0a 20  widOffset[] */. 
48a0: 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66 73 65   int nRowidOffse
48b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
48c0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
48d0: 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66 66 73  ze of aRowidOffs
48e0: 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  et[] array */.  
48f0: 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66 73 65  int *aRowidOffse
4900: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4910: 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66 66 73  /* Array of offs
4920: 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69 65 6c  et to rowid fiel
4930: 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44 6c 69  ds */..  Fts5Dli
4940: 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 3b 20  dxIter *pDlidx; 
4950: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
4960: 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
4970: 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a  t-index */..  /*
4980: 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70 75 6c   Variables popul
4990: 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 63 75  ated based on cu
49a0: 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a 2f 0a  rrent entry. */.
49b0: 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
49c0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
49d0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72    /* Current ter
49e0: 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  m */.  i64 iRowi
49f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
4a00: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4a10: 74 20 72 6f 77 69 64 20 2a 2f 0a 7d 3b 0a 0a 23  t rowid */.};..#
4a20: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49  define FTS5_SEGI
4a30: 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30 78 30 31  TER_ONETERM 0x01
4a40: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45  .#define FTS5_SE
4a50: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 30 78  GITER_REVERSE 0x
4a60: 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  02.../*.** Objec
4a70: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
4a80: 74 68 72 6f 75 67 68 20 70 61 67 69 6e 61 74 65  through paginate
4a90: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63  d data..*/.struc
4aa0: 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20  t Fts5ChunkIter 
4ab0: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
4ac0: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
4ad0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
4ae0: 65 61 66 20 64 61 74 61 2e 20 4e 55 4c 4c 20 2d  eaf data. NULL -
4af0: 3e 20 45 4f 46 2e 20 2a 2f 0a 20 20 69 36 34 20  > EOF. */.  i64 
4b00: 69 4c 65 61 66 52 6f 77 69 64 3b 20 20 20 20 20  iLeafRowid;     
4b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4b20: 62 73 6f 6c 75 74 65 20 72 6f 77 69 64 20 6f 66  bsolute rowid of
4b30: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f   current leaf */
4b40: 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20  .  int nRem;    
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b60: 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69 6e 67 20     /* Remaining 
4b70: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 74 6f  bytes of data to
4b80: 20 72 65 61 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   read */..  /* O
4b90: 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
4ba0: 20 2a 2f 0a 20 20 75 38 20 2a 70 3b 20 20 20 20   */.  u8 *p;    
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bc0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
4bd0: 20 74 6f 20 63 68 75 6e 6b 20 6f 66 20 64 61 74   to chunk of dat
4be0: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  a */.  int n;   
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4c10: 66 20 62 75 66 66 65 72 20 70 20 69 6e 20 62 79  f buffer p in by
4c20: 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  tes */.};../*.**
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 61 20  ating through a 
4c50: 73 69 6e 67 6c 65 20 70 6f 73 69 74 69 6f 6e 20  single position 
4c60: 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f  list on disk..*/
4c70: 0a 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 49  .struct Fts5PosI
4c80: 74 65 72 20 7b 0a 20 20 46 74 73 35 43 68 75 6e  ter {.  Fts5Chun
4c90: 6b 49 74 65 72 20 63 68 75 6e 6b 3b 20 20 20 20  kIter chunk;    
4ca0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4cb0: 6e 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61  nt chunk of data
4cc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
4cf0: 77 69 74 68 69 6e 20 63 68 75 6e 6b 20 64 61 74  within chunk dat
4d00: 61 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 43 6f 6c  a */..  int iCol
4d10: 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b 0a 7d 3b  ;.  int iPos;.};
4d20: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66  ../*.** Object f
4d30: 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
4d40: 6f 75 67 68 20 74 68 65 20 63 6f 6e 65 6e 74 73  ough the conents
4d50: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 69 6e 74   of a single int
4d60: 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20 0a 2a  ernal node in .*
4d70: 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 72  * memory..*/.str
4d80: 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65 72  uct Fts5NodeIter
4d90: 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72 6e 61 6c   {.  /* Internal
4da0: 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e 61 67 65  . Set and manage
4db0: 64 20 62 79 20 66 74 73 35 4e 6f 64 65 49 74 65  d by fts5NodeIte
4dc0: 72 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  rXXX() functions
4dd0: 2e 20 45 78 63 65 70 74 2c 20 0a 20 20 2a 2a 20  . Except, .  ** 
4de0: 74 68 65 20 45 4f 46 20 74 65 73 74 20 66 6f 72  the EOF test for
4df0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
4e00: 20 28 46 74 73 35 4e 6f 64 65 49 74 65 72 2e 61   (Fts5NodeIter.a
4e10: 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f 0a 20 20  Data==0).  */.  
4e20: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 3b  const u8 *aData;
4e30: 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b 0a 20 20  .  int nData;.  
4e40: 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 2f 2a 20  int iOff;..  /* 
4e50: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
4e60: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
4e70: 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 45 6d   term;.  int nEm
4e80: 70 74 79 3b 0a 20 20 69 6e 74 20 69 43 68 69 6c  pty;.  int iChil
4e90: 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b  d;.  int bDlidx;
4ea0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
4eb0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
4ec0: 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 69 73 20  llowing type is 
4ed0: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
4ee0: 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 74  through the cont
4ef0: 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20 64 6f 63  ents.** of a doc
4f00: 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72  list-index recor
4f10: 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74 61 3a 0a  d..**.** pData:.
4f20: 2a 2a 20 20 20 52 65 63 6f 72 64 20 63 6f 6e 74  **   Record cont
4f30: 61 69 6e 69 6e 67 20 74 68 65 20 64 6f 63 6c 69  aining the docli
4f40: 73 74 2d 69 6e 64 65 78 20 64 61 74 61 2e 0a 2a  st-index data..*
4f50: 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a 20 20 20  *.** bEof:.**   
4f60: 53 65 74 20 74 6f 20 74 72 75 65 20 6f 6e 63 65  Set to true once
4f70: 20 69 74 65 72 61 74 6f 72 20 68 61 73 20 72 65   iterator has re
4f80: 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  ached EOF..**.**
4f90: 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53 65 74 20   iOff:.**   Set 
4fa0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  to the current o
4fb0: 66 66 73 65 74 20 77 69 74 68 69 6e 20 72 65 63  ffset within rec
4fc0: 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f 0a 73 74  ord pData..*/.st
4fd0: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74  ruct Fts5DlidxIt
4fe0: 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  er {.  Fts5Data 
4ff0: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
5000: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5010: 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 2c 20   doclist index, 
5020: 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  if any */.  int 
5030: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
5040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
5050: 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 74 6f  rent offset into
5060: 20 70 44 6c 69 64 78 20 2a 2f 0a 20 20 69 6e 74   pDlidx */.  int
5070: 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20   bEof;          
5080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
5090: 20 45 4f 46 20 61 6c 72 65 61 64 79 20 2a 2f 0a   EOF already */.
50a0: 20 20 69 6e 74 20 69 46 69 72 73 74 4f 66 66 3b    int iFirstOff;
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 2f 2a 20 55 73 65 64 20 62 79 20 72 65 76 65 72  /* Used by rever
50d0: 73 65 20 69 74 65 72 61 74 6f 72 73 20 6f 6e 6c  se iterators onl
50e0: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  y */..  /* Outpu
50f0: 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  t variables */. 
5100: 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20   int iLeafPgno; 
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5120: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
5130: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
5140: 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ge */.  i64 iRow
5150: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
5160: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 72        /* First r
5170: 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c 65  owid on leaf iLe
5180: 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  afPgno */.};.../
5190: 2a 0a 2a 2a 20 41 6e 20 46 74 73 35 42 74 72 65  *.** An Fts5Btre
51a0: 65 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20  eIter object is 
51b0: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
51c0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 65 6e 74 72  through all entr
51d0: 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d  ies in the.** b-
51e0: 74 72 65 65 20 68 69 65 72 61 72 63 68 79 20 62  tree hierarchy b
51f0: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 73 69  elonging to a si
5200: 6e 67 6c 65 20 66 74 73 35 20 73 65 67 6d 65 6e  ngle fts5 segmen
5210: 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
5220: 74 68 65 0a 2a 2a 20 22 62 2d 74 72 65 65 20 68  the.** "b-tree h
5230: 69 65 72 61 72 63 68 79 22 20 69 73 20 61 6c 6c  ierarchy" is all
5240: 20 62 2d 74 72 65 65 20 6e 6f 64 65 73 20 65 78   b-tree nodes ex
5250: 63 65 70 74 20 6c 65 61 76 65 73 2e 20 45 61 63  cept leaves. Eac
5260: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a  h entry in the.*
5270: 2a 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63  * b-tree hierarc
5280: 68 79 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  hy consists of t
5290: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
52a0: 0a 2a 2a 20 20 20 69 4c 65 61 66 3a 20 20 54 68  .**   iLeaf:  Th
52b0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
52c0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 74   the leaf page t
52d0: 68 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 20  he entry points 
52e0: 74 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 74 65 72 6d  to..**.**   term
52f0: 3a 20 20 20 41 20 73 70 6c 69 74 2d 6b 65 79 20  :   A split-key 
5300: 74 68 61 74 20 61 6c 6c 20 74 65 72 6d 73 20 6f  that all terms o
5310: 6e 20 6c 65 61 66 20 70 61 67 65 20 24 69 4c 65  n leaf page $iLe
5320: 61 66 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  af must be great
5330: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
5340: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
5350: 2e 20 54 68 65 20 22 74 65 72 6d 22 20 61 73 73  . The "term" ass
5360: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
5370: 20 66 69 72 73 74 20 62 2d 74 72 65 65 0a 2a 2a   first b-tree.**
5380: 20 20 20 20 20 20 20 20 20 20 20 68 69 65 72 61             hiera
5390: 72 63 68 79 20 65 6e 74 72 79 20 28 74 68 65 20  rchy entry (the 
53a0: 6f 6e 65 20 74 68 61 74 20 70 6f 69 6e 74 73 20  one that points 
53b0: 74 6f 20 6c 65 61 66 20 70 61 67 65 20 31 29 20  to leaf page 1) 
53c0: 69 73 20 61 6c 77 61 79 73 20 0a 2a 2a 20 20 20  is always .**   
53d0: 20 20 20 20 20 20 20 20 61 6e 20 65 6d 70 74 79          an empty
53e0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20   string..**.**  
53f0: 20 6e 45 6d 70 74 79 3a 20 54 68 65 20 6e 75 6d   nEmpty: The num
5400: 62 65 72 20 6f 66 20 65 6d 70 74 79 20 28 74 65  ber of empty (te
5410: 72 6d 6c 65 73 73 29 20 6c 65 61 66 20 70 61 67  rmless) leaf pag
5420: 65 73 20 74 68 61 74 20 69 6d 6d 65 64 69 61 74  es that immediat
5430: 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ely.**          
5440: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65 61 66   following iLeaf
5450: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35  ..**.** The Fts5
5460: 42 74 72 65 65 49 74 65 72 20 6f 62 6a 65 63 74  BtreeIter object
5470: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
5480: 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e 74   part of the int
5490: 65 67 72 69 74 79 2d 63 68 65 63 6b 20 63 6f 64  egrity-check cod
54a0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  e..*/.struct Fts
54b0: 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20  5BtreeIterLevel 
54c0: 7b 0a 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72  {.  Fts5NodeIter
54d0: 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
54e0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
54f0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
5500: 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  node */.  Fts5Da
5510: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
5520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5530: 61 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  a for the curren
5540: 74 20 6e 6f 64 65 20 2a 2f 0a 7d 3b 0a 73 74 72  t node */.};.str
5550: 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74 65  uct Fts5BtreeIte
5560: 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r {.  Fts5Index 
5570: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
5580: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
5590: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
55a0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
55b0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
55c0: 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
55d0: 6f 75 67 68 20 74 68 69 73 20 73 65 67 6d 65 6e  ough this segmen
55e0: 74 27 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  t's b-tree */.  
55f0: 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 2f 2a 20 49 6e 64 65 78 20 70 53 65 67 20 62 65  /* Index pSeg be
5620: 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  longs to */.  in
5630: 74 20 6e 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t nLvl;         
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5650: 20 53 69 7a 65 20 6f 66 20 61 4c 76 6c 5b 5d 20   Size of aLvl[] 
5660: 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35 42  array */.  Fts5B
5670: 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 61  treeIterLevel *a
5680: 4c 76 6c 3b 20 20 20 20 20 20 20 2f 2a 20 4c 65  Lvl;       /* Le
5690: 76 65 6c 20 66 6f 72 20 65 61 63 68 20 74 69 65  vel for each tie
56a0: 72 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 0a  r of b-tree */..
56b0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
56c0: 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  ables */.  Fts5B
56d0: 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20  uffer term;     
56e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
56f0: 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  rrent term */.  
5700: 69 6e 74 20 69 4c 65 61 66 3b 20 20 20 20 20 20  int iLeaf;      
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 2f 2a 20 4c 65 61 66 20 63 6f 6e 74 61 69 6e 69  /* Leaf containi
5730: 6e 67 20 74 65 72 6d 73 20 3e 3d 20 63 75 72 72  ng terms >= curr
5740: 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e  ent term */.  in
5750: 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20  t nEmpty;       
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5770: 20 4e 75 6d 62 65 72 20 6f 66 20 22 65 6d 70 74   Number of "empt
5780: 79 22 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  y" leaves follow
5790: 69 6e 67 20 69 4c 65 61 66 20 2a 2f 0a 20 20 69  ing iLeaf */.  i
57a0: 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20  nt bEof;        
57b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
57c0: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 61 74  * Set to true at
57d0: 20 45 4f 46 20 2a 2f 0a 20 20 69 6e 74 20 62 44   EOF */.  int bD
57e0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  lidx;           
57f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
5800: 65 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  e if there exist
5810: 73 20 61 20 64 6c 69 64 78 20 2a 2f 0a 7d 3b 0a  s a dlidx */.};.
5820: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
5830: 73 35 50 75 74 55 31 36 28 75 38 20 2a 61 4f 75  s5PutU16(u8 *aOu
5840: 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a 20 20  t, u16 iVal){.  
5850: 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e  aOut[0] = (iVal>
5860: 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d  >8);.  aOut[1] =
5870: 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a   (iVal&0xFF);.}.
5880: 0a 73 74 61 74 69 63 20 75 31 36 20 66 74 73 35  .static u16 fts5
5890: 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75 38 20  GetU16(const u8 
58a0: 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  *aIn){.  return 
58b0: 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20  ((u16)aIn[0] << 
58c0: 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a  8) + aIn[1];.}..
58d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
58e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 71 6c 69  copy of the sqli
58f0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29  te3GetVarint32()
5900: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74 68   routine from th
5910: 65 20 53 51 4c 69 74 65 20 63 6f 72 65 2e 0a 2a  e SQLite core..*
5920: 2a 20 45 78 63 65 70 74 2c 20 74 68 69 73 20 76  * Except, this v
5930: 65 72 73 69 6f 6e 20 64 6f 65 73 20 68 61 6e 64  ersion does hand
5940: 6c 65 20 74 68 65 20 73 69 6e 67 6c 65 20 62 79  le the single by
5950: 74 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  te case that the
5960: 20 63 6f 72 65 0a 2a 2a 20 76 65 72 73 69 6f 6e   core.** version
5970: 20 64 65 70 65 6e 64 73 20 6f 6e 20 62 65 69 6e   depends on bein
5980: 67 20 68 61 6e 64 6c 65 64 20 62 65 66 6f 72 65  g handled before
5990: 20 69 74 73 20 66 75 6e 63 74 69 6f 6e 20 69 73   its function is
59a0: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 69 6e 74 20   called..*/.int 
59b0: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
59c0: 72 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73  rint32(const uns
59d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 2c 20 75  igned char *p, u
59e0: 33 32 20 2a 76 29 7b 0a 20 20 75 33 32 20 61 2c  32 *v){.  u32 a,
59f0: 62 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 31 2d 62  b;..  /* The 1-b
5a00: 79 74 65 20 63 61 73 65 2e 20 4f 76 65 72 77 68  yte case. Overwh
5a10: 65 6c 6d 69 6e 67 6c 79 20 74 68 65 20 6d 6f 73  elmingly the mos
5a20: 74 20 63 6f 6d 6d 6f 6e 2e 20 2a 2f 0a 20 20 61  t common. */.  a
5a30: 20 3d 20 2a 70 3b 0a 20 20 2f 2a 20 61 3a 20 70   = *p;.  /* a: p
5a40: 30 20 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a  0 (unmasked) */.
5a50: 20 20 69 66 20 28 21 28 61 26 30 78 38 30 29 29    if (!(a&0x80))
5a60: 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75  .  {.    /* Valu
5a70: 65 73 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  es between 0 and
5a80: 20 31 32 37 20 2a 2f 0a 20 20 20 20 2a 76 20 3d   127 */.    *v =
5a90: 20 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   a;.    return 1
5aa0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
5ab0: 32 2d 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20  2-byte case */. 
5ac0: 20 70 2b 2b 3b 0a 20 20 62 20 3d 20 2a 70 3b 0a   p++;.  b = *p;.
5ad0: 20 20 2f 2a 20 62 3a 20 70 31 20 28 75 6e 6d 61    /* b: p1 (unma
5ae0: 73 6b 65 64 29 20 2a 2f 0a 20 20 69 66 20 28 21  sked) */.  if (!
5af0: 28 62 26 30 78 38 30 29 29 0a 20 20 7b 0a 20 20  (b&0x80)).  {.  
5b00: 20 20 2f 2a 20 56 61 6c 75 65 73 20 62 65 74 77    /* Values betw
5b10: 65 65 6e 20 31 32 38 20 61 6e 64 20 31 36 33 38  een 128 and 1638
5b20: 33 20 2a 2f 0a 20 20 20 20 61 20 26 3d 20 30 78  3 */.    a &= 0x
5b30: 37 66 3b 0a 20 20 20 20 61 20 3d 20 61 3c 3c 37  7f;.    a = a<<7
5b40: 3b 0a 20 20 20 20 2a 76 20 3d 20 61 20 7c 20 62  ;.    *v = a | b
5b50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a  ;.    return 2;.
5b60: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 33 2d    }..  /* The 3-
5b70: 62 79 74 65 20 63 61 73 65 20 2a 2f 0a 20 20 70  byte case */.  p
5b80: 2b 2b 3b 0a 20 20 61 20 3d 20 61 3c 3c 31 34 3b  ++;.  a = a<<14;
5b90: 0a 20 20 61 20 7c 3d 20 2a 70 3b 0a 20 20 2f 2a  .  a |= *p;.  /*
5ba0: 20 61 3a 20 70 30 3c 3c 31 34 20 7c 20 70 32 20   a: p0<<14 | p2 
5bb0: 28 75 6e 6d 61 73 6b 65 64 29 20 2a 2f 0a 20 20  (unmasked) */.  
5bc0: 69 66 20 28 21 28 61 26 30 78 38 30 29 29 0a 20  if (!(a&0x80)). 
5bd0: 20 7b 0a 20 20 20 20 2f 2a 20 56 61 6c 75 65 73   {.    /* Values
5be0: 20 62 65 74 77 65 65 6e 20 31 36 33 38 34 20 61   between 16384 a
5bf0: 6e 64 20 32 30 39 37 31 35 31 20 2a 2f 0a 20 20  nd 2097151 */.  
5c00: 20 20 61 20 26 3d 20 28 30 78 37 66 3c 3c 31 34    a &= (0x7f<<14
5c10: 29 7c 28 30 78 37 66 29 3b 0a 20 20 20 20 62 20  )|(0x7f);.    b 
5c20: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 62 20 3d  &= 0x7f;.    b =
5c30: 20 62 3c 3c 37 3b 0a 20 20 20 20 2a 76 20 3d 20   b<<7;.    *v = 
5c40: 61 20 7c 20 62 3b 0a 20 20 20 20 72 65 74 75 72  a | b;.    retur
5c50: 6e 20 33 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  n 3;.  }..  /* A
5c60: 20 33 32 2d 62 69 74 20 76 61 72 69 6e 74 20 69   32-bit varint i
5c70: 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
5c80: 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  size information
5c90: 20 69 6e 20 62 74 72 65 65 73 2e 0a 20 20 2a 2a   in btrees..  **
5ca0: 20 4f 62 6a 65 63 74 73 20 61 72 65 20 72 61 72   Objects are rar
5cb0: 65 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ely larger than 
5cc0: 32 4d 69 42 20 6c 69 6d 69 74 20 6f 66 20 61 20  2MiB limit of a 
5cd0: 33 2d 62 79 74 65 20 76 61 72 69 6e 74 2e 0a 20  3-byte varint.. 
5ce0: 20 2a 2a 20 41 20 33 2d 62 79 74 65 20 76 61 72   ** A 3-byte var
5cf0: 69 6e 74 20 69 73 20 73 75 66 66 69 63 69 65 6e  int is sufficien
5d00: 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  t, for example, 
5d10: 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 69  to record the si
5d20: 7a 65 0a 20 20 2a 2a 20 6f 66 20 61 20 31 30 34  ze.  ** of a 104
5d30: 38 35 36 39 2d 62 79 74 65 20 42 4c 4f 42 20 6f  8569-byte BLOB o
5d40: 72 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2a 0a 20  r string..  **. 
5d50: 20 2a 2a 20 57 65 20 6f 6e 6c 79 20 75 6e 72 6f   ** We only unro
5d60: 6c 6c 20 74 68 65 20 66 69 72 73 74 20 31 2d 2c  ll the first 1-,
5d70: 20 32 2d 2c 20 61 6e 64 20 33 2d 20 62 79 74 65   2-, and 3- byte
5d80: 20 63 61 73 65 73 2e 20 20 54 68 65 20 76 65 72   cases.  The ver
5d90: 79 0a 20 20 2a 2a 20 72 61 72 65 20 6c 61 72 67  y.  ** rare larg
5da0: 65 72 20 63 61 73 65 73 20 63 61 6e 20 62 65 20  er cases can be 
5db0: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 73  handled by the s
5dc0: 6c 6f 77 65 72 20 36 34 2d 62 69 74 20 76 61 72  lower 64-bit var
5dd0: 69 6e 74 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  int.  ** routine
5de0: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75  ..  */.  {.    u
5df0: 36 34 20 76 36 34 3b 0a 20 20 20 20 75 38 20 6e  64 v64;.    u8 n
5e00: 3b 0a 20 20 20 20 70 20 2d 3d 20 32 3b 0a 20 20  ;.    p -= 2;.  
5e10: 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 47 65 74    n = sqlite3Get
5e20: 56 61 72 69 6e 74 28 70 2c 20 26 76 36 34 29 3b  Varint(p, &v64);
5e30: 0a 20 20 20 20 2a 76 20 3d 20 28 75 33 32 29 76  .    *v = (u32)v
5e40: 36 34 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  64;.    assert( 
5e50: 6e 3e 33 20 26 26 20 6e 3c 3d 39 20 29 3b 0a 20  n>3 && n<=9 );. 
5e60: 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 20 20 7d     return n;.  }
5e70: 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
5e80: 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28  ts5GetVarintLen(
5e90: 75 33 32 20 69 56 61 6c 29 7b 0a 20 20 69 66 28  u32 iVal){.  if(
5ea0: 20 69 56 61 6c 3c 28 31 20 3c 3c 20 37 20 29 20   iVal<(1 << 7 ) 
5eb0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
5ec0: 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 31 34 29  ( iVal<(1 << 14)
5ed0: 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 69   ) return 2;.  i
5ee0: 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32 31  f( iVal<(1 << 21
5ef0: 29 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20  ) ) return 3;.  
5f00: 69 66 28 20 69 56 61 6c 3c 28 31 20 3c 3c 20 32  if( iVal<(1 << 2
5f10: 38 29 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  8) ) return 4;. 
5f20: 20 72 65 74 75 72 6e 20 35 3b 0a 7d 0a 0a 2f 2a   return 5;.}../*
5f30: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
5f40: 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72   return a buffer
5f50: 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20   at least nByte 
5f60: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
5f70: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
5f80: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
5f90: 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  red, return NULL
5fa0: 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72   and set the err
5fb0: 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68  or code in.** th
5fc0: 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  e Fts5Index hand
5fd0: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
5fe0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
5ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6000: 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46  *fts5IdxMalloc(F
6010: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
6020: 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20   nByte){.  void 
6030: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
6040: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6050: 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  K ){.    pRet = 
6060: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
6070: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
6080: 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ret==0 ){.      
6090: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
60a0: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
60b0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 52  .      memset(pR
60c0: 65 74 2c 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20  et, 0, nByte);. 
60d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
60e0: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
60f0: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   Compare the con
6100: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65  tents of the pLe
6110: 66 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74  ft buffer with t
6120: 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74  he pRight/nRight
6130: 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   blob..**.** Ret
6140: 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74  urn -ve if pLeft
6150: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
6160: 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68   pRight, 0 if th
6170: 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a  ey are equal or.
6180: 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74  ** +ve if pRight
6190: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
61a0: 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72   pLeft. In other
61b0: 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   words:.**.**   
61c0: 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d    res = *pLeft -
61d0: 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74   *pRight.*/.stat
61e0: 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65  ic int fts5Buffe
61f0: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20  rCompareBlob(.  
6200: 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66  Fts5Buffer *pLef
6210: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
6220: 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64  /* Left hand sid
6230: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
6240: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
6250: 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68  Right, int nRigh
6260: 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61  t    /* Right ha
6270: 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  nd side of compa
6280: 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rison */.){.  in
6290: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
62a0: 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a  ft->n, nRight);.
62b0: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
62c0: 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69  mp(pLeft->p, pRi
62d0: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
62e0: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
62f0: 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68  pLeft->n - nRigh
6300: 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 23 69  t) : res);.}..#i
6310: 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20 66  f 0.static int f
6320: 74 73 35 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a  ts5CompareBlob(.
6330: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 65 66    const u8 *pLef
6340: 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 0a 20 20  t, int nLeft,.  
6350: 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74  const u8 *pRight
6360: 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29 7b 0a  , int nRight.){.
6370: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
6380: 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 29 3b  (nLeft, nRight);
6390: 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
63a0: 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69 67 68  cmp(pLeft, pRigh
63b0: 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  t, nCmp);.  retu
63c0: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 6e 4c  rn (res==0 ? (nL
63d0: 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20 3a 20  eft - nRight) : 
63e0: 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  res);.}.#endif..
63f0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
6400: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
6410: 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73  e two buffers us
6420: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ing memcmp(). If
6430: 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   one buffer.** i
6440: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
6450: 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63  e other, it is c
6460: 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65  onsidered the le
6470: 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sser..**.** Retu
6480: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
6490: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
64a0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
64b0: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
64c0: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
64d0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
64e0: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
64f0: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
6500: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
6510: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
6520: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
6530: 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66  Compare(Fts5Buff
6540: 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42  er *pLeft, Fts5B
6550: 75 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a  uffer *pRight){.
6560: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
6570: 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68  (pLeft->n, pRigh
6580: 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73  t->n);.  int res
6590: 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d   = memcmp(pLeft-
65a0: 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e  >p, pRight->p, n
65b0: 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmp);.  return (
65c0: 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d  res==0 ? (pLeft-
65d0: 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20  >n - pRight->n) 
65e0: 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  : res);.}.../*.*
65f0: 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64  * Close the read
6600: 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c  -only blob handl
6610: 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  e, if it is open
6620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6630: 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
6640: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
6650: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
6660: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6670: 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20  blob *pReader = 
6680: 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20  p->pReader;.    
6690: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
66a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
66b0: 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b  _close(pReader);
66c0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
66d0: 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74  ts5Data *fts5Dat
66e0: 61 52 65 61 64 4f 72 42 75 66 66 65 72 28 0a 20  aReadOrBuffer(. 
66f0: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
6700: 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
6710: 75 66 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  uf, .  i64 iRowi
6720: 64 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  d.){.  Fts5Data 
6730: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
6740: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6750: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  K ){.    int rc 
6760: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  = SQLITE_OK;..#i
6770: 66 20 30 0a 46 74 73 35 42 75 66 66 65 72 20 62  f 0.Fts5Buffer b
6780: 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 66 74  uf = {0,0,0};.ft
6790: 73 35 44 65 62 75 67 52 6f 77 69 64 28 26 72 63  s5DebugRowid(&rc
67a0: 2c 20 26 62 75 66 2c 20 69 52 6f 77 69 64 29 3b  , &buf, iRowid);
67b0: 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  .fprintf(stdout,
67c0: 20 22 72 65 61 64 3a 20 25 73 5c 6e 22 2c 20 62   "read: %s\n", b
67d0: 75 66 2e 70 29 3b 0a 66 66 6c 75 73 68 28 73 74  uf.p);.fflush(st
67e0: 64 6f 75 74 29 3b 0a 73 71 6c 69 74 65 33 5f 66  dout);.sqlite3_f
67f0: 72 65 65 28 62 75 66 2e 70 29 3b 0a 23 65 6e 64  ree(buf.p);.#end
6800: 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  if.    if( p->pR
6810: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f  eader ){.      /
6820: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20  * This call may 
6830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
6840: 4f 52 54 20 69 66 20 74 68 65 72 65 20 68 61 73  ORT if there has
6850: 20 62 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   been a savepoin
6860: 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  t.      ** rollb
6870: 61 63 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73  ack since it was
6880: 20 6c 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74   last used. In t
6890: 68 69 73 20 63 61 73 65 20 61 20 6e 65 77 20 62  his case a new b
68a0: 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20  lob handle.     
68b0: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
68c0: 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
68d0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f  sqlite3_blob_reo
68e0: 70 65 6e 28 70 2d 3e 70 52 65 61 64 65 72 2c 20  pen(p->pReader, 
68f0: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
6900: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42  f( rc==SQLITE_AB
6910: 4f 52 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ORT ){.        f
6920: 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
6930: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
6940: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
6950: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
6960: 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e   If the blob han
6970: 64 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f  dle is not yet o
6980: 70 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65  pen, open and se
6990: 65 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  ek it. Otherwise
69a0: 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  , use.    ** the
69b0: 20 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41   blob_reopen() A
69c0: 50 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65  PI to reseek the
69d0: 20 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68   existing blob h
69e0: 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69  andle.  */.    i
69f0: 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  f( p->pReader==0
6a00: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f   ){.      Fts5Co
6a10: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
6a20: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
6a30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
6a40: 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
6a50: 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  ->db, .         
6a60: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
6a70: 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f  ->zDataTbl, "blo
6a80: 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20  ck", iRowid, 0, 
6a90: 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20  &p->pReader.    
6aa0: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
6ab0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6ac0: 4b 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  K ){.      u8 *a
6ad0: 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
6ae0: 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62         /* Read b
6af0: 6c 6f 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68  lob data into th
6b00: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  is buffer */.   
6b10: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
6b20: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
6b30: 73 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20  s(p->pReader);. 
6b40: 20 20 20 20 20 69 66 28 20 70 42 75 66 20 29 7b       if( pBuf ){
6b50: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
6b60: 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
6b70: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
6b80: 72 47 72 6f 77 28 26 72 63 2c 20 70 42 75 66 2c  rGrow(&rc, pBuf,
6b90: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
6ba0: 20 61 4f 75 74 20 3d 20 70 42 75 66 2d 3e 70 3b   aOut = pBuf->p;
6bb0: 0a 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e  .        pBuf->n
6bc0: 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   = nByte;.      
6bd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
6be0: 6e 74 20 6e 53 70 61 63 65 20 3d 20 6e 42 79 74  nt nSpace = nByt
6bf0: 65 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45  e + FTS5_DATA_ZE
6c00: 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 20 20  RO_PADDING;.    
6c10: 20 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35      pRet = (Fts5
6c20: 44 61 74 61 2a 29 73 71 6c 69 74 65 33 46 74 73  Data*)sqlite3Fts
6c30: 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
6c40: 20 6e 53 70 61 63 65 2b 73 69 7a 65 6f 66 28 46   nSpace+sizeof(F
6c50: 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20 20  ts5Data));.     
6c60: 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
6c70: 20 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e           pRet->n
6c80: 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   = nByte;.      
6c90: 20 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d      aOut = pRet-
6ca0: 3e 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b  >p = (u8*)&pRet[
6cb0: 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52  1];.          pR
6cc0: 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  et->nRef = 1;.  
6cd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6ce0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6cf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6d00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6d10: 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52  _blob_read(p->pR
6d20: 65 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79  eader, aOut, nBy
6d30: 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  te, 0);.      }.
6d40: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
6d50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6d60: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6d70: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70  pRet);.        p
6d80: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Ret = 0;.      }
6d90: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63  .    }.    p->rc
6da0: 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52   = rc;.    p->nR
6db0: 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65  ead++;.  }..  re
6dc0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
6dd0: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72  .** Retrieve a r
6de0: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25  ecord from the %
6df0: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
6e00: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
6e10: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
6e20: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
6e30: 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65  rror left in the
6e40: 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f   .** Fts5Index o
6e50: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
6e60: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
6e70: 61 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65  ataRead(Fts5Inde
6e80: 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
6e90: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
6ea0: 52 65 74 20 3d 20 66 74 73 35 44 61 74 61 52 65  Ret = fts5DataRe
6eb0: 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c  adOrBuffer(p, 0,
6ec0: 20 69 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65   iRowid);.  asse
6ed0: 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28  rt( (pRet==0)==(
6ee0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
6ef0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ) );.  return pR
6f00: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  et;.}../*.** Rea
6f10: 64 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  d a record from 
6f20: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
6f30: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
6f40: 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
6f50: 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  .** second argum
6f60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ent..**.** If an
6f70: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
6f80: 6e 20 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20  n error is left 
6f90: 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  in the Fts5Index
6fa0: 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a   object. If an.*
6fb0: 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  * error has alre
6fc0: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
6fd0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
6fe0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
6ff0: 20 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f   a .** no-op..*/
7000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7010: 35 44 61 74 61 42 75 66 66 65 72 28 46 74 73 35  5DataBuffer(Fts5
7020: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75  Index *p, Fts5Bu
7030: 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20  ffer *pBuf, i64 
7040: 69 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64  iRowid){.  (void
7050: 29 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42  )fts5DataReadOrB
7060: 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69  uffer(p, pBuf, i
7070: 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Rowid);.}../*.**
7080: 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72   Release a refer
7090: 65 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63  ence to data rec
70a0: 6f 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20  ord returned by 
70b0: 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
70c0: 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65  to.** fts5DataRe
70d0: 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ad()..*/.static 
70e0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c  void fts5DataRel
70f0: 65 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70  ease(Fts5Data *p
7100: 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 44 61  Data){.  if( pDa
7110: 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ta ){.    assert
7120: 28 20 70 44 61 74 61 2d 3e 6e 52 65 66 3e 30 20  ( pData->nRef>0 
7130: 29 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 52  );.    pData->nR
7140: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44  ef--;.    if( pD
7150: 61 74 61 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73  ata->nRef==0 ) s
7160: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74  qlite3_free(pDat
7170: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  a);.  }.}..stati
7180: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
7190: 65 66 65 72 65 6e 63 65 28 46 74 73 35 44 61 74  eference(Fts5Dat
71a0: 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 70 44 61  a *pData){.  pDa
71b0: 74 61 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f  ta->nRef++;.}../
71c0: 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52  *.** INSERT OR R
71d0: 45 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20  EPLACE a record 
71e0: 69 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20  into the %_data 
71f0: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
7200: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 57 72   void fts5DataWr
7210: 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ite(Fts5Index *p
7220: 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f  , i64 iRowid, co
7230: 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69  nst u8 *pData, i
7240: 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28  nt nData){.  if(
7250: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
7260: 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  K ) return;..  i
7270: 66 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30  f( p->pWriter==0
7280: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
7290: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
72a0: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
72b0: 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a  nfig;.    char *
72c0: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
72d0: 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
72e0: 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25  "REPLACE INTO '%
72f0: 71 27 2e 25 51 28 69 64 2c 20 62 6c 6f 63 6b 29  q'.%Q(id, block)
7300: 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 70   VALUES(?,?)", p
7310: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
7320: 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a  zDataTbl.    );.
7330: 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20      if( zSql==0 
7340: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
7350: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7360: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
7370: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
7380: 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62  e_v2(pConfig->db
7390: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e  , zSql, -1, &p->
73a0: 70 57 72 69 74 65 72 2c 20 30 29 3b 0a 20 20 20  pWriter, 0);.   
73b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
73c0: 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
73d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
73e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  OK ){.      p->r
73f0: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
7400: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
7410: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
7420: 69 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65 72  int64(p->pWriter
7430: 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  , 1, iRowid);.  
7440: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
7450: 62 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c  b(p->pWriter, 2,
7460: 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 53   pData, nData, S
7470: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7480: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
7490: 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e  >pWriter);.  p->
74a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
74b0: 65 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  et(p->pWriter);.
74c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
74d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   the following S
74e0: 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45  QL:.**.**     DE
74f0: 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61  LETE FROM %_data
7500: 20 57 48 45 52 45 20 69 64 20 42 45 54 57 45 45   WHERE id BETWEE
7510: 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20 24 69  N $iFirst AND $i
7520: 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  Last.*/.static v
7530: 6f 69 64 20 66 74 73 35 44 61 74 61 44 65 6c 65  oid fts5DataDele
7540: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
7550: 20 69 36 34 20 69 46 69 72 73 74 2c 20 69 36 34   i64 iFirst, i64
7560: 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70   iLast){.  if( p
7570: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
7580: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28  ) return;..  if(
7590: 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20   p->pDeleter==0 
75a0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
75b0: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
75c0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
75d0: 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  fig;.    char *z
75e0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
75f0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
7600: 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27  DELETE FROM '%q'
7610: 2e 25 51 20 57 48 45 52 45 20 69 64 3e 3d 3f 20  .%Q WHERE id>=? 
7620: 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e  AND id<=?", pCon
7630: 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61  fig->zDb, p->zDa
7640: 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20  taTbl.    );.   
7650: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
7660: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
7670: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
7680: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
7690: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
76a0: 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a  2(pConfig->db, z
76b0: 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65  Sql, -1, &p->pDe
76c0: 6c 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  leter, 0);.     
76d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
76e0: 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
76f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7700: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
7710: 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
7720: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rn;.    }.  }.. 
7730: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
7740: 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c  t64(p->pDeleter,
7750: 20 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73   1, iFirst);.  s
7760: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
7770: 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32  4(p->pDeleter, 2
7780: 2c 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69  , iLast);.  sqli
7790: 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c  te3_step(p->pDel
77a0: 65 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  eter);.  p->rc =
77b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
77c0: 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a  ->pDeleter);.}..
77d0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
77e0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 68 61 6e  sqlite3_blob han
77f0: 64 6c 65 20 75 73 65 64 20 74 6f 20 72 65 61 64  dle used to read
7800: 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
7810: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
7820: 2a 2a 20 41 6e 64 20 64 69 73 63 61 72 64 20 61  ** And discard a
7830: 6e 79 20 63 61 63 68 65 64 20 72 65 61 64 73 2e  ny cached reads.
7840: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
7850: 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20  s called at the 
7860: 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 72 65 61 64  end of.** a read
7870: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
7880: 77 68 65 6e 20 61 6e 79 20 73 75 62 2d 74 72 61  when any sub-tra
7890: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
78a0: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20  ed back..*/.#if 
78b0: 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  0.static void ft
78c0: 73 35 44 61 74 61 52 65 73 65 74 28 46 74 73 35  s5DataReset(Fts5
78d0: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28  Index *p){.  if(
78e0: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
78f0: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
7900: 63 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64 65 72  close(p->pReader
7910: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65  );.    p->pReade
7920: 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  r = 0;.  }.}.#en
7930: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  dif../*.** Remov
7940: 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61 73  e all records as
7950: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 65  sociated with se
7960: 67 6d 65 6e 74 20 69 53 65 67 69 64 20 69 6e 20  gment iSegid in 
7970: 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2f 0a 73  index iIdx..*/.s
7980: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
7990: 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74  ataRemoveSegment
79a0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
79b0: 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65  nt iIdx, int iSe
79c0: 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46 69 72  gid){.  i64 iFir
79d0: 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  st = FTS5_SEGMEN
79e0: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53  T_ROWID(iIdx, iS
79f0: 65 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20 69  egid, 0, 0);.  i
7a00: 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35 5f  64 iLast = FTS5_
7a10: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
7a20: 64 78 2c 20 69 53 65 67 69 64 2b 31 2c 20 30 2c  dx, iSegid+1, 0,
7a30: 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61 74   0)-1;.  fts5Dat
7a40: 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72 73  aDelete(p, iFirs
7a50: 74 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a 0a 2f 2a  t, iLast);.}../*
7a60: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
7a70: 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74  ference to an Ft
7a80: 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
7a90: 63 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  ct returned by a
7aa0: 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61  n earlier .** ca
7ab0: 6c 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74  ll to fts5Struct
7ac0: 75 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73  ureRead() or fts
7ad0: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
7ae0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
7af0: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
7b00: 52 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75  Release(Fts5Stru
7b10: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
7b20: 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
7b30: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
7b40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72   for(i=0; i<pStr
7b50: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  uct->nLevel; i++
7b60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7b70: 5f 66 72 65 65 28 70 53 74 72 75 63 74 2d 3e 61  _free(pStruct->a
7b80: 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a  Level[i].aSeg);.
7b90: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7ba0: 33 5f 66 72 65 65 28 70 53 74 72 75 63 74 29 3b  3_free(pStruct);
7bb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
7bc0: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
7bd0: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
7be0: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
7bf0: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
7c00: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
7c10: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
7c20: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
7c30: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
7c40: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
7c50: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
7c60: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
7c70: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
7c80: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
7c90: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
7ca0: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
7cb0: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
7cc0: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
7cd0: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
7ce0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7cf0: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
7d00: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
7d10: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
7d20: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7d30: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7d40: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7d50: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
7d60: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
7d70: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7d80: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7d90: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7da0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
7db0: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7dc0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
7dd0: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
7de0: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
7df0: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e10: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
7e20: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7e30: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
7e40: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
7e50: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
7e60: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
7e70: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
7e80: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
7e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7ea0: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
7eb0: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
7ec0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
7ed0: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
7ee0: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
7ef0: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
7f00: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
7f10: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  ;.  int nByte;  
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f30: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
7f40: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
7f50: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
7f60: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
7f70: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
7f80: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
7f90: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7fa0: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
7fb0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
7fc0: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
7fd0: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
7fe0: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
7ff0: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
8000: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
8010: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
8020: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
8030: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
8040: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
8050: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
8060: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
8070: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8080: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
8090: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
80a0: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
80b0: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74  Segment);.  nByt
80c0: 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65  e = (.      size
80d0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
80e0: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
80f0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
8100: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
8110: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
8120: 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28  uctureLevel) * (
8130: 6e 4c 65 76 65 6c 29 20 20 20 20 20 20 2f 2a 20  nLevel)      /* 
8140: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
8150: 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20  /.  );.  pRet = 
8160: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
8170: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
8180: 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65  cZero(&rc, nByte
8190: 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29  );..  if( pRet )
81a0: 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76  {.    pRet->nLev
81b0: 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20  el = nLevel;.   
81c0: 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74   i += sqlite3Get
81d0: 56 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d  Varint(&pData[i]
81e0: 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43  , &pRet->nWriteC
81f0: 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f  ounter);..    fo
8200: 72 28 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51  r(iLvl=0; rc==SQ
8210: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c  LITE_OK && iLvl<
8220: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
8230: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
8240: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
8250: 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b  = &pRet->aLevel[
8260: 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74  iLvl];.      int
8270: 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69   nTotal;.      i
8280: 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20  nt iSeg;..      
8290: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
82a0: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
82b0: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20  pLvl->nMerge);. 
82c0: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
82d0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
82e0: 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20  [i], nTotal);.  
82f0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74      assert( nTot
8300: 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  al>=pLvl->nMerge
8310: 20 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e   );.      pLvl->
8320: 61 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75  aSeg = (Fts5Stru
8330: 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71  ctureSegment*)sq
8340: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
8350: 65 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20  ero(&rc, .      
8360: 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a      nTotal * siz
8370: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8380: 65 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20  eSegment).      
8390: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  );..      if( rc
83a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
83b0: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
83c0: 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20  g = nTotal;.    
83d0: 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
83e0: 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65  iSeg<nTotal; iSe
83f0: 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
8400: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
8410: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
8420: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
8430: 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20  .iSegid);.      
8440: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
8450: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
8460: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
8470: 53 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20  Seg].nHeight);. 
8480: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
8490: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
84a0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
84b0: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69  Seg[iSeg].pgnoFi
84c0: 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rst);.          
84d0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
84e0: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
84f0: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
8500: 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20  .pgnoLast);.    
8510: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
8520: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  e{.        fts5S
8530: 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
8540: 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70  pRet);.        p
8550: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Ret = 0;.      }
8560: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
8570: 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20 20 72  pOut = pRet;.  r
8580: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8590: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
85a0: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41  d fts5StructureA
85b0: 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52 63  ddLevel(int *pRc
85c0: 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
85d0: 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a 20 20 69  **ppStruct){.  i
85e0: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
85f0: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  OK ){.    Fts5St
8600: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
8610: 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
8620: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70    int nLevel = p
8630: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a  Struct->nLevel;.
8640: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
8650: 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66  (.        sizeof
8660: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
8670: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
8680: 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63     /* Main struc
8690: 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  ture */.        
86a0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
86b0: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
86c0: 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65 76  evel+1)  /* aLev
86d0: 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  el[] array */.  
86e0: 20 20 29 3b 0a 0a 20 20 20 20 70 53 74 72 75 63    );..    pStruc
86f0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  t = sqlite3_real
8700: 6c 6f 63 28 70 53 74 72 75 63 74 2c 20 6e 42 79  loc(pStruct, nBy
8710: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  te);.    if( pSt
8720: 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 6d 65  ruct ){.      me
8730: 6d 73 65 74 28 26 70 53 74 72 75 63 74 2d 3e 61  mset(&pStruct->a
8740: 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30  Level[nLevel], 0
8750: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
8760: 75 63 74 75 72 65 4c 65 76 65 6c 29 29 3b 0a 20  uctureLevel));. 
8770: 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 4c       pStruct->nL
8780: 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a 70  evel++;.      *p
8790: 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
87a0: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
87b0: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
87c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
87d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65   }.}../*.** Exte
87e0: 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20 73 6f  nd level iLvl so
87f0: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 72   that there is r
8800: 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74  oom for at least
8810: 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a 2a 20   nExtra more.** 
8820: 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  segments..*/.sta
8830: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
8840: 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
8850: 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  l(.  int *pRc, .
8860: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
8870: 2a 70 53 74 72 75 63 74 2c 20 0a 20 20 69 6e 74  *pStruct, .  int
8880: 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20 6e 45   iLvl, .  int nE
8890: 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 49 6e  xtra, .  int bIn
88a0: 73 65 72 74 0a 29 7b 0a 20 20 69 66 28 20 2a 70  sert.){.  if( *p
88b0: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
88c0: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
88d0: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
88e0: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
88f0: 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74 73 35  [iLvl];.    Fts5
8900: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8910: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *aNew;.    int 
8920: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79 74  nByte;..    nByt
8930: 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20  e = (pLvl->nSeg 
8940: 2b 20 6e 45 78 74 72 61 29 20 2a 20 73 69 7a 65  + nExtra) * size
8950: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
8960: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61 4e  Segment);.    aN
8970: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
8980: 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65 67 2c  lloc(pLvl->aSeg,
8990: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
89a0: 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69   aNew ){.      i
89b0: 66 28 20 62 49 6e 73 65 72 74 3d 3d 30 20 29 7b  f( bInsert==0 ){
89c0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
89d0: 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67  &aNew[pLvl->nSeg
89e0: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  ], 0, sizeof(Fts
89f0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
8a00: 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20  t) * nExtra);.  
8a10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8a20: 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 70     int nMove = p
8a30: 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a 65  Lvl->nSeg * size
8a40: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
8a50: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Segment);.      
8a60: 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b    memmove(&aNew[
8a70: 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20 6e  nExtra], aNew, n
8a80: 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 6d  Move);.        m
8a90: 65 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20 73  emset(aNew, 0, s
8aa0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
8ab0: 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45  ureSegment) * nE
8ac0: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xtra);.      }. 
8ad0: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
8ae0: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73  = aNew;.    }els
8af0: 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  e{.      *pRc = 
8b00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8b10: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
8b20: 20 52 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69   Read, deseriali
8b30: 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ze and return th
8b40: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  e structure reco
8b50: 72 64 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64  rd for index iId
8b60: 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  x..**.** The Fts
8b70: 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65  5Structure.aLeve
8b80: 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73  l[] and each Fts
8b90: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e  5StructureLevel.
8ba0: 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  aSeg[] array.** 
8bb0: 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74  are over-allocat
8bc0: 65 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ed as described 
8bd0: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73  for function fts
8be0: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
8bf0: 28 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a  () .** above..**
8c00: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
8c10: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
8c20: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
8c30: 65 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20  error code left 
8c40: 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e  in the.** Fts5In
8c50: 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61  dex handle. If a
8c60: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
8c70: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
8c80: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
8c90: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ** is called, it
8ca0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
8cb0: 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63  static Fts5Struc
8cc0: 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74  ture *fts5Struct
8cd0: 75 72 65 52 65 61 64 28 46 74 73 35 49 6e 64 65  ureRead(Fts5Inde
8ce0: 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 29 7b  x *p, int iIdx){
8cf0: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
8d00: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
8d10: 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  fig;.  Fts5Struc
8d20: 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20  ture *pRet = 0; 
8d30: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
8d40: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
8d50: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
8d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d70: 2f 2a 20 25 5f 64 61 74 61 20 65 6e 74 72 79 20  /* %_data entry 
8d80: 63 6f 6e 74 61 69 6e 69 6e 67 20 73 74 72 75 63  containing struc
8d90: 74 75 72 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ture record */. 
8da0: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20   int iCookie;   
8db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dc0: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
8dd0: 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 0a 20 20 61  n cookie */..  a
8de0: 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43 6f  ssert( iIdx<=pCo
8df0: 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 3b  nfig->nPrefix );
8e00: 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
8e10: 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
8e20: 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28  STRUCTURE_ROWID(
8e30: 69 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 70  iIdx));.  if( !p
8e40: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 30 3b  Data ) return 0;
8e50: 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53  .  p->rc = fts5S
8e60: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70  tructureDecode(p
8e70: 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
8e80: 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52  n, &iCookie, &pR
8e90: 65 74 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  et);..  if( p->r
8ea0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8eb0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
8ec0: 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  !=iCookie ){.   
8ed0: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
8ee0: 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70  Fts5ConfigLoad(p
8ef0: 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29  Config, iCookie)
8f00: 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74  ;.  }..  fts5Dat
8f10: 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
8f20: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
8f30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
8f40: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
8f50: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70  ase(pRet);.    p
8f60: 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Ret = 0;.  }.  r
8f70: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
8f80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
8f90: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
8fa0: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65  segments in inde
8fb0: 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  x structure pStr
8fc0: 75 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uct..*/.static i
8fd0: 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65  nt fts5Structure
8fe0: 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74  CountSegments(Ft
8ff0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9000: 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65  ruct){.  int nSe
9010: 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  gment = 0;      
9020: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
9030: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
9040: 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53  ents */.  if( pS
9050: 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74  truct ){.    int
9060: 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20   iLvl;          
9070: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
9080: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
9090: 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
90a0: 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
90b0: 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
90c0: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
90d0: 20 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d       nSegment +=
90e0: 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
90f0: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20  [iLvl].nSeg;.   
9100: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
9110: 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a   nSegment;.}../*
9120: 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e  .** Serialize an
9130: 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72  d store the "str
9140: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20 66  ucture" record f
9150: 6f 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a  or index iIdx..*
9160: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
9170: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
9180: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  n error code in 
9190: 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62  the Fts5Index ob
91a0: 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65  ject. If an.** e
91b0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
91c0: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
91d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
91e0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
91f0: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
9200: 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  eWrite(Fts5Index
9210: 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46   *p, int iIdx, F
9220: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
9230: 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d  truct){.  if( p-
9240: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
9250: 7b 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 6d 65  {.    int nSegme
9260: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
9270: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
9280: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
9290: 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  */.    Fts5Buffe
92a0: 72 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  r buf;          
92b0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
92c0: 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f  o serialize reco
92d0: 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69  rd into */.    i
92e0: 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9300: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
9310: 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
9320: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69  /.    int iCooki
9330: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9340: 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61      /* Cookie va
9350: 6c 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a  lue to store */.
9360: 0a 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 3d 20  .    nSegment = 
9370: 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
9380: 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75  ntSegments(pStru
9390: 63 74 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ct);.    memset(
93a0: 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &buf, 0, sizeof(
93b0: 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20  Fts5Buffer));.. 
93c0: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
93d0: 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75   current configu
93e0: 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f  ration cookie */
93f0: 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70  .    iCookie = p
9400: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b  ->pConfig->iCook
9410: 69 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f  ie;.    if( iCoo
9420: 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20  kie<0 ) iCookie 
9430: 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 42 75 66  = 0;.    fts5Buf
9440: 66 65 72 41 70 70 65 6e 64 33 32 28 26 70 2d 3e  ferAppend32(&p->
9450: 72 63 2c 20 26 62 75 66 2c 20 69 43 6f 6f 6b 69  rc, &buf, iCooki
9460: 65 29 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66  e);..    fts5Buf
9470: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
9480: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
9490: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a  truct->nLevel);.
94a0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
94b0: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
94c0: 63 2c 20 26 62 75 66 2c 20 6e 53 65 67 6d 65 6e  c, &buf, nSegmen
94d0: 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  t);.    fts5Buff
94e0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
94f0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36  p->rc, &buf, (i6
9500: 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  4)pStruct->nWrit
9510: 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  eCounter);..    
9520: 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
9530: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
9540: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
9550: 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20   int iSeg;      
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9570: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
9580: 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
9590: 74 73 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  ts */.      Fts5
95a0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
95b0: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
95c0: 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
95d0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
95e0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
95f0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
9600: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66  nMerge);.      f
9610: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
9620: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
9630: 75 66 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b  uf, pLvl->nSeg);
9640: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9650: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
9660: 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20  l->nSeg );..    
9670: 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
9680: 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
9690: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
96a0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
96b0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
96c0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
96d0: 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20  iSeg].iSegid);. 
96e0: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
96f0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9700: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
9710: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65  ->aSeg[iSeg].nHe
9720: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 66  ight);.        f
9730: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
9740: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
9750: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
9760: 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg].pgnoFirst);
9770: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
9780: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
9790: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
97a0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
97b0: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
97c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
97d0: 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
97e0: 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57  S5_STRUCTURE_ROW
97f0: 49 44 28 69 49 64 78 29 2c 20 62 75 66 2e 70 2c  ID(iIdx), buf.p,
9800: 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73   buf.n);.    fts
9810: 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
9820: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a  );.  }.}..#if 0.
9830: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9840: 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69  DebugStructure(i
9850: 6e 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c  nt*,Fts5Buffer*,
9860: 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b  Fts5Structure*);
9870: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
9880: 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28  5PrintStructure(
9890: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70  const char *zCap
98a0: 74 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74  tion, Fts5Struct
98b0: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
98c0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
98d0: 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65  _OK;.  Fts5Buffe
98e0: 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28  r buf;.  memset(
98f0: 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &buf, 0, sizeof(
9900: 62 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62  buf));.  fts5Deb
9910: 75 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c  ugStructure(&rc,
9920: 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b   &buf, pStruct);
9930: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75  .  fprintf(stdou
9940: 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a  t, "%s: %s\n", z
9950: 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b  Caption, buf.p);
9960: 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  .  fflush(stdout
9970: 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
9980: 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c  ree(&buf);.}.#el
9990: 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  se.# define fts5
99a0: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78  PrintStructure(x
99b0: 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  ,y).#endif..stat
99c0: 69 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65  ic int fts5Segme
99d0: 6e 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63  ntSize(Fts5Struc
99e0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
99f0: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b  g){.  return 1 +
9a00: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
9a10: 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  - pSeg->pgnoFirs
9a20: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
9a30: 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64  rn a copy of ind
9a40: 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74  ex structure pSt
9a50: 72 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72  ruct. Except, pr
9a60: 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a  omote as many .*
9a70: 2a 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f  * segments as po
9a80: 73 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20  ssible to level 
9a90: 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20  iPromote. If an 
9aa0: 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  OOM occurs, NULL
9ab0: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
9ac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9ad0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
9ae0: 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49  omoteTo(.  Fts5I
9af0: 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69  ndex *p,.  int i
9b00: 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73  Promote,.  int s
9b10: 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35  zPromote,.  Fts5
9b20: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
9b30: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20  ct.){.  int il, 
9b40: 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  is;.  Fts5Struct
9b50: 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d  ureLevel *pOut =
9b60: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
9b70: 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20  l[iPromote];..  
9b80: 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65  if( pOut->nMerge
9b90: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==0 ){.    for(i
9ba0: 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c  l=iPromote+1; il
9bb0: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
9bc0: 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46  ; il++){.      F
9bd0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
9be0: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
9bf0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a  ct->aLevel[il];.
9c00: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
9c10: 6e 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b  nMerge ) return;
9c20: 0a 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c  .      for(is=pL
9c30: 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d  vl->nSeg-1; is>=
9c40: 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20  0; is--){.      
9c50: 20 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53    int sz = fts5S
9c60: 65 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c  egmentSize(&pLvl
9c70: 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20  ->aSeg[is]);.   
9c80: 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72       if( sz>szPr
9c90: 6f 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a  omote ) return;.
9ca0: 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75          fts5Stru
9cb0: 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
9cc0: 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
9cd0: 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31  , iPromote, 1, 1
9ce0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
9cf0: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
9d00: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f         memcpy(pO
9d10: 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d  ut->aSeg, &pLvl-
9d20: 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f  >aSeg[is], sizeo
9d30: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
9d40: 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20  egment));.      
9d50: 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a    pOut->nSeg++;.
9d60: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53          pLvl->nS
9d70: 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eg--;.      }.  
9d80: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9d90: 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68   A new segment h
9da0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69  as just been wri
9db0: 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c  tten to level iL
9dc0: 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75  vl of index stru
9dd0: 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74  cture.** pStruct
9de0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
9df0: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e  determines if an
9e00: 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c  y segments shoul
9e10: 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a  d be promoted.**
9e20: 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65   as a result. Se
9e30: 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f  gments are promo
9e40: 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61  ted in two scena
9e50: 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
9e60: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
9e70: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
9e80: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65  smaller than one
9e90: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
9ea0: 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e  s.**      within
9eb0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f   the previous po
9ec0: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69  pulated level, i
9ed0: 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f  t is promoted to
9ee0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a   the previous.**
9ef0: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
9f00: 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62  level..**.**   b
9f10: 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74  ) If the segment
9f20: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73   just written is
9f30: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
9f40: 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20   newest segment 
9f50: 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e  on.**      the n
9f60: 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65  ext populated le
9f70: 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73  vel, then that s
9f80: 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20  egment, and any 
9f90: 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a  other adjacent.*
9fa0: 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20  *      segments 
9fb0: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d  that are also sm
9fc0: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f  aller than the o
9fd0: 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  ne just written,
9fe0: 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72   are .**      pr
9ff0: 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49  omoted. .**.** I
a000: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65  f one or more se
a010: 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f  gments are promo
a020: 74 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75  ted, the structu
a030: 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64  re object is upd
a040: 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65  ated.** to refle
a050: 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  ct this..*/.stat
a060: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
a070: 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20  cturePromote(.  
a080: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
a0b0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
a0c0: 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iLvl,           
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
a0e0: 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20  ndex level just 
a0f0: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73  updated */.  Fts
a100: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
a110: 75 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uct          /* 
a120: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
a130: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
a140: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
a150: 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20      int iTst;.  
a160: 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d    int iPromote =
a170: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50   -1;.    int szP
a180: 72 6f 6d 6f 74 65 3b 20 20 20 20 20 20 20 20 20  romote;         
a190: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74         /* Promot
a1a0: 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20  e anything this 
a1b0: 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20  size or smaller 
a1c0: 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  */.    Fts5Struc
a1d0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
a1e0: 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20  g;   /* Segment 
a1f0: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
a200: 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20      int szSeg;  
a210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a220: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67    /* Size of seg
a230: 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  ment just writte
a240: 6e 20 2a 2f 0a 0a 0a 20 20 20 20 70 53 65 67 20  n */...    pSeg 
a250: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
a260: 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53  el[iLvl].aSeg[pS
a270: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
a280: 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20  vl].nSeg-1];.   
a290: 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53   szSeg = (1 + pS
a2a0: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70  eg->pgnoLast - p
a2b0: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg->pgnoFirst);
a2c0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
a2d0: 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29  or condition (a)
a2e0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74   */.    for(iTst
a2f0: 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30  =iLvl-1; iTst>=0
a300: 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
a310: 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d  vel[iTst].nSeg==
a320: 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20  0; iTst--);.    
a330: 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20  if( iTst>=0 ){. 
a340: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
a350: 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b    int szMax = 0;
a360: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
a370: 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 20  tureLevel *pTst 
a380: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
a390: 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20 20  el[iTst];.      
a3a0: 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d  assert( pTst->nM
a3b0: 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erge==0 );.     
a3c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73 74   for(i=0; i<pTst
a3d0: 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
a3e0: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70        int sz = p
a3f0: 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e  Tst->aSeg[i].pgn
a400: 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61 53  oLast - pTst->aS
a410: 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20  eg[i].pgnoFirst 
a420: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + 1;.        if(
a430: 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61   sz>szMax ) szMa
a440: 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a  x = sz;.      }.
a450: 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78 3e        if( szMax>
a460: 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20 20  =szSeg ){.      
a470: 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28    /* Condition (
a480: 61 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f 6d  a) is true. Prom
a490: 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74 20 73  ote the newest s
a4a0: 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20  egment on level 
a4b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c  .        ** iLvl
a4c0: 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e 20   to level iTst. 
a4d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72 6f   */.        iPro
a4e0: 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20 20  mote = iTst;.   
a4f0: 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d       szPromote =
a500: 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a   szMax;.      }.
a510: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
a520: 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69   condition (a) i
a530: 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d  s not met, assum
a540: 65 20 28 62 29 20 69 73 20 74 72 75 65 2e 20 53  e (b) is true. S
a550: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
a560: 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61 20  o().    ** is a 
a570: 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20 6e  no-op if it is n
a580: 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ot.  */.    if( 
a590: 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20  iPromote<0 ){.  
a5a0: 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69      iPromote = i
a5b0: 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f  Lvl;.      szPro
a5c0: 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20  mote = szSeg;.  
a5d0: 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
a5e0: 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70  cturePromoteTo(p
a5f0: 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72  , iPromote, szPr
a600: 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b  omote, pStruct);
a610: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  .  }.}.../*.** I
a620: 66 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f 66  f the pIter->iOf
a630: 66 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e 74  f offset current
a640: 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ly points to an 
a650: 65 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e 67  entry indicating
a660: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
a670: 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 2c  term-less nodes,
a680: 20 61 64 76 61 6e 63 65 20 70 61 73 74 20 69 74   advance past it
a690: 20 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d 3e   and set pIter->
a6a0: 6e 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68 65  nEmpty to.** the
a6b0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79   number of empty
a6c0: 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f   child nodes..*/
a6d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
a6e0: 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e  5NodeIterGobbleN
a6f0: 45 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49 74  Empty(Fts5NodeIt
a700: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
a710: 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 49  ( pIter->iOff<pI
a720: 74 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30 3d  ter->nData && 0=
a730: 3d 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70  =(pIter->aData[p
a740: 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78  Iter->iOff] & 0x
a750: 66 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72  fe) ){.    pIter
a760: 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72  ->bDlidx = pIter
a770: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
a780: 4f 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20 20  Off] & 0x01;.   
a790: 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a   pIter->iOff++;.
a7a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
a7b0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
a7c0: 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61  32(&pIter->aData
a7d0: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 70  [pIter->iOff], p
a7e0: 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20  Iter->nEmpty);. 
a7f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
a800: 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20  r->nEmpty = 0;. 
a810: 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78     pIter->bDlidx
a820: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
a830: 2a 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  ** Advance to th
a840: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 77 69 74  e next entry wit
a850: 68 69 6e 20 74 68 65 20 6e 6f 64 65 2e 0a 2a 2f  hin the node..*/
a860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
a870: 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 69 6e  5NodeIterNext(in
a880: 74 20 2a 70 52 63 2c 20 46 74 73 35 4e 6f 64 65  t *pRc, Fts5Node
a890: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
a8a0: 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3e  if( pIter->iOff>
a8b0: 3d 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 29 7b  =pIter->nData ){
a8c0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 44 61 74  .    pIter->aDat
a8d0: 61 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72  a = 0;.    pIter
a8e0: 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 70 49 74 65  ->iChild += pIte
a8f0: 72 2d 3e 6e 45 6d 70 74 79 3b 0a 20 20 7d 65 6c  r->nEmpty;.  }el
a900: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 50 72 65  se{.    int nPre
a910: 2c 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74 65  , nNew;.    pIte
a920: 72 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  r->iOff += fts5G
a930: 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
a940: 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e  r->aData[pIter->
a950: 69 4f 66 66 5d 2c 20 6e 50 72 65 29 3b 0a 20 20  iOff], nPre);.  
a960: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d    pIter->iOff +=
a970: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
a980: 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70  (&pIter->aData[p
a990: 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 4e 65  Iter->iOff], nNe
a9a0: 77 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 74  w);.    pIter->t
a9b0: 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d 32 3b 0a  erm.n = nPre-2;.
a9c0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
a9d0: 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20 26 70  pendBlob(pRc, &p
a9e0: 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77  Iter->term, nNew
a9f0: 2c 20 70 49 74 65 72 2d 3e 61 44 61 74 61 2b 70  , pIter->aData+p
aa00: 49 74 65 72 2d 3e 69 4f 66 66 29 3b 0a 20 20 20  Iter->iOff);.   
aa10: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20   pIter->iOff += 
aa20: 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d  nNew;.    pIter-
aa30: 3e 69 43 68 69 6c 64 20 2b 3d 20 28 31 20 2b 20  >iChild += (1 + 
aa40: 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a  pIter->nEmpty);.
aa50: 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
aa60: 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74  GobbleNEmpty(pIt
aa70: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 2a 70 52  er);.    if( *pR
aa80: 63 20 29 20 70 49 74 65 72 2d 3e 61 44 61 74 61  c ) pIter->aData
aa90: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a   = 0;.  }.}.../*
aaa0: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
aab0: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
aac0: 63 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72  ct pIter to iter
aad0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
aae0: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73 65 67 6d  internal.** segm
aaf0: 65 6e 74 20 6e 6f 64 65 20 69 6e 20 70 44 61 74  ent node in pDat
ab00: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
ab10: 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e  d fts5NodeIterIn
ab20: 69 74 28 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  it(const u8 *aDa
ab30: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 46  ta, int nData, F
ab40: 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74  ts5NodeIter *pIt
ab50: 65 72 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49  er){.  memset(pI
ab60: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
ab70: 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
ab80: 2d 3e 61 44 61 74 61 20 3d 20 61 44 61 74 61 3b  ->aData = aData;
ab90: 0a 20 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 20  .  pIter->nData 
aba0: 3d 20 6e 44 61 74 61 3b 0a 20 20 70 49 74 65 72  = nData;.  pIter
abb0: 2d 3e 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74  ->iOff = fts5Get
abc0: 56 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c 20  Varint32(aData, 
abd0: 70 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b 0a  pIter->iChild);.
abe0: 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f    fts5NodeIterGo
abf0: 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72  bbleNEmpty(pIter
ac00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  );.}../*.** Free
ac10: 20 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   any memory allo
ac20: 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65  cated by the ite
ac30: 72 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f  rator object..*/
ac40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ac50: 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46 74  5NodeIterFree(Ft
ac60: 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65  s5NodeIter *pIte
ac70: 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72  r){.  fts5Buffer
ac80: 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72  Free(&pIter->ter
ac90: 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  m);.}../*.** The
aca0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
acb0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
acc0: 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66  gument has the f
acd0: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
ace0: 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  set.** as follow
acf0: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
ad00: 20 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73   sets up the res
ad10: 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  t of the iterato
ad20: 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  r so that it.** 
ad30: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
ad40: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  rst rowid in the
ad50: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a   doclist-index..
ad60: 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 20 70  **.**   pData: p
ad70: 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73  ointer to doclis
ad80: 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  t-index record, 
ad90: 0a 2a 2a 20 20 20 69 4c 65 61 66 50 67 6e 6f 3a  .**   iLeafPgno:
ada0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
adb0: 74 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2d 69  t this doclist-i
adc0: 6e 64 65 78 20 69 73 20 61 73 73 6f 63 69 61 74  ndex is associat
add0: 65 64 20 77 69 74 68 2e 0a 2a 2a 0a 2a 2a 20 57  ed with..**.** W
ade0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
adf0: 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65  n is called pIte
ae00: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20  r->iLeafPgno is 
ae10: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
ae20: 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69  the.** doclist i
ae30: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
ae40: 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75  h (the one featu
ae50: 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a  ring the term)..
ae60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
ae70: 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74  s5DlidxIterFirst
ae80: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
ae90: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 61  pIter){.  Fts5Da
aea0: 74 61 20 2a 70 44 61 74 61 20 3d 20 70 49 74 65  ta *pData = pIte
aeb0: 72 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e 74 20  r->pData;.  int 
aec0: 69 3b 0a 20 20 69 6e 74 20 62 50 72 65 73 65 6e  i;.  int bPresen
aed0: 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  t;..  assert( pI
aee0: 74 65 72 2d 3e 70 44 61 74 61 20 29 3b 0a 20 20  ter->pData );.  
aef0: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69  assert( pIter->i
af00: 4c 65 61 66 50 67 6e 6f 3e 30 20 29 3b 0a 0a 20  LeafPgno>0 );.. 
af10: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69 72   /* Read the fir
af20: 73 74 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20  st rowid value. 
af30: 41 6e 64 20 74 68 65 20 22 70 72 65 73 65 6e 74  And the "present
af40: 22 20 66 6c 61 67 20 74 68 61 74 20 66 6f 6c 6c  " flag that foll
af50: 6f 77 73 20 69 74 2e 20 2a 2f 0a 20 20 70 49 74  ows it. */.  pIt
af60: 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56  er->iOff += getV
af70: 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
af80: 30 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  0], (u64*)&pIter
af90: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 62 50 72  ->iRowid);.  bPr
afa0: 65 73 65 6e 74 20 3d 20 70 44 61 74 61 2d 3e 70  esent = pData->p
afb0: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 5d 3b  [pIter->iOff++];
afc0: 0a 20 20 69 66 28 20 62 50 72 65 73 65 6e 74 20  .  if( bPresent 
afd0: 29 7b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20  ){.    i = 0;.  
afe0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
aff0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
b000: 66 20 6c 65 61 64 69 6e 67 20 30 78 30 30 20 62  f leading 0x00 b
b010: 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ytes. */.    for
b020: 28 69 3d 31 3b 20 70 49 74 65 72 2d 3e 69 4f 66  (i=1; pIter->iOf
b030: 66 3c 70 44 61 74 61 2d 3e 6e 3b 20 69 2b 2b 29  f<pData->n; i++)
b040: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  { .      if( pDa
b050: 74 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4f 66  ta->p[pIter->iOf
b060: 66 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  f] ) break;.    
b070: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b    pIter->iOff++;
b080: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
b090: 6e 6c 65 73 73 20 77 65 20 61 72 65 20 61 6c 72  nless we are alr
b0a0: 65 61 64 79 20 61 74 20 74 68 65 20 65 6e 64 20  eady at the end 
b0b0: 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  of the doclist-i
b0c0: 6e 64 65 78 2c 20 6c 6f 61 64 20 74 68 65 20 66  ndex, load the f
b0d0: 69 72 73 74 0a 20 20 20 20 2a 2a 20 72 6f 77 69  irst.    ** rowi
b0e0: 64 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 20  d value.  */.   
b0f0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66   if( pIter->iOff
b100: 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20  <pData->n ){.   
b110: 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
b120: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
b130: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 44 61  = getVarint(&pDa
b140: 74 61 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4f 66  ta->p[pIter->iOf
b150: 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29  f], (u64*)&iVal)
b160: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
b170: 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Rowid += iVal;. 
b180: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b190: 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b  pIter->bEof = 1;
b1a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74  .    }.  }.  pIt
b1b0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d  er->iLeafPgno +=
b1c0: 20 28 69 2b 31 29 3b 0a 0a 20 20 70 49 74 65 72   (i+1);..  pIter
b1d0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 49  ->iFirstOff = pI
b1e0: 74 65 72 2d 3e 69 4f 66 66 3b 0a 20 20 72 65 74  ter->iOff;.  ret
b1f0: 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b  urn pIter->bEof;
b200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
b210: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
b220: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
b230: 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  y argument..*/.s
b240: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
b250: 69 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35  idxIterNext(Fts5
b260: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b270: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
b280: 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44  Data = pIter->pD
b290: 61 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b  ata;.  int iOff;
b2a0: 0a 0a 20 20 66 6f 72 28 69 4f 66 66 3d 70 49 74  ..  for(iOff=pIt
b2b0: 65 72 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70  er->iOff; iOff<p
b2c0: 44 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29  Data->n; iOff++)
b2d0: 7b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d  {.    if( pData-
b2e0: 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b  >p[iOff] ) break
b2f0: 3b 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f  ; .  }..  if( iO
b300: 66 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20  ff<pData->n ){. 
b310: 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
b320: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b330: 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 49 74  o += (iOff - pIt
b340: 65 72 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20  er->iOff) + 1;. 
b350: 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
b360: 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
b370: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61  Off], (u64*)&iVa
b380: 6c 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  l);.    pIter->i
b390: 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Rowid += iVal;. 
b3a0: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d     pIter->iOff =
b3b0: 20 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iOff;.  }else{.
b3c0: 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20      pIter->bEof 
b3d0: 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 1;.  }..  retu
b3e0: 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a  rn pIter->bEof;.
b3f0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
b400: 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46  s5DlidxIterEof(F
b410: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
b420: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
b430: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  r){.  return (p-
b440: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
b450: 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b 0a  | pIter->bEof);.
b460: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
b470: 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74  ts5DlidxIterLast
b480: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
b490: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 66 74  pIter){.  if( ft
b4a0: 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74  s5DlidxIterFirst
b4b0: 28 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20  (pIter)==0 ){.  
b4c0: 20 20 77 68 69 6c 65 28 20 30 3d 3d 66 74 73 35    while( 0==fts5
b4d0: 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 49  DlidxIterNext(pI
b4e0: 74 65 72 29 20 29 3b 0a 20 20 20 20 70 49 74 65  ter) );.    pIte
b4f0: 72 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 7d  r->bEof = 0;.  }
b500: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
b510: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
b520: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
b530: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 4f  pIter){.  int iO
b540: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4f 66 66  ff = pIter->iOff
b550: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
b560: 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20  er->bEof==0 );. 
b570: 20 69 66 28 20 69 4f 66 66 3c 3d 70 49 74 65 72   if( iOff<=pIter
b580: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
b590: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
b5a0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
b5b0: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
b5c0: 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36  pData->p;.    i6
b5d0: 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20  4 iVal;.    int 
b5e0: 69 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  iLimit;..    /* 
b5f0: 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70  Currently iOff p
b600: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
b610: 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61 72  st byte of a var
b620: 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  int. This block 
b630: 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e  .    ** decremen
b640: 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74  ts iOff until it
b650: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
b660: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
b670: 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a   previous .    *
b680: 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67  * varint. Taking
b690: 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61   care not to rea
b6a0: 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63  d any memory loc
b6b0: 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75  ations that occu
b6c0: 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  r.    ** before 
b6d0: 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65  the buffer in me
b6e0: 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c  mory.  */.    iL
b6f0: 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f  imit = (iOff>9 ?
b700: 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20   iOff-9 : 0);.  
b710: 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f    for(iOff--; iO
b720: 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d  ff>iLimit; iOff-
b730: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61  -){.      if( (a
b740: 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29  [iOff-1] & 0x80)
b750: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b760: 20 7d 0a 0a 20 20 20 20 67 65 74 56 61 72 69 6e   }..    getVarin
b770: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
b780: 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 49  *)&iVal);.    pI
b790: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  ter->iRowid -= i
b7a0: 56 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Val;.    pIter->
b7b0: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20  iLeafPgno--;..  
b7c0: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3e 70 49    while( iOff>pI
b7d0: 74 65 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 0a  ter->iFirstOff .
b7e0: 20 20 20 20 20 20 20 20 26 26 20 61 5b 69 4f 66          && a[iOf
b7f0: 66 2d 31 5d 3d 3d 30 78 30 30 20 26 26 20 28 61  f-1]==0x00 && (a
b800: 5b 69 4f 66 66 2d 32 5d 20 26 20 30 78 38 30 29  [iOff-2] & 0x80)
b810: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b820: 20 20 69 4f 66 66 2d 2d 3b 0a 20 20 20 20 20 20    iOff--;.      
b830: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
b840: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  --;.    }.    pI
b850: 74 65 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  ter->iOff = iOff
b860: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
b870: 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a  pIter->bEof;.}..
b880: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b890: 44 6c 69 64 78 49 74 65 72 49 6e 69 74 46 72 6f  DlidxIterInitFro
b8a0: 6d 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e 64  mData(.  Fts5Ind
b8b0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
b8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35           /* Fts5
b8d0: 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   Backend to iter
b8e0: 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
b8f0: 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b910: 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45  /* True for ORDE
b920: 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e  R BY ASC */.  in
b930: 74 20 69 4c 65 61 66 50 67 6e 6f 2c 20 20 20 20  t iLeafPgno,    
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b950: 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   Leaf page numbe
b960: 72 20 64 6c 69 64 78 20 69 73 20 66 6f 72 20 2a  r dlidx is for *
b970: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
b980: 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  lidx,           
b990: 20 20 20 20 2f 2a 20 4c 65 61 66 20 69 6e 64 65      /* Leaf inde
b9a0: 78 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73 35  x data */.  Fts5
b9b0: 44 6c 69 64 78 49 74 65 72 20 2a 2a 70 70 49 74  DlidxIter **ppIt
b9c0: 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er          /* O
b9d0: 55 54 3a 20 50 6f 70 75 6c 61 74 65 64 20 69 74  UT: Populated it
b9e0: 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46  erator */.){.  F
b9f0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
ba00: 74 65 72 20 3d 20 2a 70 70 49 74 65 72 3b 0a 0a  ter = *ppIter;..
ba10: 20 20 69 66 28 20 70 49 74 65 72 3d 3d 30 20 29    if( pIter==0 )
ba20: 7b 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20  {.    *ppIter = 
ba30: 70 49 74 65 72 20 3d 20 28 46 74 73 35 44 6c 69  pIter = (Fts5Dli
ba40: 64 78 49 74 65 72 2a 29 66 74 73 35 49 64 78 4d  dxIter*)fts5IdxM
ba50: 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
ba60: 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b  Fts5DlidxIter));
ba70: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 3d 3d  .    if( pIter==
ba80: 30 20 29 7b 20 0a 20 20 20 20 20 20 66 74 73 35  0 ){ .      fts5
ba90: 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 6c 69  DataRelease(pDli
baa0: 64 78 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  dx);.      retur
bab0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
bac0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  {.    memset(pIt
bad0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
bae0: 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b 0a 20  s5DlidxIter));. 
baf0: 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 61   }..  pIter->pDa
bb00: 74 61 20 3d 20 70 44 6c 69 64 78 3b 0a 20 20 70  ta = pDlidx;.  p
bb10: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
bb20: 3d 20 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69  = iLeafPgno;.  i
bb30: 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20  f( bRev==0 ){.  
bb40: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
bb50: 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20 7d  irst(pIter);.  }
bb60: 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44 6c  else{.    fts5Dl
bb70: 69 64 78 49 74 65 72 4c 61 73 74 28 70 49 74 65  idxIterLast(pIte
bb80: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
bb90: 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78  c void fts5Dlidx
bba0: 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
bbb0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
bbd0: 74 73 35 20 42 61 63 6b 65 6e 64 20 74 6f 20 69  ts5 Backend to i
bbe0: 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
bbf0: 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f     /* True for O
bc20: 52 44 45 52 20 42 59 20 41 53 43 20 2a 2f 0a 20  RDER BY ASC */. 
bc30: 20 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69   int iIdx, int i
bc40: 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
bc50: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 53 65 67   /* Segment iSeg
bc60: 69 64 20 77 69 74 68 69 6e 20 69 6e 64 65 78 20  id within index 
bc70: 69 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  iIdx */.  int iL
bc80: 65 61 66 50 67 6e 6f 2c 20 20 20 20 20 20 20 20  eafPgno,        
bc90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
bca0: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  f page number to
bcb0: 20 6c 6f 61 64 20 64 6c 69 64 78 20 66 6f 72 20   load dlidx for 
bcc0: 2a 2f 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  */.  Fts5DlidxIt
bcd0: 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20  er **ppIter     
bce0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 70       /* OUT: Pop
bcf0: 75 6c 61 74 65 64 20 69 74 65 72 61 74 6f 72 20  ulated iterator 
bd00: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61  */.){.  Fts5Data
bd10: 20 2a 70 44 6c 69 64 78 3b 0a 20 20 70 44 6c 69   *pDlidx;.  pDli
bd20: 64 78 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  dx = fts5DataRea
bd30: 64 28 70 2c 20 46 54 53 35 5f 44 4f 43 4c 49 53  d(p, FTS5_DOCLIS
bd40: 54 5f 49 44 58 5f 52 4f 57 49 44 28 69 49 64 78  T_IDX_ROWID(iIdx
bd50: 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 50  , iSegid, iLeafP
bd60: 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 44 6c  gno));.  if( pDl
bd70: 69 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  idx==0 ) return;
bd80: 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
bd90: 49 6e 69 74 46 72 6f 6d 44 61 74 61 28 70 2c 20  InitFromData(p, 
bda0: 62 52 65 76 2c 20 69 4c 65 61 66 50 67 6e 6f 2c  bRev, iLeafPgno,
bdb0: 20 70 44 6c 69 64 78 2c 20 70 70 49 74 65 72 29   pDlidx, ppIter)
bdc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
bdd0: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
bde0: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
bdf0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73  allocated by fts
be00: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29  5DlidxIterInit()
be10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
be20: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
be30: 65 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  ee(Fts5DlidxIter
be40: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
be50: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 66 74 73  pIter ){.    fts
be60: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
be70: 65 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  er->pData);.    
be80: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
be90: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  er);.  }.}..stat
bea0: 69 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66  ic void fts5Leaf
beb0: 48 65 61 64 65 72 28 46 74 73 35 44 61 74 61 20  Header(Fts5Data 
bec0: 2a 70 4c 65 61 66 2c 20 69 6e 74 20 2a 70 69 52  *pLeaf, int *piR
bed0: 6f 77 69 64 2c 20 69 6e 74 20 2a 70 69 54 65 72  owid, int *piTer
bee0: 6d 29 7b 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d  m){.  *piRowid =
bef0: 20 28 69 6e 74 29 66 74 73 35 47 65 74 55 31 36   (int)fts5GetU16
bf00: 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a  (&pLeaf->p[0]);.
bf10: 20 20 2a 70 69 54 65 72 6d 20 3d 20 28 69 6e 74    *piTerm = (int
bf20: 29 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65  )fts5GetU16(&pLe
bf30: 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a  af->p[2]);.}../*
bf40: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78  .** Load the nex
bf50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f  t leaf page into
bf60: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65   the segment ite
bf70: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
bf80: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
bf90: 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73  rNextPage(.  Fts
bfa0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bfc0: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
bfd0: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
bfe0: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
bff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
c000: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
c010: 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  to next page */.
c020: 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
c030: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
c040: 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20  = pIter->pSeg;. 
c050: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
c060: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
c070: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
c080: 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65  no++;.  if( pIte
c090: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53  r->iLeafPgno<=pS
c0a0: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
c0b0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
c0c0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
c0d0: 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53 35  p, .        FTS5
c0e0: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
c0f0: 49 74 65 72 2d 3e 69 49 64 78 2c 20 70 53 65 67  Iter->iIdx, pSeg
c100: 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74  ->iSegid, 0, pIt
c110: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  er->iLeafPgno). 
c120: 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
c130: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
c140: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
c150: 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  * Fts5SegIter.iL
c160: 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e  eafOffset curren
c170: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  tly points to th
c180: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
c190: 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69 78  the .** "nSuffix
c1a0: 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65 72  " field of a ter
c1b0: 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72 61  m. Function para
c1c0: 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e 74  meter nKeep cont
c1d0: 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a 2a  ains the value.*
c1e0: 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66 69  * of the "nPrefi
c1f0: 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68 65  x" field (if the
c200: 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74 20  re was one - it 
c210: 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20 74  is passed 0 if t
c220: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
c230: 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20  rst term in the 
c240: 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20  segment)..**.** 
c250: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 6f  This function po
c260: 70 75 6c 61 74 65 73 20 28 46 74 73 35 53 65 67  pulates (Fts5Seg
c270: 49 74 65 72 2e 74 65 72 6d 29 20 61 6e 64 20 28  Iter.term) and (
c280: 46 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77  Fts5SegIter.iRow
c290: 69 64 29 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  id).** according
c2a0: 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20 28 46  ly and leaves (F
c2b0: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
c2c0: 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f 20 74  Offset) set to t
c2d0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 0a 2a 2a  he offset to .**
c2e0: 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20   the size field 
c2f0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 6f 73  of the first pos
c300: 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20  ition list. The 
c310: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65  position list be
c320: 6c 6f 6e 67 69 6e 67 20 0a 2a 2a 20 74 6f 20 64  longing .** to d
c330: 6f 63 75 6d 65 6e 74 20 28 46 74 73 35 53 65 67  ocument (Fts5Seg
c340: 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f  Iter.iRowid)..*/
c350: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c360: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
c370: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
c380: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
c390: 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20  r, int nKeep){. 
c3a0: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
c3b0: 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20  pLeaf->p;       
c3c0: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65   /* Buffer to re
c3d0: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a  ad data from */.
c3e0: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
c3f0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
c400: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
c410: 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20  ead at */.  int 
c420: 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  nNew;           
c430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
c440: 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61  ytes of new data
c450: 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66   */..  iOff += f
c460: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
c470: 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  a[iOff], nNew);.
c480: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
c490: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
c4a0: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
c4b0: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
c4c0: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
c4d0: 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  Off]);.  iOff +=
c4e0: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
c4f0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
c500: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
c510: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
c520: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
c530: 6f 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  o;.  if( iOff>=p
c540: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29  Iter->pLeaf->n )
c550: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
c560: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
c570: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
c580: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  er->pLeaf==0 ){.
c590: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
c5a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
c5b0: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
c5c0: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  T;.      return;
c5d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20  .    }.    iOff 
c5e0: 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74  = 4;.    a = pIt
c5f0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
c600: 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69  }.  iOff += sqli
c610: 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b  te3GetVarint(&a[
c620: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
c630: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
c640: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c650: 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  et = iOff;.}../*
c660: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
c670: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
c680: 63 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72  ct pIter to iter
c690: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
c6a0: 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65  entries in.** se
c6b0: 67 6d 65 6e 74 20 70 53 65 67 20 77 69 74 68 69  gment pSeg withi
c6c0: 6e 20 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68  n index iIdx. Th
c6d0: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
c6e0: 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
c6f0: 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 65 6e 74  he .** first ent
c700: 72 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ry when this fun
c710: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
c720: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
c730: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
c740: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
c750: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
c760: 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
c770: 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
c780: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
c790: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
c7a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
c7b0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
c7c0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c7d0: 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46  SegIterInit(.  F
c7e0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
c7f0: 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 49 64        .  int iId
c800: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
c810: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
c820: 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78  ig.aHash[] index
c830: 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f   of FTS index */
c840: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
c850: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
c860: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
c870: 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  n of segment */.
c880: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
c890: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
c8a0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70    /* Object to p
c8b0: 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
c8c0: 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
c8d0: 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rst==0 ){.    /*
c8e0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66   This happens if
c8f0: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20   the segment is 
c900: 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e  being used as an
c910: 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63   input to an inc
c920: 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20  remental.    ** 
c930: 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61  merge and all da
c940: 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ta has already b
c950: 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53  een "trimmed". S
c960: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
c970: 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  ** fts5TrimSegme
c980: 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nts() for detail
c990: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
c9a0: 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74  leave the iterat
c9b0: 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a  or empty..    **
c9c0: 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
c9d0: 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d   see the (pIter-
c9e0: 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61  >pLeaf==0) and a
c9f0: 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74  ssume the iterat
ca00: 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20  or is.    ** at 
ca10: 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a  EOF already. */.
ca20: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
ca30: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  r->pLeaf==0 );. 
ca40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
ca50: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
ca60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65  ITE_OK ){.    me
ca70: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
ca80: 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a  izeof(*pIter));.
ca90: 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20      pIter->pSeg 
caa0: 3d 20 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65  = pSeg;.    pIte
cab0: 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
cac0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
cad0: 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Pgno = pSeg->pgn
cae0: 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74  oFirst-1;.    ft
caf0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
cb00: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
cb10: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
cb20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cb30: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
cb40: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74  Leaf->p;.    pIt
cb50: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
cb60: 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
cb70: 32 5d 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67  2]);.    fts5Seg
cb80: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20  IterLoadTerm(p, 
cb90: 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d  pIter, 0);.  }.}
cba0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
cbb0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76  ction is only ev
cbc0: 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65  er called on ite
cbd0: 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62  rators created b
cbe0: 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74  y calls to.** Ft
cbf0: 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77  s5IndexQuery() w
cc00: 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45  ith the FTS5INDE
cc10: 58 5f 51 55 45 52 59 5f 41 53 43 20 66 6c 61 67  X_QUERY_ASC flag
cc20: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e   set..**.** When
cc30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
cc40: 73 20 63 61 6c 6c 65 64 2c 20 69 74 65 72 61 74  s called, iterat
cc50: 6f 72 20 70 49 74 65 72 20 70 6f 69 6e 74 73 20  or pIter points 
cc60: 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
cc70: 69 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72  id.** on the cur
cc80: 72 65 6e 74 20 6c 65 61 66 20 61 73 73 6f 63 69  rent leaf associ
cc90: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 65  ated with the te
cca0: 72 6d 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  rm being queried
ccb0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
ccc0: 2a 2a 20 61 64 76 61 6e 63 65 73 20 69 74 20 74  ** advances it t
ccd0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6c  o point to the l
cce0: 61 73 74 20 73 75 63 68 20 72 6f 77 69 64 20 61  ast such rowid a
ccf0: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
cd00: 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 0a 2a 2a  , initializes.**
cd10: 20 74 68 65 20 61 52 6f 77 69 64 4f 66 66 73 65   the aRowidOffse
cd20: 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66  t[] and iRowidOf
cd30: 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e 0a  fset variables..
cd40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
cd50: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
cd60: 65 49 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e  eInitPage(Fts5In
cd70: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
cd80: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
cd90: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
cda0: 65 61 66 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20  eaf->n;.  int i 
cdb0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
cdc0: 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20  fset;.  u8 *a = 
cdd0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
cde0: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
cdf0: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  set = 0;..  whil
ce00: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
ce10: 5f 4f 4b 20 26 26 20 69 3c 6e 20 29 7b 0a 20 20  _OK && i<n ){.  
ce20: 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30    i64 iDelta = 0
ce30: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  ;.    int nPos;.
ce40: 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65  .    i += fts5Ge
ce50: 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 5d 2c  tVarint32(&a[i],
ce60: 20 6e 50 6f 73 29 3b 0a 20 20 20 20 69 20 2b 3d   nPos);.    i +=
ce70: 20 6e 50 6f 73 3b 0a 20 20 20 20 69 66 28 20 69   nPos;.    if( i
ce80: 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=n ) break;.   
ce90: 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   i += getVarint(
cea0: 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44  &a[i], (u64*)&iD
ceb0: 65 6c 74 61 29 3b 0a 20 20 20 20 69 66 28 20 69  elta);.    if( i
cec0: 44 65 6c 74 61 3d 3d 30 20 29 20 62 72 65 61 6b  Delta==0 ) break
ced0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
cee0: 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a  wid += iDelta;..
cef0: 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
cf00: 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f  fset>=pIter->nRo
cf10: 77 69 64 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  widOffset ){.   
cf20: 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49     int nNew = pI
cf30: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
cf40: 74 20 2b 20 38 3b 0a 20 20 20 20 20 20 69 6e 74  t + 8;.      int
cf50: 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73   *aNew = (int*)s
cf60: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
cf70: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
cf80: 65 74 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28  et, nNew*sizeof(
cf90: 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28  int));.      if(
cfa0: 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
cfb0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
cfc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
cfd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
cfe0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 61 52  .      pIter->aR
cff0: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 61 4e 65  owidOffset = aNe
d000: 77 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  w;.      pIter->
d010: 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 6e  nRowidOffset = n
d020: 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  New;.    }..    
d030: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
d040: 73 65 74 5b 69 52 6f 77 69 64 4f 66 66 73 65 74  set[iRowidOffset
d050: 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  ++] = pIter->iLe
d060: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 49  afOffset;.    pI
d070: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d080: 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65   = i;.  }.  pIte
d090: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 20  r->iRowidOffset 
d0a0: 3d 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a  = iRowidOffset;.
d0b0: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  }../*.**.*/.stat
d0c0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d0d0: 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
d0e0: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
d0f0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
d100: 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
d110: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
d120: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
d130: 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SE );.  assert( 
d140: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
d150: 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
d160: 45 52 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61  ERM );..  fts5Da
d170: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
d180: 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
d190: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77  ->pLeaf = 0;.  w
d1a0: 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
d1b0: 49 54 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d  ITE_OK && pIter-
d1c0: 3e 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72  >iLeafPgno>pIter
d1d0: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
d1e0: 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
d1f0: 2a 70 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72  *pNew;.    pIter
d200: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20  ->iLeafPgno--;. 
d210: 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61     pNew = fts5Da
d220: 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
d230: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20  EGMENT_ROWID(.  
d240: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
d250: 49 64 78 2c 20 70 49 74 65 72 2d 3e 70 53 65 67  Idx, pIter->pSeg
d260: 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74  ->iSegid, 0, pIt
d270: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20  er->iLeafPgno.  
d280: 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e    ));.    if( pN
d290: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
d2a0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d2b0: 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ==pIter->iTermLe
d2c0: 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
d2d0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
d2e0: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65  rmLeafOffset<pNe
d2f0: 77 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  w->n ){.        
d300: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
d310: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   pNew;.         
d320: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d330: 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65  set = pIter->iTe
d340: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  rmLeafOffset;.  
d350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d360: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
d370: 20 69 52 6f 77 69 64 4f 66 66 2c 20 64 75 6d 6d   iRowidOff, dumm
d380: 79 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4c  y;.        fts5L
d390: 65 61 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20  eafHeader(pNew, 
d3a0: 26 69 52 6f 77 69 64 4f 66 66 2c 20 26 64 75 6d  &iRowidOff, &dum
d3b0: 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  my);.        if(
d3c0: 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20   iRowidOff ){.  
d3d0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
d3e0: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
d3f0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
d400: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52 6f 77  eafOffset = iRow
d410: 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 7d  idOff;.        }
d420: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d430: 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
d440: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
d450: 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61  a = &pIter->pLea
d460: 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61  f->p[pIter->iLea
d470: 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20  fOffset];.      
d480: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d490: 66 73 65 74 20 2b 3d 20 67 65 74 56 61 72 69 6e  fset += getVarin
d4a0: 74 28 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65  t(a, (u64*)&pIte
d4b0: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
d4c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d4d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d4e0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
d4f0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
d500: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
d510: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
d520: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
d530: 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
d540: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
d550: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
d560: 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
d570: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
d580: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
d590: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
d5a0: 69 6e 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65  ints to a delete
d5b0: 20 6d 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74   marker. A delet
d5c0: 65 20 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65  e marker is an e
d5d0: 6e 74 72 79 20 77 69 74 68 20 61 20 30 20 62 79  ntry with a 0 by
d5e0: 74 65 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c  te.** position-l
d5f0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
d600: 6e 74 20 66 74 73 35 53 65 67 49 74 65 72 49 73  nt fts5SegIterIs
d610: 44 65 6c 65 74 65 28 0a 20 20 46 74 73 35 49 6e  Delete(.  Fts5In
d620: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
d630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
d640: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
d650: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
d660: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
d670: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
d680: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
d690: 29 7b 0a 20 20 69 6e 74 20 62 52 65 74 20 3d 20  ){.  int bRet = 
d6a0: 30 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  0;.  Fts5Data *p
d6b0: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
d6c0: 65 61 66 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  eaf;.  if( p->rc
d6d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
d6e0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20  Leaf ){.    if( 
d6f0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d700: 65 74 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  et<pLeaf->n ){. 
d710: 20 20 20 20 20 62 52 65 74 20 3d 20 28 70 4c 65       bRet = (pLe
d720: 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65  af->p[pIter->iLe
d730: 61 66 4f 66 66 73 65 74 5d 3d 3d 30 78 30 30 29  afOffset]==0x00)
d740: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d750: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65     Fts5Data *pNe
d760: 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  w = fts5DataRead
d770: 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
d780: 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20  _ROWID(.        
d790: 20 20 20 20 70 49 74 65 72 2d 3e 69 49 64 78 2c      pIter->iIdx,
d7a0: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
d7b0: 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e  egid, 0, pIter->
d7c0: 69 4c 65 61 66 50 67 6e 6f 2b 31 0a 20 20 20 20  iLeafPgno+1.    
d7d0: 20 20 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20    ));.      if( 
d7e0: 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
d7f0: 62 52 65 74 20 3d 20 28 70 4e 65 77 2d 3e 70 5b  bRet = (pNew->p[
d800: 34 5d 3d 3d 30 78 30 30 29 3b 0a 20 20 20 20 20  4]==0x00);.     
d810: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
d820: 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  se(pNew);.      
d830: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
d840: 74 75 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn bRet;.}../*
d850: 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72  .** Advance iter
d860: 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68  ator pIter to th
d870: 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
d880: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
d890: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
d8a0: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
d8b0: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
d8c0: 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a  rror code. It .*
d8d0: 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65  * is not conside
d8e0: 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
d8f0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
d900: 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20  ches EOF. If an 
d910: 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
d920: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
d930: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
d940: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
d950: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
d960: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
d970: 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74  egIterNext(.  Ft
d980: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d9a0: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
d9b0: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
d9c0: 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
d9d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
d9e0: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
d9f0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
da00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
da10: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
da20: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
da30: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a  ITER_REVERSE ){.
da40: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
da50: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20  >iRowidOffset>0 
da60: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  ){.        u8 *a
da70: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
da80: 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  >p;.        int 
da90: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e  iOff;.        in
daa0: 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  t nPos;.        
dab0: 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  i64 iDelta;.    
dac0: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
dad0: 64 4f 66 66 73 65 74 2d 2d 3b 0a 0a 20 20 20 20  dOffset--;..    
dae0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
daf0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20 3d 20  Offset = iOff = 
db00: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
db10: 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69  set[pIter->iRowi
db20: 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20  dOffset];.      
db30: 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
db40: 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
db50: 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20  f], nPos);.     
db60: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b     iOff += nPos;
db70: 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
db80: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
db90: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
dba0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77       pIter->iRow
dbb0: 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id -= iDelta;.  
dbc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dbd0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
dbe0: 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20  verseNewPage(p, 
dbf0: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
dc00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dc10: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
dc20: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
dc30: 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
dc40: 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
dc50: 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  erm = 0;.      i
dc60: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20  nt nKeep = 0;.. 
dc70: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
dc80: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
dc90: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
dca0: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
dcb0: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
dcc0: 20 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d    u8 *a = pLeaf-
dcd0: 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  >p;.      int n 
dce0: 3d 20 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20  = pLeaf->n;..   
dcf0: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
dd00: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
dd10: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
dd20: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50  {.        int nP
dd30: 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  oslist;.        
dd40: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
dd50: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
dd60: 2c 20 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  , nPoslist);.   
dd70: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f       iOff += nPo
dd80: 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  slist;.      }..
dd90: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e        if( iOff<n
dda0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
ddb0: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73  he next entry is
ddc0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
ddd0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
dde0: 75 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  u64 iDelta;.    
ddf0: 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69      iOff += sqli
de00: 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b  te3GetVarint(&a[
de10: 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b  iOff], &iDelta);
de20: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
de30: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
de40: 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ff;.        if( 
de50: 69 44 65 6c 74 61 3d 3d 30 20 29 7b 0a 20 20 20  iDelta==0 ){.   
de60: 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20         bNewTerm 
de70: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 1;.          i
de80: 66 28 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20  f( iOff>=n ){.  
de90: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
dea0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
deb0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
dec0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
ded0: 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20  fOffset = 4;.   
dee0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
def0: 20 69 4f 66 66 21 3d 66 74 73 35 47 65 74 55 31   iOff!=fts5GetU1
df00: 36 28 26 61 5b 32 5d 29 20 29 7b 0a 20 20 20 20  6(&a[2]) ){.    
df10: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
df20: 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74  LeafOffset += ft
df30: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
df40: 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
df50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
df60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
df70: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77       pIter->iRow
df80: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
df90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
dfa0: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
dfb0: 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Seg==0 ){.      
dfc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 4c    const char *pL
dfd0: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
dfe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65   const char *zTe
dff0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  rm;.        int 
e000: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  nList;.        i
e010: 66 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c  f( 0==(pIter->fl
e020: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e030: 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20  ER_ONETERM) ){. 
e040: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e050: 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74  Fts5HashScanNext
e060: 28 70 2d 3e 61 70 48 61 73 68 5b 30 5d 29 3b 0a  (p->apHash[0]);.
e070: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
e080: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
e090: 72 79 28 70 2d 3e 61 70 48 61 73 68 5b 30 5d 2c  ry(p->apHash[0],
e0a0: 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c   &zTerm, &pList,
e0b0: 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
e0c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
e0d0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
e0e0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
e0f0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
e100: 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  af);.          p
e110: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
e120: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
e130: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e140: 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a  >pLeaf->p = (u8*
e150: 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  )pList;.        
e160: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
e170: 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  n = nList;.     
e180: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
e190: 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
e1a0: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
e1b0: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28  strlen(zTerm), (
e1c0: 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
e1d0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
e1e0: 61 66 4f 66 66 73 65 74 20 3d 20 67 65 74 56 61  afOffset = getVa
e1f0: 72 69 6e 74 28 28 75 38 2a 29 70 4c 69 73 74 2c  rint((u8*)pList,
e200: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
e210: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
e220: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61    if( pIter->fla
e230: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
e240: 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20 20  R_REVERSE ){.   
e250: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
e260: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
e270: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
e280: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e290: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
e2a0: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  {.        iOff =
e2b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;.        /* N
e2c0: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  ext entry is not
e2d0: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
e2e0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
e2f0: 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29  while( iOff==0 )
e300: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
e310: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
e320: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
e330: 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74       pLeaf = pIt
e340: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
e350: 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d       if( pLeaf==
e360: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e370: 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20 3d       if( (iOff =
e380: 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
e390: 61 66 2d 3e 70 5b 30 5d 29 29 20 29 7b 0a 20 20  af->p[0])) ){.  
e3a0: 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
e3b0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
e3c0: 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  nt(&pLeaf->p[iOf
e3d0: 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
e3e0: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
e3f0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
e400: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
e410: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e420: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
e430: 20 28 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74   (iOff = fts5Get
e440: 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d  U16(&pLeaf->p[2]
e450: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
e460: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e470: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
e480: 20 20 20 20 20 20 20 20 20 62 4e 65 77 54 65 72           bNewTer
e490: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
e4a0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
e4b0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
e4c0: 68 65 63 6b 20 69 66 20 74 68 65 20 69 74 65 72  heck if the iter
e4d0: 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74 20 45  ator is now at E
e4e0: 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72  OF. If so, retur
e4f0: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20  n early. */.    
e500: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
e510: 61 66 20 26 26 20 62 4e 65 77 54 65 72 6d 20 29  af && bNewTerm )
e520: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
e530: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
e540: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
e550: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  M ){.          f
e560: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
e570: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
e580: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
e590: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
e5a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e5b0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
e5c0: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
e5d0: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20   nKeep);.       
e5e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
e5f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  .  }.}../*.** It
e600: 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
e610: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
e620: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
e630: 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   in a doclist. T
e640: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
e650: 73 65 74 73 20 74 68 65 20 69 74 65 72 61 74 6f  sets the iterato
e660: 72 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 65  r up so that ite
e670: 72 61 74 65 73 20 69 6e 20 72 65 76 65 72 73 65  rates in reverse
e680: 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a   order through.*
e690: 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a  * the doclist..*
e6a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
e6b0: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
e6c0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
e6d0: 6e 74 20 69 49 64 78 2c 20 46 74 73 35 53 65 67  nt iIdx, Fts5Seg
e6e0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
e6f0: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
e720: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  data */.  int iO
e730: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
e740: 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 42 79 74  fOffset;  /* Byt
e750: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
e760: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
e770: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73    Fts5Data *pLas
e780: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e  t = 0;.  int pgn
e790: 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oLast = 0;..  /*
e7a0: 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 70 61 67   Move to the pag
e7b0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
e7c0: 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69  the last rowid i
e7d0: 6e 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2e 20  n this doclist. 
e7e0: 2a 2f 0a 20 20 70 4c 65 61 66 20 3d 20 70 49 74  */.  pLeaf = pIt
e7f0: 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66  er->pLeaf;..  if
e800: 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20  ( pIter->pDlidx 
e810: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  ){.    int iSegi
e820: 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  d = pIter->pSeg-
e830: 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e  >iSegid;.    pgn
e840: 6f 4c 61 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  oLast = pIter->p
e850: 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f  Dlidx->iLeafPgno
e860: 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74  ;.    pLast = ft
e870: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
e880: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
e890: 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30  (iIdx, iSegid, 0
e8a0: 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20  , pgnoLast));.  
e8b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
e8c0: 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20  ( iOff<pLeaf->n 
e8d0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  ){.      int nPo
e8e0: 73 3b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  s;.      i64 iDe
e8f0: 6c 74 61 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 50  lta;..      /* P
e900: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a  osition list siz
e910: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
e920: 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
e930: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
e940: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 50 6f  af->p[iOff], nPo
e950: 73 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  s);.      iOff +
e960: 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 66  = nPos;.      if
e970: 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 6e  ( iOff>=pLeaf->n
e980: 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
e990: 20 2f 2a 20 52 6f 77 69 64 20 64 65 6c 74 61 2e   /* Rowid delta.
e9a0: 20 4f 72 2c 20 69 66 20 30 78 30 30 2c 20 74 68   Or, if 0x00, th
e9b0: 65 20 65 6e 64 20 6f 66 20 64 6f 63 6c 69 73 74  e end of doclist
e9c0: 20 6d 61 72 6b 65 72 2e 20 2a 2f 0a 20 20 20 20   marker. */.    
e9d0: 20 20 6e 50 6f 73 20 3d 20 67 65 74 56 61 72 69    nPos = getVari
e9e0: 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  nt(&pLeaf->p[iOf
e9f0: 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  f], (u64*)&iDelt
ea00: 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44  a);.      if( iD
ea10: 65 6c 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b  elta==0 ) break;
ea20: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e  .      iOff += n
ea30: 50 6f 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Pos;.    }..    
ea40: 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d  if( iOff>=pLeaf-
ea50: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  >n ){.      Fts5
ea60: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
ea70: 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e   *pSeg = pIter->
ea80: 70 53 65 67 3b 0a 20 20 20 20 20 20 69 36 34 20  pSeg;.      i64 
ea90: 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d  iAbs = FTS5_SEGM
eaa0: 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20  ENT_ROWID(iIdx, 
eab0: 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c  pSeg->iSegid, 0,
eac0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
ead0: 6f 29 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4c  o);.      i64 iL
eae0: 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  ast = FTS5_SEGME
eaf0: 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70  NT_ROWID(iIdx, p
eb00: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20  Seg->iSegid, 0, 
eb10: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b  pSeg->pgnoLast);
eb20: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c  ..      /* The l
eb30: 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  ast rowid in the
eb40: 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74   doclist may not
eb50: 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65   be on the curre
eb60: 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a  nt page. Search.
eb70: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61 72         ** forwar
eb80: 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70 61  d to find the pa
eb90: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
eba0: 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20 2a  e last rowid.  *
ebb0: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 41 62 73  /.      for(iAbs
ebc0: 2b 2b 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  ++; p->rc==SQLIT
ebd0: 45 5f 4f 4b 20 26 26 20 69 41 62 73 3c 3d 69 4c  E_OK && iAbs<=iL
ebe0: 61 73 74 3b 20 69 41 62 73 2b 2b 29 7b 0a 20 20  ast; iAbs++){.  
ebf0: 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
ec00: 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
ec10: 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20  ead(p, iAbs);.  
ec20: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
ec30: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
ec40: 69 52 6f 77 69 64 2c 20 69 54 65 72 6d 3b 0a 20  iRowid, iTerm;. 
ec50: 20 20 20 20 20 20 20 20 20 66 74 73 35 4c 65 61           fts5Lea
ec60: 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69  fHeader(pNew, &i
ec70: 52 6f 77 69 64 2c 20 26 69 54 65 72 6d 29 3b 0a  Rowid, &iTerm);.
ec80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
ec90: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
eca0: 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 54      Fts5Data *pT
ecb0: 6d 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  mp = pLast;.    
ecc0: 20 20 20 20 20 20 20 20 70 4c 61 73 74 20 3d 20          pLast = 
ecd0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  pNew;.          
ece0: 20 20 70 4e 65 77 20 3d 20 70 54 6d 70 3b 0a 20    pNew = pTmp;. 
ecf0: 20 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c             pgnoL
ed00: 61 73 74 20 3d 20 69 41 62 73 20 26 20 28 28 28  ast = iAbs & (((
ed10: 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
ed20: 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 3b  TA_PAGE_B) - 1);
ed30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ed40: 20 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d         if( iTerm
ed50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ed60: 69 41 62 73 20 3d 20 69 4c 61 73 74 3b 0a 20 20  iAbs = iLast;.  
ed70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ed80: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
ed90: 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ase(pNew);.     
eda0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
edb0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
edc0: 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74  pLast is NULL at
edd0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
ede0: 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  n the last rowid
edf0: 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73   for this doclis
ee00: 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74  t.  ** lies on t
ee10: 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  he page currentl
ee20: 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  y indicated by t
ee30: 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20  he iterator. In 
ee40: 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20  this case .  ** 
ee50: 69 4c 61 73 74 4f 66 66 20 69 73 20 73 65 74 20  iLastOff is set 
ee60: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61  to the value tha
ee70: 74 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  t pIter->iLeafOf
ee80: 66 73 65 74 20 77 69 6c 6c 20 74 61 6b 65 20 77  fset will take w
ee90: 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 69 74 65  hen.  ** the ite
eea0: 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  rator points to 
eeb0: 74 68 61 74 20 72 6f 77 69 64 2e 0a 20 20 2a 2a  that rowid..  **
eec0: 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61  .  ** Or, if pLa
eed0: 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  st is non-NULL, 
eee0: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 70  then it is the p
eef0: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
ef00: 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20  s the last.  ** 
ef10: 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  rowid..  */.  if
ef20: 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69  ( pLast ){.    i
ef30: 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 66 74  nt dummy;.    ft
ef40: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
ef50: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
ef60: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
ef70: 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72  pLast;.    pIter
ef80: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67  ->iLeafPgno = pg
ef90: 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 66 74 73 35  noLast;.    fts5
efa0: 4c 65 61 66 48 65 61 64 65 72 28 70 4c 61 73 74  LeafHeader(pLast
efb0: 2c 20 26 69 4f 66 66 2c 20 26 64 75 6d 6d 79 29  , &iOff, &dummy)
efc0: 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65  ;.    iOff += ge
efd0: 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e  tVarint(&pLast->
efe0: 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  p[iOff], (u64*)&
eff0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
f000: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f010: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
f020: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
f030: 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
f040: 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  (p, pIter);.}../
f050: 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49  *.** Iterator pI
f060: 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
f070: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
f080: 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63  t rowid of a doc
f090: 6c 69 73 74 20 77 69 74 68 69 6e 0a 2a 2a 20 69  list within.** i
f0a0: 6e 64 65 78 20 69 49 64 78 2e 20 54 68 65 72 65  ndex iIdx. There
f0b0: 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
f0c0: 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
f0d0: 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65  ith the final te
f0e0: 72 6d 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72  rm on.** the cur
f0f0: 72 65 6e 74 20 70 61 67 65 2e 20 49 66 20 74 68  rent page. If th
f100: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
f110: 73 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  s the last term 
f120: 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 0a 2a 2a  on the page, .**
f130: 20 6c 6f 61 64 20 74 68 65 20 64 6f 63 6c 69 73   load the doclis
f140: 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73  t-index from dis
f150: 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  k and initialize
f160: 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20   an iterator at 
f170: 0a 2a 2a 20 28 70 49 74 65 72 2d 3e 70 44 6c 69  .** (pIter->pDli
f180: 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dx)..*/.static v
f190: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
f1a0: 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64  oadDlidx(Fts5Ind
f1b0: 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c  ex *p, int iIdx,
f1c0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
f1d0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65 67  ter){.  int iSeg
f1e0: 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e   = pIter->pSeg->
f1f0: 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52  iSegid;.  int bR
f200: 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61  ev = (pIter->fla
f210: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
f220: 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74  R_REVERSE);.  Ft
f230: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
f240: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a  pIter->pLeaf; /*
f250: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
f260: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66  ta */.  int iOff
f270: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
f280: 66 66 73 65 74 3b 20 20 2f 2a 20 42 79 74 65 20  ffset;  /* Byte 
f290: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 63 75  offset within cu
f2a0: 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a 20  rrent leaf */.. 
f2b0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
f2c0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
f2d0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
f2e0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
f2f0: 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20  >pDlidx==0 );.. 
f300: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
f310: 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
f320: 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61   ends on this pa
f330: 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20  ge. If it does, 
f340: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c  return.  ** earl
f350: 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e  y without loadin
f360: 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  g the doclist-in
f370: 64 65 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e  dex (as it belon
f380: 67 73 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  gs to a differen
f390: 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a  t.  ** term. */.
f3a0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65    if( pIter->iTe
f3b0: 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65  rmLeafPgno==pIte
f3c0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  r->iLeafPgno ){.
f3d0: 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c      while( iOff<
f3e0: 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20  pLeaf->n ){.    
f3f0: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
f400: 20 20 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74      int nPoslist
f410: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 4f 66 66  ;..      /* iOff
f420: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68   is currently th
f430: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
f440: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 61 20  size field of a 
f450: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 2a  position list. *
f460: 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  /.      iOff += 
f470: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
f480: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
f490: 20 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20   nPoslist);.    
f4a0: 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 6c 69    iOff += nPosli
f4b0: 73 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69  st;..      if( i
f4c0: 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a  Off<pLeaf->n ){.
f4d0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
f4e0: 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  getVarint(&pLeaf
f4f0: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
f500: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
f510: 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
f520: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
f530: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
f540: 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
f550: 74 28 70 2c 20 62 52 65 76 2c 20 69 49 64 78 2c  t(p, bRev, iIdx,
f560: 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e 69 54   iSeg, pIter->iT
f570: 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20 26 70 49  ermLeafPgno, &pI
f580: 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 7d 0a  ter->pDlidx);.}.
f590: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
f5a0: 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74  e the object pIt
f5b0: 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  er to point to t
f5c0: 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20  erm pTerm/nTerm 
f5d0: 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a  within segment.*
f5e0: 2a 20 70 53 65 67 2c 20 69 6e 64 65 78 20 69 49  * pSeg, index iI
f5f0: 64 78 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  dx. If there is 
f600: 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20  no such term in 
f610: 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69  the index, the i
f620: 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 73 65  terator.** is se
f630: 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  t to EOF..**.** 
f640: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
f650: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
f660: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
f670: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
f680: 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  code. If .** an 
f690: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
f6a0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
f6b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
f6c0: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
f6d0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
f6e0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
f6f0: 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74  erSeekInit(.  Ft
f700: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f720: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f   FTS5 backend */
f730: 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61     /* Config.aHa
f760: 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46 54  sh[] index of FT
f770: 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  S index */.  con
f780: 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
f790: 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20  t nTerm,     /* 
f7a0: 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20  Term to seek to 
f7b0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
f7e0: 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c  FTS5INDEX_XXX fl
f7f0: 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ags */.  Fts5Str
f800: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
f810: 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
f820: 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
f830: 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
f840: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
f850: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
f860: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
f870: 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20  .){.  int iPg = 
f880: 31 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  1;.  int h;.  in
f890: 74 20 62 47 65 20 3d 20 28 28 66 6c 61 67 73 20  t bGe = ((flags 
f8a0: 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
f8b0: 59 5f 50 52 45 46 49 58 29 20 26 26 20 69 49 64  Y_PREFIX) && iId
f8c0: 78 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 62 44 6c  x==0);.  int bDl
f8d0: 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20  idx = 0;        
f8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
f8f0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
f900: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
f910: 0a 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d  .  assert( bGe==
f920: 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
f930: 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
f940: 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  SC)==0 );.  asse
f950: 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65  rt( pTerm && nTe
f960: 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  rm );.  memset(p
f970: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
f980: 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
f990: 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
f9a0: 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20    pIter->iIdx = 
f9b0: 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  iIdx;..  /* This
f9c0: 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74 61 63   block sets stac
f9d0: 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67 20 74  k variable iPg t
f9e0: 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  o the leaf page 
f9f0: 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 79 0a  number that may.
fa00: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72    ** contain ter
fa10: 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
fa20: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
fa30: 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  t in the segment
fa40: 2e 20 2a 2f 0a 20 20 66 6f 72 28 68 3d 70 53 65  . */.  for(h=pSe
fa50: 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20 68 3e  g->nHeight-1; h>
fa60: 30 3b 20 68 2d 2d 29 7b 0a 20 20 20 20 46 74 73  0; h--){.    Fts
fa70: 35 4e 6f 64 65 49 74 65 72 20 6e 6f 64 65 3b 20  5NodeIter node; 
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fa90: 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
faa0: 72 6f 75 67 68 20 69 6e 74 65 72 6e 61 6c 20 6e  rough internal n
fab0: 6f 64 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20  odes */.    i64 
fac0: 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
fad0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
fae0: 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
faf0: 68 2c 20 69 50 67 29 3b 0a 20 20 20 20 46 74 73  h, iPg);.    Fts
fb00: 35 44 61 74 61 20 2a 70 4e 6f 64 65 20 3d 20 66  5Data *pNode = f
fb10: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
fb20: 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  Rowid);.    if( 
fb30: 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b  pNode==0 ) break
fb40: 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49  ;..    fts5NodeI
fb50: 74 65 72 49 6e 69 74 28 70 4e 6f 64 65 2d 3e 70  terInit(pNode->p
fb60: 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26 6e 6f 64  , pNode->n, &nod
fb70: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
fb80: 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29  node.term.n==0 )
fb90: 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20 6e 6f 64  ;..    iPg = nod
fba0: 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 62 44  e.iChild;.    bD
fbb0: 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44 6c 69  lidx = node.bDli
fbc0: 64 78 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35  dx;.    for(fts5
fbd0: 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
fbe0: 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20  >rc, &node);.   
fbf0: 20 20 20 20 20 6e 6f 64 65 2e 61 44 61 74 61 20       node.aData 
fc00: 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  && fts5BufferCom
fc10: 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64 65 2e 74  pareBlob(&node.t
fc20: 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
fc30: 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20 20 20 66  m)<=0;.        f
fc40: 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
fc50: 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 0a 20  &p->rc, &node). 
fc60: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 67 20     ){.      iPg 
fc70: 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20  = node.iChild;. 
fc80: 20 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f       bDlidx = no
fc90: 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20 7d  de.bDlidx;.    }
fca0: 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
fcb0: 72 46 72 65 65 28 26 6e 6f 64 65 29 3b 0a 20 20  rFree(&node);.  
fcc0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
fcd0: 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20  e(pNode);.  }.. 
fce0: 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70   if( iPg<pSeg->p
fcf0: 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20  gnoFirst ){.    
fd00: 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  iPg = pSeg->pgno
fd10: 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64  First;.    bDlid
fd20: 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49  x = 0;.  }..  pI
fd30: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
fd40: 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35   iPg - 1;.  fts5
fd50: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
fd60: 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66  p, pIter);..  if
fd70: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
fd80: 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  {.    int res;. 
fd90: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
fda0: 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 55  ffset = fts5GetU
fdb0: 31 36 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66  16(&pIter->pLeaf
fdc0: 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 66 74 73  ->p[2]);.    fts
fdd0: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
fde0: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
fdf0: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 65     do {.      re
fe00: 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f  s = fts5BufferCo
fe10: 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72  mpareBlob(&pIter
fe20: 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  ->term, pTerm, n
fe30: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Term);.      if(
fe40: 20 72 65 73 3e 3d 30 20 29 20 62 72 65 61 6b 3b   res>=0 ) break;
fe50: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
fe60: 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  erNext(p, pIter)
fe70: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49  ;.    }while( pI
fe80: 74 65 72 2d 3e 70 4c 65 61 66 20 26 26 20 70 2d  ter->pLeaf && p-
fe90: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
fea0: 3b 0a 0a 20 20 20 20 69 66 28 20 62 47 65 3d 3d  ;..    if( bGe==
feb0: 30 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  0 && res ){.    
fec0: 20 20 2f 2a 20 53 65 74 20 69 74 65 72 61 74 6f    /* Set iterato
fed0: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f  r to point to EO
fee0: 46 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44  F */.      fts5D
fef0: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
ff00: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
ff10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
ff20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
ff30: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
ff40: 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29 7b  _OK && bGe==0 ){
ff50: 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
ff60: 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
ff70: 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
ff80: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
ff90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
ffa0: 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
ffb0: 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
ffc0: 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67       pIter->flag
ffd0: 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
ffe0: 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  R_REVERSE;.     
fff0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44 6c   }.      if( bDl
10000 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66  idx ){.        f
10010 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c  ts5SegIterLoadDl
10020 69 64 78 28 70 2c 20 69 49 64 78 2c 20 70 49 74  idx(p, iIdx, pIt
10030 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
10040 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
10050 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
10060 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ESC ){.        f
10070 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
10080 65 28 70 2c 20 69 49 64 78 2c 20 70 49 74 65 72  e(p, iIdx, pIter
10090 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
100a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
100b0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a  itialize the obj
100c0 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ect pIter to poi
100d0 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d  nt to term pTerm
100e0 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68  /nTerm within th
100f0 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68  e.** in-memory h
10100 61 73 68 20 74 61 62 6c 65 20 69 49 64 78 2e 20  ash table iIdx. 
10110 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
10120 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
10130 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69  table, the .** i
10140 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  terator is set t
10150 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  o EOF..**.** If 
10160 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
10170 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73   Fts5Index.rc is
10180 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f   set to an appro
10190 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
101a0 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  e. If .** an err
101b0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
101c0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
101d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
101e0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
101f0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
10200 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 48  oid fts5SegIterH
10210 61 73 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49  ashInit(.  Fts5I
10220 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
10230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
10240 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20  S5 backend */.  
10250 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b  /* Config.aHash[
10280 5d 20 69 6e 64 65 78 20 6f 66 20 46 54 53 20 69  ] index of FTS i
10290 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
102a0 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
102b0 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
102c0 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a  m to seek to */.
102d0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
10300 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73  5INDEX_XXX flags
10310 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
10320 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
10330 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
10340 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29  to populate */.)
10350 7b 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70 48  {.  Fts5Hash *pH
10360 61 73 68 20 3d 20 70 2d 3e 61 70 48 61 73 68 5b  ash = p->apHash[
10370 69 49 64 78 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  iIdx];.  const c
10380 68 61 72 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a  har *pList = 0;.
10390 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b    int nList = 0;
103a0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d  .  const u8 *z =
103b0 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b   0;.  int n = 0;
103c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 48 61 73  ..  assert( pHas
103d0 68 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72  h );..  if( pTer
103e0 6d 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3d 3d 30  m==0 || (iIdx==0
103f0 20 26 26 20 28 66 6c 61 67 73 20 26 20 46 54 53   && (flags & FTS
10400 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45  5INDEX_QUERY_PRE
10410 46 49 58 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  FIX)) ){.    sql
10420 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
10430 49 6e 69 74 28 70 48 61 73 68 2c 20 28 63 6f 6e  Init(pHash, (con
10440 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
10450 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69  nTerm);.    sqli
10460 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
10470 6e 74 72 79 28 70 48 61 73 68 2c 20 28 63 6f 6e  ntry(pHash, (con
10480 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70  st char**)&z, &p
10490 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
104a0 20 20 20 6e 20 3d 20 28 7a 20 3f 20 73 74 72 6c     n = (z ? strl
104b0 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  en((const char*)
104c0 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65  z) : 0);.  }else
104d0 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61  {.    pIter->fla
104e0 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
104f0 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20  ER_ONETERM;.    
10500 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51  sqlite3Fts5HashQ
10510 75 65 72 79 28 70 48 61 73 68 2c 20 28 63 6f 6e  uery(pHash, (con
10520 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
10530 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  nTerm, &pList, &
10540 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20 3d 20  nList);.    z = 
10550 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e  pTerm;.    n = n
10560 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Term;.  }..  if(
10570 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 46 74   pList ){.    Ft
10580 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
10590 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
105a0 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
105b0 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c  &pIter->term, n,
105c0 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d   z);.    pLeaf =
105d0 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
105e0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  , sizeof(Fts5Dat
105f0 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  a));.    if( pLe
10600 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  af==0 ) return;.
10610 20 20 20 20 70 4c 65 61 66 2d 3e 6e 52 65 66 20      pLeaf->nRef 
10620 3d 20 31 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e  = 1;.    pLeaf->
10630 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
10640 20 20 20 20 70 4c 65 61 66 2d 3e 6e 20 3d 20 6e      pLeaf->n = n
10650 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  List;.    pIter-
10660 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a  >pLeaf = pLeaf;.
10670 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
10680 4f 66 66 73 65 74 20 3d 20 67 65 74 56 61 72 69  Offset = getVari
10690 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28 75 36  nt(pLeaf->p, (u6
106a0 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
106b0 64 29 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61  d);..    if( fla
106c0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
106d0 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
106e0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
106f0 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
10700 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66  REVERSE;.      f
10710 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
10720 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
10730 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  er);.    }.  }.}
10740 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65  ../*.** Zero the
10750 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
10760 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
10770 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
10780 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
10790 72 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74  rClear(Fts5SegIt
107a0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74  er *pIter){.  ft
107b0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
107c0 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74  ter->term);.  ft
107d0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
107e0 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66  ter->pLeaf);.  f
107f0 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
10800 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b  (pIter->pDlidx);
10810 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
10820 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
10830 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  set);.  memset(p
10840 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
10850 46 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d  Fts5SegIter));.}
10860 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63  ../*.** Do the c
10870 6f 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73  omparison necess
10880 61 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ary to populate 
10890 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f  pIter->aFirst[iO
108a0 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ut]..**.** If th
108b0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
108c0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
108d0 65 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64  en it is the ind
108e0 65 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a  ex of an entry.*
108f0 2a 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e  * in the pIter->
10900 61 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61  aSeg[] array tha
10910 74 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20  t is (a) not at 
10920 45 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69  EOF, and (b) poi
10930 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65  nting.** to a ke
10940 79 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c  y that is a dupl
10950 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
10960 2c 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74  , higher priorit
10970 79 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69  y, .** segment-i
10980 74 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70  terator in the p
10990 53 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61  Seg->aSeg[] arra
109a0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
109b0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f   fts5MultiIterDo
109c0 43 6f 6d 70 61 72 65 28 46 74 73 35 4d 75 6c 74  Compare(Fts5Mult
109d0 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
109e0 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e   int iOut){.  in
109f0 74 20 69 31 3b 20 20 20 20 20 20 20 20 20 20 20  t i1;           
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10a10 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68   Index of left-h
10a20 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
10a30 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20  */.  int i2;    
10a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
10a60 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   right-hand Fts5
10a70 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74  SegIter */.  int
10a80 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67   iRes;.  Fts5Seg
10a90 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20  Iter *p1;       
10aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
10ab0 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
10ac0 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  r */.  Fts5SegIt
10ad0 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20  er *p2;         
10ae0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d         /* Right-
10af0 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
10b00 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
10b10 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20  Out<pIter->nSeg 
10b20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61  && iOut>0 );.  a
10b30 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52  ssert( pIter->bR
10b40 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e  ev==0 || pIter->
10b50 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66  bRev==1 );..  if
10b60 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e  ( iOut>=(pIter->
10b70 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69  nSeg/2) ){.    i
10b80 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65  1 = (iOut - pIte
10b90 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a  r->nSeg/2) * 2;.
10ba0 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b      i2 = i1 + 1;
10bb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31  .  }else{.    i1
10bc0 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
10bd0 5b 69 4f 75 74 2a 32 5d 3b 0a 20 20 20 20 69 32  [iOut*2];.    i2
10be0 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
10bf0 5b 69 4f 75 74 2a 32 2b 31 5d 3b 0a 20 20 7d 0a  [iOut*2+1];.  }.
10c00 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61    p1 = &pIter->a
10c10 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20  Seg[i1];.  p2 = 
10c20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d  &pIter->aSeg[i2]
10c30 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65  ;..  if( p1->pLe
10c40 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  af==0 ){        
10c50 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61     /* If p1 is a
10c60 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65  t EOF */.    iRe
10c70 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20  s = i2;.  }else 
10c80 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30  if( p2->pLeaf==0
10c90 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32   ){     /* If p2
10ca0 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20   is at EOF */.  
10cb0 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d    iRes = i1;.  }
10cc0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65  else{.    int re
10cd0 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f  s = fts5BufferCo
10ce0 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c  mpare(&p1->term,
10cf0 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20   &p2->term);.   
10d00 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
10d10 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32 3e       assert( i2>
10d20 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  i1 );.      asse
10d30 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20  rt( i2!=0 );.   
10d40 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69     if( p1->iRowi
10d50 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 20  d==p2->iRowid ) 
10d60 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20  return i2;.     
10d70 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f   res = ((p1->iRo
10d80 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64  wid > p2->iRowid
10d90 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20  )==pIter->bRev) 
10da0 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d  ? -1 : +1;.    }
10db0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73  .    assert( res
10dc0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  !=0 );.    if( r
10dd0 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52  es<0 ){.      iR
10de0 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c  es = i1;.    }el
10df0 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d  se{.      iRes =
10e00 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   i2;.    }.  }..
10e10 20 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b    pIter->aFirst[
10e20 69 4f 75 74 5d 20 3d 20 69 52 65 73 3b 0a 20 20  iOut] = iRes;.  
10e30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
10e40 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d  ** Move the seg-
10e50 69 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  iter so that it 
10e60 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
10e70 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67  rst rowid on pag
10e80 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20  e iLeafPgno..** 
10e90 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69  It is an error i
10ea0 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f  f leaf iLeafPgno
10eb0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77   contains no row
10ec0 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  id..*/.static vo
10ed0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47 6f  id fts5SegIterGo
10ee0 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  toPage(.  Fts5In
10ef0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
10f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
10f10 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
10f20 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
10f30 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
10f40 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
10f50 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
10f60 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a    int iLeafPgno.
10f70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ){.  assert( iLe
10f80 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c  afPgno>pIter->iL
10f90 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 69 66 28  eafPgno );.  if(
10fa0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
10fb0 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
10fc0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61  iLeafPgno = iLea
10fd0 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73  fPgno-1;.    fts
10fe0 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
10ff0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
11000 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
11010 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65  QLITE_OK || pIte
11020 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c  r->iLeafPgno==iL
11030 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 7d 0a 0a  eafPgno );.  }..
11040 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
11050 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
11060 74 20 69 4f 66 66 3b 0a 20 20 20 20 75 38 20 2a  t iOff;.    u8 *
11070 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
11080 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  ->p;.    int n =
11090 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
110a0 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74  ;..    iOff = ft
110b0 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b  s5GetU16(&a[0]);
110c0 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20  .    if( iOff<4 
110d0 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20  || iOff>=n ){.  
110e0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
110f0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
11100 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  lse{.      iOff 
11110 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b  += getVarint(&a[
11120 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
11130 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
11140 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
11150 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
11160 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11170 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
11180 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
11190 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
111a0 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73  ment until it is
111b0 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20   at or .** past 
111c0 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67  rowid iFrom. Reg
111d0 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
111e0 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74  alue of iFrom, t
111f0 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a  he iterator is.*
11200 2a 20 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65  * always advance
11210 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  d at least once.
11220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11230 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46  fts5SegIterNextF
11240 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
11250 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11260 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
11270 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
11280 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
11290 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
112a0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
112b0 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69  o advance */.  i
112c0 36 34 20 69 4d 61 74 63 68 20 20 20 20 20 20 20  64 iMatch       
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
112e0 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74  * Advance iterat
112f0 6f 72 20 61 74 20 6c 65 61 73 74 20 74 68 69 73  or at least this
11300 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   far */.){.  int
11310 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e   bRev = (pIter->
11320 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
11330 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20  ITER_REVERSE);. 
11340 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
11350 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  pDlidx = pIter->
11360 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c  pDlidx;.  int iL
11370 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
11380 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  >iLeafPgno;.  in
11390 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20  t bMove = 1;..  
113a0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
113b0 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
113c0 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20  TER_ONETERM );. 
113d0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
113e0 70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65  pDlidx );.  asse
113f0 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  rt( pIter->pLeaf
11400 20 29 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d   );..  if( bRev=
11410 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
11420 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
11430 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 20  f(p, pDlidx)==0 
11440 26 26 20 69 4d 61 74 63 68 3e 70 44 6c 69 64 78  && iMatch>pDlidx
11450 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
11460 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 44    iLeafPgno = pD
11470 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  lidx->iLeafPgno;
11480 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
11490 49 74 65 72 4e 65 78 74 28 70 44 6c 69 64 78 29  IterNext(pDlidx)
114a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
114b0 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70  rt( iLeafPgno>=p
114c0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
114d0 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20  || p->rc );.    
114e0 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49  if( iLeafPgno>pI
114f0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
11500 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
11510 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70  terGotoPage(p, p
11520 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29  Iter, iLeafPgno)
11530 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20  ;.      bMove = 
11540 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  0;.    }.  }else
11550 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 4d  {.    assert( iM
11560 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77  atch<pIter->iRow
11570 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  id );.    while(
11580 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
11590 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 20  f(p, pDlidx)==0 
115a0 26 26 20 69 4d 61 74 63 68 3c 70 44 6c 69 64 78  && iMatch<pDlidx
115b0 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
115c0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
115d0 72 65 76 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  rev(pDlidx);.   
115e0 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f   }.    iLeafPgno
115f0 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66   = pDlidx->iLeaf
11600 50 67 6e 6f 3b 0a 0a 20 20 20 20 61 73 73 65 72  Pgno;..    asser
11610 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  t( fts5DlidxIter
11620 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c  Eof(p, pDlidx) |
11630 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74  | iLeafPgno<=pIt
11640 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b  er->iLeafPgno );
11650 0a 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ..    if( iLeafP
11660 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno<pIter->iLeaf
11670 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49  Pgno ){.      pI
11680 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
11690 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20   iLeafPgno+1;.  
116a0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
116b0 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c  everseNewPage(p,
116c0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62   pIter);.      b
116d0 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
116e0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20    }..  while( 1 
116f0 29 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76 65  ){.    if( bMove
11700 20 29 20 66 74 73 35 53 65 67 49 74 65 72 4e 65   ) fts5SegIterNe
11710 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  xt(p, pIter);.  
11720 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
11730 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  af==0 ) break;. 
11740 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 26     if( bRev==0 &
11750 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e  & pIter->iRowid>
11760 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
11770 0a 20 20 20 20 69 66 28 20 62 52 65 76 21 3d 30  .    if( bRev!=0
11780 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69   && pIter->iRowi
11790 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d<=iMatch ) brea
117a0 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20 31  k;.    bMove = 1
117b0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
117c0 46 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f  Free the iterato
117d0 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
117e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
117f0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
11800 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
11810 49 74 65 72 46 72 65 65 28 46 74 73 35 49 6e 64  IterFree(Fts5Ind
11820 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69  ex *p, Fts5Multi
11830 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
11840 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
11850 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
11860 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
11870 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
11880 20 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c     fts5SegIterCl
11890 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67  ear(&pIter->aSeg
118a0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
118b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
118c0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  er);.  }.}..stat
118d0 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
118e0 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20  iIterAdvanced(. 
118f0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
11920 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68   to iterate with
11930 69 6e 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74  in */.  Fts5Mult
11940 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
11950 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
11960 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46  tor to update aF
11970 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72  irst[] array for
11980 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67   */.  int iChang
11990 65 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ed,             
119a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
119b0 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a  f sub-iterator j
119c0 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a  ust advanced */.
119d0 20 20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20    int iMinset   
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74    /* Minimum ent
11a00 72 79 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74  ry in aFirst[] t
11a10 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  o set */.){.  in
11a20 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49  t i;.  for(i=(pI
11a30 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67  ter->nSeg+iChang
11a40 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65  ed)/2; i>=iMinse
11a50 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  t && p->rc==SQLI
11a60 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20  TE_OK; i=i/2){. 
11a70 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20     int iEq;.    
11a80 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d  if( (iEq = fts5M
11a90 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72  ultiIterDoCompar
11aa0 65 28 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a  e(pIter, i)) ){.
11ab0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
11ac0 72 4e 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d  rNext(p, &pIter-
11ad0 3e 61 53 65 67 5b 69 45 71 5d 29 3b 0a 20 20 20  >aSeg[iEq]);.   
11ae0 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53     i = pIter->nS
11af0 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a  eg + iEq;.    }.
11b00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76    }.}../*.** Mov
11b10 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  e the iterator t
11b20 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
11b30 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
11b40 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
11b50 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
11b60 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e  ft in Fts5Index.
11b70 72 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a  rc. It is not .*
11b80 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20  * considered an 
11b90 65 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65  error if the ite
11ba0 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f  rator reaches EO
11bb0 46 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61  F, or if it is a
11bc0 6c 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f  lready at .** EO
11bd0 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
11be0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
11bf0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11c00 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
11c10 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
11c20 2c 20 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  , .  Fts5MultiSe
11c30 67 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20  gIter *pIter,.  
11c40 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20  int bFrom,      
11c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c60 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67 75 6d  /* True if argum
11c70 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c  ent iFrom is val
11c80 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f  id */.  i64 iFro
11c90 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
11ca0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e          /* Advan
11cb0 63 65 20 61 74 20 6c 65 61 73 74 20 61 73 20 66  ce at least as f
11cc0 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b  ar as this */.){
11cd0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
11ce0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
11cf0 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d 20 62 46  nt bUseFrom = bF
11d00 72 6f 6d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  rom;.    do {.  
11d10 20 20 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d      int iFirst =
11d20 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
11d30 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ];.      Fts5Seg
11d40 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
11d50 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74  ter->aSeg[iFirst
11d60 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 62 55 73  ];.      if( bUs
11d70 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70  eFrom && pSeg->p
11d80 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 20  Dlidx ){.       
11d90 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
11da0 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46  From(p, pSeg, iF
11db0 72 6f 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rom);.      }els
11dc0 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  e{.        fts5S
11dd0 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 53  egIterNext(p, pS
11de0 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eg);.      }.   
11df0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
11e00 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65  Advanced(p, pIte
11e10 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20  r, iFirst, 1);. 
11e20 20 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20       bUseFrom = 
11e30 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  0;.    }while( p
11e40 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79  Iter->bSkipEmpty
11e50 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 66 74   .         && ft
11e60 73 35 53 65 67 49 74 65 72 49 73 44 65 6c 65 74  s5SegIterIsDelet
11e70 65 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65  e(p, &pIter->aSe
11e80 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  g[pIter->aFirst[
11e90 31 5d 5d 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  1]]).    );.  }.
11ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
11eb0 65 20 61 20 6e 65 77 20 46 74 73 35 4d 75 6c 74  e a new Fts5Mult
11ec0 69 53 65 67 49 74 65 72 20 6f 62 6a 65 63 74 2e  iSegIter object.
11ed0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f  .**.** The new o
11ee0 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73  bject will be us
11ef0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
11f00 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20 73 74  rough data in st
11f10 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
11f20 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73  .** If iLevel is
11f30 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64   -ve, then all d
11f40 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65  ata in all segme
11f50 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f  nts is merged. O
11f60 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20  r, if iLevel.** 
11f70 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74  is zero or great
11f80 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  er, data from th
11f90 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74  e first nSegment
11fa0 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
11fb0 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20  el iLevel.** is 
11fc0 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  merged..**.** Th
11fd0 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69  e iterator initi
11fe0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ally points to t
11ff0 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f  he first term/ro
12000 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65  wid entry in the
12010 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61   .** iterated da
12020 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
12030 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
12040 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78  New(.  Fts5Index
12050 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
12060 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
12070 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
12080 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
12090 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
120a0 72 75 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  ruct,         /*
120b0 20 53 74 72 75 63 74 75 72 65 20 6f 66 20 73 70   Structure of sp
120c0 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a  ecific index */.
120d0 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73    /* Config.aHas
12100 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46 54 53  h[] index of FTS
12110 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
12120 62 53 6b 69 70 45 6d 70 74 79 2c 0a 20 20 69 6e  bSkipEmpty,.  in
12130 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12150 20 54 72 75 65 20 66 6f 72 20 3e 3d 20 2a 2f 0a   True for >= */.
12160 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
12170 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
12180 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
12190 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29  k to (or NULL/0)
121a0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
121b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
121c0 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74        /* Level t
121d0 6f 20 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f  o iterate (-1 fo
121e0 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20  r all) */.  int 
121f0 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20  nSegment,       
12200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
12210 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
12220 73 20 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76  s to merge (iLev
12230 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35  el>=0) */.  Fts5
12240 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 2a 70  MultiSegIter **p
12250 70 4f 75 74 20 20 20 20 20 20 20 20 2f 2a 20 4e  pOut        /* N
12260 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  ew object */.){.
12270 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20    int nSeg;     
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12290 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
122a0 65 67 6d 65 6e 74 73 20 6d 65 72 67 65 64 20 2a  egments merged *
122b0 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20  /.  int nSlot;  
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122d0 20 20 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20      /* Power of 
122e0 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 20  two >= nSeg */. 
122f0 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20   int iIter = 0; 
12300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12310 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65   /* */.  int iSe
12320 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
12330 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
12340 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
12350 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ugh segments */.
12360 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
12370 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74  evel *pLvl;.  Ft
12380 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
12390 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28  pNew;..  assert(
123a0 20 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54   (pTerm==0 && nT
123b0 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65  erm==0) || iLeve
123c0 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  l<0 );..  /* All
123d0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
123e0 74 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65  the new multi-se
123f0 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20  g-iterator. */. 
12400 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
12410 0a 20 20 20 20 6e 53 65 67 20 3d 20 66 74 73 35  .    nSeg = fts5
12420 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
12430 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 3b  gments(pStruct);
12440 0a 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d  .    nSeg += (p-
12450 3e 61 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29  >apHash ? 1 : 0)
12460 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
12470 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63  Seg = MIN(pStruc
12480 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c  t->aLevel[iLevel
12490 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74  ].nSeg, nSegment
124a0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 53 6c  );.  }.  for(nSl
124b0 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67  ot=2; nSlot<nSeg
124c0 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29  ; nSlot=nSlot*2)
124d0 3b 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65  ;.  *ppOut = pNe
124e0 77 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f  w = fts5IdxMallo
124f0 63 28 70 2c 20 0a 20 20 20 20 20 20 73 69 7a 65  c(p, .      size
12500 6f 66 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49  of(Fts5MultiSegI
12510 74 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ter) +          
12520 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20  /* pNew */.     
12530 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49   sizeof(Fts5SegI
12540 74 65 72 29 20 2a 20 6e 53 6c 6f 74 20 2b 20 20  ter) * nSlot +  
12550 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53       /* pNew->aS
12560 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69  eg[] */.      si
12570 7a 65 6f 66 28 75 31 36 29 20 2a 20 6e 53 6c 6f  zeof(u16) * nSlo
12580 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
12590 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73    /* pNew->aFirs
125a0 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  t[] */.  );.  if
125b0 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
125c0 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 65 67  rn;.  pNew->nSeg
125d0 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 70 4e 65 77   = nSlot;.  pNew
125e0 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53 65  ->aSeg = (Fts5Se
125f0 67 49 74 65 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  gIter*)&pNew[1];
12600 0a 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20  .  pNew->aFirst 
12610 3d 20 28 75 31 36 2a 29 26 70 4e 65 77 2d 3e 61  = (u16*)&pNew->a
12620 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 70 4e  Seg[nSlot];.  pN
12630 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28  ew->bRev = (0!=(
12640 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
12650 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b 0a  X_QUERY_DESC));.
12660 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70    pNew->bSkipEmp
12670 74 79 20 3d 20 62 53 6b 69 70 45 6d 70 74 79 3b  ty = bSkipEmpty;
12680 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
12690 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f  e each of the co
126a0 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20  mponent segment 
126b0 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20  iterators. */.  
126c0 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a  if( iLevel<0 ){.
126d0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
126e0 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26  eLevel *pEnd = &
126f0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
12700 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d  pStruct->nLevel]
12710 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 70 48  ;.    if( p->apH
12720 61 73 68 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ash ){.      /* 
12730 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74  Add a segment it
12740 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63  erator for the c
12750 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20  urrent contents 
12760 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  of the hash tabl
12770 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35  e. */.      Fts5
12780 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
12790 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74   &pNew->aSeg[iIt
127a0 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 66 74 73  er++];.      fts
127b0 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69 74  5SegIterHashInit
127c0 28 70 2c 20 69 49 64 78 2c 20 70 54 65 72 6d 2c  (p, iIdx, pTerm,
127d0 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70   nTerm, flags, p
127e0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Iter);.    }.   
127f0 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75   for(pLvl=&pStru
12800 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70  ct->aLevel[0]; p
12810 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b  Lvl<pEnd; pLvl++
12820 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ){.      for(iSe
12830 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20  g=pLvl->nSeg-1; 
12840 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29  iSeg>=0; iSeg--)
12850 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74  {.        Fts5St
12860 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
12870 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53  pSeg = &pLvl->aS
12880 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
12890 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
128a0 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
128b0 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20  eg[iIter++];.   
128c0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
128d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
128e0 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70  ts5SegIterInit(p
128f0 2c 20 69 49 64 78 2c 20 70 53 65 67 2c 20 70 49  , iIdx, pSeg, pI
12900 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ter);.        }e
12910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
12920 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
12930 69 74 28 70 2c 20 69 49 64 78 2c 20 70 54 65 72  it(p, iIdx, pTer
12940 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c  m, nTerm, flags,
12950 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20   pSeg, pIter);. 
12960 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12970 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
12980 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72      pLvl = &pStr
12990 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
129a0 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69 53 65  el];.    for(iSe
129b0 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d  g=nSeg-1; iSeg>=
129c0 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20  0; iSeg--){.    
129d0 20 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69    fts5SegIterIni
129e0 74 28 70 2c 20 69 49 64 78 2c 20 26 70 4c 76 6c  t(p, iIdx, &pLvl
129f0 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70  ->aSeg[iSeg], &p
12a00 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
12a10 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +]);.    }.  }. 
12a20 20 61 73 73 65 72 74 28 20 69 49 74 65 72 3d 3d   assert( iIter==
12a30 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  nSeg );..  /* If
12a40 20 74 68 65 20 61 62 6f 76 65 20 77 61 73 20 73   the above was s
12a50 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68 20  uccessful, each 
12a60 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61 74  component iterat
12a70 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a  ors now points .
12a80 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73    ** to the firs
12a90 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20 73  t entry in its s
12aa0 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20  egment. In this 
12ab0 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65 20  case initialize 
12ac0 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73 74  the .  ** aFirst
12ad0 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66  [] array. Or, if
12ae0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
12af0 63 75 72 72 65 64 2c 20 66 72 65 65 20 74 68 65  curred, free the
12b00 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f   iterator.  ** o
12b10 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74 68  bject and set th
12b20 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
12b30 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20  e to NULL.  */. 
12b40 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
12b50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72  TE_OK ){.    for
12b60 28 69 49 74 65 72 3d 6e 53 6c 6f 74 2d 31 3b 20  (iIter=nSlot-1; 
12b70 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d  iIter>0; iIter--
12b80 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71  ){.      int iEq
12b90 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 45 71  ;.      if( (iEq
12ba0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
12bb0 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20  DoCompare(pNew, 
12bc0 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20  iIter)) ){.     
12bd0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
12be0 78 74 28 70 2c 20 26 70 4e 65 77 2d 3e 61 53 65  xt(p, &pNew->aSe
12bf0 67 5b 69 45 71 5d 29 3b 0a 20 20 20 20 20 20 20  g[iEq]);.       
12c00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
12c10 76 61 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c 20  vanced(p, pNew, 
12c20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a 20 20 20  iEq, iIter);.   
12c30 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
12c40 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45  if( pNew->bSkipE
12c50 6d 70 74 79 20 0a 20 20 20 20 20 26 26 20 66 74  mpty .     && ft
12c60 73 35 53 65 67 49 74 65 72 49 73 44 65 6c 65 74  s5SegIterIsDelet
12c70 65 28 70 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67  e(p, &pNew->aSeg
12c80 5b 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31 5d  [pNew->aFirst[1]
12c90 5d 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ]) .    ){.     
12ca0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
12cb0 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
12cc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
12cd0 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  {.    fts5MultiI
12ce0 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29  terFree(p, pNew)
12cf0 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30  ;.    *ppOut = 0
12d00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
12d10 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
12d20 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74  e iterator is at
12d30 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72   EOF or if an er
12d40 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
12d50 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65  . .** False othe
12d60 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
12d70 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74   int fts5MultiIt
12d80 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20  erEof(Fts5Index 
12d90 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
12da0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
12db0 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c  return (p->rc ||
12dc0 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
12dd0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d  ter->aFirst[1] ]
12de0 2e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f  .pLeaf==0);.}../
12df0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12e00 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e 74  rowid of the ent
12e10 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ry that the iter
12e20 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  ator currently p
12e30 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20  oints.** to. If 
12e40 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
12e50 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e 20  nts to EOF when 
12e60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
12e70 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72   called the.** r
12e80 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66  esults are undef
12e90 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
12ea0 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74 65  i64 fts5MultiIte
12eb0 72 52 6f 77 69 64 28 46 74 73 35 4d 75 6c 74 69  rRowid(Fts5Multi
12ec0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
12ed0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
12ee0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
12ef0 46 69 72 73 74 5b 31 5d 20 5d 2e 70 4c 65 61 66  First[1] ].pLeaf
12f00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74   );.  return pIt
12f10 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
12f20 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e 69 52 6f  >aFirst[1] ].iRo
12f30 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  wid;.}../*.** Mo
12f40 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
12f50 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
12f60 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  y at or followin
12f70 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61  g iMatch..*/.sta
12f80 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
12f90 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a  tiIterNextFrom(.
12fa0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
12fb0 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
12fc0 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69  ter *pIter, .  i
12fd0 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77  64 iMatch.){.  w
12fe0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
12ff0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66  64 iRowid;.    f
13000 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
13010 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d  (p, pIter, 1, iM
13020 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66  atch);.    if( f
13030 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
13040 70 2c 20 70 49 74 65 72 29 20 29 20 62 72 65 61  p, pIter) ) brea
13050 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20  k;.    iRowid = 
13060 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
13070 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69  id(pIter);.    i
13080 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  f( pIter->bRev==
13090 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61  0 && iRowid>=iMa
130a0 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
130b0 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76   if( pIter->bRev
130c0 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69  !=0 && iRowid<=i
130d0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
130e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
130f0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
13100 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
13110 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73 73  ing the term ass
13120 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
13130 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20   .** entry that 
13140 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72  the iterator cur
13150 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
13160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
13170 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49  t u8 *fts5MultiI
13180 74 65 72 54 65 72 6d 28 46 74 73 35 4d 75 6c 74  terTerm(Fts5Mult
13190 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
131a0 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73   int *pn){.  Fts
131b0 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70  5SegIter *p = &p
131c0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
131d0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a  r->aFirst[1] ];.
131e0 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e    *pn = p->term.
131f0 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74  n;.  return p->t
13200 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erm.p;.}../*.** 
13210 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
13220 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61 74 6f  he chunk iterato
13230 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
13240 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
13250 69 73 0a 2a 2a 20 61 74 20 45 4f 46 2e 20 4f 72  is.** at EOF. Or
13260 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   if an error has
13270 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
13280 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  d. Otherwise, re
13290 74 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73  turn false..*/.s
132a0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 68  tatic int fts5Ch
132b0 75 6e 6b 49 74 65 72 45 6f 66 28 46 74 73 35 49  unkIterEof(Fts5I
132c0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75  ndex *p, Fts5Chu
132d0 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  nkIter *pIter){.
132e0 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20    return (p->rc 
132f0 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  || pIter->pLeaf=
13300 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  =0);.}../*.** Ad
13310 76 61 6e 63 65 20 74 68 65 20 63 68 75 6e 6b 2d  vance the chunk-
13320 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
13330 6e 65 78 74 20 63 68 75 6e 6b 20 6f 66 20 64 61  next chunk of da
13340 74 61 20 74 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73  ta to read..*/.s
13350 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43  tatic void fts5C
13360 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 46 74 73  hunkIterNext(Fts
13370 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 43  5Index *p, Fts5C
13380 68 75 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 29  hunkIter *pIter)
13390 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
133a0 72 2d 3e 6e 52 65 6d 3e 3d 70 49 74 65 72 2d 3e  r->nRem>=pIter->
133b0 6e 20 29 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 52  n );.  pIter->nR
133c0 65 6d 20 2d 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a  em -= pIter->n;.
133d0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
133e0 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
133f0 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
13400 3d 20 30 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20  = 0;.  pIter->p 
13410 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 74 65 72  = 0;.  if( pIter
13420 2d 3e 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ->nRem>0 ){.    
13430 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
13440 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
13450 66 52 6f 77 69 64 2b 2b 3b 0a 20 20 20 20 70 4c  fRowid++;.    pL
13460 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
13470 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
13480 64 28 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61  d(p, pIter->iLea
13490 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  fRowid);.    if(
134a0 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
134b0 70 49 74 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70  pIter->n = MIN(p
134c0 49 74 65 72 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61  Iter->nRem, pLea
134d0 66 2d 3e 6e 2d 34 29 3b 0a 20 20 20 20 20 20 70  f->n-4);.      p
134e0 49 74 65 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d  Iter->p = pLeaf-
134f0 3e 70 2b 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >p+4;.    }.  }.
13500 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69  }../*.** Intiali
13510 7a 65 20 74 68 65 20 63 68 75 6e 6b 20 69 74 65  ze the chunk ite
13520 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 74 68  rator to read th
13530 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
13540 64 61 74 61 20 66 6f 72 20 77 68 69 63 68 20 0a  data for which .
13550 2a 2a 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c  ** the size fiel
13560 64 20 69 73 20 61 74 20 6f 66 66 73 65 74 20 69  d is at offset i
13570 4f 66 66 20 6f 66 20 6c 65 61 66 20 70 4c 65 61  Off of leaf pLea
13580 66 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  f. .*/.static vo
13590 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  id fts5ChunkIter
135a0 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
135b0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
135c0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
135d0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
135e0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
135f0 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20 20  *pSeg,          
13600 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
13610 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20  terator to read 
13620 70 6f 73 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a  poslist from */.
13630 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20    Fts5ChunkIter 
13640 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
13650 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
13660 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  this object */.)
13670 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  {.  Fts5Data *pL
13680 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61  eaf = pSeg->pLea
13690 66 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  f;.  int iOff = 
136a0 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
136b0 74 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 49 74  t;..  memset(pIt
136c0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
136d0 49 74 65 72 29 29 3b 0a 20 20 2f 2a 20 49 66 20  Iter));.  /* If 
136e0 46 74 73 35 53 65 67 49 74 65 72 2e 70 53 65 67  Fts5SegIter.pSeg
136f0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
13700 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65  his iterator ite
13710 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 64 61  rates through da
13720 74 61 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 6c  ta.  ** currentl
13730 79 20 73 74 6f 72 65 64 20 69 6e 20 61 20 68 61  y stored in a ha
13740 73 68 20 74 61 62 6c 65 2e 20 49 6e 20 74 68 69  sh table. In thi
13750 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
13760 6e 6f 20 6c 65 61 66 2d 72 6f 77 69 64 0a 20 20  no leaf-rowid.  
13770 2a 2a 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 2e  ** to calculate.
13780 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 65 67 2d    */.  if( pSeg-
13790 3e 70 53 65 67 20 29 7b 0a 20 20 20 20 69 6e 74  >pSeg ){.    int
137a0 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65   iId = pSeg->pSe
137b0 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 69  g->iSegid;.    i
137c0 36 34 20 72 6f 77 69 64 20 3d 20 46 54 53 35 5f  64 rowid = FTS5_
137d0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
137e0 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20 30  eg->iIdx, iId, 0
137f0 2c 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e  , pSeg->iLeafPgn
13800 6f 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  o);.    pIter->i
13810 4c 65 61 66 52 6f 77 69 64 20 3d 20 72 6f 77 69  LeafRowid = rowi
13820 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f  d;.  }..  if( iO
13830 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  ff<pLeaf->n ){. 
13840 20 20 20 66 74 73 35 44 61 74 61 52 65 66 65 72     fts5DataRefer
13850 65 6e 63 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ence(pLeaf);.   
13860 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
13870 70 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pLeaf;.  }else{.
13880 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20      pIter->nRem 
13890 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 43 68 75  = 1;.    fts5Chu
138a0 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  nkIterNext(p, pI
138b0 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ter);.    if( p-
138c0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
138d0 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20    iOff = 4;.    
138e0 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
138f0 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 69 4f 66  Leaf;.  }..  iOf
13900 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
13910 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
13920 4f 66 66 5d 2c 20 70 49 74 65 72 2d 3e 6e 52 65  Off], pIter->nRe
13930 6d 29 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d  m);.  pIter->n =
13940 20 4d 49 4e 28 70 4c 65 61 66 2d 3e 6e 20 2d 20   MIN(pLeaf->n - 
13950 69 4f 66 66 2c 20 70 49 74 65 72 2d 3e 6e 52 65  iOff, pIter->nRe
13960 6d 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d  m);.  pIter->p =
13970 20 70 4c 65 61 66 2d 3e 70 20 2b 20 69 4f 66 66   pLeaf->p + iOff
13980 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
13990 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
139a0 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c  ChunkIterNext(p,
139b0 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a   pIter);.  }.}..
139c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
139d0 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65  ChunkIterRelease
139e0 28 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a  (Fts5ChunkIter *
139f0 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 44 61  pIter){.  fts5Da
13a00 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
13a10 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
13a20 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a  ->pLeaf = 0;.}..
13a30 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 72  /*.** Read and r
13a40 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 33  eturn the next 3
13a50 32 2d 62 69 74 20 76 61 72 69 6e 74 20 66 72 6f  2-bit varint fro
13a60 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  m the position-l
13a70 69 73 74 20 69 74 65 72 61 74 6f 72 20 0a 2a 2a  ist iterator .**
13a80 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
13a90 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
13aa0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
13ab0 72 20 6f 63 63 75 72 73 2c 20 7a 65 72 6f 20 69  r occurs, zero i
13ac0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 20 61 6e  s returned an an
13ad0 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74   error code left
13ae0 20 69 6e 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65   in .** Fts5Inde
13af0 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  x.rc. If an erro
13b00 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
13b10 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
13b20 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
13b30 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
13b40 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
13b50 20 69 6e 74 20 66 74 73 35 50 6f 73 49 74 65 72   int fts5PosIter
13b60 52 65 61 64 56 61 72 69 6e 74 28 46 74 73 35 49  ReadVarint(Fts5I
13b70 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73  ndex *p, Fts5Pos
13b80 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
13b90 69 6e 74 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20  int iVal = 0;.  
13ba0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13bb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
13bc0 70 49 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74  pIter->iOff>=pIt
13bd0 65 72 2d 3e 63 68 75 6e 6b 2e 6e 20 29 7b 0a 20  er->chunk.n ){. 
13be0 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
13bf0 65 72 4e 65 78 74 28 70 2c 20 26 70 49 74 65 72  erNext(p, &pIter
13c00 2d 3e 63 68 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ->chunk);.      
13c10 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65  if( fts5ChunkIte
13c20 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e  rEof(p, &pIter->
13c30 63 68 75 6e 6b 29 20 29 20 72 65 74 75 72 6e 20  chunk) ) return 
13c40 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  0;.      pIter->
13c50 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iOff = 0;.    }.
13c60 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
13c70 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
13c80 33 32 28 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b  32(&pIter->chunk
13c90 2e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c  .p[pIter->iOff],
13ca0 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
13cb0 74 75 72 6e 20 69 56 61 6c 3b 0a 7d 0a 0a 2f 2a  turn iVal;.}../*
13cc0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
13cd0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 74  position list it
13ce0 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
13cf0 78 74 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74 61  xt entry..*/.sta
13d00 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73  tic void fts5Pos
13d10 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
13d20 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74  ex *p, Fts5PosIt
13d30 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
13d40 74 20 69 56 61 6c 3b 0a 20 20 61 73 73 65 72 74  t iVal;.  assert
13d50 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45  ( fts5ChunkIterE
13d60 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68  of(p, &pIter->ch
13d70 75 6e 6b 29 3d 3d 30 20 29 3b 0a 20 20 69 56 61  unk)==0 );.  iVa
13d80 6c 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52  l = fts5PosIterR
13d90 65 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74  eadVarint(p, pIt
13da0 65 72 29 3b 0a 20 20 69 66 28 20 66 74 73 35 43  er);.  if( fts5C
13db0 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
13dc0 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30  pIter->chunk)==0
13dd0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 56 61 6c   ){.    if( iVal
13de0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ==1 ){.      pIt
13df0 65 72 2d 3e 69 43 6f 6c 20 3d 20 66 74 73 35 50  er->iCol = fts5P
13e00 6f 73 49 74 65 72 52 65 61 64 56 61 72 69 6e 74  osIterReadVarint
13e10 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
13e20 20 20 70 49 74 65 72 2d 3e 69 50 6f 73 20 3d 20    pIter->iPos = 
13e30 66 74 73 35 50 6f 73 49 74 65 72 52 65 61 64 56  fts5PosIterReadV
13e40 61 72 69 6e 74 28 70 2c 20 70 49 74 65 72 29 20  arint(p, pIter) 
13e50 2d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  - 2;.    }else{.
13e60 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 6f        pIter->iPo
13e70 73 20 2b 3d 20 28 69 56 61 6c 20 2d 20 32 29 3b  s += (iVal - 2);
13e80 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
13e90 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
13ea0 68 65 20 46 74 73 35 50 6f 73 49 74 65 72 20 6f  he Fts5PosIter o
13eb0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
13ec0 74 68 65 20 66 69 6e 61 6c 20 61 72 67 75 6d 65  the final argume
13ed0 6e 74 20 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a  nt to iterate.**
13ee0 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73   through the pos
13ef0 69 74 69 6f 6e 2d 6c 69 73 74 20 61 73 73 6f 63  ition-list assoc
13f00 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 69  iated with the i
13f10 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
13f20 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70 4d 75  iterator .** pMu
13f30 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  lti currently po
13f40 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
13f50 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 49  ic void fts5PosI
13f60 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
13f70 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
13f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
13f90 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
13fa0 74 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69  t */.  Fts5Multi
13fb0 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c  SegIter *pMulti,
13fc0 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74 69 2d         /* Multi-
13fd0 73 65 67 20 69 74 65 72 61 74 6f 72 20 74 6f 20  seg iterator to 
13fe0 72 65 61 64 20 70 6f 73 2d 6c 69 73 74 20 66 72  read pos-list fr
13ff0 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 50 6f 73 49  om */.  Fts5PosI
14000 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
14010 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
14020 61 6c 69 7a 65 20 74 68 69 73 20 6f 62 6a 65 63  alize this objec
14030 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  t */.){.  if( p-
14040 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14050 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
14060 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74  r *pSeg = &pMult
14070 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d  i->aSeg[ pMulti-
14080 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20  >aFirst[1] ];.  
14090 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
140a0 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
140b0 29 29 3b 0a 20 20 20 20 66 74 73 35 43 68 75 6e  ));.    fts5Chun
140c0 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  kIterInit(p, pSe
140d0 67 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b  g, &pIter->chunk
140e0 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 43  );.    if( fts5C
140f0 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
14100 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30  pIter->chunk)==0
14110 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 6f   ){.      fts5Po
14120 73 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  sIterNext(p, pIt
14130 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  er);.    }.  }.}
14140 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
14150 72 75 65 20 69 66 20 74 68 65 20 70 6f 73 69 74  rue if the posit
14160 69 6f 6e 20 69 74 65 72 61 74 6f 72 20 70 61 73  ion iterator pas
14170 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
14180 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  d argument is.**
14190 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66 20 61   at EOF. Or if a
141a0 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
141b0 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20 4f 74  ady occurred. Ot
141c0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
141d0 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  false..*/.static
141e0 20 69 6e 74 20 66 74 73 35 50 6f 73 49 74 65 72   int fts5PosIter
141f0 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
14200 2c 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70  , Fts5PosIter *p
14210 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
14220 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
14230 3e 63 68 75 6e 6b 2e 70 4c 65 61 66 3d 3d 30 29  >chunk.pLeaf==0)
14240 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
14250 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e  ate a new segmen
14260 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73 74 72  t-id for the str
14270 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a  ucture pStruct..
14280 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
14290 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
142a0 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
142b0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
142c0 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  . 0 is .** retur
142d0 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
142e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
142f0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
14300 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
14310 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
14320 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69  Struct){.  int i
14330 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ;.  if( p->rc!=S
14340 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
14350 6e 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  n 0;..  for(i=0;
14360 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20 20   i<100; i++){.  
14370 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
14380 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
14390 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e 74 29  ness(sizeof(int)
143a0 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64  , (void*)&iSegid
143b0 29 3b 0a 20 20 20 20 69 53 65 67 69 64 20 3d 20  );.    iSegid = 
143c0 69 53 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20  iSegid & ((1 << 
143d0 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d  FTS5_DATA_ID_B)-
143e0 31 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65 67  1);.    if( iSeg
143f0 69 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  id ){.      int 
14400 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
14410 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
14420 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
14430 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
14440 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
14450 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
14460 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
14470 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
14480 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64 3d       if( iSegid=
14490 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  =pStruct->aLevel
144a0 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
144b0 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20  ].iSegid ){.    
144c0 20 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d          iSegid =
144d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
144e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
144f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14500 69 53 65 67 69 64 20 29 20 72 65 74 75 72 6e 20  iSegid ) return 
14510 69 53 65 67 69 64 3b 0a 20 20 7d 0a 0a 20 20 70  iSegid;.  }..  p
14520 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
14530 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ROR;.  return 0;
14540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
14550 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65  d all data curre
14560 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74  ntly cached in t
14570 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a  he hash-tables..
14580 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
14590 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
145a0 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ata(Fts5Index *p
145b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
145c0 61 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65  apHash || p->nPe
145d0 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a  ndingData==0 );.
145e0 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 20    if( p->apHash 
145f0 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  ){.    Fts5Confi
14600 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
14610 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69 6e 74  pConfig;.    int
14620 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
14630 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72   i<=pConfig->nPr
14640 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  efix; i++){.    
14650 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 5b    if( p->apHash[
14660 69 5d 20 29 20 73 71 6c 69 74 65 33 46 74 73 35  i] ) sqlite3Fts5
14670 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 61 70 48  HashClear(p->apH
14680 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ash[i]);.    }. 
14690 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61     p->nPendingDa
146a0 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ta = 0;.  }.}../
146b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
146c0 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66  size of the pref
146d0 69 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68  ix, in bytes, th
146e0 61 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f  at buffer (nNew/
146f0 70 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20  pNew) shares.** 
14700 77 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c  with buffer (nOl
14710 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74  d/pOld)..*/.stat
14720 69 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69  ic int fts5Prefi
14730 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74  xCompress(.  int
14740 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20   nOld, const u8 
14750 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65  *pOld,.  int nNe
14760 77 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65  w, const u8 *pNe
14770 77 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  w.){.  int i;.  
14780 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20  for(i=0; i<nNew 
14790 26 26 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  && i<nOld; i++){
147a0 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d  .    if( pOld[i]
147b0 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61  !=pNew[i] ) brea
147c0 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
147d0 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61  i;.}../*.** If a
147e0 6e 20 22 6e 45 6d 70 74 79 22 20 72 65 63 6f 72  n "nEmpty" recor
147f0 64 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  d must be writte
14800 6e 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20  n to the b-tree 
14810 62 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 0a  before the next.
14820 2a 2a 20 74 65 72 6d 2c 20 77 72 69 74 65 20 69  ** term, write i
14830 74 20 6e 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t now..*/.static
14840 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
14850 74 72 65 65 4e 45 6d 70 74 79 28 46 74 73 35 49  treeNEmpty(Fts5I
14860 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
14870 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
14880 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  {.  if( pWriter-
14890 3e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 69  >nEmpty ){.    i
148a0 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20  nt bFlag = 0;.  
148b0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
148c0 20 2a 70 50 67 3b 0a 20 20 20 20 70 50 67 20 3d   *pPg;.    pPg =
148d0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
148e0 65 72 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70  er[1];.    if( p
148f0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d  Writer->nEmpty>=
14900 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
14910 49 5a 45 20 26 26 20 70 57 72 69 74 65 72 2d 3e  IZE && pWriter->
14920 63 64 6c 69 64 78 2e 6e 20 29 7b 0a 20 20 20 20  cdlidx.n ){.    
14930 20 20 69 36 34 20 69 4b 65 79 20 3d 20 46 54 53    i64 iKey = FTS
14940 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f  5_DOCLIST_IDX_RO
14950 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
14960 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
14970 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 0a  riter->iSegid, .
14980 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65            pWrite
14990 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67  r->aWriter[0].pg
149a0 6e 6f 20 2d 20 31 20 2d 20 70 57 72 69 74 65 72  no - 1 - pWriter
149b0 2d 3e 6e 45 6d 70 74 79 0a 20 20 20 20 20 20 29  ->nEmpty.      )
149c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
149d0 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2e  pWriter->cdlidx.
149e0 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73  n>0 );.      fts
149f0 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4b  5DataWrite(p, iK
14a00 65 79 2c 20 70 57 72 69 74 65 72 2d 3e 63 64 6c  ey, pWriter->cdl
14a10 69 64 78 2e 70 2c 20 70 57 72 69 74 65 72 2d 3e  idx.p, pWriter->
14a20 63 64 6c 69 64 78 2e 6e 29 3b 0a 20 20 20 20 20  cdlidx.n);.     
14a30 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20   bFlag = 1;.    
14a40 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
14a50 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
14a60 3e 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20  >rc, &pPg->buf, 
14a70 62 46 6c 61 67 29 3b 0a 20 20 20 20 66 74 73 35  bFlag);.    fts5
14a80 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
14a90 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d  nt(&p->rc, &pPg-
14aa0 3e 62 75 66 2c 20 70 57 72 69 74 65 72 2d 3e 6e  >buf, pWriter->n
14ab0 45 6d 70 74 79 29 3b 0a 20 20 20 20 70 57 72 69  Empty);.    pWri
14ac0 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b  ter->nEmpty = 0;
14ad0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 74 68  .  }..  /* Wheth
14ae0 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 77 61 73  er or not it was
14af0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
14b00 2c 20 7a 65 72 6f 20 74 68 65 20 64 6f 63 6c 69  , zero the docli
14b10 73 74 20 69 6e 64 65 78 20 61 74 20 74 68 69 73  st index at this
14b20 0a 20 20 2a 2a 20 70 6f 69 6e 74 20 2a 2f 0a 20  .  ** point */. 
14b30 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
14b40 65 72 5a 65 72 6f 28 26 70 57 72 69 74 65 72 2d  erZero(&pWriter-
14b50 3e 63 64 6c 69 64 78 29 3b 0a 20 20 70 57 72 69  >cdlidx);.  pWri
14b60 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56  ter->bDlidxPrevV
14b70 61 6c 69 64 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61  alid = 0;.}..sta
14b80 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
14b90 74 65 42 74 72 65 65 47 72 6f 77 28 46 74 73 35  teBtreeGrow(Fts5
14ba0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
14bb0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
14bc0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
14bd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14be0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
14bf0 2a 61 4e 65 77 3b 0a 20 20 20 20 46 74 73 35 50  *aNew;.    Fts5P
14c00 61 67 65 57 72 69 74 65 72 20 2a 70 4e 65 77 3b  ageWriter *pNew;
14c10 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
14c20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57  sizeof(Fts5PageW
14c30 72 69 74 65 72 29 20 2a 20 28 70 57 72 69 74 65  riter) * (pWrite
14c40 72 2d 3e 6e 57 72 69 74 65 72 2b 31 29 3b 0a 0a  r->nWriter+1);..
14c50 20 20 20 20 61 4e 65 77 20 3d 20 28 46 74 73 35      aNew = (Fts5
14c60 50 61 67 65 57 72 69 74 65 72 2a 29 73 71 6c 69  PageWriter*)sqli
14c70 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 57 72 69  te3_realloc(pWri
14c80 74 65 72 2d 3e 61 57 72 69 74 65 72 2c 20 6e 4e  ter->aWriter, nN
14c90 65 77 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ew);.    if( aNe
14ca0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  w==0 ){.      p-
14cb0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
14cc0 45 4d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  EM;.      return
14cd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e 65  ;.    }..    pNe
14ce0 77 20 3d 20 26 61 4e 65 77 5b 70 57 72 69 74 65  w = &aNew[pWrite
14cf0 72 2d 3e 6e 57 72 69 74 65 72 5d 3b 0a 20 20 20  r->nWriter];.   
14d00 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
14d10 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65   sizeof(Fts5Page
14d20 57 72 69 74 65 72 29 29 3b 0a 20 20 20 20 70 4e  Writer));.    pN
14d30 65 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20  ew->pgno = 1;.  
14d40 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
14d50 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
14d60 20 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29 3b   &pNew->buf, 1);
14d70 0a 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e  ..    pWriter->n
14d80 57 72 69 74 65 72 2b 2b 3b 0a 20 20 20 20 70 57  Writer++;.    pW
14d90 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d  riter->aWriter =
14da0 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   aNew;.  }.}../*
14db0 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
14dc0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
14dd0 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70   leaf page excep
14de0 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74  t the first that
14df0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20   contains.** at 
14e00 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20  least one term. 
14e10 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f  Argument (nTerm/
14e20 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70  pTerm) is the sp
14e30 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d  lit-key - a term
14e40 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
14e50 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d  er than all term
14e60 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72  s written to ear
14e70 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64  lier leaves, and
14e80 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20   equal to or.** 
14e90 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
14ea0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
14eb0 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a  he new leaf..**.
14ec0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
14ed0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
14ee0 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
14ef0 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66  Fts5Index.rc. If
14f00 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73   an error.** has
14f10 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
14f20 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
14f30 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
14f40 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
14f50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
14f60 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
14f70 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
14f80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14f90 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
14fa0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
14fb0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
14fc0 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
14fd0 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
14fe0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
14ff0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
15000 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
15010 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20  erm on new page 
15020 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65 69  */.){.  int iHei
15030 67 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69 67  ght;.  for(iHeig
15040 68 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68 74  ht=1; 1; iHeight
15050 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  ++){.    Fts5Pag
15060 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b 0a  eWriter *pPage;.
15070 0a 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74  .    if( iHeight
15080 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74  >=pWriter->nWrit
15090 65 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  er ){.      fts5
150a0 57 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 70  WriteBtreeGrow(p
150b0 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
150c0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
150d0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
150e0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
150f0 2d 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67 68  ->aWriter[iHeigh
15100 74 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  t];..    fts5Wri
15110 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c  teBtreeNEmpty(p,
15120 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20 20   pWriter);..    
15130 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
15140 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  >=p->pConfig->pg
15150 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  sz ){.      /* p
15160 50 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69  Page will be wri
15170 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68  tten to disk. Th
15180 65 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77  e term will be w
15190 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
151a0 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20        ** parent 
151b0 6f 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20  of pPage.  */.  
151c0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
151d0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
151e0 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
151f0 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
15200 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
15210 48 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70  Height, pPage->p
15220 67 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  gno.      );.   
15230 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
15240 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67  (p, iRowid, pPag
15250 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
15260 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66  >buf.n);.      f
15270 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
15280 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20  Page->buf);.    
15290 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
152a0 28 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a  (&pPage->term);.
152b0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
152c0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
152d0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
152e0 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f  , pPage[-1].pgno
152f0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  );.      pPage->
15300 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  pgno++;.    }els
15310 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72  e{.      int nPr
15320 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  e = fts5PrefixCo
15330 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
15340 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
15350 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
15360 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  m);.      fts5Bu
15370 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
15380 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
15390 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20  >buf, nPre+2);. 
153a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
153b0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
153c0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
153d0 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20   nTerm-nPre);.  
153e0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
153f0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
15400 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
15410 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b  erm-nPre, pTerm+
15420 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73  nPre);.      fts
15430 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
15440 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c  c, &pPage->term,
15450 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
15460 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15470 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
15480 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
15490 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74  treeNoTerm(.  Ft
154a0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
154c0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
154d0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
154e0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
154f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
15500 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ter object */.){
15510 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
15520 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
15530 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72  e ){.    /* No r
15540 6f 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70 61  owids on this pa
15550 67 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30 78  ge. Append an 0x
15560 30 30 20 62 79 74 65 20 74 6f 20 74 68 65 20 63  00 byte to the c
15570 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64  urrent .    ** d
15580 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
15590 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
155a0 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64  >bDlidxPrevValid
155b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34  ==0 ){.      i64
155c0 20 69 52 6f 77 69 64 20 3d 20 70 57 72 69 74 65   iRowid = pWrite
155d0 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 3b 0a 20  r->iPrevRowid;. 
155e0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
155f0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
15600 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  nt(&p->rc, &pWri
15610 74 65 72 2d 3e 63 64 6c 69 64 78 2c 20 69 52 6f  ter->cdlidx, iRo
15620 77 69 64 29 3b 0a 20 20 20 20 20 20 70 57 72 69  wid);.      pWri
15630 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56  ter->bDlidxPrevV
15640 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
15650 70 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78 50  pWriter->iDlidxP
15660 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  rev = iRowid;.  
15670 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
15680 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
15690 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
156a0 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78 2c 20  Writer->cdlidx, 
156b0 30 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65  0);.  }.  pWrite
156c0 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a  r->nEmpty++;.}..
156d0 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77  /*.** Rowid iRow
156e0 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  id has just been
156f0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
15700 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
15710 67 65 2e 20 41 73 20 69 74 20 69 73 0a 2a 2a 20  ge. As it is.** 
15720 74 68 65 20 66 69 72 73 74 20 6f 6e 20 69 74 73  the first on its
15730 20 70 61 67 65 2c 20 61 70 70 65 6e 64 20 61 6e   page, append an
15740 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75   entry to the cu
15750 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e  rrent doclist-in
15760 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
15770 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69  oid fts5WriteDli
15780 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35  dxAppend(.  Fts5
15790 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
157a0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
157b0 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77  ter, .  i64 iRow
157c0 69 64 0a 29 7b 0a 20 20 69 36 34 20 69 56 61 6c  id.){.  i64 iVal
157d0 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  ;.  if( pWriter-
157e0 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64  >bDlidxPrevValid
157f0 20 29 7b 0a 20 20 20 20 69 56 61 6c 20 3d 20 69   ){.    iVal = i
15800 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d  Rowid - pWriter-
15810 3e 69 44 6c 69 64 78 50 72 65 76 3b 0a 20 20 7d  >iDlidxPrev;.  }
15820 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
15830 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
15840 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
15850 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78  &pWriter->cdlidx
15860 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69  , iRowid);.    i
15870 56 61 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  Val = 1;.  }.  s
15880 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
15890 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
158a0 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 63  >rc, &pWriter->c
158b0 64 6c 69 64 78 2c 20 69 56 61 6c 29 3b 0a 20 20  dlidx, iVal);.  
158c0 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50  pWriter->bDlidxP
158d0 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  revValid = 1;.  
158e0 70 57 72 69 74 65 72 2d 3e 69 44 6c 69 64 78 50  pWriter->iDlidxP
158f0 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a  rev = iRowid;.}.
15900 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15910 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
15920 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
15930 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
15940 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  iter){.  static 
15950 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20  const u8 zero[] 
15960 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20  = { 0x00, 0x00, 
15970 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x00, 0x00 };.  
15980 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
15990 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
159a0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20  ->aWriter[0];.  
159b0 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 69  i64 iRowid;..  i
159c0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
159d0 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a  stTermInPage ){.
159e0 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77      /* No term w
159f0 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  as written to th
15a00 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  is page. */.    
15a10 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47  assert( 0==fts5G
15a20 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  etU16(&pPage->bu
15a30 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66  f.p[2]) );.    f
15a40 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
15a50 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
15a60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
15a70 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
15a80 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a  e to the db. */.
15a90 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
15aa0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
15ab0 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
15ac0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c  iter->iSegid, 0,
15ad0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
15ae0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
15af0 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d  , iRowid, pPage-
15b00 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
15b10 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  uf.n);..  /* Ini
15b20 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74  tialize the next
15b30 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
15b40 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
15b50 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  e->buf);.  fts5B
15b60 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
15b70 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
15b80 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20  buf, 4, zero);. 
15b90 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a   pPage->pgno++;.
15ba0 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74  .  /* Increase t
15bb0 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  he leaves writte
15bc0 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70  n counter */.  p
15bd0 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69  Writer->nLeafWri
15be0 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  tten++;..  /* Th
15bf0 65 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73  e new leaf holds
15c00 20 6e 6f 20 74 65 72 6d 73 20 2a 2f 0a 20 20 70   no terms */.  p
15c10 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
15c20 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a  rmInPage = 1;.}.
15c30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65  ./*.** Append te
15c40 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74  rm pTerm/nTerm t
15c50 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65  o the segment be
15c60 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20 74  ing written by t
15c70 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65 64  he writer passed
15c80 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
15c90 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
15ca0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
15cb0 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
15cc0 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
15cd0 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
15ce0 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
15cf0 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
15d00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
15d10 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
15d20 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
15d30 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73  ppendTerm(.  Fts
15d40 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
15d50 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
15d60 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72  iter,.  int nTer
15d70 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  m, const u8 *pTe
15d80 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72  rm .){.  int nPr
15d90 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
15da0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
15db0 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70  s of prefix comp
15dc0 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d  ression for term
15dd0 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
15de0 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
15df0 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b  Writer->aWriter[
15e00 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  0];..  assert( p
15e10 50 61 67 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Page==0 || pPage
15e20 2d 3e 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50  ->buf.n==0 || pP
15e30 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a  age->buf.n>4 );.
15e40 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 70    if( pPage && p
15e50 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29  Page->buf.n==0 )
15e60 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68  {.    /* Zero th
15e70 65 20 66 69 72 73 74 20 74 65 72 6d 20 61 6e 64  e first term and
15e80 20 66 69 72 73 74 20 64 6f 63 69 64 20 66 69 65   first docid fie
15e90 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  lds */.    stati
15ea0 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b  c const u8 zero[
15eb0 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30  ] = { 0x00, 0x00
15ec0 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a  , 0x00, 0x00 };.
15ed0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
15ee0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
15ef0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c   &pPage->buf, 4,
15f00 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61 73 73 65   zero);.    asse
15f10 72 74 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  rt( pWriter->bFi
15f20 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b  rstTermInPage );
15f30 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63  .  }.  if( p->rc
15f40 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20 20   ) return;.  .  
15f50 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
15f60 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
15f70 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
15f80 68 65 20 22 66 69 72 73 74 20 74 65 72 6d 22 20  he "first term" 
15f90 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 67  field of the pag
15fa0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
15fb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
15fc0 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20 70  buf.p[2]==0 && p
15fd0 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d 3d  Page->buf.p[3]==
15fe0 30 20 29 3b 0a 20 20 20 20 66 74 73 35 50 75 74  0 );.    fts5Put
15ff0 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
16000 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  p[2], pPage->buf
16010 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65 66 69 78  .n);.    nPrefix
16020 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
16030 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a  age->pgno!=1 ){.
16040 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
16050 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
16060 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20 69  on a leaf that i
16070 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f  s not the leftmo
16080 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20  st leaf in.     
16090 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20   ** the segment 
160a0 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20  b-tree. In this 
160b0 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65 73  case it is neces
160c0 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74 65  sary to add a te
160d0 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  rm to.      ** t
160e0 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  he b-tree hierar
160f0 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29 20  chy that is (a) 
16100 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
16110 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20  largest term .  
16120 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77      ** already w
16130 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65  ritten to the se
16140 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d  gment and (b) sm
16150 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71  aller than or eq
16160 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ual to.      ** 
16170 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74  this term. In ot
16180 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65  her words, a pre
16190 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54  fix of (pTerm/nT
161a0 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65  erm) that is one
161b0 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c  .      ** byte l
161c0 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c  onger than the l
161d0 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28 70  ongest prefix (p
161e0 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72  Term/nTerm) shar
161f0 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20  es with the.    
16200 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65    ** previous te
16210 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rm. .      **.  
16220 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20      ** Usually, 
16230 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
16240 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69  m is available i
16250 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54  n pPage->term. T
16260 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20  he exception.   
16270 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73     ** is if this
16280 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
16290 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e  rm written in an
162a0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72   incremental-mer
162b0 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a  ge step..      *
162c0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
162d0 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  he previous term
162e0 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
162f0 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65  e, so just write
16300 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
16310 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d   of (pTerm/nTerm
16320 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  ) into the paren
16330 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20  t node. This is 
16340 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a  slightly.      *
16350 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62  * inefficient, b
16360 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74  ut still correct
16370 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  .  */.      int 
16380 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  n = nTerm;.     
16390 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d   if( pPage->term
163a0 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20  .n ){.        n 
163b0 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69 78  = 1 + fts5Prefix
163c0 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e  Compress(pPage->
163d0 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74  term.n, pPage->t
163e0 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54  erm.p, nTerm, pT
163f0 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  erm);.      }.  
16400 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
16410 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65  eeTerm(p, pWrite
16420 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20  r, n, pTerm);.  
16430 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72      pPage = &pWr
16440 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
16450 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
16460 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66  .    nPrefix = f
16470 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
16480 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c  s(pPage->term.n,
16490 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
164a0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
164b0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
164c0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
164d0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
164e0 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20  Prefix);.  }..  
164f0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75  /* Append the nu
16500 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16510 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20   new data, then 
16520 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74  the term data it
16530 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65  self.  ** to the
16540 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
16550 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
16560 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
16570 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
16580 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35  nPrefix);.  fts5
16590 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
165a0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
165b0 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50  >buf, nTerm - nP
165c0 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50  refix, &pTerm[nP
165d0 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55  refix]);..  /* U
165e0 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61  pdate the Fts5Pa
165f0 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69  geWriter.term fi
16600 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  eld. */.  fts5Bu
16610 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
16620 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54  &pPage->term, nT
16630 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70  erm, pTerm);.  p
16640 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
16650 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20  rmInPage = 0;.. 
16660 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
16670 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
16680 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
16690 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
166a0 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 1;..  /* If t
166b0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
166c0 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c  page is full, fl
166d0 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20  ush it to disk. 
166e0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
166f0 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69  buf.n>=p->pConfi
16700 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66  g->pgsz ){.    f
16710 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
16720 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
16730 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
16740 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
16750 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
16760 41 70 70 65 6e 64 20 61 20 64 6f 63 69 64 20 74  Append a docid t
16770 6f 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75  o the writers ou
16780 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  tput. .*/.static
16790 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
167a0 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74  ppendRowid(.  Ft
167b0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
167c0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
167d0 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f  riter,.  i64 iRo
167e0 77 69 64 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  wid.){.  if( p->
167f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16800 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69  .    Fts5PageWri
16810 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
16820 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
16830 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
16840 69 73 20 69 73 20 74 6f 20 62 65 20 74 68 65 20  is is to be the 
16850 66 69 72 73 74 20 64 6f 63 69 64 20 77 72 69 74  first docid writ
16860 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ten to the page,
16870 20 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a   set the .    **
16880 20 64 6f 63 69 64 2d 70 6f 69 6e 74 65 72 20 69   docid-pointer i
16890 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  n the page-heade
168a0 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61  r. Also append a
168b0 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c   value to the dl
168c0 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65  idx.    ** buffe
168d0 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63  r, in case a doc
168e0 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65  list-index is re
168f0 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20  quired.  */.    
16900 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
16910 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
16920 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75 74 55  {.      fts5PutU
16930 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c  16(pPage->buf.p,
16940 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a   pPage->buf.n);.
16950 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44        fts5WriteD
16960 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57  lidxAppend(p, pW
16970 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a  riter, iRowid);.
16980 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72      }..    /* Wr
16990 69 74 65 20 74 68 65 20 64 6f 63 69 64 2e 20 2a  ite the docid. *
169a0 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  /.    if( pWrite
169b0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
169c0 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74  Doclist || pWrit
169d0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
169e0 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66  nPage ){.      f
169f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
16a00 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
16a10 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69  Page->buf, iRowi
16a20 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
16a30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
16a40 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72  rc || iRowid>pWr
16a50 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64  iter->iPrevRowid
16a60 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75   );.      fts5Bu
16a70 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
16a80 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
16a90 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 70  >buf, iRowid - p
16aa0 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
16ab0 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  id);.    }.    p
16ac0 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
16ad0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  id = iRowid;.   
16ae0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
16af0 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d  RowidInDoclist =
16b00 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d   0;.    pWriter-
16b10 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
16b20 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  ge = 0;..    if(
16b30 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70   pPage->buf.n>=p
16b40 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
16b50 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
16b60 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
16b70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Writer);.      p
16b80 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
16b90 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  widInPage = 1;. 
16ba0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
16bb0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
16bc0 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e  eAppendPoslistIn
16bd0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
16be0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
16bf0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
16c00 69 6e 74 20 69 56 61 6c 0a 29 7b 0a 20 20 69 66  int iVal.){.  if
16c10 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16c20 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61  OK ){.    Fts5Pa
16c30 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
16c40 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
16c50 74 65 72 5b 30 5d 3b 0a 20 20 20 20 66 74 73 35  ter[0];.    fts5
16c60 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
16c70 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
16c80 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20  e->buf, iVal);. 
16c90 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75     if( pPage->bu
16ca0 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  f.n>=p->pConfig-
16cb0 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66  >pgsz ){.      f
16cc0 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
16cd0 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
16ce0 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46       pWriter->bF
16cf0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
16d00 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 1;.    }.  }.}
16d10 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16d20 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
16d30 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35  listData(.  Fts5
16d40 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
16d50 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
16d60 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ter, .  const u8
16d70 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20   *aData, .  int 
16d80 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50  nData.){.  Fts5P
16d90 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
16da0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
16db0 69 74 65 72 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74  iter[0];.  const
16dc0 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a   u8 *a = aData;.
16dd0 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b    int n = nData;
16de0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d  .  .  assert( p-
16df0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30  >pConfig->pgsz>0
16e00 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
16e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
16e20 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
16e30 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d   n)>=p->pConfig-
16e40 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 6e 74  >pgsz ){.    int
16e50 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66   nReq = p->pConf
16e60 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65  ig->pgsz - pPage
16e70 2d 3e 62 75 66 2e 6e 3b 0a 20 20 20 20 69 6e 74  ->buf.n;.    int
16e80 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20   nCopy = 0;.    
16e90 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65  while( nCopy<nRe
16ea0 71 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64  q ){.      i64 d
16eb0 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70  ummy;.      nCop
16ec0 79 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  y += getVarint(&
16ed0 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29  a[nCopy], (u64*)
16ee0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20  &dummy);.    }. 
16ef0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
16f00 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
16f10 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f  &pPage->buf, nCo
16f20 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d  py, a);.    a +=
16f30 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d   nCopy;.    n -=
16f40 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35   nCopy;.    fts5
16f50 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
16f60 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
16f70 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
16f80 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a  owidInPage = 1;.
16f90 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
16fa0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
16fb0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
16fc0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
16fd0 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  , a);.  }.}..sta
16fe0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
16ff0 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65  teAppendZerobyte
17000 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
17010 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
17020 72 69 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75  riter){.  fts5Bu
17030 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
17040 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
17050 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62 75  r->aWriter[0].bu
17060 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
17070 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63  Flush any data c
17080 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69  ached by the wri
17090 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  ter object to th
170a0 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65  e database. Free
170b0 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   any.** allocati
170c0 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ons associated w
170d0 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a  ith the writer..
170e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
170f0 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a  ts5WriteFinish(.
17100 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
17110 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
17120 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20   *pWriter,      
17130 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
17140 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ect */.  int *pn
17150 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
17160 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
17170 20 48 65 69 67 68 74 20 6f 66 20 74 68 65 20 62   Height of the b
17180 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  -tree */.  int *
17190 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20  pnLeaf          
171a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
171b0 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  T: Number of lea
171c0 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65  f pages in b-tre
171d0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
171e0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
171f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
17200 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
17210 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d  Leaf = &pWriter-
17220 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 20  >aWriter[0];.   
17230 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f   if( pLeaf->pgno
17240 3d 3d 31 20 26 26 20 70 4c 65 61 66 2d 3e 62 75  ==1 && pLeaf->bu
17250 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
17260 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  *pnLeaf = 0;.   
17270 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 30     *pnHeight = 0
17280 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17290 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75     if( pLeaf->bu
172a0 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 20  f.n>4 ){.       
172b0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
172c0 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
172d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
172e0 70 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e  pnLeaf = pLeaf->
172f0 70 67 6e 6f 2d 31 3b 0a 20 20 20 20 20 20 69 66  pgno-1;.      if
17300 28 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74  ( pWriter->nWrit
17310 65 72 3d 3d 31 20 26 26 20 70 57 72 69 74 65 72  er==1 && pWriter
17320 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d  ->nEmpty>=FTS5_M
17330 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b  IN_DLIDX_SIZE ){
17340 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69  .        fts5Wri
17350 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c 20 70  teBtreeGrow(p, p
17360 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Writer);.      }
17370 0a 20 20 20 20 20 20 69 66 28 20 70 57 72 69 74  .      if( pWrit
17380 65 72 2d 3e 6e 57 72 69 74 65 72 3e 31 20 29 7b  er->nWriter>1 ){
17390 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69  .        fts5Wri
173a0 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c  teBtreeNEmpty(p,
173b0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
173c0 20 7d 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67   }.      *pnHeig
173d0 68 74 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 57  ht = pWriter->nW
173e0 72 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 66 6f  riter;..      fo
173f0 72 28 69 3d 31 3b 20 69 3c 70 57 72 69 74 65 72  r(i=1; i<pWriter
17400 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b  ->nWriter; i++){
17410 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 61 67  .        Fts5Pag
17420 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26  eWriter *pPg = &
17430 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
17440 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73  [i];.        fts
17450 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
17460 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
17470 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
17480 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
17490 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
174a0 20 70 50 67 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20   pPg->pgno), .  
174b0 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 62            pPg->b
174c0 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e  uf.p, pPg->buf.n
174d0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
174e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
174f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74  for(i=0; i<pWrit
17500 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b  er->nWriter; i++
17510 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57  ){.    Fts5PageW
17520 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57  riter *pPg = &pW
17530 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69  riter->aWriter[i
17540 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
17550 50 67 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c  Pg || p->rc!=SQL
17560 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66  ITE_OK );.    if
17570 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 66  ( pPg ){.      f
17580 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
17590 50 67 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 20  Pg->term);.     
175a0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
175b0 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20 20 20 20  &pPg->buf);.    
175c0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
175d0 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 57  free(pWriter->aW
175e0 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  riter);.  sqlite
175f0 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
17600 26 70 57 72 69 74 65 72 2d 3e 63 64 6c 69 64 78  &pWriter->cdlidx
17610 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
17620 64 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28  d fts5WriteInit(
17630 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
17640 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
17650 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
17660 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65  nt iIdx, int iSe
17670 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28  gid.){.  memset(
17680 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  pWriter, 0, size
17690 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
176a0 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  ));.  pWriter->i
176b0 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57  Idx = iIdx;.  pW
176c0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  riter->iSegid = 
176d0 69 53 65 67 69 64 3b 0a 0a 20 20 70 57 72 69 74  iSegid;..  pWrit
176e0 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 28 46  er->aWriter = (F
176f0 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29 66  ts5PageWriter*)f
17700 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 73  ts5IdxMalloc(p,s
17710 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72  izeof(Fts5PageWr
17720 69 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70 57  iter));.  if( pW
17730 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 3d 3d  riter->aWriter==
17740 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 57  0 ) return;.  pW
17750 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d  riter->nWriter =
17760 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61   1;.  pWriter->a
17770 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d  Writer[0].pgno =
17780 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
17790 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
177a0 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  = 1;.}..static v
177b0 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69  oid fts5WriteIni
177c0 74 46 6f 72 41 70 70 65 6e 64 28 0a 20 20 46 74  tForAppend(.  Ft
177d0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
177e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
177f0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
17800 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
17810 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
17820 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
17830 74 65 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ter to initializ
17840 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  e */.  int iIdx,
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17860 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
17870 73 65 67 6d 65 6e 74 20 69 73 20 61 20 70 61 72  segment is a par
17880 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53 74  t of */.  Fts5St
17890 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
178a0 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67  pSeg      /* Seg
178b0 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f 20 61  ment object to a
178c0 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20  ppend to */.){. 
178d0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70 53 65   int nByte = pSe
178e0 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73 69 7a  g->nHeight * siz
178f0 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74  eof(Fts5PageWrit
17900 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 57  er);.  memset(pW
17910 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  riter, 0, sizeof
17920 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29  (Fts5SegWriter))
17930 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64  ;.  pWriter->iId
17940 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57 72 69  x = iIdx;.  pWri
17950 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 70 53  ter->iSegid = pS
17960 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 70 57  eg->iSegid;.  pW
17970 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d  riter->aWriter =
17980 20 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72   (Fts5PageWriter
17990 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
179a0 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 57 72  p, nByte);.  pWr
179b0 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20  iter->nWriter = 
179c0 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3b 0a 0a  pSeg->nHeight;..
179d0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
179e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
179f0 74 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20  t pgno = 1;.    
17a00 69 6e 74 20 69 3b 0a 20 20 20 20 70 57 72 69 74  int i;.    pWrit
17a10 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70  er->aWriter[0].p
17a20 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
17a30 4c 61 73 74 2b 31 3b 0a 20 20 20 20 66 6f 72 28  Last+1;.    for(
17a40 69 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d  i=pSeg->nHeight-
17a50 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
17a60 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
17a70 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
17a80 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64  WID(pWriter->iId
17a90 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  x, pWriter->iSeg
17aa0 69 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a 20 20  id, i, pgno);.  
17ab0 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
17ac0 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74  er *pPg = &pWrit
17ad0 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a  er->aWriter[i];.
17ae0 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20        pPg->pgno 
17af0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74  = pgno;.      ft
17b00 73 35 44 61 74 61 42 75 66 66 65 72 28 70 2c 20  s5DataBuffer(p, 
17b10 26 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f 77 69  &pPg->buf, iRowi
17b20 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  d);.      if( p-
17b30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
17b40 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 4e 6f  {.        Fts5No
17b50 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20 20  deIter ss;.     
17b60 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49     fts5NodeIterI
17b70 6e 69 74 28 70 50 67 2d 3e 62 75 66 2e 70 2c 20  nit(pPg->buf.p, 
17b80 70 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73 73 29  pPg->buf.n, &ss)
17b90 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
17ba0 20 73 73 2e 61 44 61 74 61 20 29 20 66 74 73 35   ss.aData ) fts5
17bb0 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
17bc0 3e 72 63 2c 20 26 73 73 29 3b 0a 20 20 20 20 20  >rc, &ss);.     
17bd0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
17be0 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 74  (&p->rc, &pPg->t
17bf0 65 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c 20  erm, ss.term.n, 
17c00 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20  ss.term.p);.    
17c10 20 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e 69 43      pgno = ss.iC
17c20 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20 66 74  hild;.        ft
17c30 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26  s5NodeIterFree(&
17c40 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ss);.      }.   
17c50 20 7d 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d   }.    if( pSeg-
17c60 3e 6e 48 65 69 67 68 74 3d 3d 31 20 29 7b 0a 20  >nHeight==1 ){. 
17c70 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 45       pWriter->nE
17c80 6d 70 74 79 20 3d 20 70 53 65 67 2d 3e 70 67 6e  mpty = pSeg->pgn
17c90 6f 4c 61 73 74 2d 31 3b 0a 20 20 20 20 7d 0a 20  oLast-1;.    }. 
17ca0 20 20 20 61 73 73 65 72 74 28 20 28 70 67 6e 6f     assert( (pgno
17cb0 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79  +pWriter->nEmpty
17cc0 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  )==pSeg->pgnoLas
17cd0 74 20 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72  t );.    pWriter
17ce0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
17cf0 67 65 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65  ge = 1;.    asse
17d00 72 74 28 20 70 57 72 69 74 65 72 2d 3e 61 57 72  rt( pWriter->aWr
17d10 69 74 65 72 5b 30 5d 2e 74 65 72 6d 2e 6e 3d 3d  iter[0].term.n==
17d20 30 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  0 );.  }.}../*.*
17d30 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
17d40 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65   was used to ite
17d50 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
17d60 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
17d70 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72  of on an.** incr
17d80 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70  emental merge op
17d90 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  eration. This fu
17da0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17db0 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   if the incremen
17dc0 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65  tal.** merge ste
17dd0 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62  p has finished b
17de0 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  ut the input has
17df0 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65   not been comple
17e00 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a  tely exhausted..
17e10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
17e20 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
17e30 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
17e40 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
17e50 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
17e60 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
17e70 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66  f;.  memset(&buf
17e80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
17e90 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72 28  Buffer));.  for(
17ea0 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53  i=0; i<pIter->nS
17eb0 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  eg; i++){.    Ft
17ec0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
17ed0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
17ee0 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ];.    if( pSeg-
17ef0 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20  >pSeg==0 ){.    
17f00 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
17f10 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65 67    }else if( pSeg
17f20 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
17f30 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
17f40 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20  pgnoLast = 0;.  
17f50 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
17f60 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20  pgnoFirst = 0;. 
17f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17f80 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d  int iOff = pSeg-
17f90 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
17fa0 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ;     /* Offset 
17fb0 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65 61  on new first lea
17fc0 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  f page */.      
17fd0 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a  i64 iLeafRowid;.
17fe0 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
17ff0 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74  pData;.      int
18000 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65   iId = pSeg->pSe
18010 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20  g->iSegid;.     
18020 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30   u8 aHdr[4] = {0
18030 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
18040 20 30 78 30 34 7d 3b 0a 0a 20 20 20 20 20 20 69   0x04};..      i
18050 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53 35  LeafRowid = FTS5
18060 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
18070 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20  Seg->iIdx, iId, 
18080 30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65  0, pSeg->iTermLe
18090 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  afPgno);.      p
180a0 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
180b0 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ead(p, iLeafRowi
180c0 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  d);.      if( pD
180d0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ata ){.        f
180e0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62  ts5BufferZero(&b
180f0 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  uf);.        fts
18100 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
18110 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
18120 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61 48  sizeof(aHdr), aH
18130 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  dr);.        fts
18140 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
18150 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
18160 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b  , pSeg->term.n);
18170 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
18180 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
18190 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67  ->rc, &buf, pSeg
181a0 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e  ->term.n, pSeg->
181b0 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20  term.p);.       
181c0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
181d0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
181e0 75 66 2c 20 70 44 61 74 61 2d 3e 6e 20 2d 20 69  uf, pData->n - i
181f0 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69  Off, &pData->p[i
18200 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 66  Off]);.        f
18210 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
18220 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70  Data);.        p
18230 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46  Seg->pSeg->pgnoF
18240 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65  irst = pSeg->iTe
18250 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20  rmLeafPgno;.    
18260 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c 65      fts5DataDele
18270 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  te(p, FTS5_SEGME
18280 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
18290 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 31 29 2c  Idx, iId, 0, 1),
182a0 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
182b0 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
182c0 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64  te(p, iLeafRowid
182d0 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b  , buf.p, buf.n);
182e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
182f0 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
18300 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a  ree(&buf);.}../*
18310 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
18320 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67  id fts5IndexMerg
18330 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49 6e  eLevel(.  Fts5In
18340 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
18350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
18360 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
18370 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20   */.  int iIdx, 
18380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18390 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
183a0 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46  o work on */.  F
183b0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
183c0 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
183d0 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75  * IN/OUT: Stuctu
183e0 72 65 20 6f 66 20 69 6e 64 65 78 20 69 49 64 78  re of index iIdx
183f0 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20   */.  int iLvl, 
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18410 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74        /* Level t
18420 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f  o read input fro
18430 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65  m */.  int *pnRe
18440 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
18450 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
18460 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79 20  up to this many 
18470 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a 2f  output leaves */
18480 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
18490 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
184a0 70 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  ppStruct;.  Fts5
184b0 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
184c0 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
184d0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
184e0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
184f0 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20  vel *pLvlOut;.  
18500 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
18510 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20   *pIter = 0;    
18520 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 72  /* Iterator to r
18530 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20 2a  ead input data *
18540 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70  /.  int nRem = p
18550 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20  nRem ? *pnRem : 
18560 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65  0;  /* Output le
18570 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f  af pages left to
18580 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20   write */.  int 
18590 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20  nInput;         
185a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
185b0 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73  umber of input s
185c0 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73  egments */.  Fts
185d0 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
185e0 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
185f0 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
18600 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
18610 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
18620 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65 67     /* Output seg
18630 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42 75  ment */.  Fts5Bu
18640 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74  ffer term;.  int
18650 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74   bRequireDoclist
18660 54 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Term = 0;    /* 
18670 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74  Doclist terminat
18680 6f 72 20 28 30 78 30 30 29 20 72 65 71 75 69 72  or (0x00) requir
18690 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6c 64  ed */.  int bOld
186a0 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
186b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
186c0 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  if the output se
186d0 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64  gment is the old
186e0 65 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  est */..  assert
186f0 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ( iLvl<pStruct->
18700 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65  nLevel );.  asse
18710 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
18720 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
18730 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65  .  memset(&write
18740 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
18750 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
18760 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c  memset(&term, 0,
18770 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
18780 65 72 29 29 3b 0a 20 20 77 72 69 74 65 72 2e 69  er));.  writer.i
18790 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 69 66  Idx = iIdx;.  if
187a0 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  ( pLvl->nMerge )
187b0 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20  {.    pLvlOut = 
187c0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
187d0 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73  [iLvl+1];.    as
187e0 73 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e  sert( pLvlOut->n
187f0 53 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e  Seg>0 );.    nIn
18800 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72  put = pLvl->nMer
18810 67 65 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  ge;.    fts5Writ
18820 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28 70  eInitForAppend(p
18830 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c  , &writer, iIdx,
18840 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b   &pLvlOut->aSeg[
18850 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d  pLvlOut->nSeg-1]
18860 29 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  );.    pSeg = &p
18870 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76  LvlOut->aSeg[pLv
18880 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20  lOut->nSeg-1];. 
18890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
188a0 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
188b0 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
188c0 74 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  truct);..    /* 
188d0 45 78 74 65 6e 64 20 74 68 65 20 46 74 73 35 53  Extend the Fts5S
188e0 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
188f0 61 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  as required to e
18900 6e 73 75 72 65 20 74 68 65 20 6f 75 74 70 75 74  nsure the output
18910 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20  .    ** segment 
18920 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69  exists. */.    i
18930 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74  f( iLvl==pStruct
18940 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20  ->nLevel-1 ){.  
18950 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
18960 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  eAddLevel(&p->rc
18970 2c 20 70 70 53 74 72 75 63 74 29 3b 0a 20 20 20  , ppStruct);.   
18980 20 20 20 70 53 74 72 75 63 74 20 3d 20 2a 70 70     pStruct = *pp
18990 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20  Struct;.    }.  
189a0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45    fts5StructureE
189b0 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72  xtendLevel(&p->r
189c0 63 2c 20 70 53 74 72 75 63 74 2c 20 69 4c 76 6c  c, pStruct, iLvl
189d0 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69  +1, 1, 0);.    i
189e0 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
189f0 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  n;.    pLvl = &p
18a00 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
18a10 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75  Lvl];.    pLvlOu
18a20 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
18a30 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20  evel[iLvl+1];.. 
18a40 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74     fts5WriteInit
18a50 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64  (p, &writer, iId
18a60 78 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  x, iSegid);..   
18a70 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
18a80 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f  segment to the o
18a90 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  utput level */. 
18aa0 20 20 20 69 66 28 20 69 4c 76 6c 2b 31 3d 3d 70     if( iLvl+1==p
18ab0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29  Struct->nLevel )
18ac0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
18ad0 2b 2b 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26  ++;.    pSeg = &
18ae0 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
18af0 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20  vlOut->nSeg];.  
18b00 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b    pLvlOut->nSeg+
18b10 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  +;.    pSeg->pgn
18b20 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
18b30 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
18b40 53 65 67 69 64 3b 0a 0a 20 20 20 20 2f 2a 20 52  Segid;..    /* R
18b50 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61  ead input from a
18b60 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74  ll segments in t
18b70 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a  he input level *
18b80 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70  /.    nInput = p
18b90 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20  Lvl->nSeg;.  }. 
18ba0 20 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c   bOldest = (pLvl
18bb0 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20  Out->nSeg==1 && 
18bc0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d  pStruct->nLevel=
18bd0 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 23 69 66 20 30  =iLvl+2);..#if 0
18be0 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  .fprintf(stdout,
18bf0 20 22 6d 65 72 67 69 6e 67 20 25 64 20 73 65 67   "merging %d seg
18c00 6d 65 6e 74 73 20 66 72 6f 6d 20 6c 65 76 65 6c  ments from level
18c10 20 25 64 21 22 2c 20 6e 49 6e 70 75 74 2c 20 69   %d!", nInput, i
18c20 4c 76 6c 29 3b 0a 66 66 6c 75 73 68 28 73 74 64  Lvl);.fflush(std
18c30 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  out);.#endif..  
18c40 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30 20  assert( iLvl>=0 
18c50 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c  );.  for(fts5Mul
18c60 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
18c70 72 75 63 74 2c 20 69 49 64 78 2c 20 30 2c 20 30  ruct, iIdx, 0, 0
18c80 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49  , 0, 0, iLvl, nI
18c90 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20  nput, &pIter);. 
18ca0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
18cb0 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
18cc0 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
18cd0 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
18ce0 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
18cf0 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
18d00 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
18d10 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
18d20 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20 20 20 46  irst[1] ];.    F
18d30 74 73 35 43 68 75 6e 6b 49 74 65 72 20 73 50 6f  ts5ChunkIter sPo
18d40 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
18d50 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
18d60 74 68 72 6f 75 67 68 20 70 6f 73 69 74 69 6f 6e  through position
18d70 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a   list */..    /*
18d80 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
18d90 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 73  being written is
18da0 20 74 68 65 20 6f 6c 64 65 73 74 20 69 6e 20 74   the oldest in t
18db0 68 65 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20  he entire index 
18dc0 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  and.    ** the p
18dd0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73 20  osition list is 
18de0 65 6d 70 74 79 20 28 69 2e 65 2e 20 74 68 65 20  empty (i.e. the 
18df0 65 6e 74 72 79 20 69 73 20 61 20 64 65 6c 65 74  entry is a delet
18e00 65 20 6d 61 72 6b 65 72 29 2c 20 6e 6f 0a 20 20  e marker), no.  
18e10 20 20 2a 2a 20 65 6e 74 72 79 20 6e 65 65 64 20    ** entry need 
18e20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
18e30 65 20 6f 75 74 70 75 74 2e 20 20 2a 2f 0a 20 20  e output.  */.  
18e40 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49    fts5ChunkIterI
18e50 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26 73 50  nit(p, pSeg, &sP
18e60 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 62 4f 6c  os);.    if( bOl
18e70 64 65 73 74 3d 3d 30 20 7c 7c 20 73 50 6f 73 2e  dest==0 || sPos.
18e80 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRem>0 ){.      
18e90 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  int nTerm;.     
18ea0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
18eb0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
18ec0 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65  Term(pIter, &nTe
18ed0 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rm);.      if( n
18ee0 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20  Term!=term.n || 
18ef0 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65  memcmp(pTerm, te
18f00 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a  rm.p, nTerm) ){.
18f10 20 20 20 20 20 20 20 20 69 66 28 20 70 6e 52 65          if( pnRe
18f20 6d 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61  m && writer.nLea
18f30 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b  fWritten>nRem ){
18f40 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 43  .          fts5C
18f50 68 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28  hunkIterRelease(
18f60 26 73 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  &sPos);.        
18f70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18f80 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   }..        /* T
18f90 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72  his is a new ter
18fa0 6d 2e 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d  m. Append a term
18fb0 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73   to the output s
18fc0 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  egment. */.     
18fd0 20 20 20 69 66 28 20 62 52 65 71 75 69 72 65 44     if( bRequireD
18fe0 6f 63 6c 69 73 74 54 65 72 6d 20 29 7b 0a 20 20  oclistTerm ){.  
18ff0 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
19000 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65 28  eAppendZerobyte(
19010 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
19020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
19030 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65  ts5WriteAppendTe
19040 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e  rm(p, &writer, n
19050 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
19060 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
19070 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72  Set(&p->rc, &ter
19080 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
19090 3b 0a 20 20 20 20 20 20 20 20 62 52 65 71 75 69  ;.        bRequi
190a0 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20  reDoclistTerm = 
190b0 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
190c0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
190d0 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74  rowid to the out
190e0 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 66 74 73  put */.      fts
190f0 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69  5WriteAppendRowi
19100 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74  d(p, &writer, ft
19110 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
19120 28 70 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 20  (pIter));..     
19130 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 6f 73   /* Copy the pos
19140 69 74 69 6f 6e 20 6c 69 73 74 20 66 72 6f 6d 20  ition list from 
19150 69 6e 70 75 74 20 74 6f 20 6f 75 74 70 75 74 20  input to output 
19160 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  */.      fts5Wri
19170 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49  teAppendPoslistI
19180 6e 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 73  nt(p, &writer, s
19190 50 6f 73 2e 6e 52 65 6d 29 3b 0a 20 20 20 20 20  Pos.nRem);.     
191a0 20 66 6f 72 28 2f 2a 20 6e 6f 6f 70 20 2a 2f 3b   for(/* noop */;
191b0 20 21 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45   !fts5ChunkIterE
191c0 6f 66 28 70 2c 20 26 73 50 6f 73 29 3b 20 66 74  of(p, &sPos); ft
191d0 73 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28  s5ChunkIterNext(
191e0 70 2c 20 26 73 50 6f 73 29 29 7b 0a 20 20 20 20  p, &sPos)){.    
191f0 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
19200 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70  endPoslistData(p
19210 2c 20 26 77 72 69 74 65 72 2c 20 73 50 6f 73 2e  , &writer, sPos.
19220 70 2c 20 73 50 6f 73 2e 6e 29 3b 0a 20 20 20 20  p, sPos.n);.    
19230 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
19240 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c 65  ts5ChunkIterRele
19250 61 73 65 28 26 73 50 6f 73 29 3b 0a 20 20 7d 0a  ase(&sPos);.  }.
19260 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20  .  /* Flush the 
19270 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 74  last leaf page t
19280 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20  o disk. Set the 
19290 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62  output segment b
192a0 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a  -tree height.  *
192b0 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20  * and last leaf 
192c0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74  page number at t
192d0 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a  he same time.  *
192e0 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69 6e  /.  fts5WriteFin
192f0 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20  ish(p, &writer, 
19300 26 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20  &pSeg->nHeight, 
19310 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29  &pSeg->pgnoLast)
19320 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c  ;..  if( fts5Mul
19330 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
19340 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  er) ){.    int i
19350 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  ;..    /* Remove
19360 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73   the redundant s
19370 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
19380 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
19390 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
193a0 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20  nInput; i++){.  
193b0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f      fts5DataRemo
193c0 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 49 64  veSegment(p, iId
193d0 78 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d  x, pLvl->aSeg[i]
193e0 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a  .iSegid);.    }.
193f0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
19400 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67  he redundant seg
19410 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ments from the i
19420 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  nput level */.  
19430 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
19440 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20  !=nInput ){.    
19450 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70    int nMove = (p
19460 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70  Lvl->nSeg - nInp
19470 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  ut) * sizeof(Fts
19480 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
19490 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76  t);.      memmov
194a0 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70  e(pLvl->aSeg, &p
194b0 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74  Lvl->aSeg[nInput
194c0 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d  ], nMove);.    }
194d0 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20  .    pLvl->nSeg 
194e0 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70  -= nInput;.    p
194f0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b  Lvl->nMerge = 0;
19500 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
19510 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20  gnoLast==0 ){.  
19520 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65      pLvlOut->nSe
19530 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  g--;.    }.  }el
19540 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
19550 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3e 30 20  pSeg->nHeight>0 
19560 26 26 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  && pSeg->pgnoLas
19570 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54  t>0 );.    fts5T
19580 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70  rimSegments(p, p
19590 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  Iter);.    pLvl-
195a0 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74  >nMerge = nInput
195b0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c  ;.  }..  fts5Mul
195c0 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 49  tiIterFree(p, pI
195d0 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66  ter);.  fts5Buff
195e0 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
195f0 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e   if( pnRem ) *pn
19600 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c  Rem -= writer.nL
19610 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f  eafWritten;.}../
19620 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
19630 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73  nLeaf leaf pages
19640 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73   of data has jus
19650 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74  t been flushed t
19660 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73  o a level-0.** s
19670 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78  egments in index
19680 20 69 49 64 78 20 77 69 74 68 20 73 74 72 75 63   iIdx with struc
19690 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
196a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61  is function upda
196b0 74 65 73 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  tes the.** write
196c0 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69  -counter accordi
196d0 6e 67 6c 79 20 61 6e 64 2c 20 69 66 20 6e 65 63  ngly and, if nec
196e0 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d 73  essary, performs
196f0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72   incremental mer
19700 67 65 0a 2a 2a 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a  ge.** work..**.*
19710 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
19720 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
19730 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
19740 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
19750 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
19760 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
19770 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
19780 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
19790 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 57   void fts5IndexW
197a0 6f 72 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ork(.  Fts5Index
197b0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
197c0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
197d0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
197e0 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
19810 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35  ork on */.  Fts5
19820 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
19830 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
19840 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
19850 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
19860 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  x */.  int nLeaf
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19890 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65   of output leave
198a0 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  s just written *
198b0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
198c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
198d0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
198e0 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
198f0 74 72 75 63 74 3b 0a 20 20 20 20 69 36 34 20 6e  truct;.    i64 n
19900 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
19910 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
19920 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69  ial value of wri
19930 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  te-counter */.  
19940 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20    int nWork;    
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72  /* Number of wor
19970 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66  k-quanta to perf
19980 6f 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  orm */.    int n
19990 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rem;            
199a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
199b0 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73  er of leaf pages
199c0 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a   left to write *
199d0 2f 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  /..    /* Update
199e0 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74   the write-count
199f0 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20  er. While doing 
19a00 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a  so, set nWork. *
19a10 2f 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70  /.    nWrite = p
19a20 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
19a30 75 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b  unter;.    nWork
19a40 20 3d 20 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c   = ((nWrite + nL
19a50 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55  eaf) / p->nWorkU
19a60 6e 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f  nit) - (nWrite /
19a70 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 3b 0a   p->nWorkUnit);.
19a80 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72      pStruct->nWr
19a90 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c  iteCounter += nL
19aa0 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20  eaf;.    nRem = 
19ab0 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e  p->nWorkUnit * n
19ac0 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e  Work * pStruct->
19ad0 6e 4c 65 76 65 6c 3b 0a 0a 20 20 20 20 77 68 69  nLevel;..    whi
19ae0 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20  le( nRem>0 ){.  
19af0 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68  /* To iterate th
19b20 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
19b30 20 20 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c        int iBestL
19b40 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  vl = 0;         
19b50 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72    /* Level offer
19b60 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70  ing the most inp
19b70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
19b80 20 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d       int nBest =
19b90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19ba0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
19bb0 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20  put segments on 
19bc0 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20  best level */.. 
19bd0 20 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73       /* Set iBes
19be0 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65  tLvl to the leve
19bf0 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  l to read input 
19c00 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a  segments from. *
19c10 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
19c20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e  pStruct->nLevel>
19c30 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
19c40 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
19c50 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
19c60 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74  l++){.        Ft
19c70 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
19c80 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
19c90 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
19ca0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
19cb0 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20  l->nMerge ){.   
19cc0 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
19cd0 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b  >nMerge>nBest ){
19ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 42 65  .            iBe
19cf0 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20  stLvl = iLvl;.  
19d00 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74 20            nBest 
19d10 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a  = pLvl->nMerge;.
19d20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19d30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
19d50 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42  f( pLvl->nSeg>nB
19d60 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
19d70 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e   nBest = pLvl->n
19d80 53 65 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Seg;.          i
19d90 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a  BestLvl = iLvl;.
19da0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19db0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  }..      /* If n
19dc0 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c  Best is still 0,
19dd0 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20   then the index 
19de0 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a  must be empty. *
19df0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19e00 44 45 42 55 47 0a 20 20 20 20 20 20 66 6f 72 28  DEBUG.      for(
19e10 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30  iLvl=0; nBest==0
19e20 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74   && iLvl<pStruct
19e30 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
19e40 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
19e50 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  t( pStruct->aLev
19e60 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30  el[iLvl].nSeg==0
19e70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
19e80 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 42  if..      if( nB
19e90 65 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  est<p->pConfig->
19ea0 6e 41 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20  nAutomerge .    
19eb0 20 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61     && pStruct->a
19ec0 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e  Level[iBestLvl].
19ed0 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20 20 20  nMerge==0 .     
19ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
19ef0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
19f00 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
19f10 65 76 65 6c 28 70 2c 20 69 49 64 78 2c 20 26 70  evel(p, iIdx, &p
19f20 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c 76 6c  Struct, iBestLvl
19f30 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 20 20  , &nRem);.      
19f40 61 73 73 65 72 74 28 20 6e 52 65 6d 3d 3d 30 20  assert( nRem==0 
19f50 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
19f60 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _OK );.      if(
19f70 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19f80 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  K && pStruct->aL
19f90 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e  evel[iBestLvl].n
19fa0 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Merge==0 ){.    
19fb0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
19fc0 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73  ePromote(p, iBes
19fd0 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29  tLvl+1, pStruct)
19fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19ff0 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
1a000 75 63 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a  uct;.    }..  }.
1a010 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1a020 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 4d 65  ts5IndexCrisisMe
1a030 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
1a040 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1a050 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1a060 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1a070 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
1a0a0 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35  ork on */.  Fts5
1a0b0 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
1a0c0 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49  ruct        /* I
1a0d0 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
1a0e0 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
1a0f0 78 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74  x */.){.  Fts5St
1a100 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
1a110 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
1a120 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 20 20  int iLvl = 0;.  
1a130 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1a140 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 20 26  LITE_OK .      &
1a150 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  & iLvl<pStruct->
1a160 6e 4c 65 76 65 6c 0a 20 20 20 20 20 20 26 26 20  nLevel.      && 
1a170 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1a180 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 70 2d 3e 70  iLvl].nSeg>=p->p
1a190 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73 4d  Config->nCrisisM
1a1a0 65 72 67 65 20 0a 20 20 29 7b 0a 20 20 20 20 66  erge .  ){.    f
1a1b0 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
1a1c0 65 6c 28 70 2c 20 69 49 64 78 2c 20 26 70 53 74  el(p, iIdx, &pSt
1a1d0 72 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a  ruct, iLvl, 0);.
1a1e0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1a1f0 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c  ePromote(p, iLvl
1a200 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  +1, pStruct);.  
1a210 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20    iLvl++;.  }.  
1a220 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
1a230 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  uct;.}..static i
1a240 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  nt fts5IndexRetu
1a250 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  rn(Fts5Index *p)
1a260 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
1a270 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  rc;.  p->rc = SQ
1a280 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72  LITE_OK;.  retur
1a290 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66  n rc;.}..typedef
1a2a0 20 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73   struct Fts5Flus
1a2b0 68 43 74 78 20 46 74 73 35 46 6c 75 73 68 43 74  hCtx Fts5FlushCt
1a2c0 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c  x;.struct Fts5Fl
1a2d0 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49  ushCtx {.  Fts5I
1a2e0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74  ndex *pIdx;.  Ft
1a2f0 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
1a300 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  er; .};../*.** B
1a310 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e  uffer aBuf[] con
1a320 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20  tains a list of 
1a330 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61  varints, all sma
1a340 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74  ll enough to fit
1a350 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20  .** in a 32-bit 
1a360 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20  integer. Return 
1a370 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1a380 6c 61 72 67 65 73 74 20 70 72 65 66 69 78 20 6f  largest prefix o
1a390 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20  f this .** list 
1a3a0 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65  nMax bytes or le
1a3b0 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  ss in size..*/.s
1a3c0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f  tatic int fts5Po
1a3d0 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73  slistPrefix(cons
1a3e0 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20  t u8 *aBuf, int 
1a3f0 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74  nMax){.  int ret
1a400 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 31   = 0;.  while( 1
1a410 20 29 7b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   ){.    u32 dumm
1a420 79 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 66  y;.    int i = f
1a430 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
1a440 61 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79  aBuf[ret], dummy
1a450 29 3b 0a 20 20 20 20 69 66 28 20 28 72 65 74 20  );.    if( (ret 
1a460 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72  + i) > nMax ) br
1a470 65 61 6b 3b 0a 20 20 20 20 72 65 74 20 2b 3d 20  eak;.    ret += 
1a480 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
1a490 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  ret;.}../*.** Fl
1a4a0 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ush the contents
1a4b0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61   of in-memory ha
1a4c0 73 68 20 74 61 62 6c 65 20 69 48 61 73 68 20 74  sh table iHash t
1a4d0 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20  o a new level-0 
1a4e0 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64  .** segment on d
1a4f0 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74 65  isk. Also update
1a500 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
1a510 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65 63  ng structure rec
1a520 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ord..**.** If an
1a530 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
1a540 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  et the Fts5Index
1a550 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .rc error code. 
1a560 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
1a570 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
1a580 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
1a590 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
1a5a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1a5b0 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28  ts5FlushOneHash(
1a5c0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
1a5d0 74 20 69 48 61 73 68 2c 20 69 6e 74 20 2a 70 6e  t iHash, int *pn
1a5e0 4c 65 61 66 29 7b 0a 20 20 46 74 73 35 48 61 73  Leaf){.  Fts5Has
1a5f0 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 61 70  h *pHash = p->ap
1a600 48 61 73 68 5b 69 48 61 73 68 5d 3b 0a 20 20 46  Hash[iHash];.  F
1a610 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1a620 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65  truct;.  int iSe
1a630 67 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c  gid;.  int pgnoL
1a640 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ast = 0;        
1a650 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
1a660 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
1a670 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  r in segment */.
1a680 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72  .  /* Obtain a r
1a690 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
1a6a0 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
1a6b0 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  and allocate a n
1a6c0 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20  ew segment-id.  
1a6d0 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c  ** for the new l
1a6e0 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20  evel-0 segment. 
1a6f0 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20   */.  pStruct = 
1a700 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
1a710 64 28 70 2c 20 69 48 61 73 68 29 3b 0a 20 20 69  d(p, iHash);.  i
1a720 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f  Segid = fts5Allo
1a730 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74  cateSegid(p, pSt
1a740 72 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53  ruct);..  if( iS
1a750 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73  egid ){.    cons
1a760 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e  t int pgsz = p->
1a770 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 0a  pConfig->pgsz;..
1a780 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1a790 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
1a7a0 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74    /* New segment
1a7b0 20 77 69 74 68 69 6e 20 70 53 74 72 75 63 74 20   within pStruct 
1a7c0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 48 65 69 67  */.    int nHeig
1a7d0 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ht;             
1a7e0 20 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f       /* Height o
1a7f0 66 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 62 2d  f new segment b-
1a800 74 72 65 65 20 2a 2f 0a 20 20 20 20 46 74 73 35  tree */.    Fts5
1a810 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
1a820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
1a830 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
1a840 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61  assemble leaf pa
1a850 67 65 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35 53  ge */..    Fts5S
1a860 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  egWriter writer;
1a870 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e  .    fts5WriteIn
1a880 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69  it(p, &writer, i
1a890 48 61 73 68 2c 20 69 53 65 67 69 64 29 3b 0a 0a  Hash, iSegid);..
1a8a0 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63      /* Pre-alloc
1a8b0 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20 75  ate the buffer u
1a8c0 73 65 64 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  sed to assemble 
1a8d0 6c 65 61 66 20 70 61 67 65 73 20 74 6f 20 74 68  leaf pages to th
1a8e0 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20  e target.    ** 
1a8f0 70 61 67 65 20 73 69 7a 65 2e 20 20 2a 2f 0a 20  page size.  */. 
1a900 20 20 20 61 73 73 65 72 74 28 20 70 67 73 7a 3e     assert( pgsz>
1a910 30 20 29 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  0 );.    pBuf = 
1a920 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b  &writer.aWriter[
1a930 30 5d 2e 62 75 66 3b 0a 20 20 20 20 66 74 73 35  0].buf;.    fts5
1a940 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
1a950 63 2c 20 70 42 75 66 2c 20 70 67 73 7a 20 2b 20  c, pBuf, pgsz + 
1a960 32 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  20);..    /* Beg
1a970 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  in scanning thro
1a980 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20 65  ugh hash table e
1a990 6e 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 69  ntries. */.    i
1a9a0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a9b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
1a9c0 73 65 74 28 70 42 75 66 2d 3e 70 2c 20 30 2c 20  set(pBuf->p, 0, 
1a9d0 34 29 3b 0a 20 20 20 20 20 20 70 42 75 66 2d 3e  4);.      pBuf->
1a9e0 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 73 71 6c  n = 4;.      sql
1a9f0 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
1aa00 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20 30  Init(pHash, 0, 0
1aa10 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68  );.    }..    wh
1aa20 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46  ile( 0==sqlite3F
1aa30 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70  ts5HashScanEof(p
1aa40 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63  Hash) ){.      c
1aa50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
1aa60 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  ;.      int nTer
1aa70 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  m;.      const u
1aa80 38 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20  8 *pDoclist;.   
1aa90 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b     int nDoclist;
1aaa0 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
1aab0 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79  ts5HashScanEntry
1aac0 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 28  (pHash, &zTerm,(
1aad0 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 70 44  const char**)&pD
1aae0 6f 63 6c 69 73 74 2c 26 6e 44 6f 63 6c 69 73 74  oclist,&nDoclist
1aaf0 29 3b 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 3d  );.      nTerm =
1ab00 20 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 3b 0a   strlen(zTerm);.
1ab10 0a 20 20 20 20 20 20 2f 2a 20 44 65 63 69 64 65  .      /* Decide
1ab20 20 69 66 20 74 68 65 20 74 65 72 6d 20 66 69 74   if the term fit
1ab30 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s on the current
1ab40 20 6c 65 61 66 2e 20 49 66 20 6e 6f 74 2c 20 66   leaf. If not, f
1ab50 6c 75 73 68 20 69 74 0a 20 20 20 20 20 20 2a 2a  lush it.      **
1ab60 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20   to disk.  */.  
1ab70 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e      if( (pBuf->n
1ab80 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 20 3e 20   + nTerm + 2) > 
1ab90 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
1aba0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
1abb0 61 66 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a  af(p, &writer);.
1abc0 20 20 20 20 20 20 20 20 70 42 75 66 20 3d 20 26          pBuf = &
1abd0 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30  writer.aWriter[0
1abe0 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20 69  ].buf;.        i
1abf0 66 28 20 28 6e 54 65 72 6d 20 2b 20 33 32 29 20  f( (nTerm + 32) 
1ac00 3e 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  > pBuf->nSpace )
1ac10 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
1ac20 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
1ac30 63 2c 20 70 42 75 66 2c 20 6e 54 65 72 6d 20 2b  c, pBuf, nTerm +
1ac40 20 33 32 20 2d 20 70 42 75 66 2d 3e 6e 29 3b 0a   32 - pBuf->n);.
1ac50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ac60 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  }..      /* Writ
1ac70 65 20 74 68 65 20 74 65 72 6d 20 74 6f 20 74 68  e the term to th
1ac80 65 20 6c 65 61 66 2e 20 41 6e 64 20 70 75 73 68  e leaf. And push
1ac90 20 69 74 20 75 70 20 69 6e 74 6f 20 74 68 65 20   it up into the 
1aca0 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
1acb0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 77 72   */.      if( wr
1acc0 69 74 65 72 2e 62 46 69 72 73 74 54 65 72 6d 49  iter.bFirstTermI
1acd0 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
1ace0 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73      pBuf->n += s
1acf0 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 28  qlite3PutVarint(
1ad00 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
1ad10 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ], 0);.      }el
1ad20 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
1ad30 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b  PutU16(&pBuf->p[
1ad40 32 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 0a 20 20  2], pBuf->n);.  
1ad50 20 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69        writer.bFi
1ad60 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1ad70 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  0;.        if( w
1ad80 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d  riter.aWriter[0]
1ad90 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20  .pgno!=1 ){.    
1ada0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42        fts5WriteB
1adb0 74 72 65 65 54 65 72 6d 28 70 2c 20 26 77 72 69  treeTerm(p, &wri
1adc0 74 65 72 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e  ter, nTerm, (con
1add0 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20  st u8*)zTerm);. 
1ade0 20 20 20 20 20 20 20 20 20 70 42 75 66 20 3d 20           pBuf = 
1adf0 26 77 72 69 74 65 72 2e 61 57 72 69 74 65 72 5b  &writer.aWriter[
1ae00 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20  0].buf;.        
1ae10 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1ae20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74  pBuf->n += sqlit
1ae30 65 33 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  e3PutVarint(&pBu
1ae40 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e  f->p[pBuf->n], n
1ae50 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73  Term);.      fts
1ae60 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1ae70 62 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  b(&p->rc, pBuf, 
1ae80 6e 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38  nTerm, (const u8
1ae90 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20  *)zTerm);..     
1aea0 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66   if( pgsz>=(pBuf
1aeb0 2d 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b  ->n + nDoclist +
1aec0 20 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   1) ){.        /
1aed0 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63  * The entire doc
1aee0 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  list will fit on
1aef0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1af00 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  f. */.        ft
1af10 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1af20 6f 62 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ob(&p->rc, pBuf,
1af30 20 6e 44 6f 63 6c 69 73 74 2c 20 70 44 6f 63 6c   nDoclist, pDocl
1af40 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ist);.      }els
1af50 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  e{.        i64 i
1af60 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Rowid = 0;.     
1af70 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20     i64 iDelta = 
1af80 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
1af90 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
1afa0 20 69 6e 74 20 62 46 69 72 73 74 44 6f 63 69 64   int bFirstDocid
1afb0 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f   = 0;..        /
1afc0 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63  * The entire doc
1afd0 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69  list will not fi
1afe0 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20  t on this leaf. 
1aff0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20  The following . 
1b000 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 69         ** loop i
1b010 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
1b020 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74 68 61  the poslists tha
1b030 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 75  t make up the cu
1b040 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 2a  rrent .        *
1b050 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20  * doclist.  */. 
1b060 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f         while( iO
1b070 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ff<nDoclist ){. 
1b080 20 20 20 20 20 20 20 20 20 75 33 32 20 6e 50 6f           u32 nPo
1b090 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  s;.          int
1b0a0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   nCopy;.        
1b0b0 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
1b0c0 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  int(&pDoclist[iO
1b0d0 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
1b0e0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ta);.          n
1b0f0 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74 56 61  Copy = fts5GetVa
1b100 72 69 6e 74 33 32 28 26 70 44 6f 63 6c 69 73 74  rint32(&pDoclist
1b110 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20  [iOff], nPos);. 
1b120 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b           nCopy +
1b130 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  = nPos;.        
1b140 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c    iRowid += iDel
1b150 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20  ta;.          . 
1b160 20 20 20 20 20 20 20 20 20 69 66 28 20 62 46 69           if( bFi
1b170 72 73 74 44 6f 63 69 64 20 29 7b 0a 20 20 20 20  rstDocid ){.    
1b180 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55          fts5PutU
1b190 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20  16(&pBuf->p[0], 
1b1a0 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66  pBuf->n);   /* f
1b1b0 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20 70 61  irst docid on pa
1b1c0 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ge */.          
1b1d0 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c    pBuf->n += sql
1b1e0 69 74 65 33 50 75 74 56 61 72 69 6e 74 28 26 70  ite3PutVarint(&p
1b1f0 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c  Buf->p[pBuf->n],
1b200 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
1b210 20 20 20 20 20 20 62 46 69 72 73 74 44 6f 63 69        bFirstDoci
1b220 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
1b230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b240 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73      pBuf->n += s
1b250 71 6c 69 74 65 33 50 75 74 56 61 72 69 6e 74 28  qlite3PutVarint(
1b260 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e  &pBuf->p[pBuf->n
1b270 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  ], iDelta);.    
1b280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b290 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
1b2a0 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20  n<=pBuf->nSpace 
1b2b0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  );..          if
1b2c0 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 6e 43 6f  ( (pBuf->n + nCo
1b2d0 70 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20  py) <= pgsz ){. 
1b2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b2f0 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74  e entire poslist
1b300 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
1b310 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53   current leaf. S
1b320 6f 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20  o copy.         
1b330 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20     ** it in one 
1b340 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  go. */.         
1b350 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1b360 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1b370 70 42 75 66 2c 20 6e 43 6f 70 79 2c 20 26 70 44  pBuf, nCopy, &pD
1b380 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 29 3b 0a 20  oclist[iOff]);. 
1b390 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b3b0 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73  he entire poslis
1b3c0 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  t will not fit o
1b3d0 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53 6f 20  n this leaf. So 
1b3e0 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20 20 20  it needs.       
1b3f0 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 62 72       ** to be br
1b400 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f  oken into sectio
1b410 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75 61  ns. The only qua
1b420 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69 6e 67  lification being
1b430 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1b440 74 68 61 74 20 65 61 63 68 20 76 61 72 69 6e 74  that each varint
1b450 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65 64 20   must be stored 
1b460 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a  contiguously.  *
1b470 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  /.            co
1b480 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69 73 74  nst u8 *pPoslist
1b490 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66   = &pDoclist[iOf
1b4a0 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  f];.            
1b4b0 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20  int iPos = 0;.  
1b4c0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
1b4d0 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   1 ){.          
1b4e0 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d      int nSpace =
1b4f0 20 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 3b   pgsz - pBuf->n;
1b500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1b510 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  nt n;.          
1b520 20 20 20 20 69 66 28 20 28 6e 43 6f 70 79 20 2d      if( (nCopy -
1b530 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29   iPos)<=nSpace )
1b540 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1b550 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50    n = nCopy - iP
1b560 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
1b570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b580 20 20 20 20 20 20 20 20 20 6e 20 3d 20 66 74 73           n = fts
1b590 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 26  5PoslistPrefix(&
1b5a0 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20  pPoslist[iPos], 
1b5b0 6e 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  nSpace);.       
1b5c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b5d0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1b5e0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1b5f0 72 63 2c 20 70 42 75 66 2c 20 6e 2c 20 26 70 50  rc, pBuf, n, &pP
1b600 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 29 3b 0a 20  oslist[iPos]);. 
1b610 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f               iPo
1b620 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  s += n;.        
1b630 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d        if( iPos>=
1b640 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20  nCopy ) break;. 
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
1b660 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1b670 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
1b680 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20             pBuf 
1b690 3d 20 26 77 72 69 74 65 72 2e 61 57 72 69 74 65  = &writer.aWrite
1b6a0 72 5b 30 5d 2e 62 75 66 3b 0a 20 20 20 20 20 20  r[0].buf;.      
1b6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b6c0 20 20 20 20 62 46 69 72 73 74 44 6f 63 69 64 20      bFirstDocid 
1b6d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
1b6e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1b6f0 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 67 73 7a  t( pBuf->n<=pgsz
1b700 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   );.          iO
1b710 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  ff += nCopy;.   
1b720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
1b730 20 20 20 20 20 20 70 42 75 66 2d 3e 70 5b 70 42        pBuf->p[pB
1b740 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b  uf->n++] = '\0';
1b750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b760 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53  Buf->n<=pBuf->nS
1b770 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 73 71  pace );.      sq
1b780 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
1b790 6e 4e 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20  nNext(pHash);.  
1b7a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46    }.    sqlite3F
1b7b0 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 48 61  ts5HashClear(pHa
1b7c0 73 68 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  sh);.    fts5Wri
1b7d0 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69  teFinish(p, &wri
1b7e0 74 65 72 2c 20 26 6e 48 65 69 67 68 74 2c 20 26  ter, &nHeight, &
1b7f0 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20  pgnoLast);..    
1b800 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
1b810 73 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20  s5Structure. It 
1b820 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
1b830 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b840 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74  by the.    ** ft
1b850 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1b860 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e  se() call below.
1b870 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
1b880 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20  ruct->nLevel==0 
1b890 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
1b8a0 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
1b8b0 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29  p->rc, &pStruct)
1b8c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
1b8d0 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
1b8e0 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
1b8f0 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  ruct, 0, 1, 0);.
1b900 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1b910 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b920 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
1b930 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65  t->aLevel[0].aSe
1b940 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  g[ pStruct->aLev
1b950 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a  el[0].nSeg++ ];.
1b960 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67        pSeg->iSeg
1b970 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
1b980 20 20 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74     pSeg->nHeight
1b990 20 3d 20 6e 48 65 69 67 68 74 3b 0a 20 20 20 20   = nHeight;.    
1b9a0 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
1b9b0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65  t = 1;.      pSe
1b9c0 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67  g->pgnoLast = pg
1b9d0 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20  noLast;.    }.  
1b9e0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
1b9f0 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74  romote(p, 0, pSt
1ba00 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 0a 20 20 69  ruct);.  }...  i
1ba10 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  f( p->pConfig->n
1ba20 41 75 74 6f 6d 65 72 67 65 3e 30 20 29 20 66 74  Automerge>0 ) ft
1ba30 73 35 49 6e 64 65 78 57 6f 72 6b 28 70 2c 20 69  s5IndexWork(p, i
1ba40 48 61 73 68 2c 20 26 70 53 74 72 75 63 74 2c 20  Hash, &pStruct, 
1ba50 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73  pgnoLast);.  fts
1ba60 35 49 6e 64 65 78 43 72 69 73 69 73 4d 65 72 67  5IndexCrisisMerg
1ba70 65 28 70 2c 20 69 48 61 73 68 2c 20 26 70 53 74  e(p, iHash, &pSt
1ba80 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72  ruct);.  fts5Str
1ba90 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 69  uctureWrite(p, i
1baa0 48 61 73 68 2c 20 70 53 74 72 75 63 74 29 3b 0a  Hash, pStruct);.
1bab0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
1bac0 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
1bad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
1bae0 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20  any data stored 
1baf0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
1bb00 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20   hash tables to 
1bb10 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1bb20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1bb30 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35  5IndexFlush(Fts5
1bb40 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
1bb50 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1bb60 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
1bb70 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb90 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
1bba0 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
1bbb0 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  xes */.  int nLe
1bbc0 61 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  af = 0;         
1bbd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1bbe0 65 72 20 6f 66 20 6c 65 61 76 65 73 20 77 72 69  er of leaves wri
1bbf0 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  tten */..  /* If
1bc00 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
1bc10 72 65 61 64 79 20 6f 63 63 75 72 65 64 20 74 68  ready occured th
1bc20 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1bc30 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  op. */.  if( p->
1bc40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1bc50 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
1bc60 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1bc70 61 73 73 65 72 74 28 20 70 2d 3e 61 70 48 61 73  assert( p->apHas
1bc80 68 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c 75 73 68  h );..  /* Flush
1bc90 20 74 68 65 20 74 65 72 6d 73 20 61 6e 64 20 65   the terms and e
1bca0 61 63 68 20 70 72 65 66 69 78 20 69 6e 64 65 78  ach prefix index
1bcb0 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 66 6f   to disk */.  fo
1bcc0 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69  r(i=0; i<=pConfi
1bcd0 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29  g->nPrefix; i++)
1bce0 7b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f  {.    fts5FlushO
1bcf0 6e 65 48 61 73 68 28 70 2c 20 69 2c 20 26 6e 4c  neHash(p, i, &nL
1bd00 65 61 66 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e  eaf);.  }.  p->n
1bd10 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b  PendingData = 0;
1bd20 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
1bd30 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  Fts5IndexOptimiz
1bd40 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
1bd50 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
1bd60 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
1bd70 66 69 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  fig;.  int i;.. 
1bd80 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28   fts5IndexFlush(
1bd90 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  p);.  for(i=0; i
1bda0 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
1bdb0 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  ix; i++){.    Ft
1bdc0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1bdd0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
1bde0 74 75 72 65 52 65 61 64 28 70 2c 20 69 29 3b 0a  tureRead(p, i);.
1bdf0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1be00 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  e *pNew = 0;.   
1be10 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 0a 20   int nSeg = 0;. 
1be20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
1be30 7b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 66  {.      nSeg = f
1be40 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
1be50 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
1be60 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 53  t);.      if( nS
1be70 65 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  eg>1 ){.        
1be80 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
1be90 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
1bea0 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65  );.        nByte
1beb0 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c   += (pStruct->nL
1bec0 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66  evel+1) * sizeof
1bed0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
1bee0 76 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  vel);.        pN
1bef0 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  ew = (Fts5Struct
1bf00 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ure*)sqlite3Fts5
1bf10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72  MallocZero(&p->r
1bf20 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  c, nByte);.     
1bf30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1bf40 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 46   pNew ){.      F
1bf50 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
1bf60 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 20 20 69  l *pLvl;.      i
1bf70 6e 74 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20  nt nByte = nSeg 
1bf80 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1bf90 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
1bfa0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76        pNew->nLev
1bfb0 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c  el = pStruct->nL
1bfc0 65 76 65 6c 2b 31 3b 0a 20 20 20 20 20 20 70 4e  evel+1;.      pN
1bfd0 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ew->nWriteCounte
1bfe0 72 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72  r = pStruct->nWr
1bff0 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20  iteCounter;.    
1c000 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e    pLvl = &pNew->
1c010 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e  aLevel[pStruct->
1c020 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 70  nLevel];.      p
1c030 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73  Lvl->aSeg = (Fts
1c040 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1c050 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
1c060 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
1c070 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
1c080 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b  f( pLvl->aSeg ){
1c090 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 76  .        int iLv
1c0a0 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 20  l, iSeg;.       
1c0b0 20 69 6e 74 20 69 53 65 67 4f 75 74 20 3d 20 30   int iSegOut = 0
1c0c0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 4c  ;.        for(iL
1c0d0 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
1c0e0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1c0f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
1c100 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
1c110 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1c120 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
1c130 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
1c140 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
1c150 4f 75 74 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e  Out] = pStruct->
1c160 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
1c170 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
1c180 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b 0a       iSegOut++;.
1c190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c1a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c      }.        pL
1c1b0 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b  vl->nSeg = nSeg;
1c1c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c1d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1c1e0 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
1c1f0 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
1c200 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
1c210 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
1c220 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e 65 77   int iLvl = pNew
1c230 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20 20 20  ->nLevel-1;.    
1c240 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1c250 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65  SQLITE_OK && pNe
1c260 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  w->aLevel[iLvl].
1c270 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSeg>0 ){.      
1c280 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53    int nRem = FTS
1c290 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b  5_OPT_WORK_UNIT;
1c2a0 0a 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64  .        fts5Ind
1c2b0 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
1c2c0 69 2c 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20  i, &pNew, iLvl, 
1c2d0 26 6e 52 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  &nRem);.      }.
1c2e0 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
1c2f0 74 75 72 65 57 72 69 74 65 28 70 2c 20 69 2c 20  tureWrite(p, i, 
1c300 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 66 74 73  pNew);.      fts
1c310 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1c320 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 0a  e(pNew);.    }..
1c330 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1c340 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1c350 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1c360 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
1c370 28 70 29 3b 20 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  (p); .}..../*.**
1c380 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65   Return a simple
1c390 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
1c3a0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67  based on the arg
1c3b0 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  uments..*/.stati
1c3c0 63 20 75 36 34 20 66 74 73 35 49 6e 64 65 78 45  c u64 fts5IndexE
1c3d0 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34  ntryCksum(.  i64
1c3e0 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20   iRowid, .  int 
1c3f0 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f  iCol, .  int iPo
1c400 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
1c410 20 2a 70 54 65 72 6d 2c 20 0a 20 20 69 6e 74 20   *pTerm, .  int 
1c420 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69  nTerm.){.  int i
1c430 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52  ;.  u64 ret = iR
1c440 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28  owid;.  ret += (
1c450 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a  ret<<3) + iCol;.
1c460 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
1c470 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f 72 28  ) + iPos;.  for(
1c480 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
1c490 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  +) ret += (ret<<
1c4a0 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20  3) + pTerm[i];. 
1c4b0 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
1c4c0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1c4d0 42 74 72 65 65 49 74 65 72 49 6e 69 74 28 0a 20  BtreeIterInit(. 
1c4e0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1c4f0 20 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 46 74    int iIdx,.  Ft
1c500 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1c510 6e 74 20 2a 70 53 65 67 2c 20 0a 20 20 46 74 73  nt *pSeg, .  Fts
1c520 35 42 74 72 65 65 49 74 65 72 20 2a 70 49 74 65  5BtreeIter *pIte
1c530 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  r.){.  int nByte
1c540 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6e 42 79  ;.  int i;.  nBy
1c550 74 65 20 3d 20 73 69 7a 65 6f 66 28 70 49 74 65  te = sizeof(pIte
1c560 72 2d 3e 61 4c 76 6c 5b 30 5d 29 20 2a 20 28 70  r->aLvl[0]) * (p
1c570 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 29 3b  Seg->nHeight-1);
1c580 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
1c590 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
1c5a0 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 4c  r));.  pIter->nL
1c5b0 76 6c 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67  vl = pSeg->nHeig
1c5c0 68 74 2d 31 3b 0a 20 20 70 49 74 65 72 2d 3e 69  ht-1;.  pIter->i
1c5d0 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 49  Idx = iIdx;.  pI
1c5e0 74 65 72 2d 3e 70 20 3d 20 70 3b 0a 20 20 70 49  ter->p = p;.  pI
1c5f0 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ter->pSeg = pSeg
1c600 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 26 26  ;.  if( nByte &&
1c610 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1c620 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
1c630 61 4c 76 6c 20 3d 20 28 46 74 73 35 42 74 72 65  aLvl = (Fts5Btre
1c640 65 49 74 65 72 4c 65 76 65 6c 2a 29 66 74 73 35  eIterLevel*)fts5
1c650 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79  IdxMalloc(p, nBy
1c660 74 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  te);.  }.  for(i
1c670 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
1c680 45 5f 4f 4b 20 26 26 20 69 3c 70 49 74 65 72 2d  E_OK && i<pIter-
1c690 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
1c6a0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54   i64 iRowid = 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 70 53 65 67 2d 3e 69 53 65  (iIdx, pSeg->iSe
1c6d0 67 69 64 2c 20 69 2b 31 2c 20 31 29 3b 0a 20 20  gid, i+1, 1);.  
1c6e0 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
1c6f0 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 4c  a;.    pIter->aL
1c700 76 6c 5b 69 5d 2e 70 44 61 74 61 20 3d 20 70 44  vl[i].pData = pD
1c710 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
1c720 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ad(p, iRowid);. 
1c730 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
1c740 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74        fts5NodeIt
1c750 65 72 49 6e 69 74 28 70 44 61 74 61 2d 3e 70 2c  erInit(pData->p,
1c760 20 70 44 61 74 61 2d 3e 6e 2c 20 26 70 49 74 65   pData->n, &pIte
1c770 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 73 29 3b 0a 20  r->aLvl[i].s);. 
1c780 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c790 70 49 74 65 72 2d 3e 6e 4c 76 6c 3d 3d 30 20 7c  pIter->nLvl==0 |
1c7a0 7c 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70  | p->rc ){.    p
1c7b0 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  Iter->bEof = 1;.
1c7c0 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
1c7d0 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
1c7e0 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
1c7f0 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20  pIter->nEmpty = 
1c800 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73  pIter->aLvl[0].s
1c810 2e 6e 45 6d 70 74 79 3b 0a 20 20 20 20 70 49 74  .nEmpty;.    pIt
1c820 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74 65  er->iLeaf = pIte
1c830 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68  r->aLvl[0].s.iCh
1c840 69 6c 64 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ild;.    pIter->
1c850 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  bDlidx = pIter->
1c860 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64 78  aLvl[0].s.bDlidx
1c870 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
1c880 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74  void fts5BtreeIt
1c890 65 72 4e 65 78 74 28 46 74 73 35 42 74 72 65 65  erNext(Fts5Btree
1c8a0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1c8b0 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70  Fts5Index *p = p
1c8c0 49 74 65 72 2d 3e 70 3b 0a 20 20 69 6e 74 20 69  Iter->p;.  int i
1c8d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
1c8e0 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 26 26 20 70  er->bEof==0 && p
1c8f0 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
1c900 61 44 61 74 61 20 29 3b 0a 20 20 66 6f 72 28 69  aData );.  for(i
1c910 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76  =0; i<pIter->nLv
1c920 6c 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  l && p->rc==SQLI
1c930 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
1c940 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65   Fts5BtreeIterLe
1c950 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  vel *pLvl = &pIt
1c960 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  er->aLvl[i];.   
1c970 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
1c980 74 28 26 70 2d 3e 72 63 2c 20 26 70 4c 76 6c 2d  t(&p->rc, &pLvl-
1c990 3e 73 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76  >s);.    if( pLv
1c9a0 6c 2d 3e 73 2e 61 44 61 74 61 20 29 7b 0a 20 20  l->s.aData ){.  
1c9b0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
1c9c0 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
1c9d0 2d 3e 74 65 72 6d 2c 20 70 4c 76 6c 2d 3e 73 2e  ->term, pLvl->s.
1c9e0 74 65 72 6d 2e 6e 2c 20 70 4c 76 6c 2d 3e 73 2e  term.n, pLvl->s.
1c9f0 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 62  term.p);.      b
1ca00 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
1ca10 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49  .      fts5NodeI
1ca20 74 65 72 46 72 65 65 28 26 70 4c 76 6c 2d 3e 73  terFree(&pLvl->s
1ca30 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  );.      fts5Dat
1ca40 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70  aRelease(pLvl->p
1ca50 44 61 74 61 29 3b 0a 20 20 20 20 20 20 70 4c 76  Data);.      pLv
1ca60 6c 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  l->pData = 0;.  
1ca70 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d    }.  }.  if( i=
1ca80 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 7c 7c 20  =pIter->nLvl || 
1ca90 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70 49 74  p->rc ){.    pIt
1caa0 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  er->bEof = 1;.  
1cab0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
1cac0 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70  Segid = pIter->p
1cad0 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
1cae0 20 66 6f 72 28 69 2d 2d 3b 20 69 3e 3d 30 3b 20   for(i--; i>=0; 
1caf0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i--){.      Fts5
1cb00 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a  BtreeIterLevel *
1cb10 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
1cb20 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69 36  Lvl[i];.      i6
1cb30 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  4 iRowid = FTS5_
1cb40 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 49  SEGMENT_ROWID(pI
1cb50 74 65 72 2d 3e 69 49 64 78 2c 69 53 65 67 69 64  ter->iIdx,iSegid
1cb60 2c 69 2b 31 2c 70 4c 76 6c 5b 31 5d 2e 73 2e 69  ,i+1,pLvl[1].s.i
1cb70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 70 4c  Child);.      pL
1cb80 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
1cb90 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
1cba0 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
1cbb0 4c 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20  Lvl->pData ){.  
1cbc0 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74        fts5NodeIt
1cbd0 65 72 49 6e 69 74 28 70 4c 76 6c 2d 3e 70 44 61  erInit(pLvl->pDa
1cbe0 74 61 2d 3e 70 2c 20 70 4c 76 6c 2d 3e 70 44 61  ta->p, pLvl->pDa
1cbf0 74 61 2d 3e 6e 2c 20 26 70 4c 76 6c 2d 3e 73 29  ta->n, &pLvl->s)
1cc00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1cc10 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 6e 45    }..  pIter->nE
1cc20 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c  mpty = pIter->aL
1cc30 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a  vl[0].s.nEmpty;.
1cc40 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20    pIter->bDlidx 
1cc50 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  = pIter->aLvl[0]
1cc60 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 70 49 74  .s.bDlidx;.  pIt
1cc70 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 49 74 65  er->iLeaf = pIte
1cc80 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68  r->aLvl[0].s.iCh
1cc90 69 6c 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ild;.  assert( p
1cca0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ccb0 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 29  || pIter->bEof )
1ccc0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1ccd0 20 66 74 73 35 42 74 72 65 65 49 74 65 72 46 72   fts5BtreeIterFr
1cce0 65 65 28 46 74 73 35 42 74 72 65 65 49 74 65 72  ee(Fts5BtreeIter
1ccf0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
1cd00 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1cd10 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b  pIter->nLvl; i++
1cd20 29 7b 0a 20 20 20 20 46 74 73 35 42 74 72 65 65  ){.    Fts5Btree
1cd30 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  IterLevel *pLvl 
1cd40 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  = &pIter->aLvl[i
1cd50 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49  ];.    fts5NodeI
1cd60 74 65 72 46 72 65 65 28 26 70 4c 76 6c 2d 3e 73  terFree(&pLvl->s
1cd70 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  );.    if( pLvl-
1cd80 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  >pData ){.      
1cd90 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1cda0 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20  pLvl->pData);.  
1cdb0 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
1cdc0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
1cdd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
1cde0 74 65 72 2d 3e 61 4c 76 6c 29 3b 0a 20 20 66 74  ter->aLvl);.  ft
1cdf0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
1ce00 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a 0a 2f  ter->term);.}../
1ce10 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ce20 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20  on is purely an 
1ce30 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
1ce40 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
1ce50 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
1ce60 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
1ce70 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
1ce80 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
1ce90 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
1cea0 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73  nstead, it tests
1ceb0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
1cec0 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64  et of pgno/rowid
1ced0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
1cee0 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65  e .** visited re
1cef0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1cf00 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  her the doclist-
1cf10 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64  index identified
1cf20 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a   by parameters.*
1cf30 2a 20 69 49 64 78 2f 69 53 65 67 69 64 2f 69 4c  * iIdx/iSegid/iL
1cf40 65 61 66 20 69 73 20 69 74 65 72 61 74 65 64 20  eaf is iterated 
1cf50 69 6e 20 66 6f 72 77 61 72 64 73 20 6f 72 20 72  in forwards or r
1cf60 65 76 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f  everse order..*/
1cf70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1cf80 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64  EBUG.static void
1cf90 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 54 65   fts5DlidxIterTe
1cfa0 73 74 52 65 76 65 72 73 65 28 0a 20 20 46 74 73  stReverse(.  Fts
1cfb0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e  5Index *p, .  in
1cfc0 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
1cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cfe0 20 49 6e 64 65 78 20 74 6f 20 6c 6f 61 64 20 64   Index to load d
1cff0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f  oclist-index fro
1d000 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69  m */.  int iSegi
1d010 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1d020 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
1d030 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f  t id to load fro
1d040 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  m */.  int iLeaf
1d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d060 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64         /* Load d
1d070 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
1d080 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b   this leaf */.){
1d090 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
1d0a0 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20   *pDlidx = 0;.  
1d0b0 69 36 34 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b  i64 cksum1 = 13;
1d0c0 0a 20 20 69 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  i64 cksum2 = 
1d0d0 31 33 3b 0a 0a 20 20 66 6f 72 28 66 74 73 35 44  13;..  for(fts5D
1d0e0 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
1d0f0 30 2c 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c  0, iIdx, iSegid,
1d100 20 69 4c 65 61 66 2c 20 26 70 44 6c 69 64 78 29   iLeaf, &pDlidx)
1d110 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
1d120 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
1d130 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  dx)==0;.      ft
1d140 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
1d150 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20  pDlidx).  ){.   
1d160 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
1d170 3e 69 4c 65 61 66 50 67 6e 6f 3e 69 4c 65 61 66  >iLeafPgno>iLeaf
1d180 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 3d   );.    cksum1 =
1d190 20 28 63 6b 73 75 6d 31 20 5e 20 28 20 28 69 36   (cksum1 ^ ( (i6
1d1a0 34 29 28 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66  4)(pDlidx->iLeaf
1d1b0 50 67 6e 6f 29 20 3c 3c 20 33 32 20 29 29 3b 0a  Pgno) << 32 ));.
1d1c0 20 20 20 20 63 6b 73 75 6d 31 20 3d 20 28 63 6b      cksum1 = (ck
1d1d0 73 75 6d 31 20 5e 20 70 44 6c 69 64 78 2d 3e 69  sum1 ^ pDlidx->i
1d1e0 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 66 74  Rowid);.  }.  ft
1d1f0 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
1d200 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64  pDlidx);.  pDlid
1d210 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 66 74  x = 0;..  for(ft
1d220 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
1d230 70 2c 20 31 2c 20 69 49 64 78 2c 20 69 53 65 67  p, 1, iIdx, iSeg
1d240 69 64 2c 20 69 4c 65 61 66 2c 20 26 70 44 6c 69  id, iLeaf, &pDli
1d250 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  dx);.      fts5D
1d260 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
1d270 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
1d280 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
1d290 65 76 28 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a  ev(pDlidx).  ){.
1d2a0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
1d2b0 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 69 4c  dx->iLeafPgno>iL
1d2c0 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d  eaf );.    cksum
1d2d0 32 20 3d 20 28 63 6b 73 75 6d 32 20 5e 20 28 20  2 = (cksum2 ^ ( 
1d2e0 28 69 36 34 29 28 70 44 6c 69 64 78 2d 3e 69 4c  (i64)(pDlidx->iL
1d2f0 65 61 66 50 67 6e 6f 29 20 3c 3c 20 33 32 20 29  eafPgno) << 32 )
1d300 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 3d 20  );.    cksum2 = 
1d310 28 63 6b 73 75 6d 32 20 5e 20 70 44 6c 69 64 78  (cksum2 ^ pDlidx
1d320 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  ->iRowid);.  }. 
1d330 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
1d340 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
1d350 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28  lidx = 0;..  if(
1d360 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1d370 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73  K && cksum1!=cks
1d380 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  um2 ) p->rc = FT
1d390 53 35 5f 43 4f 52 52 55 50 54 3b 20 0a 7d 0a 23  S5_CORRUPT; .}.#
1d3a0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
1d3b0 73 35 44 6c 69 64 78 49 74 65 72 54 65 73 74 52  s5DlidxIterTestR
1d3c0 65 76 65 72 73 65 28 77 2c 78 2c 79 2c 7a 29 0a  everse(w,x,y,z).
1d3d0 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 76  #endif..static v
1d3e0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
1d3f0 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
1d400 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nt(.  Fts5Index 
1d410 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1d420 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1d430 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1d440 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
1d450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d460 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20    /* Index that 
1d470 70 53 65 67 20 69 73 20 61 20 70 61 72 74 20 6f  pSeg is a part o
1d480 66 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  f */.  Fts5Struc
1d490 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
1d4a0 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g      /* Segmen
1d4b0 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72  t to check inter
1d4c0 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  nal consistency 
1d4d0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 42 74 72 65  */.){.  Fts5Btre
1d4e0 65 49 74 65 72 20 69 74 65 72 3b 20 20 20 20 20  eIter iter;     
1d4f0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1d500 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1d510 67 68 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  gh b-tree hierar
1d520 63 68 79 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 65  chy */..  /* Ite
1d530 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
1d540 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
1d550 79 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73  y.  */.  for(fts
1d560 35 42 74 72 65 65 49 74 65 72 49 6e 69 74 28 70  5BtreeIterInit(p
1d570 2c 20 69 49 64 78 2c 20 70 53 65 67 2c 20 26 69  , iIdx, pSeg, &i
1d580 74 65 72 29 3b 0a 20 20 20 20 20 20 69 74 65 72  ter);.      iter
1d590 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20  .bEof==0;.      
1d5a0 66 74 73 35 42 74 72 65 65 49 74 65 72 4e 65 78  fts5BtreeIterNex
1d5b0 74 28 26 69 74 65 72 29 0a 20 20 29 7b 0a 20 20  t(&iter).  ){.  
1d5c0 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20    i64 iRow;     
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69  /* Rowid for thi
1d5f0 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74  s leaf */.    Ft
1d600 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20  s5Data *pLeaf;  
1d610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1d620 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61  ata for this lea
1d630 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66  f */.    int iOf
1d640 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1d650 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1d660 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20 6f   of first term o
1d670 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e  n leaf */.    in
1d680 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
1d690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1d6a0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1d6b0 68 72 6f 75 67 68 20 65 6d 70 74 79 20 6c 65 61  hrough empty lea
1d6c0 76 65 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49  ves */..    /* I
1d6d0 66 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75  f the leaf in qu
1d6e0 65 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  estion has alrea
1d6f0 64 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20  dy been trimmed 
1d700 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74  from the segment
1d710 2c 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65  , .    ** ignore
1d720 20 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74   this b-tree ent
1d730 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  ry. Otherwise, l
1d740 6f 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f  oad it into memo
1d750 72 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ry. */.    if( i
1d760 74 65 72 2e 69 4c 65 61 66 3c 70 53 65 67 2d 3e  ter.iLeaf<pSeg->
1d770 70 67 6e 6f 46 69 72 73 74 20 29 20 63 6f 6e 74  pgnoFirst ) cont
1d780 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d  inue;.    iRow =
1d790 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1d7a0 57 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d 3e  WID(iIdx, pSeg->
1d7b0 69 53 65 67 69 64 2c 20 30 2c 20 69 74 65 72 2e  iSegid, 0, iter.
1d7c0 69 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61  iLeaf);.    pLea
1d7d0 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
1d7e0 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69  (p, iRow);.    i
1d7f0 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72  f( pLeaf==0 ) br
1d800 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  eak;..    /* Che
1d810 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66  ck that the leaf
1d820 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1d830 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64  st one term, and
1d840 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75 61   that it is equa
1d850 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c  l.    ** to or l
1d860 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
1d870 70 6c 69 74 2d 6b 65 79 20 69 6e 20 69 74 65 72  plit-key in iter
1d880 2e 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69  .term.  */.    i
1d890 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
1d8a0 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a  (&pLeaf->p[2]);.
1d8b0 20 20 20 20 69 66 28 20 69 4f 66 66 3d 3d 30 20      if( iOff==0 
1d8c0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
1d8d0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
1d8e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d8f0 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
1d900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d910 69 7a 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c  ize of term on l
1d920 65 61 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  eaf in bytes */.
1d930 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20        int res;  
1d940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d950 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
1d960 6f 66 20 74 65 72 6d 20 61 6e 64 20 73 70 6c 69  of term and spli
1d970 74 2d 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 69  t-key */.      i
1d980 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
1d990 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70  rint32(&pLeaf->p
1d9a0 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a  [iOff], nTerm);.
1d9b0 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63        res = memc
1d9c0 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  mp(&pLeaf->p[iOf
1d9d0 66 5d 2c 20 69 74 65 72 2e 74 65 72 6d 2e 70 2c  f], iter.term.p,
1d9e0 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 69 74 65 72   MIN(nTerm, iter
1d9f0 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20 20 20 20 20  .term.n));.     
1da00 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
1da10 73 20 3d 20 6e 54 65 72 6d 20 2d 20 69 74 65 72  s = nTerm - iter
1da20 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 69  .term.n;.      i
1da30 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
1da40 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
1da50 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
1da60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  }.    }.    fts5
1da70 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
1da80 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  f);.    if( p->r
1da90 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  c ) break;..    
1daa0 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  /* Now check tha
1dab0 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74  t the iter.nEmpt
1dac0 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  y leaves followi
1dad0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ng the current l
1dae0 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65  eaf.    ** (a) e
1daf0 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  xist and (b) con
1db00 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a  tain no terms. *
1db10 2f 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 70  /.    for(i=1; p
1db20 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1db30 26 26 20 69 3c 3d 69 74 65 72 2e 6e 45 6d 70 74  && i<=iter.nEmpt
1db40 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  y; i++){.      p
1db50 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
1db60 65 61 64 28 70 2c 20 69 52 6f 77 2b 69 29 3b 0a  ead(p, iRow+i);.
1db70 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
1db80 26 26 20 30 21 3d 66 74 73 35 47 65 74 55 31 36  && 0!=fts5GetU16
1db90 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 20 29  (&pLeaf->p[2]) )
1dba0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
1dbb0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
1dbc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1dbd0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
1dbe0 65 61 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  eaf);.    }..   
1dbf0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
1dc00 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c  a doclist-index,
1dc10 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c   check that it l
1dc20 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20  ooks right. */. 
1dc30 20 20 20 69 66 28 20 69 74 65 72 2e 62 44 6c 69     if( iter.bDli
1dc40 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  dx ){.      Fts5
1dc50 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
1dc60 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69  x = 0;  /* For i
1dc70 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
1dc80 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a   doclist index *
1dc90 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72 65  /.      int iPre
1dca0 76 4c 65 61 66 20 3d 20 69 74 65 72 2e 69 4c 65  vLeaf = iter.iLe
1dcb0 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  af;.      int iS
1dcc0 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65  egid = pSeg->iSe
1dcd0 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  gid;.      int i
1dce0 50 67 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b  Pg;.      i64 iK
1dcf0 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 66  ey;..      for(f
1dd00 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
1dd10 28 70 2c 20 30 2c 20 69 49 64 78 2c 20 69 53 65  (p, 0, iIdx, iSe
1dd20 67 69 64 2c 20 69 74 65 72 2e 69 4c 65 61 66 2c  gid, iter.iLeaf,
1dd30 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20   &pDlidx);.     
1dd40 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1dd50 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
1dd60 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ==0;.          f
1dd70 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
1dd80 28 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29  (pDlidx).      )
1dd90 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  {..        /* Ch
1dda0 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65  eck any rowid-le
1ddb0 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63  ss pages that oc
1ddc0 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63  cur before the c
1ddd0 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a  urrent leaf. */.
1dde0 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
1ddf0 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67  iPrevLeaf+1; iPg
1de00 3c 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67  <pDlidx->iLeafPg
1de10 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  no; iPg++){.    
1de20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
1de30 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
1de40 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c  iIdx, iSegid, 0,
1de50 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20   iPg);.         
1de60 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1de70 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1de80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c            if( pL
1de90 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1dea0 20 20 20 69 66 28 20 66 74 73 35 47 65 74 55 31     if( fts5GetU1
1deb0 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 21  6(&pLeaf->p[0])!
1dec0 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  =0 ) p->rc = FTS
1ded0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
1dee0 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
1def0 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
1df00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1df10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50 72     }.        iPr
1df20 65 76 4c 65 61 66 20 3d 20 70 44 6c 69 64 78 2d  evLeaf = pDlidx-
1df30 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 20  >iLeafPgno;..   
1df40 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
1df50 61 74 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  at the leaf page
1df60 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
1df70 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 6c 6c  e iterator reall
1df80 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a  y does.        *
1df90 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f  * contain the ro
1dfa0 77 69 64 20 73 75 67 67 65 73 74 65 64 20 62 79  wid suggested by
1dfb0 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20   the same. */.  
1dfc0 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
1dfd0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
1dfe0 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c  iIdx, iSegid, 0,
1dff0 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67   pDlidx->iLeafPg
1e000 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  no);.        pLe
1e010 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
1e020 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
1e030 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
1e040 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
1e050 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Rowid;.         
1e060 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20 3d   int iRowidOff =
1e070 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
1e080 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20 20 20  af->p[0]);.     
1e090 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 26       getVarint(&
1e0a0 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f  pLeaf->p[iRowidO
1e0b0 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77  ff], (u64*)&iRow
1e0c0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  id);.          i
1e0d0 66 28 20 69 52 6f 77 69 64 21 3d 70 44 6c 69 64  f( iRowid!=pDlid
1e0e0 78 2d 3e 69 52 6f 77 69 64 20 29 20 70 2d 3e 72  x->iRowid ) p->r
1e0f0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
1e100 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1e110 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
1e120 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  f);.        }.. 
1e130 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f       }..      fo
1e140 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b  r(iPg=iPrevLeaf+
1e150 31 3b 20 69 50 67 3c 3d 28 69 74 65 72 2e 69 4c  1; iPg<=(iter.iL
1e160 65 61 66 20 2b 20 69 74 65 72 2e 6e 45 6d 70 74  eaf + iter.nEmpt
1e170 79 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  y); iPg++){.    
1e180 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f      iKey = FTS5_
1e190 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1e1a0 64 78 2c 20 69 53 65 67 69 64 2c 20 30 2c 20 69  dx, iSegid, 0, i
1e1b0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  Pg);.        pLe
1e1c0 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
1e1d0 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
1e1e0 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
1e1f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66  .          if( f
1e200 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
1e210 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d 3e  ->p[0])!=0 ) p->
1e220 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1e230 54 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  T;.          fts
1e240 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
1e250 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  af);.        }. 
1e260 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
1e270 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
1e280 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
1e290 74 73 35 44 6c 69 64 78 49 74 65 72 54 65 73 74  ts5DlidxIterTest
1e2a0 52 65 76 65 72 73 65 28 70 2c 20 69 49 64 78 2c  Reverse(p, iIdx,
1e2b0 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c   iSegid, iter.iL
1e2c0 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  eaf);.    }.  }.
1e2d0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1e2e0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e  LITE_OK && iter.
1e2f0 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e  iLeaf!=pSeg->pgn
1e300 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  oLast ){.    p->
1e310 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1e320 54 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 74  T;.  }..  fts5Bt
1e330 72 65 65 49 74 65 72 46 72 65 65 28 26 69 74 65  reeIterFree(&ite
1e340 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  r);.}../*.** Ite
1e350 72 61 74 6f 72 20 70 4d 75 6c 74 69 20 63 75 72  rator pMulti cur
1e360 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1e370 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28   a valid entry (
1e380 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a  not EOF). This.*
1e390 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  * function appen
1e3a0 64 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ds a copy of the
1e3b0 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 6f   position-list o
1e3c0 66 20 74 68 65 20 65 6e 74 72 79 20 70 4d 75 6c  f the entry pMul
1e3d0 74 69 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ti .** currently
1e3e0 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20 62 75   points to to bu
1e3f0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
1e400 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1e410 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1e420 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d  de is left in p-
1e430 3e 72 63 2e 20 49 74 20 69 73 20 61 73 73 75 6d  >rc. It is assum
1e440 65 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 68  ed.** no error h
1e450 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
1e460 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
1e470 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1e480 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e490 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f   fts5MultiIterPo
1e4a0 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64  slist(.  Fts5Ind
1e4b0 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 4d 75 6c  ex *p,.  Fts5Mul
1e4c0 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74  tiSegIter *pMult
1e4d0 69 2c 0a 20 20 69 6e 74 20 62 53 7a 2c 0a 20 20  i,.  int bSz,.  
1e4e0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1e4f0 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
1e500 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e510 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20    Fts5ChunkIter 
1e520 69 74 65 72 3b 0a 20 20 20 20 46 74 73 35 53 65  iter;.    Fts5Se
1e530 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1e540 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75  Multi->aSeg[ pMu
1e550 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d  lti->aFirst[1] ]
1e560 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74  ;.    assert( ft
1e570 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
1e580 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a  , pMulti)==0 );.
1e590 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
1e5a0 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26  rInit(p, pSeg, &
1e5b0 69 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 66  iter);.    if( f
1e5c0 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28  ts5ChunkIterEof(
1e5d0 70 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a  p, &iter)==0 ){.
1e5e0 20 20 20 20 20 20 69 66 28 20 62 53 7a 20 29 7b        if( bSz ){
1e5f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1e600 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1e610 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 74  &p->rc, pBuf, it
1e620 65 72 2e 6e 52 65 6d 29 3b 0a 20 20 20 20 20 20  er.nRem);.      
1e630 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 66  }.      while( f
1e640 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28  ts5ChunkIterEof(
1e650 70 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a  p, &iter)==0 ){.
1e660 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1e670 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1e680 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e  >rc, pBuf, iter.
1e690 6e 2c 20 69 74 65 72 2e 70 29 3b 0a 20 20 20 20  n, iter.p);.    
1e6a0 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
1e6b0 72 4e 65 78 74 28 70 2c 20 26 69 74 65 72 29 3b  rNext(p, &iter);
1e6c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e6d0 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
1e6e0 52 65 6c 65 61 73 65 28 26 69 74 65 72 29 3b 0a  Release(&iter);.
1e6f0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1e700 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  id fts5DoclistIt
1e710 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69  erNext(Fts5Docli
1e720 73 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  stIter *pIter){.
1e730 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 3c 70    if( pIter->i<p
1e740 49 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  Iter->n ){.    i
1e750 66 28 20 70 49 74 65 72 2d 3e 69 20 29 7b 0a 20  f( pIter->i ){. 
1e760 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
1e770 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20  .      pIter->i 
1e780 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 49  += getVarint(&pI
1e790 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d  ter->a[pIter->i]
1e7a0 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
1e7b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
1e7c0 72 2d 3e 62 44 65 73 63 20 29 7b 0a 20 20 20 20  r->bDesc ){.    
1e7d0 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
1e7e0 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d -= iDelta;.   
1e7f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e800 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
1e810 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
1e820 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1e830 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20      pIter->i += 
1e840 67 65 74 56 61 72 69 6e 74 28 26 70 49 74 65 72  getVarint(&pIter
1e850 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28  ->a[pIter->i], (
1e860 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
1e870 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
1e880 70 49 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73 35  pIter->i += fts5
1e890 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
1e8a0 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c  er->a[pIter->i],
1e8b0 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
1e8c0 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  );.    pIter->aP
1e8d0 6f 73 6c 69 73 74 20 3d 20 26 70 49 74 65 72 2d  oslist = &pIter-
1e8e0 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 3b 0a 20 20  >a[pIter->i];.  
1e8f0 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 70 49    pIter->i += pI
1e900 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20  ter->nPoslist;. 
1e910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
1e920 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b  r->aPoslist = 0;
1e930 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
1e940 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49  oid fts5DoclistI
1e950 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42  terInit(.  Fts5B
1e960 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20  uffer *pBuf, .  
1e970 69 6e 74 20 62 44 65 73 63 2c 20 0a 20 20 46 74  int bDesc, .  Ft
1e980 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
1e990 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74  Iter.){.  memset
1e9a0 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
1e9b0 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
1e9c0 74 65 72 2d 3e 61 20 3d 20 70 42 75 66 2d 3e 70  ter->a = pBuf->p
1e9d0 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 70  ;.  pIter->n = p
1e9e0 42 75 66 2d 3e 6e 3b 0a 20 20 70 49 74 65 72 2d  Buf->n;.  pIter-
1e9f0 3e 62 44 65 73 63 20 3d 20 62 44 65 73 63 3b 0a  >bDesc = bDesc;.
1ea00 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
1ea10 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a  rNext(pIter);.}.
1ea20 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1ea30 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65  doclist to buffe
1ea40 72 20 70 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r pBuf..*/.stati
1ea50 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
1ea60 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 69  AppendDocid(.  i
1ea70 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
1ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ea90 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72 20  * IN/OUT: Error 
1eaa0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62 44  code */.  int bD
1eab0 65 73 63 2c 0a 20 20 46 74 73 35 42 75 66 66 65  esc,.  Fts5Buffe
1eac0 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
1ead0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1eae0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1eaf0 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77    i64 *piLastRow
1eb00 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
1eb10 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65    /* IN/OUT: Pre
1eb20 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74  vious rowid writ
1eb30 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ten (if any) */.
1eb40 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20    i64 iRowid    
1eb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb60 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70    /* Rowid to ap
1eb70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  pend */.){.  if(
1eb80 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pBuf->n==0 ){. 
1eb90 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1eba0 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70  endVarint(pRc, p
1ebb0 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Buf, iRowid);.  
1ebc0 7d 65 6c 73 65 20 69 66 28 20 62 44 65 73 63 20  }else if( bDesc 
1ebd0 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
1ebe0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 52  rAppendVarint(pR
1ebf0 63 2c 20 70 42 75 66 2c 20 2a 70 69 4c 61 73 74  c, pBuf, *piLast
1ec00 52 6f 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b  Rowid - iRowid);
1ec10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
1ec20 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1ec30 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20  rint(pRc, pBuf, 
1ec40 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74  iRowid - *piLast
1ec50 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70  Rowid);.  }.  *p
1ec60 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f  iLastRowid = iRo
1ec70 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75  wid;.}../*.** Bu
1ec80 66 66 65 72 73 20 70 31 20 61 6e 64 20 70 32 20  ffers p1 and p2 
1ec90 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74 73  contain doclists
1eca0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1ecb0 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e 74 65  merges the conte
1ecc0 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f  nt.** of the two
1ecd0 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65 74 68   doclists togeth
1ece0 65 72 20 61 6e 64 20 73 65 74 73 20 62 75 66 66  er and sets buff
1ecf0 65 72 20 70 31 20 74 6f 20 74 68 65 20 72 65 73  er p1 to the res
1ed00 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65  ult before.** re
1ed10 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
1ed20 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1ed30 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1ed40 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72   is left in p->r
1ed50 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  c. If an error h
1ed60 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  as.** already oc
1ed70 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
1ed80 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1ed90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1eda0 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
1edb0 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64  Lists(.  Fts5Ind
1edc0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1edd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1ede0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1edf0 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 0a  */.  int bDesc,.
1ee00 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31    Fts5Buffer *p1
1ee10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ee20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20    /* First list 
1ee30 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74  to merge */.  Ft
1ee40 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20  s5Buffer *p2    
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ee60 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20   Second list to 
1ee70 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  merge */.){.  if
1ee80 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  ( p2->n ){.    i
1ee90 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20  64 iLastRowid = 
1eea0 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69  0;.    Fts5Docli
1eeb0 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46  stIter i1;.    F
1eec0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69  ts5DoclistIter i
1eed0 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  2;.    Fts5Buffe
1eee0 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73 35 42  r out;.    Fts5B
1eef0 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d  uffer tmp;.    m
1ef00 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73  emset(&out, 0, s
1ef10 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20  izeof(out));.   
1ef20 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c   memset(&tmp, 0,
1ef30 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a   sizeof(tmp));..
1ef40 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
1ef50 74 65 72 49 6e 69 74 28 70 31 2c 20 62 44 65 73  terInit(p1, bDes
1ef60 63 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73  c, &i1);.    fts
1ef70 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
1ef80 28 70 32 2c 20 62 44 65 73 63 2c 20 26 69 32 29  (p2, bDesc, &i2)
1ef90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 31 2e  ;.    while( i1.
1efa0 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69  aPoslist!=0 || i
1efb0 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 29 7b  2.aPoslist!=0 ){
1efc0 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50  .      if( i2.aP
1efd0 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31  oslist==0 || (i1
1efe0 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20 20  .aPoslist && .  
1eff0 20 20 20 20 20 20 20 20 20 28 20 28 62 44 65 73           ( (bDes
1f000 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e 69  c && i1.iRowid>i
1f010 32 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 21 62  2.iRowid) || (!b
1f020 44 65 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69  Desc && i1.iRowi
1f030 64 3c 69 32 2e 69 52 6f 77 69 64 29 20 29 0a 20  d<i2.iRowid) ). 
1f040 20 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20       )){.       
1f050 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
1f060 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20  rom i1 */.      
1f070 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
1f080 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62  dDocid(&p->rc, b
1f090 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61  Desc, &out, &iLa
1f0a0 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77  stRowid, i1.iRow
1f0b0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
1f0c0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1f0d0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  int(&p->rc, &out
1f0e0 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a  , i1.nPoslist);.
1f0f0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f100 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1f110 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50  >rc, &out, i1.nP
1f120 6f 73 6c 69 73 74 2c 20 69 31 2e 61 50 6f 73 6c  oslist, i1.aPosl
1f130 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ist);.        ft
1f140 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1f150 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i1);.      }.
1f160 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69        else if( i
1f170 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c  1.aPoslist==0 ||
1f180 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69   i2.iRowid!=i1.i
1f190 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
1f1a0 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66   /* Copy entry f
1f1b0 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20  rom i2 */.      
1f1c0 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e    fts5MergeAppen
1f1d0 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62  dDocid(&p->rc, b
1f1e0 44 65 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61  Desc, &out, &iLa
1f1f0 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
1f200 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
1f210 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1f220 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  int(&p->rc, &out
1f230 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a  , i2.nPoslist);.
1f240 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f250 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1f260 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50  >rc, &out, i2.nP
1f270 6f 73 6c 69 73 74 2c 20 69 32 2e 61 50 6f 73 6c  oslist, i2.aPosl
1f280 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ist);.        ft
1f290 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1f2a0 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a  t(&i2);.      }.
1f2b0 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20        else{.    
1f2c0 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52      Fts5PoslistR
1f2d0 65 61 64 65 72 20 72 31 3b 0a 20 20 20 20 20 20  eader r1;.      
1f2e0 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61    Fts5PoslistRea
1f2f0 64 65 72 20 72 32 3b 0a 20 20 20 20 20 20 20 20  der r2;.        
1f300 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65  Fts5PoslistWrite
1f310 72 20 77 72 69 74 65 72 3b 0a 0a 20 20 20 20 20  r writer;..     
1f320 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65     memset(&write
1f330 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 72 69  r, 0, sizeof(wri
1f340 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  ter));..        
1f350 2f 2a 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f  /* Merge the two
1f360 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e   position lists.
1f370 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 66 74 73   */ .        fts
1f380 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
1f390 64 28 26 70 2d 3e 72 63 2c 20 62 44 65 73 63 2c  d(&p->rc, bDesc,
1f3a0 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77   &out, &iLastRow
1f3b0 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a  id, i2.iRowid);.
1f3c0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f3d0 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20  erZero(&tmp);.  
1f3e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1f3f0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
1f400 69 74 28 2d 31 2c 20 69 31 2e 61 50 6f 73 6c 69  it(-1, i1.aPosli
1f410 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  st, i1.nPoslist,
1f420 20 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73   &r1);.        s
1f430 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1f440 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31 2c 20  tReaderInit(-1, 
1f450 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e  i2.aPoslist, i2.
1f460 6e 50 6f 73 6c 69 73 74 2c 20 26 72 32 29 3b 0a  nPoslist, &r2);.
1f470 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
1f480 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1f490 26 26 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 7c  && (r1.bEof==0 |
1f4a0 7c 20 72 32 2e 62 45 6f 66 3d 3d 30 29 20 29 7b  | r2.bEof==0) ){
1f4b0 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
1f4c0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  New;.          i
1f4d0 66 28 20 72 32 2e 62 45 6f 66 20 7c 7c 20 28 72  f( r2.bEof || (r
1f4e0 31 2e 62 45 6f 66 3d 3d 30 20 26 26 20 72 31 2e  1.bEof==0 && r1.
1f4f0 69 50 6f 73 3c 72 32 2e 69 50 6f 73 29 20 29 7b  iPos<r2.iPos) ){
1f500 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e 65  .            iNe
1f510 77 20 3d 20 72 31 2e 69 50 6f 73 3b 0a 20 20 20  w = r1.iPos;.   
1f520 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1f530 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1f540 72 4e 65 78 74 28 26 72 31 29 3b 0a 20 20 20 20  rNext(&r1);.    
1f550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f560 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
1f570 72 32 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20  r2.iPos;.       
1f580 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1f590 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
1f5a0 74 28 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20  t(&r2);.        
1f5b0 20 20 20 20 69 66 28 20 72 31 2e 69 50 6f 73 3d      if( r1.iPos=
1f5c0 3d 72 32 2e 69 50 6f 73 20 29 20 73 71 6c 69 74  =r2.iPos ) sqlit
1f5d0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
1f5e0 64 65 72 4e 65 78 74 28 26 72 31 29 3b 0a 20 20  derNext(&r1);.  
1f5f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f600 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1f610 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72  te3Fts5PoslistWr
1f620 69 74 65 72 41 70 70 65 6e 64 28 26 74 6d 70 2c  iterAppend(&tmp,
1f630 20 26 77 72 69 74 65 72 2c 20 69 4e 65 77 29 3b   &writer, iNew);
1f640 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1f650 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f660 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1f670 63 2c 20 26 6f 75 74 2c 20 74 6d 70 2e 6e 29 3b  c, &out, tmp.n);
1f680 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f690 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1f6a0 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70 2e  ->rc, &out, tmp.
1f6b0 6e 2c 20 74 6d 70 2e 70 29 3b 0a 20 20 20 20 20  n, tmp.p);.     
1f6c0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
1f6d0 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
1f6e0 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
1f6f0 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
1f700 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f710 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
1f720 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e  &p->rc, p1, out.
1f730 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66  n, out.p);.    f
1f740 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
1f750 6d 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  mp);.    fts5Buf
1f760 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 20  ferFree(&out);. 
1f770 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1f780 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70  d fts5BufferSwap
1f790 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c  (Fts5Buffer *p1,
1f7a0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 29   Fts5Buffer *p2)
1f7b0 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  {.  Fts5Buffer t
1f7c0 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31 20  mp = *p1;.  *p1 
1f7d0 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20 74  = *p2;.  *p2 = t
1f7e0 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  mp;.}..static vo
1f7f0 69 64 20 66 74 73 35 53 65 74 75 70 50 72 65 66  id fts5SetupPref
1f800 69 78 49 74 65 72 28 0a 20 20 46 74 73 35 49 6e  ixIter(.  Fts5In
1f810 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1f820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1f830 65 78 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ex to read from 
1f840 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20  */.  int bDesc, 
1f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f860 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1f870 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
1f880 20 44 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73   DESC" */.  cons
1f890 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20  t u8 *pToken,   
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1f8b0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1f8c0 20 70 72 65 66 69 78 20 74 6f 20 6d 61 74 63 68   prefix to match
1f8d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e   */.  int nToken
1f8e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f8f0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1f900 20 62 75 66 66 65 72 20 70 54 6f 6b 65 6e 20 69   buffer pToken i
1f910 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46 74 73  n bytes */.  Fts
1f920 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
1f930 72 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r            /* 
1f940 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62  Populate this ob
1f950 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ject */.){.  Fts
1f960 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
1f970 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65  uct;.  Fts5Buffe
1f980 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74  r *aBuf;.  const
1f990 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a   int nBuf = 32;.
1f9a0 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35 42  .  aBuf = (Fts5B
1f9b0 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d 61  uffer*)fts5IdxMa
1f9c0 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
1f9d0 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66 29  ts5Buffer)*nBuf)
1f9e0 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
1f9f0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
1fa00 70 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 61 42  p, 0);..  if( aB
1fa10 75 66 20 26 26 20 70 53 74 72 75 63 74 20 29 7b  uf && pStruct ){
1fa20 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
1fa30 49 74 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b 0a  Iter *pDoclist;.
1fa40 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1fa50 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20  64 iLastRowid = 
1fa60 30 3b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74 69  0;.    Fts5Multi
1fa70 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 30 3b  SegIter *p1 = 0;
1fa80 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
1fa90 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20   used to gather 
1faa0 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20  data from index 
1fab0 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  */.    Fts5Buffe
1fac0 72 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20  r doclist;..    
1fad0 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c  memset(&doclist,
1fae0 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69   0, sizeof(docli
1faf0 73 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74  st));.    for(ft
1fb00 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
1fb10 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c  , pStruct, 0, 1,
1fb20 20 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b   1, pToken, nTok
1fb30 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b  en, -1, 0, &p1);
1fb40 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
1fb50 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29  tiIterEof(p, p1)
1fb60 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ==0;.        fts
1fb70 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
1fb80 2c 20 70 31 2c 20 30 2c 20 30 29 0a 20 20 20 20  , p1, 0, 0).    
1fb90 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  ){.      i64 iRo
1fba0 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  wid = fts5MultiI
1fbb0 74 65 72 52 6f 77 69 64 28 70 31 29 3b 0a 20 20  terRowid(p1);.  
1fbc0 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20      int nTerm;. 
1fbd0 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
1fbe0 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69  Term = fts5Multi
1fbf0 49 74 65 72 54 65 72 6d 28 70 31 2c 20 26 6e 54  IterTerm(p1, &nT
1fc00 65 72 6d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  erm);.      asse
1fc10 72 74 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65  rt( memcmp(pToke
1fc20 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54  n, pTerm, MIN(nT
1fc30 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30  oken, nTerm))<=0
1fc40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54   );.      if( nT
1fc50 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65  erm<nToken || me
1fc60 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65  mcmp(pToken, pTe
1fc70 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72  rm, nToken) ) br
1fc80 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  eak;..      if( 
1fc90 64 6f 63 6c 69 73 74 2e 6e 3e 30 20 0a 20 20 20  doclist.n>0 .   
1fca0 20 20 20 20 26 26 20 28 28 21 62 44 65 73 63 20      && ((!bDesc 
1fcb0 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74  && iRowid<=iLast
1fcc0 52 6f 77 69 64 29 20 7c 7c 20 28 62 44 65 73 63  Rowid) || (bDesc
1fcd0 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4c 61 73   && iRowid>=iLas
1fce0 74 52 6f 77 69 64 29 29 0a 20 20 20 20 20 20 29  tRowid)).      )
1fcf0 7b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  {..        for(i
1fd00 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
1fd10 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e  E_OK && doclist.
1fd20 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
1fd30 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75     assert( i<nBu
1fd40 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  f );.          i
1fd50 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20  f( aBuf[i].n==0 
1fd60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
1fd70 74 73 35 42 75 66 66 65 72 53 77 61 70 28 26 64  ts5BufferSwap(&d
1fd80 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
1fd90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
1fda0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64  ts5BufferZero(&d
1fdb0 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20  oclist);.       
1fdc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1fdd0 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 50        fts5MergeP
1fde0 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20 62 44  refixLists(p, bD
1fdf0 65 73 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26  esc, &doclist, &
1fe00 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
1fe10 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fe20 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a  Zero(&aBuf[i]);.
1fe30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1fe40 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1fe50 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e      if( doclist.
1fe60 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1fe70 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fe80 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1fe90 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69 64 29  doclist, iRowid)
1fea0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
1feb0 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20 20  ( bDesc ){.     
1fec0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1fed0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1fee0 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 4c 61 73  , &doclist, iLas
1fef0 74 52 6f 77 69 64 20 2d 20 69 52 6f 77 69 64 29  tRowid - iRowid)
1ff00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ff10 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1ff20 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1ff30 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20  ->rc, &doclist, 
1ff40 69 52 6f 77 69 64 20 2d 20 69 4c 61 73 74 52 6f  iRowid - iLastRo
1ff50 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  wid);.      }.  
1ff60 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d      iLastRowid =
1ff70 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 66   iRowid;.      f
1ff80 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c  ts5MultiIterPosl
1ff90 69 73 74 28 70 2c 20 70 31 2c 20 31 2c 20 26 64  ist(p, p1, 1, &d
1ffa0 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 0a  oclist);.    }..
1ffb0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1ffc0 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Buf; i++){.     
1ffd0 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
1ffe0 4c 69 73 74 73 28 70 2c 20 62 44 65 73 63 2c 20  Lists(p, bDesc, 
1fff0 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
20000 69 5d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  i]);.      fts5B
20010 75 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b  ufferFree(&aBuf[
20020 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
20030 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
20040 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44  (p, p1);..    pD
20050 6f 63 6c 69 73 74 20 3d 20 28 46 74 73 35 44 6f  oclist = (Fts5Do
20060 63 6c 69 73 74 49 74 65 72 2a 29 66 74 73 35 49  clistIter*)fts5I
20070 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
20080 6f 66 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74  of(Fts5DoclistIt
20090 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  er));.    if( !p
200a0 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  Doclist ){.     
200b0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
200c0 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d  &doclist);.    }
200d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
200e0 72 2d 3e 70 44 6f 63 6c 69 73 74 20 3d 20 70 44  r->pDoclist = pD
200f0 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 66 74  oclist;.      ft
20100 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
20110 74 28 26 64 6f 63 6c 69 73 74 2c 20 62 44 65 73  t(&doclist, bDes
20120 63 2c 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  c, pIter->pDocli
20130 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  st);.    }.  }..
20140 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
20150 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
20160 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20170 61 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  aBuf);.}../*.** 
20180 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  Run internal che
20190 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  cks to ensure th
201a0 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  at the FTS index
201b0 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c   (a) is internal
201c0 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e  ly .** consisten
201d0 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
201e0 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77  ns entries for w
201f0 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20  hich the XOR of 
20200 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a  the checksums.**
20210 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62   as calculated b
20220 79 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  y fts5IndexEntry
20230 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d  Cksum() is cksum
20240 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
20250 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
20260 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65   any of the inte
20270 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c  rnal checks fail
20280 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63  , or if the.** c
20290 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74  hecksum does not
202a0 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53   match. Return S
202b0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20  QLITE_OK if all 
202c0 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74 68  checks pass with
202d0 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72  out.** error, or
202e0 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69   some other SQLi
202f0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
20300 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28   another error (
20310 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63  e.g. OOM).** occ
20320 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
20330 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65  te3Fts5IndexInte
20340 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49  grityCheck(Fts5I
20350 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73  ndex *p, u64 cks
20360 75 6d 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  um){.  Fts5Confi
20370 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
20380 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69  pConfig;.  int i
20390 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
203a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
203b0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
203c0 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f  rough indexes */
203d0 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  u64 cksum2 = 
203e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
203f0 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62     /* Checksum b
20400 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73  ased on contents
20410 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 0a   of indexes */..
20420 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
20430 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
20440 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65  es of each segme
20450 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61  nt match the lea
20460 76 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 49 64  ves */.  for(iId
20470 78 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  x=0; p->rc==SQLI
20480 54 45 5f 4f 4b 20 26 26 20 69 49 64 78 3c 3d 70  TE_OK && iIdx<=p
20490 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
204a0 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74   iIdx++){.    Ft
204b0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
204c0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
204d0 74 75 72 65 52 65 61 64 28 70 2c 20 69 49 64 78  tureRead(p, iIdx
204e0 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  );.    if( pStru
204f0 63 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ct ){.      int 
20500 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
20510 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
20520 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
20530 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
20540 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
20550 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
20560 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
20570 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
20580 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
20590 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
205a0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
205b0 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
205c0 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 66  eg];.          f
205d0 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
205e0 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c  yCheckSegment(p,
205f0 20 69 49 64 78 2c 20 70 53 65 67 29 3b 0a 20 20   iIdx, pSeg);.  
20600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20610 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
20620 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
20630 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20  Struct);.  }..  
20640 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
20650 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  e checksum of th
20660 65 20 69 6e 64 65 78 20 6d 61 74 63 68 65 73 20  e index matches 
20670 74 68 65 20 61 72 67 75 6d 65 6e 74 20 63 68 65  the argument che
20680 63 6b 73 75 6d 20 2a 2f 0a 20 20 66 6f 72 28 69  cksum */.  for(i
20690 49 64 78 3d 30 3b 20 69 49 64 78 3c 3d 70 43 6f  Idx=0; iIdx<=pCo
206a0 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
206b0 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  Idx++){.    Fts5
206c0 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
206d0 74 65 72 3b 0a 20 20 20 20 46 74 73 35 53 74 72  ter;.    Fts5Str
206e0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
206f0 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
20700 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20 20  ead(p, iIdx);.  
20710 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49    for(fts5MultiI
20720 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63  terNew(p, pStruc
20730 74 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c 20 30  t, iIdx, 0, 0, 0
20740 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49 74  , 0, -1, 0, &pIt
20750 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  er);.        fts
20760 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
20770 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
20780 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
20790 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
207a0 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  0, 0).    ){.   
207b0 20 20 20 46 74 73 35 50 6f 73 49 74 65 72 20 73     Fts5PosIter s
207c0 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Pos;           /
207d0 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
207e0 65 20 74 68 72 6f 75 67 68 20 70 6f 73 69 74 69  e through positi
207f0 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20  on list */.     
20800 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
20810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20820 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20  Size of term in 
20830 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  bytes */.      i
20840 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
20850 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
20860 49 74 65 72 29 3b 0a 20 20 20 20 20 20 63 68 61  Iter);.      cha
20870 72 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74  r *z = (char*)ft
20880 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
20890 70 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20  pIter, &n);..   
208a0 20 20 20 66 6f 72 28 66 74 73 35 50 6f 73 49 74     for(fts5PosIt
208b0 65 72 49 6e 69 74 28 70 2c 20 70 49 74 65 72 2c  erInit(p, pIter,
208c0 20 26 73 50 6f 73 29 3b 0a 20 20 20 20 20 20 20   &sPos);.       
208d0 20 20 20 66 74 73 35 50 6f 73 49 74 65 72 45 6f     fts5PosIterEo
208e0 66 28 70 2c 20 26 73 50 6f 73 29 3d 3d 30 3b 0a  f(p, &sPos)==0;.
208f0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50 6f            fts5Po
20900 73 49 74 65 72 4e 65 78 74 28 70 2c 20 26 73 50  sIterNext(p, &sP
20910 6f 73 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  os).      ){.   
20920 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66       cksum2 ^= f
20930 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
20940 75 6d 28 69 52 6f 77 69 64 2c 20 73 50 6f 73 2e  um(iRowid, sPos.
20950 69 43 6f 6c 2c 20 73 50 6f 73 2e 69 50 6f 73 2c  iCol, sPos.iPos,
20960 20 7a 2c 20 6e 29 3b 0a 23 69 66 20 30 0a 20 20   z, n);.#if 0.  
20970 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
20980 64 6f 75 74 2c 20 22 72 6f 77 69 64 3d 25 64 20  dout, "rowid=%d 
20990 22 2c 20 28 69 6e 74 29 69 52 6f 77 69 64 29 3b  ", (int)iRowid);
209a0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
209b0 28 73 74 64 6f 75 74 2c 20 22 74 65 72 6d 3d 25  (stdout, "term=%
209c0 2e 2a 73 20 22 2c 20 6e 2c 20 7a 29 3b 0a 20 20  .*s ", n, z);.  
209d0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
209e0 64 6f 75 74 2c 20 22 63 6f 6c 3d 25 64 20 22 2c  dout, "col=%d ",
209f0 20 73 50 6f 73 2e 69 43 6f 6c 29 3b 0a 20 20 20   sPos.iCol);.   
20a00 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
20a10 6f 75 74 2c 20 22 6f 66 66 3d 25 64 5c 6e 22 2c  out, "off=%d\n",
20a20 20 73 50 6f 73 2e 69 50 6f 73 29 3b 0a 20 20 20   sPos.iPos);.   
20a30 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64 6f       fflush(stdo
20a40 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ut);.#endif.    
20a50 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
20a60 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
20a70 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 66  p, pIter);.    f
20a80 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
20a90 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
20aa0 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  }.  if( p->rc==S
20ab0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
20ac0 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  m!=cksum2 ) p->r
20ad0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
20ae0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ;..  return fts5
20af0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
20b00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  }.../*.** Indica
20b10 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  te that all subs
20b20 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
20b30 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
20b40 57 72 69 74 65 28 29 20 70 65 72 74 61 69 6e 0a  Write() pertain.
20b50 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65  ** to the docume
20b60 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20 69 52  nt with rowid iR
20b70 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  owid..*/.int sql
20b80 69 74 65 33 46 74 73 35 49 6e 64 65 78 42 65 67  ite3Fts5IndexBeg
20b90 69 6e 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  inWrite(Fts5Inde
20ba0 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
20bb0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
20bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
20bd0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
20be0 68 61 73 68 20 74 61 62 6c 65 73 20 69 66 20 74  hash tables if t
20bf0 68 65 79 20 68 61 76 65 20 6e 6f 74 20 61 6c 72  hey have not alr
20c00 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
20c10 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ted */.  if( p->
20c20 61 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  apHash==0 ){.   
20c30 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
20c40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20c50 20 20 20 20 69 6e 74 20 6e 48 61 73 68 20 3d 20      int nHash = 
20c60 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  p->pConfig->nPre
20c70 66 69 78 20 2b 20 31 3b 0a 20 20 20 20 46 74 73  fix + 1;.    Fts
20c80 35 48 61 73 68 20 2a 2a 61 70 4e 65 77 3b 0a 0a  5Hash **apNew;..
20c90 20 20 20 20 61 70 4e 65 77 20 3d 20 28 46 74 73      apNew = (Fts
20ca0 35 48 61 73 68 2a 2a 29 73 71 6c 69 74 65 33 46  5Hash**)sqlite3F
20cb0 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
20cc0 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 48 61  c, sizeof(Fts5Ha
20cd0 73 68 2a 29 2a 6e 48 61 73 68 29 3b 0a 20 20 20  sh*)*nHash);.   
20ce0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
20cf0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 48 61  LITE_OK && i<nHa
20d00 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  sh; i++){.      
20d10 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
20d20 48 61 73 68 4e 65 77 28 26 61 70 4e 65 77 5b 69  HashNew(&apNew[i
20d30 5d 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  ], &p->nPendingD
20d40 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata);.    }.    
20d50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20d60 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 70  K ){.      p->ap
20d70 48 61 73 68 20 3d 20 61 70 4e 65 77 3b 0a 20 20  Hash = apNew;.  
20d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
20d90 66 28 20 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  f( apNew ){.    
20da0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
20db0 48 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Hash; i++){.    
20dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
20dd0 35 48 61 73 68 46 72 65 65 28 61 70 4e 65 77 5b  5HashFree(apNew[
20de0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
20df0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
20e00 72 65 65 28 61 70 4e 65 77 29 3b 0a 20 20 20 20  ree(apNew);.    
20e10 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
20e20 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
20e30 20 20 69 66 28 20 69 52 6f 77 69 64 3c 3d 70 2d    if( iRowid<=p-
20e40 3e 69 57 72 69 74 65 52 6f 77 69 64 20 7c 7c 20  >iWriteRowid || 
20e50 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  (p->nPendingData
20e60 20 3e 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e   > p->nMaxPendin
20e70 67 44 61 74 61 29 20 29 7b 0a 20 20 20 20 66 74  gData) ){.    ft
20e80 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b  s5IndexFlush(p);
20e90 0a 20 20 7d 0a 20 20 70 2d 3e 69 57 72 69 74 65  .  }.  p->iWrite
20ea0 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
20eb0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
20ec0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
20ed0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74  /*.** Commit dat
20ee0 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  a to disk..*/.in
20ef0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
20f00 65 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78  exSync(Fts5Index
20f10 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74   *p, int bCommit
20f20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
20f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
20f40 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  .  fts5IndexFlus
20f50 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d  h(p);.  if( bCom
20f60 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52  mit ) fts5CloseR
20f70 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75  eader(p);.  retu
20f80 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
20f90 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
20fa0 44 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61  Discard any data
20fb0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
20fc0 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
20fd0 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69  bles. Do not wri
20fe0 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20  te it.** to the 
20ff0 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69  database. Additi
21000 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74  onally, assume t
21010 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
21020 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a   of the %_data.*
21030 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65  * table may have
21040 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b   changed on disk
21050 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f  . So any in-memo
21060 72 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64  ry caches of %_d
21070 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20  ata .** records 
21080 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61  must be invalida
21090 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
210a0 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c  te3Fts5IndexRoll
210b0 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a  back(Fts5Index *
210c0 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52  p){.  fts5CloseR
210d0 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35  eader(p);.  fts5
210e0 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61  IndexDiscardData
210f0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
21100 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
21110 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21120 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21130 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  The %_data table
21140 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   is completely e
21150 6d 70 74 79 20 77 68 65 6e 20 74 68 69 73 20 66  mpty when this f
21160 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
21170 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  d. This.** funct
21180 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74  ion populates it
21190 20 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61   with the initia
211a0 6c 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  l structure obje
211b0 63 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64  cts for each ind
211c0 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  ex,.** and the i
211d0 6e 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f  nitial version o
211e0 66 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22  f the "averages"
211f0 20 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d   record (a zero-
21200 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69  byte blob)..*/.i
21210 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
21220 64 65 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e  dexReinit(Fts5In
21230 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dex *p){.  int i
21240 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
21250 65 20 73 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  e s;..  memset(&
21260 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  s, 0, sizeof(Fts
21270 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20 20  5Structure));.  
21280 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 43  for(i=0; i<p->pC
21290 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 2b 31  onfig->nPrefix+1
212a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35  ; i++){.    fts5
212b0 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
212c0 2c 20 69 2c 20 26 73 29 3b 0a 20 20 7d 0a 20 20  , i, &s);.  }.  
212d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
212e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 72  E_OK ){.    p->r
212f0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
21300 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28  ndexSetAverages(
21310 70 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22  p, (const u8*)""
21320 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
21330 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
21340 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
21350 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35   Open a new Fts5
21360 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66  Index handle. If
21370 20 74 68 65 20 62 43 72 65 61 74 65 20 61 72 67   the bCreate arg
21380 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63  ument is true, c
21390 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69  reate.** and ini
213a0 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  tialize the unde
213b0 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61  rlying %_data ta
213c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ble..**.** If su
213d0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
213e0 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  p to point to th
213f0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64  e new object and
21400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21410 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  K..** Otherwise,
21420 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
21430 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
21440 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
21450 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21460 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20  Fts5IndexOpen(. 
21470 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
21480 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72  nfig, .  int bCr
21490 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64  eate, .  Fts5Ind
214a0 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20  ex **pp,.  char 
214b0 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74  **pzErr.){.  int
214c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
214d0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b  .  Fts5Index *p;
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
21500 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d   */..  *pp = p =
21510 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c   (Fts5Index*)sql
21520 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
21530 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a  of(Fts5Index));.
21540 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
21550 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
21560 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
21570 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78  sizeof(Fts5Index
21580 29 29 3b 0a 20 20 70 2d 3e 70 43 6f 6e 66 69 67  ));.  p->pConfig
21590 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 70 2d   = pConfig;.  p-
215a0 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53  >nWorkUnit = FTS
215b0 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 70  5_WORK_UNIT;.  p
215c0 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74  ->nMaxPendingDat
215d0 61 20 3d 20 31 30 32 34 2a 31 30 32 34 3b 0a 20  a = 1024*1024;. 
215e0 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73   p->zDataTbl = s
215f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
21600 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69  %s_data", pConfi
21610 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  g->zName);.  if(
21620 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d 30 20   p->zDataTbl==0 
21630 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
21640 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
21650 65 20 69 66 28 20 62 43 72 65 61 74 65 20 29 7b  e if( bCreate ){
21660 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21670 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
21680 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69  (.        pConfi
21690 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49  g, "data", "id I
216a0 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
216b0 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c  EY, block BLOB",
216c0 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 29 3b   0, pzErr.    );
216d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
216e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
216f0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
21700 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a  IndexReinit(p);.
21710 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
21720 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
21730 54 45 5f 4f 4b 20 7c 7c 20 72 63 21 3d 53 51 4c  TE_OK || rc!=SQL
21740 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
21750 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
21760 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
21770 70 2c 20 30 29 3b 0a 20 20 20 20 2a 70 70 20 3d  p, 0);.    *pp =
21780 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
21790 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
217a0 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65  ose a handle ope
217b0 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
217c0 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
217d0 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29  3Fts5IndexOpen()
217e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
217f0 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46  Fts5IndexClose(F
21800 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
21810 20 62 44 65 73 74 72 6f 79 29 7b 0a 20 20 69 6e   bDestroy){.  in
21820 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21830 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
21840 20 69 66 28 20 62 44 65 73 74 72 6f 79 20 29 7b   if( bDestroy ){
21850 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
21860 74 65 33 46 74 73 35 44 72 6f 70 54 61 62 6c 65  te3Fts5DropTable
21870 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 22 64 61  (p->pConfig, "da
21880 74 61 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ta");.    }.    
21890 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64  assert( p->pRead
218a0 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  er==0 );.    sql
218b0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
218c0 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73  >pWriter);.    s
218d0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
218e0 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20  p->pDeleter);.  
218f0 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 20    if( p->apHash 
21900 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
21910 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21920 3c 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50  <=p->pConfig->nP
21930 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  refix; i++){.   
21940 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
21950 48 61 73 68 46 72 65 65 28 70 2d 3e 61 70 48 61  HashFree(p->apHa
21960 73 68 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  sh[i]);.      }.
21970 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21980 65 65 28 70 2d 3e 61 70 48 61 73 68 29 3b 0a 20  ee(p->apHash);. 
21990 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
219a0 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62  _free(p->zDataTb
219b0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
219c0 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  free(p);.  }.  r
219d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
219e0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f  ** Argument p po
219f0 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
21a00 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d   containing utf-
21a10 38 20 74 65 78 74 20 74 68 61 74 20 69 73 20 6e  8 text that is n
21a20 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69   bytes in .** si
21a30 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ze. Return the n
21a40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
21a50 6e 20 74 68 65 20 6e 43 68 61 72 20 63 68 61 72  n the nChar char
21a60 61 63 74 65 72 20 70 72 65 66 69 78 20 6f 66 20  acter prefix of 
21a70 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f  the.** buffer, o
21a80 72 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  r 0 if there are
21a90 20 6c 65 73 73 20 74 68 61 6e 20 6e 43 68 61 72   less than nChar
21aa0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
21ab0 6f 74 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  otal..*/.static 
21ac0 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61  int fts5IndexCha
21ad0 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28 63 6f  rlenToBytelen(co
21ae0 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 69 6e 74  nst char *p, int
21af0 20 6e 42 79 74 65 2c 20 69 6e 74 20 6e 43 68 61   nByte, int nCha
21b00 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  r){.  int n = 0;
21b10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
21b20 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b  i=0; i<nChar; i+
21b30 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e  +){.    if( n>=n
21b40 42 79 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Byte ) return 0;
21b50 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
21b60 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74 68  ontains fewer th
21b70 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a  an nChar chars *
21b80 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67  /.    if( (unsig
21b90 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e  ned char)p[n++]>
21ba0 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77  =0xc0 ){.      w
21bb0 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78  hile( (p[n] & 0x
21bc0 63 30 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b  c0)==0x80 ) n++;
21bd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21be0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
21bf0 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65  pIn is a UTF-8 e
21c00 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e  ncoded string, n
21c10 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  In bytes in size
21c20 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
21c30 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64  ber of.** unicod
21c40 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  e characters in 
21c50 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 69  the string..*/.i
21c60 6e 74 20 66 74 73 35 49 6e 64 65 78 43 68 61 72  nt fts5IndexChar
21c70 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  len(const char *
21c80 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20  pIn, int nIn){. 
21c90 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20   int nChar = 0; 
21ca0 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e             .  in
21cb0 74 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  t i = 0;.  while
21cc0 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69  ( i<nIn ){.    i
21cd0 66 28 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  f( (unsigned cha
21ce0 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30  r)pIn[i++]>=0xc0
21cf0 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
21d00 20 69 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69   i<nIn && (pIn[i
21d10 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
21d20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ) i++;.    }.   
21d30 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20   nChar++;.  }.  
21d40 72 65 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a  return nChar;.}.
21d50 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74 65  ./*.** Calculate
21d60 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
21d70 65 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20 74  ecksum that is t
21d80 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69 6e  he XOR of the in
21d90 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68 65  dex entry.** che
21da0 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74  cksum of all ent
21db0 72 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20  ries that would 
21dc0 62 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  be generated by 
21dd0 74 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69 66  the token specif
21de0 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 69  ied.** by the fi
21df0 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73 2e  nal 5 arguments.
21e00 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46  .*/.u64 sqlite3F
21e10 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a 20  ts5IndexCksum(. 
21e20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
21e30 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20  nfig,           
21e40 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
21e50 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  n object */.  i6
21e60 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21e80 20 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20 61   Document term a
21e90 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69  ppears in */.  i
21ea0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21ec0 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61 70  * Column term ap
21ed0 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e  pears in */.  in
21ee0 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  t iPos,         
21ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21f00 20 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20 61   Position term a
21f10 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 63  ppears in */.  c
21f20 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d  onst char *pTerm
21f30 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 2f  , int nTerm    /
21f40 2a 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20 2a  * Term at iPos *
21f50 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20 3d  /.){.  u64 ret =
21f60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
21f70 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
21f80 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
21f90 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
21fb0 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
21fc0 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
21fd0 0a 20 20 72 65 74 20 3d 20 66 74 73 35 49 6e 64  .  ret = fts5Ind
21fe0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
21ff0 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
22000 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a   pTerm, nTerm);.
22010 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69  .  for(iIdx=0; i
22020 49 64 78 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  Idx<pConfig->nPr
22030 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
22040 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 66     int nByte = f
22050 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54  ts5IndexCharlenT
22060 6f 42 79 74 65 6c 65 6e 28 70 54 65 72 6d 2c 20  oBytelen(pTerm, 
22070 6e 54 65 72 6d 2c 20 70 43 6f 6e 66 69 67 2d 3e  nTerm, pConfig->
22080 61 50 72 65 66 69 78 5b 69 49 64 78 5d 29 3b 0a  aPrefix[iIdx]);.
22090 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
220a0 0a 20 20 20 20 20 20 72 65 74 20 5e 3d 20 66 74  .      ret ^= ft
220b0 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
220c0 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  m(iRowid, iCol, 
220d0 69 50 6f 73 2c 20 70 54 65 72 6d 2c 20 6e 42 79  iPos, pTerm, nBy
220e0 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  te);.    }.  }..
220f0 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
22100 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
22110 20 72 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20   remove data to 
22120 6f 72 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  or from the inde
22130 78 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20 64  x. Each time a d
22140 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61  ocument is .** a
22150 64 64 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76  dded to or remov
22160 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65  ed from the inde
22170 78 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  x, this function
22180 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f   is called one o
22190 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e  r more.** times.
221a0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  .**.** For an in
221b0 73 65 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65  sert, it must be
221c0 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
221d0 20 65 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74   each token in t
221e0 68 65 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e  he new document.
221f0 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61  .** If the opera
22200 74 69 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65  tion is a delete
22210 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
22220 6c 65 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f  led (at least) o
22230 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  nce for each.** 
22240 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20  unique token in 
22250 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
22260 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20  h an iCol value 
22270 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20  less than zero. 
22280 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75  The iPos.** argu
22290 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20  ment is ignored 
222a0 66 6f 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f  for a delete..*/
222b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
222c0 49 6e 64 65 78 57 72 69 74 65 28 0a 20 20 46 74  IndexWrite(.  Ft
222d0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
222f0 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20   Index to write 
22300 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  to */.  int iCol
22310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22320 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
22330 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20  n token appears 
22340 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74  in (-ve -> delet
22350 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73  e) */.  int iPos
22360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22370 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
22380 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74  ion of token wit
22390 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  hin column */.  
223a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
223b0 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20  en, int nToken  
223c0 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20  /* Token to add 
223d0 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20  or remove to or 
223e0 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b  from index */.){
223f0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
22400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22410 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
22420 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e  erate through in
22430 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  dexes */.  int r
22440 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
22450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22460 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
22470 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
22480 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
22490 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
224a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
224b0 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65  .  /* Add the ne
224c0 77 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65 20 6d  w token to the m
224d0 61 69 6e 20 74 65 72 6d 73 20 68 61 73 68 20 74  ain terms hash t
224e0 61 62 6c 65 2e 20 41 6e 64 20 74 6f 20 65 61 63  able. And to eac
224f0 68 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 70 72  h of the.  ** pr
22500 65 66 69 78 20 68 61 73 68 20 74 61 62 6c 65 73  efix hash tables
22510 20 74 68 61 74 20 69 74 20 69 73 20 6c 61 72 67   that it is larg
22520 65 20 65 6e 6f 75 67 68 20 66 6f 72 2e 20 2a 2f  e enough for. */
22530 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  .  rc = sqlite3F
22540 74 73 35 48 61 73 68 57 72 69 74 65 28 0a 20 20  ts5HashWrite(.  
22550 20 20 20 20 70 2d 3e 61 70 48 61 73 68 5b 30 5d      p->apHash[0]
22560 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64  , p->iWriteRowid
22570 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54  , iCol, iPos, pT
22580 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29  oken, nToken.  )
22590 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
225a0 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
225b0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
225c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
225d0 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e 64 65  nByte = fts5Inde
225e0 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
225f0 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  n(pToken, nToken
22600 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  , pConfig->aPref
22610 69 78 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ix[i]);.    if( 
22620 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72  nByte ){.      r
22630 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
22640 61 73 68 57 72 69 74 65 28 0a 20 20 20 20 20 20  ashWrite(.      
22650 20 20 20 20 70 2d 3e 61 70 48 61 73 68 5b 69 2b      p->apHash[i+
22660 31 5d 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  1], p->iWriteRow
22670 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
22680 70 54 6f 6b 65 6e 2c 20 6e 42 79 74 65 0a 20 20  pToken, nByte.  
22690 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
226a0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
226b0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
226c0 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69  ew iterator to i
226d0 74 65 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c  terate though al
226e0 6c 20 64 6f 63 69 64 73 20 74 68 61 74 20 6d 61  l docids that ma
226f0 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70 65 63  tch the .** spec
22700 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74  ified token or t
22710 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a  oken prefix..*/.
22720 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
22730 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46 74 73  ndexQuery(.  Fts
22740 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
22750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22760 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65  FTS index to que
22770 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ry */.  const ch
22780 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20  ar *pToken, int 
22790 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e  nToken, /* Token
227a0 20 28 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20   (or prefix) to 
227b0 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  query for */.  i
227c0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
227e0 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e  * Mask of FTS5IN
227f0 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67  DEX_QUERY_X flag
22800 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  s */.  Fts5Index
22810 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
22820 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
22830 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  ew iterator obje
22840 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49  ct */.){.  Fts5I
22850 6e 64 65 78 49 74 65 72 20 2a 70 52 65 74 3b 0a  ndexIter *pRet;.
22860 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
22870 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46  .  if( flags & F
22880 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
22890 52 45 46 49 58 20 29 7b 0a 20 20 20 20 46 74 73  REFIX ){.    Fts
228a0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
228b0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
228c0 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20 66     int nChar = f
228d0 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28  ts5IndexCharlen(
228e0 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
228f0 0a 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b  .    for(iIdx=1;
22900 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e   iIdx<=pConfig->
22910 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29  nPrefix; iIdx++)
22920 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  {.      if( pCon
22930 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
22940 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72  x-1]==nChar ) br
22950 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
22960 66 28 20 69 49 64 78 3e 70 43 6f 6e 66 69 67 2d  f( iIdx>pConfig-
22970 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20  >nPrefix ){.    
22980 20 20 69 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20    iIdx = -1;.   
22990 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d   }.  }..  pRet =
229a0 20 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a   (Fts5IndexIter*
229b0 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
229c0 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 73  ocZero(&p->rc, s
229d0 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49  izeof(Fts5IndexI
229e0 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70 52 65  ter));.  if( pRe
229f0 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t ){.    memset(
22a00 70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pRet, 0, sizeof(
22a10 46 74 73 35 49 6e 64 65 78 49 74 65 72 29 29 3b  Fts5IndexIter));
22a20 0a 0a 20 20 20 20 70 52 65 74 2d 3e 70 49 6e 64  ..    pRet->pInd
22a30 65 78 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20  ex = p;.    if( 
22a40 69 49 64 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iIdx>=0 ){.     
22a50 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74 20 3d   pRet->pStruct =
22a60 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
22a70 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20  ad(p, iIdx);.   
22a80 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 53 74     if( pRet->pSt
22a90 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ruct ){.        
22aa0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
22ab0 28 70 2c 20 70 52 65 74 2d 3e 70 53 74 72 75 63  (p, pRet->pStruc
22ac0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
22ad0 69 49 64 78 2c 20 31 2c 20 66 6c 61 67 73 2c 20  iIdx, 1, flags, 
22ae0 28 63 6f 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65  (const u8*)pToke
22af0 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30  n, nToken, -1, 0
22b00 2c 20 26 70 52 65 74 2d 3e 70 4d 75 6c 74 69 0a  , &pRet->pMulti.
22b10 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
22b20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
22b30 20 20 20 20 69 6e 74 20 62 44 65 73 63 20 3d 20      int bDesc = 
22b40 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
22b50 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 21 3d  EX_QUERY_DESC)!=
22b60 30 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74  0;.      fts5Set
22b70 75 70 50 72 65 66 69 78 49 74 65 72 28 70 2c 20  upPrefixIter(p, 
22b80 62 44 65 73 63 2c 20 28 63 6f 6e 73 74 20 75 38  bDesc, (const u8
22b90 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  *)pToken, nToken
22ba0 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20  , pRet);.    }. 
22bb0 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 20   }..  if( p->rc 
22bc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
22bd0 73 35 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74  s5IterClose(pRet
22be0 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  );.    pRet = 0;
22bf0 0a 20 20 7d 0a 20 20 2a 70 70 49 74 65 72 20 3d  .  }.  *ppIter =
22c00 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20   pRet;.  return 
22c10 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
22c20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
22c30 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
22c40 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
22c50 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
22c60 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a  ment is at EOF..
22c70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22c80 73 35 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  s5IterEof(Fts5In
22c90 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
22ca0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
22cb0 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
22cc0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
22cd0 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
22ce0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
22cf0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d  pIter->pDoclist-
22d00 3e 61 50 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a 20  >aPoslist==0; . 
22d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
22d20 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  rn fts5MultiIter
22d30 45 6f 66 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  Eof(pIter->pInde
22d40 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69  x, pIter->pMulti
22d50 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
22d60 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
22d70 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e   matching rowid.
22d80 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
22d90 46 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73  Fts5IterNext(Fts
22da0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
22db0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  r){.  assert( pI
22dc0 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
22dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
22de0 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
22df0 69 73 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44  ist ){.    fts5D
22e00 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
22e10 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b  Iter->pDoclist);
22e20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
22e30 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49  s5BufferZero(&pI
22e40 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
22e50 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
22e60 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64  Next(pIter->pInd
22e70 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74  ex, pIter->pMult
22e80 69 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  i, 0, 0);.  }.  
22e90 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
22ea0 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
22eb0 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
22ec0 4d 6f 76 65 20 74 68 65 20 64 6f 63 6c 69 73 74  Move the doclist
22ed0 2d 69 74 65 72 20 70 61 73 73 65 64 20 61 73 20  -iter passed as 
22ee0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
22ef0 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20 0a  nt to the next .
22f00 2a 2a 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69  ** matching rowi
22f10 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  d that occurs at
22f20 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68   or after iMatch
22f30 2e 20 54 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  . The definition
22f40 20 6f 66 20 22 61 74 20 0a 2a 2a 20 6f 72 20 61   of "at .** or a
22f50 66 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e  fter" depends on
22f60 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74   whether this it
22f70 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 20  erator iterates 
22f80 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20  in ascending or 
22f90 0a 2a 2a 20 64 65 73 63 65 6e 64 69 6e 67 20 72  .** descending r
22fa0 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  owid order..*/.s
22fb0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
22fc0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72  oclistIterNextFr
22fd0 6f 6d 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74  om(Fts5DoclistIt
22fe0 65 72 20 2a 70 2c 20 69 36 34 20 69 4d 61 74 63  er *p, i64 iMatc
22ff0 68 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36  h){.  do{.    i6
23000 34 20 69 52 6f 77 69 64 20 3d 20 70 2d 3e 69 52  4 iRowid = p->iR
23010 6f 77 69 64 3b 0a 20 20 20 20 69 66 28 20 70 2d  owid;.    if( p-
23020 3e 62 44 65 73 63 3d 3d 30 20 26 26 20 69 52 6f  >bDesc==0 && iRo
23030 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
23040 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  eak;.    if( p->
23050 62 44 65 73 63 21 3d 30 20 26 26 20 69 52 6f 77  bDesc!=0 && iRow
23060 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
23070 61 6b 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c  ak;.    fts5Docl
23080 69 73 74 49 74 65 72 4e 65 78 74 28 70 29 3b 0a  istIterNext(p);.
23090 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e 61 50 6f    }while( p->aPo
230a0 73 6c 69 73 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  slist );.}../*.*
230b0 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65  * Move to the ne
230c0 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69  xt matching rowi
230d0 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  d that occurs at
230e0 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68   or after iMatch
230f0 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74  . The.** definit
23100 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66  ion of "at or af
23110 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20  ter" depends on 
23120 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65  whether this ite
23130 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a  rator iterates.*
23140 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
23150 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  r descending row
23160 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74  id order..*/.int
23170 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
23180 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64  NextFrom(Fts5Ind
23190 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  exIter *pIter, i
231a0 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 69 66  64 iMatch){.  if
231b0 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  ( pIter->pDoclis
231c0 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f 63  t ){.    fts5Doc
231d0 6c 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f 6d  listIterNextFrom
231e0 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74  (pIter->pDoclist
231f0 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 7d 65 6c  , iMatch);.  }el
23200 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74  se{.    fts5Mult
23210 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49  iIterNextFrom(pI
23220 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
23230 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61 74  er->pMulti, iMat
23240 63 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ch);.  }.  retur
23250 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
23260 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
23270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23280 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
23290 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  wid..*/.i64 sqli
232a0 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64  te3Fts5IterRowid
232b0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
232c0 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
232d0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b  ter->pDoclist ){
232e0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65  .    return pIte
232f0 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 69 52 6f  r->pDoclist->iRo
23300 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
23310 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c    return fts5Mul
23320 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65  tiIterRowid(pIte
23330 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a  r->pMulti);.  }.
23340 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
23350 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
23360 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
23370 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  g a copy of the 
23380 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f  position list fo
23390 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  r.** the current
233a0 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74 20 76   entry. Output v
233b0 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73 20 73  ariable *pn is s
233c0 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
233d0 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a  f the buffer .**
233e0 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65   in bytes before
233f0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
23400 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 62  * The returned b
23410 75 66 66 65 72 20 64 6f 65 73 20 6e 6f 74 20 69  uffer does not i
23420 6e 63 6c 75 64 65 20 74 68 65 20 30 78 30 30 20  nclude the 0x00 
23430 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
23440 73 74 6f 72 65 64 20 6f 6e 0a 2a 2a 20 64 69 73  stored on.** dis
23450 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
23460 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74  3Fts5IterPoslist
23470 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
23480 70 49 74 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  pIter, const u8 
23490 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a  **pp, int *pn){.
234a0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
234b0 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c  >pIndex->rc==SQL
234c0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20  ITE_OK );.  if( 
234d0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20  pIter->pDoclist 
234e0 29 7b 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49 74  ){.    *pn = pIt
234f0 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 6e 50  er->pDoclist->nP
23500 6f 73 6c 69 73 74 3b 0a 20 20 20 20 2a 70 70 20  oslist;.    *pp 
23510 3d 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  = pIter->pDoclis
23520 74 2d 3e 61 50 6f 73 6c 69 73 74 3b 0a 20 20 7d  t->aPoslist;.  }
23530 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 49 6e  else{.    Fts5In
23540 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e  dex *p = pIter->
23550 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
23560 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
23570 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
23580 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f   fts5MultiIterPo
23590 73 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e  slist(p, pIter->
235a0 70 4d 75 6c 74 69 2c 20 30 2c 20 26 70 49 74 65  pMulti, 0, &pIte
235b0 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
235c0 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pn = pIter->po
235d0 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 2a 70 70  slist.n;.    *pp
235e0 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
235f0 74 2e 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t.p;.  }.  retur
23600 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
23610 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
23620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
23630 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65   an iterator ope
23640 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
23650 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
23660 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
23670 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
23680 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
23690 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
236a0 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
236b0 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  er ){.    if( pI
236c0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b  ter->pDoclist ){
236d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
236e0 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c  ree(pIter->pDocl
236f0 69 73 74 2d 3e 61 29 3b 0a 20 20 20 20 20 20 73  ist->a);.      s
23700 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
23710 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20  r->pDoclist);.  
23720 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
23730 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
23740 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
23750 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a  pIter->pMulti);.
23760 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
23770 75 72 65 52 65 6c 65 61 73 65 28 70 49 74 65 72  ureRelease(pIter
23780 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  ->pStruct);.    
23790 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
237a0 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
237b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
237c0 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49 74  5CloseReader(pIt
237d0 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 20 20 20  er->pIndex);.   
237e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
237f0 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
23800 2a 2a 20 52 65 61 64 20 74 68 65 20 22 61 76 65  ** Read the "ave
23810 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 69 6e  rages" record in
23820 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73 75  to the buffer su
23830 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65  pplied as the se
23840 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
23850 74 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  t. Return SQLITE
23860 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
23870 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
23880 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 66  error code.** if
23890 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
238a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
238b0 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65 72  Fts5IndexGetAver
238c0 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ages(Fts5Index *
238d0 70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  p, Fts5Buffer *p
238e0 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
238f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
23900 20 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65   );.  fts5DataRe
23910 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20 70 42  adOrBuffer(p, pB
23920 75 66 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  uf, FTS5_AVERAGE
23930 53 5f 52 4f 57 49 44 29 3b 0a 20 20 72 65 74 75  S_ROWID);.  retu
23940 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
23950 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
23960 52 65 70 6c 61 63 65 20 74 68 65 20 63 75 72 72  Replace the curr
23970 65 6e 74 20 22 61 76 65 72 61 67 65 73 22 20 72  ent "averages" r
23980 65 63 6f 72 64 20 77 69 74 68 20 74 68 65 20 63  ecord with the c
23990 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
239a0 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69  uffer .** suppli
239b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
239c0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
239d0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
239e0 65 78 53 65 74 41 76 65 72 61 67 65 73 28 46 74  exSetAverages(Ft
239f0 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73  s5Index *p, cons
23a00 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74  t u8 *pData, int
23a10 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73 65 72   nData){.  asser
23a20 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
23a30 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44 61 74  _OK );.  fts5Dat
23a40 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41  aWrite(p, FTS5_A
23a50 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70  VERAGES_ROWID, p
23a60 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
23a70 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
23a80 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
23a90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
23aa0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
23ab0 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75 6c  locks this modul
23ac0 65 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d 20  e has read from 
23ad0 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61  the %_data.** ta
23ae0 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61 73  ble since it was
23af0 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74   created..*/.int
23b00 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
23b10 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65 78  xReads(Fts5Index
23b20 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
23b30 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->nRead;.}../*.*
23b40 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62 69 74  * Set the 32-bit
23b50 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73 74   cookie value st
23b60 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
23b70 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63 74 75  t of all structu
23b80 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  re .** records t
23b90 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
23ba0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
23bb0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
23bc0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
23bd0 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
23be0 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
23bf0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
23c00 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  rror.** occurs..
23c10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
23c20 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65  s5IndexSetCookie
23c30 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
23c40 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74 20  nt iNew){.  int 
23c50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23c60 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
23c70 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
23c80 69 67 3b 0a 20 20 75 38 20 61 43 6f 6f 6b 69 65  ig;.  u8 aCookie
23c90 5b 34 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  [4];.  int i;.. 
23ca0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
23cb0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
23cc0 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
23cd0 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a  aCookie, iNew);.
23ce0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
23cf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 70  QLITE_OK && i<=p
23d00 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
23d10 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
23d20 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d  e3_blob *pBlob =
23d30 20 30 3b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   0;.    i64 iRow
23d40 69 64 20 3d 20 46 54 53 35 5f 53 54 52 55 43 54  id = FTS5_STRUCT
23d50 55 52 45 5f 52 4f 57 49 44 28 69 29 3b 0a 20 20  URE_ROWID(i);.  
23d60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
23d70 6c 6f 62 5f 6f 70 65 6e 28 0a 20 20 20 20 20 20  lob_open(.      
23d80 20 20 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70    pConfig->db, p
23d90 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
23da0 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b  zDataTbl, "block
23db0 22 2c 20 69 52 6f 77 69 64 2c 20 31 2c 20 26 70  ", iRowid, 1, &p
23dc0 42 6c 6f 62 0a 20 20 20 20 29 3b 0a 20 20 20 20  Blob.    );.    
23dd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23de0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
23df0 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42  e3_blob_write(pB
23e00 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c  lob, aCookie, 4,
23e10 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   0);.      rc = 
23e20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
23e30 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20 20 20 7d  se(pBlob);.    }
23e40 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
23e50 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
23e60 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f  3Fts5IndexLoadCo
23e70 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a  nfig(Fts5Index *
23e80 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
23e90 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
23ea0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
23eb0 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 30  ructureRead(p, 0
23ec0 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
23ed0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
23ee0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
23ef0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
23f00 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
23f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
23f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c  *********.** Bel
23fa0 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73  ow this point is
23fb0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
23fc0 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f  ion of the fts5_
23fd0 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a  decode() scalar.
23fe0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  ** function only
23ff0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  ..*/../*.** Deco
24000 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74  de a segment-dat
24010 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65  a rowid from the
24020 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
24030 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
24040 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20  ** the opposite 
24050 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45  of macro FTS5_SE
24060 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a  GMENT_ROWID()..*
24070 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
24080 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20  s5DecodeRowid(. 
24090 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20   i64 iRowid,    
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25   /* Rowid from %
240c0 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
240d0 20 69 6e 74 20 2a 70 69 49 64 78 2c 20 20 20 20   int *piIdx,    
240e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240f0 20 2f 2a 20 4f 55 54 3a 20 49 6e 64 65 78 20 2a   /* OUT: Index *
24100 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64  /.  int *piSegid
24110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24120 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d      /* OUT: Segm
24130 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
24140 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20 20 20  *piHeight,      
24150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24160 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20  UT: Height */.  
24170 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20  int *piPgno     
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d  /* OUT: Page num
241a0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50  ber */.){.  *piP
241b0 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  gno = (int)(iRow
241c0 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
241d0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
241e0 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77  B) - 1));.  iRow
241f0 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
24200 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48  _PAGE_B;..  *piH
24210 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52  eight = (int)(iR
24220 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
24230 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49  << FTS5_DATA_HEI
24240 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  GHT_B) - 1));.  
24250 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
24260 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a  DATA_HEIGHT_B;..
24270 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e    *piSegid = (in
24280 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
24290 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
242a0 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 20  A_ID_B) - 1));. 
242b0 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
242c0 5f 44 41 54 41 5f 49 44 5f 42 3b 0a 0a 20 20 2a  _DATA_ID_B;..  *
242d0 70 69 49 64 78 20 3d 20 28 69 6e 74 29 28 69 52  piIdx = (int)(iR
242e0 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
242f0 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 58  << FTS5_DATA_IDX
24300 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74  _B) - 1));.}..st
24310 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
24320 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52  bugRowid(int *pR
24330 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  c, Fts5Buffer *p
24340 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a  Buf, i64 iKey){.
24350 20 20 69 6e 74 20 69 49 64 78 2c 69 53 65 67 69    int iIdx,iSegi
24360 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 3b  d,iHeight,iPgno;
24370 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65    /* Rowid compe
24380 6e 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44  nents */.  fts5D
24390 65 63 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c  ecodeRowid(iKey,
243a0 20 26 69 49 64 78 2c 20 26 69 53 65 67 69 64 2c   &iIdx, &iSegid,
243b0 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e   &iHeight, &iPgn
243c0 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69  o);..  if( iSegi
243d0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d==0 ){.    if( 
243e0 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41  iKey==FTS5_AVERA
243f0 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20  GES_ROWID ){.   
24400 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
24410 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
24420 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28 61 76  (pRc, pBuf, "(av
24430 65 72 61 67 65 73 29 20 22 29 3b 0a 20 20 20 20  erages) ");.    
24440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
24450 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
24460 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
24470 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20  pBuf, .         
24480 20 22 7b 73 74 72 75 63 74 75 72 65 20 69 64 78   "{structure idx
24490 3d 25 64 7d 22 2c 20 28 69 6e 74 29 28 69 4b 65  =%d}", (int)(iKe
244a0 79 2d 31 30 29 0a 20 20 20 20 20 20 29 3b 0a 20  y-10).      );. 
244b0 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 20     }.  }.  else 
244c0 69 66 28 20 69 48 65 69 67 68 74 3d 3d 46 54 53  if( iHeight==FTS
244d0 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45  5_SEGMENT_MAX_HE
244e0 49 47 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69  IGHT ){.    sqli
244f0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
24500 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
24510 42 75 66 2c 20 22 28 64 6c 69 64 78 20 69 64 78  Buf, "(dlidx idx
24520 3d 25 64 20 73 65 67 69 64 3d 25 64 20 70 67 6e  =%d segid=%d pgn
24530 6f 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20  o=%d)",.        
24540 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 50  iIdx, iSegid, iP
24550 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  gno.    );.  }el
24560 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  se{.    sqlite3F
24570 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
24580 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
24590 20 22 28 69 64 78 3d 25 64 20 73 65 67 69 64 3d   "(idx=%d segid=
245a0 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 29  %d h=%d pgno=%d)
245b0 22 2c 0a 20 20 20 20 20 20 20 20 69 49 64 78 2c  ",.        iIdx,
245c0 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74   iSegid, iHeight
245d0 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20  , iPgno.    );. 
245e0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
245f0 64 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63  d fts5DebugStruc
24600 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ture(.  int *pRc
24610 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24620 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
24630 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: error code */
24640 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
24650 42 75 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63  Buf,.  Fts5Struc
24660 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74  ture *p.){.  int
24670 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20   iLvl, iSeg;    
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24690 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
246a0 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73  levels, segments
246b0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d   */..  for(iLvl=
246c0 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65  0; iLvl<p->nLeve
246d0 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
246e0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
246f0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61  el *pLvl = &p->a
24700 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
24710 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
24720 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
24730 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20  Rc, pBuf, .     
24740 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65     " {lvl=%d nMe
24750 72 67 65 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70  rge=%d", iLvl, p
24760 4c 76 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20 20 20  Lvl->nMerge.    
24770 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d  );.    for(iSeg=
24780 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53  0; iSeg<pLvl->nS
24790 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
247a0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
247b0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
247c0 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
247d0 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
247e0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
247f0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
24800 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 7b  , .          " {
24810 69 64 3d 25 64 20 68 3d 25 64 20 6c 65 61 76 65  id=%d h=%d leave
24820 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67  s=%d..%d}", pSeg
24830 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e  ->iSegid, pSeg->
24840 6e 48 65 69 67 68 74 2c 20 0a 20 20 20 20 20 20  nHeight, .      
24850 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
24860 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  rst, pSeg->pgnoL
24870 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ast.      );.   
24880 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
24890 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
248a0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
248b0 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  "}");.  }.}../*.
248c0 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20  ** This is part 
248d0 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
248e0 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61  de() debugging a
248f0 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  id..**.** Argume
24900 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20  nts pBlob/nBlob 
24910 63 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c  contain a serial
24920 69 7a 65 64 20 46 74 73 35 53 74 72 75 63 74 75  ized Fts5Structu
24930 72 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a  re object. This.
24940 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
24950 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  nds a human-read
24960 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
24970 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ion of the same 
24980 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65  object.** to the
24990 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 61   buffer passed a
249a0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
249b0 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  ument. .*/.stati
249c0 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
249d0 65 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  eStructure(.  in
249e0 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24a00 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
24a10 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
24a20 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e  fer *pBuf,.  con
24a30 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e  st u8 *pBlob, in
24a40 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74  t nBlob.){.  int
24a50 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
24a80 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
24a90 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
24aa0 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75   /* Decoded stru
24ab0 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cture object */.
24ac0 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75  .  rc = fts5Stru
24ad0 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f  ctureDecode(pBlo
24ae0 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29  b, nBlob, 0, &p)
24af0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
24b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
24b10 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  c = rc;.    retu
24b20 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  rn;.  }..  fts5D
24b30 65 62 75 67 53 74 72 75 63 74 75 72 65 28 70 52  ebugStructure(pR
24b40 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66  c, pBuf, p);.  f
24b50 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
24b60 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ase(p);.}../*.**
24b70 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73   Buffer (a/n) is
24b80 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
24b90 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65  ain a list of se
24ba0 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73  rialized varints
24bb0 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76  . Read.** each v
24bc0 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64  arint and append
24bd0 20 69 74 73 20 73 74 72 69 6e 67 20 72 65 70 72   its string repr
24be0 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75  esentation to bu
24bf0 66 66 65 72 20 70 42 75 66 2e 20 52 65 74 75 72  ffer pBuf. Retur
24c00 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65  n.** after eithe
24c10 72 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  r the input buff
24c20 65 72 20 69 73 20 65 78 68 61 75 73 74 65 64 20  er is exhausted 
24c30 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69 73 20  or a 0 value is 
24c40 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  read..**.** The 
24c50 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
24c60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
24c70 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  tes read from th
24c80 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a  e input buffer..
24c90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
24ca0 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
24cb0 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75  int *pRc, Fts5Bu
24cc0 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73  ffer *pBuf, cons
24cd0 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b  t u8 *a, int n){
24ce0 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b  .  int iOff = 0;
24cf0 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e  .  while( iOff<n
24d00 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c   ){.    int iVal
24d10 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
24d20 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
24d30 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20  [iOff], iVal);. 
24d40 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
24d50 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
24d60 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64  (pRc, pBuf, " %d
24d70 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20  ", iVal);.  }.  
24d80 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a  return iOff;.}..
24d90 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20  /*.** The start 
24da0 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20  of buffer (a/n) 
24db0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61  contains the sta
24dc0 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e  rt of a doclist.
24dd0 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20   The doclist.** 
24de0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66  may or may not f
24df0 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74 68 65  inish within the
24e00 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75   buffer. This fu
24e10 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
24e20 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65   text.** represe
24e30 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
24e40 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  art of the docli
24e50 73 74 20 74 68 61 74 20 69 73 20 70 72 65 73 65  st that is prese
24e60 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20  nt to buffer.** 
24e70 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pBuf. .**.** The
24e80 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
24e90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
24ea0 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ytes read from t
24eb0 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e  he input buffer.
24ec0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
24ed0 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
24ee0 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
24ef0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e  uffer *pBuf, con
24f00 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29  st u8 *a, int n)
24f10 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64 3b 0a  {.  i64 iDocid;.
24f20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
24f30 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b  .  if( iOff<n ){
24f40 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c  .    iOff += sql
24f50 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
24f60 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
24f70 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Docid);.    sqli
24f80 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
24f90 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
24fa0 42 75 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c  Buf, " rowid=%ll
24fb0 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d  d", iDocid);.  }
24fc0 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e  .  while( iOff<n
24fd0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   ){.    int nPos
24fe0 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
24ff0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
25000 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20  [iOff], nPos);. 
25010 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
25020 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52 63  ecodePoslist(pRc
25030 2c 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d  , pBuf, &a[iOff]
25040 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50  , MIN(n-iOff, nP
25050 6f 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f  os));.    if( iO
25060 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36  ff<n ){.      i6
25070 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
25080 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
25090 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
250a0 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
250b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 65  );.      if( iDe
250c0 6c 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  lta==0 ) return 
250d0 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 44 6f 63  iOff;.      iDoc
250e0 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
250f0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
25100 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
25110 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 72  f(pRc, pBuf, " r
25120 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63  owid=%lld", iDoc
25130 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  id);.    }.  }..
25140 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d    return iOff;.}
25150 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
25160 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73  ementation of us
25170 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61  er-defined scala
25180 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f  r function fts5_
25190 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61  decode()..*/.sta
251a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
251b0 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  odeFunction(.  s
251c0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
251d0 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
251e0 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  * Function call 
251f0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
25200 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
25210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25220 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28  Number of args (
25230 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73  always 2) */.  s
25240 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
25250 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
25260 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
25270 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  ents */.){.  i64
25280 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
252a0 52 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64  Rowid for record
252b0 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
252c0 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 69 53 65  /.  int iIdx,iSe
252d0 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e  gid,iHeight,iPgn
252e0 6f 3b 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d  o;  /* Rowid com
252f0 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  ponents */.  con
25300 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e  st u8 *aBlob; in
25310 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  t n;         /* 
25320 52 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65  Record to decode
25330 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b   */.  u8 *a = 0;
25340 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 73 3b  .  Fts5Buffer s;
25350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25360 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74     /* Build up t
25370 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65  ext to return he
25380 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
25390 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
253a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
253b0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
253c0 6e 53 70 61 63 65 20 3d 20 30 3b 0a 0a 20 20 61  nSpace = 0;..  a
253d0 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29  ssert( nArg==2 )
253e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
253f0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
25400 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  fer));.  iRowid 
25410 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
25420 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b  int64(apVal[0]);
25430 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
25440 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c  alue_bytes(apVal
25450 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20  [1]);.  aBlob = 
25460 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
25470 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 0a 20  ob(apVal[1]);.. 
25480 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46 54   nSpace = n + FT
25490 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
254a0 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a  DING;.  a = (u8*
254b0 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
254c0 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61  ocZero(&rc, nSpa
254d0 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20  ce);.  if( a==0 
254e0 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75  ) goto decode_ou
254f0 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20 61  t;.  memcpy(a, a
25500 42 6c 6f 62 2c 20 6e 29 3b 0a 20 20 66 74 73 35  Blob, n);.  fts5
25510 44 65 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77  DecodeRowid(iRow
25520 69 64 2c 20 26 69 49 64 78 2c 20 26 69 53 65 67  id, &iIdx, &iSeg
25530 69 64 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69  id, &iHeight, &i
25540 50 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65  Pgno);..  fts5De
25550 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73  bugRowid(&rc, &s
25560 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28  , iRowid);.  if(
25570 20 69 48 65 69 67 68 74 3d 3d 46 54 53 35 5f 53   iHeight==FTS5_S
25580 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48  EGMENT_MAX_HEIGH
25590 54 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  T ){.    Fts5Dat
255a0 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73  a dlidx;.    Fts
255b0 35 44 6c 69 64 78 49 74 65 72 20 69 74 65 72 3b  5DlidxIter iter;
255c0 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20  ..    dlidx.p = 
255d0 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 20 3d  a;.    dlidx.n =
255e0 20 6e 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 52   n;.    dlidx.nR
255f0 65 66 20 3d 20 32 3b 0a 0a 20 20 20 20 6d 65 6d  ef = 2;..    mem
25600 73 65 74 28 26 69 74 65 72 2c 20 30 2c 20 73 69  set(&iter, 0, si
25610 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74  zeof(Fts5DlidxIt
25620 65 72 29 29 3b 0a 20 20 20 20 69 74 65 72 2e 70  er));.    iter.p
25630 44 61 74 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20  Data = &dlidx;. 
25640 20 20 20 69 74 65 72 2e 69 4c 65 61 66 50 67 6e     iter.iLeafPgn
25650 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20 20 20  o = iPgno;..    
25660 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65  for(fts5DlidxIte
25670 72 46 69 72 73 74 28 26 69 74 65 72 29 3b 20 69  rFirst(&iter); i
25680 74 65 72 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73  ter.bEof==0; fts
25690 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 26  5DlidxIterNext(&
256a0 69 74 65 72 29 29 7b 0a 20 20 20 20 20 20 73 71  iter)){.      sq
256b0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
256c0 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
256d0 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20   &s, .          
256e0 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 69 74 65  " %d(%lld)", ite
256f0 72 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 69 74 65  r.iLeafPgno, ite
25700 72 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29  r.iRowid.      )
25710 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
25720 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  if( iSegid==0 ){
25730 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d  .    if( iRowid=
25740 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52  =FTS5_AVERAGES_R
25750 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OWID ){.      /*
25760 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 7d 65 6c   todo */.    }el
25770 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65  se{.      fts5De
25780 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 26 72  codeStructure(&r
25790 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20  c, &s, a, n);.  
257a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20    }.  }else{..  
257b0 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
257c0 6d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  m;.    memset(&t
257d0 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
257e0 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20  ts5Buffer));..  
257f0 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d 30    if( iHeight==0
25800 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
25810 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  ermOff = 0;.    
25820 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20    int iRowidOff 
25830 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  = 0;.      int i
25840 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Off;.      int n
25850 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Keep = 0;..     
25860 20 69 66 28 20 6e 3e 3d 34 20 29 7b 0a 20 20 20   if( n>=4 ){.   
25870 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d       iRowidOff =
25880 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 30   fts5GetU16(&a[0
25890 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 54 65 72  ]);.        iTer
258a0 6d 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  mOff = fts5GetU1
258b0 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20 20  6(&a[2]);.      
258c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
258d0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
258e0 53 65 74 28 26 72 63 2c 20 26 73 2c 20 38 2c 20  Set(&rc, &s, 8, 
258f0 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72  (const u8*)"corr
25900 75 70 74 22 29 3b 0a 20 20 20 20 20 20 20 20 67  upt");.        g
25910 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
25920 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
25930 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a  f( iRowidOff ){.
25940 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69          iOff = i
25950 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20  RowidOff;.      
25960 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f  }else if( iTermO
25970 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  ff ){.        iO
25980 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20  ff = iTermOff;. 
25990 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
259a0 20 20 20 20 69 4f 66 66 20 3d 20 6e 3b 0a 20 20      iOff = n;.  
259b0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
259c0 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 26 72  DecodePoslist(&r
259d0 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f  c, &s, &a[4], iO
259e0 66 66 2d 34 29 3b 0a 0a 20 20 20 20 20 20 61 73  ff-4);..      as
259f0 73 65 72 74 28 20 69 52 6f 77 69 64 4f 66 66 3d  sert( iRowidOff=
25a00 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 52 6f 77  =0 || iOff==iRow
25a10 69 64 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 69  idOff );.      i
25a20 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a  f( iRowidOff ){.
25a30 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
25a40 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
25a50 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
25a60 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20  ff], n-iOff);.  
25a70 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
25a80 65 72 74 28 20 69 54 65 72 6d 4f 66 66 3d 3d 30  ert( iTermOff==0
25a90 20 7c 7c 20 69 4f 66 66 3d 3d 69 54 65 72 6d 4f   || iOff==iTermO
25aa0 66 66 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ff );.      whil
25ab0 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
25ac0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a       int nByte;.
25ad0 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
25ae0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
25af0 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  &a[iOff], nByte)
25b00 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d 2e 6e  ;.        term.n
25b10 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20  = nKeep;.       
25b20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
25b30 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d  dBlob(&rc, &term
25b40 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66  , nByte, &a[iOff
25b50 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  ]);.        iOff
25b60 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20   += nByte;..    
25b70 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
25b80 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
25b90 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  f(.            &
25ba0 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25  rc, &s, " term=%
25bb0 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63  .*s", term.n, (c
25bc0 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e  onst char*)term.
25bd0 70 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  p.        );.   
25be0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
25bf0 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26  5DecodeDoclist(&
25c00 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d  rc, &s, &a[iOff]
25c10 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20  , n-iOff);.     
25c20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b     if( iOff<n ){
25c30 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
25c40 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
25c50 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65  32(&a[iOff], nKe
25c60 65 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ep);.        }. 
25c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
25c80 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
25c90 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
25ca0 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65       Fts5NodeIte
25cb0 72 20 73 73 3b 0a 20 20 20 20 20 20 66 6f 72 28  r ss;.      for(
25cc0 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
25cd0 28 61 2c 20 6e 2c 20 26 73 73 29 3b 20 73 73 2e  (a, n, &ss); ss.
25ce0 61 44 61 74 61 3b 20 66 74 73 35 4e 6f 64 65 49  aData; fts5NodeI
25cf0 74 65 72 4e 65 78 74 28 26 72 63 2c 20 26 73 73  terNext(&rc, &ss
25d00 29 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  )){.        if( 
25d10 73 73 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a  ss.term.n==0 ){.
25d20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25d30 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
25d40 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
25d50 20 22 20 6c 65 66 74 3d 25 64 22 2c 20 73 73 2e   " left=%d", ss.
25d60 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  iChild);.       
25d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25d80 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
25d90 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
25da0 26 72 63 2c 26 73 2c 20 22 20 5c 22 25 2e 2a 73  &rc,&s, " \"%.*s
25db0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
25dc0 20 20 20 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73      ss.term.n, s
25dd0 73 2e 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 20  s.term.p.       
25de0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
25df0 20 20 20 20 20 20 20 20 69 66 28 20 73 73 2e 6e          if( ss.n
25e00 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20 20  Empty ){.       
25e10 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
25e20 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
25e30 28 26 72 63 2c 20 26 73 2c 20 22 20 65 6d 70 74  (&rc, &s, " empt
25e40 79 3d 25 64 25 73 22 2c 20 73 73 2e 6e 45 6d 70  y=%d%s", ss.nEmp
25e50 74 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty,.            
25e60 20 20 73 73 2e 62 44 6c 69 64 78 20 3f 20 22 2a    ss.bDlidx ? "*
25e70 22 20 3a 20 22 22 0a 20 20 20 20 20 20 20 20 20  " : "".         
25e80 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
25e90 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
25ea0 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 73 73  NodeIterFree(&ss
25eb0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
25ec0 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73   decode_out:.  s
25ed0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29 3b 0a  qlite3_free(a);.
25ee0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
25ef0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
25f00 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
25f10 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  Ctx, (const char
25f20 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49  *)s.p, s.n, SQLI
25f30 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
25f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
25f50 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
25f60 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b  _code(pCtx, rc);
25f70 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
25f80 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a  rFree(&s);.}../*
25f90 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
25fa0 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
25fb0 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
25fc0 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69  nction fts5_rowi
25fd0 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
25fe0 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46 75 6e  oid fts5RowidFun
25ff0 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
26000 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
26010 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
26020 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78  tion call contex
26030 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
26040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26050 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26060 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73   of args (always
26070 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   2) */.  sqlite3
26080 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
26090 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
260a0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
260b0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
260c0 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e  r *zArg;.  if( n
260d0 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  Arg==0 ){.    sq
260e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
260f0 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75 6c 64  or(pCtx, "should
26100 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28   be: fts5_rowid(
26110 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c  subject, ....)",
26120 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   -1);.  }else{. 
26130 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74     zArg = (const
26140 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
26150 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
26160 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  0]);.    if( 0==
26170 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
26180 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74 22 29  zArg, "segment")
26190 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
261a0 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  owid;.      int 
261b0 69 64 78 2c 20 73 65 67 69 64 2c 20 68 65 69 67  idx, segid, heig
261c0 68 74 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  ht, pgno;.      
261d0 69 66 28 20 6e 41 72 67 21 3d 35 20 29 7b 0a 20  if( nArg!=5 ){. 
261e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
261f0 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
26200 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
26210 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f  should be: fts5_
26220 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27 2c  rowid('segment',
26230 20 69 64 78 2c 20 73 65 67 69 64 2c 20 68 65 69   idx, segid, hei
26240 67 68 74 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31  ght, pgno))", -1
26250 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
26260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26270 20 69 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 76   idx = sqlite3_v
26280 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31  alue_int(apVal[1
26290 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 65 67 69  ]);.        segi
262a0 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
262b0 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29 3b  e_int(apVal[2]);
262c0 0a 20 20 20 20 20 20 20 20 68 65 69 67 68 74 20  .        height 
262d0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
262e0 69 6e 74 28 61 70 56 61 6c 5b 33 5d 29 3b 0a 20  int(apVal[3]);. 
262f0 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 71         pgno = sq
26300 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
26310 61 70 56 61 6c 5b 34 5d 29 3b 0a 20 20 20 20 20  apVal[4]);.     
26320 20 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35     iRowid = FTS5
26330 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
26340 64 78 2c 20 73 65 67 69 64 2c 20 68 65 69 67 68  dx, segid, heigh
26350 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t, pgno);.      
26360 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
26370 5f 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f  _int64(pCtx, iRo
26380 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  wid);.      }.  
26390 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 73    }else if( 0==s
263a0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
263b0 41 72 67 2c 20 22 73 74 61 72 74 2d 6f 66 2d 69  Arg, "start-of-i
263c0 6e 64 65 78 22 29 20 29 7b 0a 20 20 20 20 20 20  ndex") ){.      
263d0 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  i64 iRowid;.    
263e0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 20    int idx;.     
263f0 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
26400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
26410 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
26420 78 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  x, .            
26430 22 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35  "should be: fts5
26440 5f 72 6f 77 69 64 28 27 73 74 61 72 74 2d 6f 66  _rowid('start-of
26450 2d 69 6e 64 65 78 27 2c 20 69 64 78 29 22 2c 20  -index', idx)", 
26460 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  -1.        );.  
26470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26480 20 20 20 69 64 78 20 3d 20 73 71 6c 69 74 65 33     idx = sqlite3
26490 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
264a0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52  [1]);.        iR
264b0 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
264c0 45 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20 31  ENT_ROWID(idx, 1
264d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
264e0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
264f0 69 6e 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77  int64(pCtx, iRow
26500 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  id);.      }.   
26510 20 7d 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73   }else {.      s
26520 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
26530 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
26540 20 20 20 22 66 69 72 73 74 20 61 72 67 20 74 6f     "first arg to
26550 20 66 74 73 35 5f 72 6f 77 69 64 28 29 20 6d 75   fts5_rowid() mu
26560 73 74 20 62 65 20 27 73 65 67 6d 65 6e 74 27 20  st be 'segment' 
26570 22 0a 20 20 20 20 20 20 20 20 22 6f 72 20 27 73  ".        "or 's
26580 74 61 72 74 2d 6f 66 2d 69 6e 64 65 78 27 22 0a  tart-of-index'".
26590 20 20 20 20 20 20 20 20 2c 20 2d 31 0a 20 20 20          , -1.   
265a0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
265b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
265c0 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
265d0 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67 20 74  of registering t
265e0 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77  he FTS5 module w
265f0 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ith database.** 
26600 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49  connection db. I
26610 74 20 72 65 67 69 73 74 65 72 73 20 73 65 76 65  t registers seve
26620 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ral user-defined
26630 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
26640 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68  s useful.** with
26650 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   FTS5..**.** If 
26660 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
26670 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26680 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  d. If an error o
26690 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65  ccurs, some othe
266a0 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  r.** SQLite erro
266b0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
266c0 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69  ed instead..*/.i
266d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
266e0 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20  dexInit(sqlite3 
266f0 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *db){.  int rc =
26700 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
26710 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20  function(.      
26720 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65  db, "fts5_decode
26730 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 2, SQLITE_UTF
26740 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65  8, 0, fts5Decode
26750 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20  Function, 0, 0. 
26760 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
26770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
26780 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
26790 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
267a0 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 72       db, "fts5_r
267b0 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54  owid", -1, SQLIT
267c0 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35 52  E_UTF8, 0, fts5R
267d0 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  owidFunction, 0,
267e0 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20   0.    );.  }.  
267f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a        return rc;.}..