/ Hex Artifact Content
Login

Artifact 0453bb593fe0ef6245762b6823e88839757fdc75:


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 44 45 46 41  define FTS5_DEFA
0670: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 20 20  ULT_PAGE_SIZE   
0680: 31 30 30 30 0a 0a 23 64 65 66 69 6e 65 20 46 54  1000..#define FT
0690: 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 20 20  S5_WORK_UNIT    
06a0: 20 20 36 34 20 20 20 20 2f 2a 20 4e 75 6d 62 65    64    /* Numbe
06b0: 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
06c0: 69 6e 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  in unit of work 
06d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
06e0: 4d 49 4e 5f 4d 45 52 47 45 20 20 20 20 20 20 20  MIN_MERGE       
06f0: 34 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  4    /* Minimum 
0700: 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
0710: 74 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 0a  ts to merge */..
0720: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e  #define FTS5_MIN
0730: 5f 44 4c 49 44 58 5f 53 49 5a 45 20 20 34 20 20  _DLIDX_SIZE  4  
0740: 20 20 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69    /* Add dlidx i
0750: 66 20 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74  f this many empt
0760: 79 20 70 61 67 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a  y pages */../*.*
0770: 2a 20 44 65 74 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a  * Details:.**.**
0780: 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   The %_data tabl
0790: 65 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68 69  e managed by thi
07a0: 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a 0a 2a 2a 20  s module,.**.** 
07b0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
07c0: 20 25 5f 64 61 74 61 28 69 64 20 49 4e 54 45 47   %_data(id INTEG
07d0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
07e0: 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b 0a 2a 2a 0a  block BLOB);.**.
07f0: 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e 73 20 74 68  ** , contains th
0800: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 35 20 74 79  e following 5 ty
0810: 70 65 73 20 6f 66 20 72 65 63 6f 72 64 73 2e 20  pes of records. 
0820: 53 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 73  See the comments
0830: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
0840: 74 68 65 20 46 54 53 35 5f 2a 5f 52 4f 57 49 44  the FTS5_*_ROWID
0850: 20 6d 61 63 72 6f 73 20 62 65 6c 6f 77 20 66 6f   macros below fo
0860: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
0870: 6f 66 20 68 6f 77 20 25 5f 64 61 74 61 20 72 6f  of how %_data ro
0880: 77 69 64 73 20 61 72 65 20 0a 2a 2a 20 61 73 73  wids are .** ass
0890: 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20 66 6f  igned to each fo
08a0: 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 31 2e 20   them..**.** 1. 
08b0: 53 74 72 75 63 74 75 72 65 20 52 65 63 6f 72 64  Structure Record
08c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 73  s:.**.**   The s
08d0: 65 74 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  et of segments t
08e0: 68 61 74 20 6d 61 6b 65 20 75 70 20 61 6e 20 69  hat make up an i
08f0: 6e 64 65 78 20 2d 20 74 68 65 20 69 6e 64 65 78  ndex - the index
0900: 20 73 74 72 75 63 74 75 72 65 20 2d 20 61 72 65   structure - are
0910: 0a 2a 2a 20 20 20 72 65 63 6f 72 64 65 64 20 69  .**   recorded i
0920: 6e 20 61 20 73 69 6e 67 6c 65 20 72 65 63 6f 72  n a single recor
0930: 64 20 77 69 74 68 69 6e 20 74 68 65 20 25 5f 64  d within the %_d
0940: 61 74 61 20 74 61 62 6c 65 2e 20 54 68 65 20 72  ata table. The r
0950: 65 63 6f 72 64 20 69 73 20 61 20 6c 69 73 74 0a  ecord is a list.
0960: 2a 2a 20 20 20 6f 66 20 53 51 4c 69 74 65 20 76  **   of SQLite v
0970: 61 72 69 6e 74 73 2e 20 0a 2a 2a 0a 2a 2a 20 20  arints. .**.**  
0980: 20 54 68 65 20 72 65 63 6f 72 64 20 62 65 67 69   The record begi
0990: 6e 73 20 77 69 74 68 20 74 68 72 65 65 20 76 61  ns with three va
09a0: 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rints:.**.**    
09b0: 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76   + number of lev
09c0: 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f  els,.**     + to
09d0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
09e0: 67 6d 65 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65  gments on all le
09f0: 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76  vels,.**     + v
0a00: 61 6c 75 65 20 6f 66 20 77 72 69 74 65 20 63 6f  alue of write co
0a10: 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54  unter..**.**   T
0a20: 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 6c 65  hen, for each le
0a30: 76 65 6c 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d  vel from 0 to nM
0a40: 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ax:.**.**     + 
0a50: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  number of input 
0a60: 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f  segments in ongo
0a70: 69 6e 67 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20  ing merge..**   
0a80: 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72    + total number
0a90: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
0aa0: 6c 65 76 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20  level..**     + 
0ab0: 66 6f 72 20 65 61 63 68 20 73 65 67 6d 65 6e 74  for each segment
0ac0: 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20   from oldest to 
0ad0: 6e 65 77 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20  newest:.**      
0ae0: 20 20 20 2b 20 73 65 67 6d 65 6e 74 20 69 64 20     + segment id 
0af0: 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20  (always > 0).** 
0b00: 20 20 20 20 20 20 20 20 2b 20 62 2d 74 72 65 65          + b-tree
0b10: 20 68 65 69 67 68 74 20 28 31 20 2d 3e 20 72 6f   height (1 -> ro
0b20: 6f 74 20 69 73 20 6c 65 61 66 2c 20 32 20 2d 3e  ot is leaf, 2 ->
0b30: 20 72 6f 6f 74 20 69 73 20 70 61 72 65 6e 74 20   root is parent 
0b40: 6f 66 20 6c 65 61 66 20 65 74 63 2e 29 0a 2a 2a  of leaf etc.).**
0b50: 20 20 20 20 20 20 20 20 20 2b 20 66 69 72 73 74           + first
0b60: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
0b70: 72 20 28 6f 66 74 65 6e 20 31 29 0a 2a 2a 20 20  r (often 1).**  
0b80: 20 20 20 20 20 20 20 2b 20 66 69 6e 61 6c 20 6c         + final l
0b90: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  eaf page number.
0ba0: 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20 41 76 65  **.** 2. The Ave
0bb0: 72 61 67 65 73 20 52 65 63 6f 72 64 3a 0a 2a 2a  rages Record:.**
0bc0: 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c 65 20 72  .**   A single r
0bd0: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0be0: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
0bf0: 68 65 20 64 61 74 61 20 69 73 20 61 20 6c 69 73  he data is a lis
0c00: 74 20 6f 66 20 76 61 72 69 6e 74 73 2e 0a 2a 2a  t of varints..**
0c10: 20 20 20 54 68 65 20 66 69 72 73 74 20 76 61 6c     The first val
0c20: 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
0c30: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
0c40: 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20 66 6f 72  index. Then, for
0c50: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20   each column.** 
0c60: 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72    from left to r
0c70: 69 67 68 74 2c 20 74 68 65 20 74 6f 74 61 6c 20  ight, the total 
0c80: 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65 6e 73  number of tokens
0c90: 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66   in the column f
0ca0: 6f 72 20 61 6c 6c 20 0a 2a 2a 20 20 20 72 6f 77  or all .**   row
0cb0: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  s of the table..
0cc0: 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65 6e 74  **.** 3. Segment
0cd0: 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   leaves:.**.**  
0ce0: 20 54 45 52 4d 20 44 4f 43 4c 49 53 54 20 46 4f   TERM DOCLIST FO
0cf0: 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  RMAT:.**.**     
0d00: 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73 65 67  Most of each seg
0d10: 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74 61 6b  ment leaf is tak
0d20: 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f 64 6f  en up by term/do
0d30: 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65 20  clist data. The 
0d40: 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61 6c 20  .**     general 
0d50: 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20 74 65  format of the te
0d60: 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20  rm/doclist data 
0d70: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0d80: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0d90: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0da0: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0db0: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0dc0: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0dd0: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0de0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0df0: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0e00: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0e10: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0e20: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0e30: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0e40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0e50: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0e60: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0e70: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0e80: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0e90: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
0ea0: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
0eb0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
0ec0: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
0ed0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
0ee0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
0ef0: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
0f00: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
0f10: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
0f20: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
0f30: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
0f40: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
0f50: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
0f60: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
0f70: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
0f80: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
0f90: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 66        poslist: f
0fa0: 69 72 73 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20  irst poslist.** 
0fb0: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20 20 20          }.**    
0fc0: 20 20 20 20 20 30 78 30 30 20 62 79 74 65 0a 2a       0x00 byte.*
0fd0: 2a 0a 2a 2a 20 20 20 20 20 70 6f 73 6c 69 73 74  *.**     poslist
0fe0: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
0ff0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 73         varint: s
1000: 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74 20 69  ize of poslist i
1010: 6e 20 62 79 74 65 73 2e 20 6e 6f 74 20 69 6e 63  n bytes. not inc
1020: 6c 75 64 69 6e 67 20 74 68 69 73 20 66 69 65 6c  luding this fiel
1030: 64 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  d..**         co
1040: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1050: 6f 72 20 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20  or column 0.**  
1060: 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d         zero-or-m
1070: 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20  ore {.**        
1080: 20 20 20 30 78 30 31 20 62 79 74 65 0a 2a 2a 20     0x01 byte.** 
1090: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
10a0: 3a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  : column number 
10b0: 28 49 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  (I).**          
10c0: 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73   collist: collis
10d0: 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a  t for column I.*
10e0: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a  *         }.**.*
10f0: 2a 20 20 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f  *     collist fo
1100: 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  rmat:.**.**     
1110: 20 20 20 20 76 61 72 69 6e 74 3a 20 66 69 72 73      varint: firs
1120: 74 20 6f 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20  t offset + 2.** 
1130: 20 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d          zero-or-
1140: 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20  more {.**       
1150: 20 20 20 20 76 61 72 69 6e 74 3a 20 6f 66 66 73      varint: offs
1160: 65 74 20 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20  et delta + 2.** 
1170: 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20          }.**.** 
1180: 20 20 50 41 47 49 4e 41 54 49 4f 4e 0a 2a 2a 0a    PAGINATION.**.
1190: 2a 2a 20 20 20 20 20 54 68 65 20 66 6f 72 6d 61  **     The forma
11a0: 74 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  t described abov
11b0: 65 20 69 73 20 6f 6e 6c 79 20 61 63 63 75 72 61  e is only accura
11c0: 74 65 20 69 66 20 74 68 65 20 65 6e 74 69 72 65  te if the entire
11d0: 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 0a 2a 2a   term/doclist.**
11e0: 20 20 20 20 20 64 61 74 61 20 66 69 74 73 20 6f       data fits o
11f0: 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65 61 66 20  n a single leaf 
1200: 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
1210: 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 20 74   not the case, t
1220: 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 20 20 20  he format.**    
1230: 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e 20 74   is changed in t
1240: 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20  wo ways:.**.**  
1250: 20 20 20 20 20 2b 20 69 66 20 74 68 65 20 66 69       + if the fi
1260: 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 61 20 70  rst rowid on a p
1270: 61 67 65 20 6f 63 63 75 72 73 20 62 65 66 6f 72  age occurs befor
1280: 65 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  e the first term
1290: 2c 20 69 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  , it.**         
12a0: 69 73 20 73 74 6f 72 65 64 20 61 73 20 61 20 6c  is stored as a l
12b0: 69 74 65 72 61 6c 20 76 61 6c 75 65 3a 0a 2a 2a  iteral value:.**
12c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12d0: 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74 20 72  varint:  first r
12e0: 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  owid.**.**      
12f0: 20 2b 20 74 68 65 20 66 69 72 73 74 20 74 65 72   + the first ter
1300: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 69  m on each page i
1310: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
1320: 73 61 6d 65 20 77 61 79 20 61 73 20 74 68 65 0a  same way as the.
1330: 2a 2a 20 20 20 20 20 20 20 20 20 76 65 72 79 20  **         very 
1340: 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68  first term of th
1350: 65 20 73 65 67 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a  e segment:.**.**
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72               var
1370: 69 6e 74 20 3a 20 73 69 7a 65 20 6f 66 20 66 69  int : size of fi
1380: 72 73 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20  rst term.**     
1390: 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20 20          blob:   
13a0: 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74 61   first term data
13b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 45 61 63 68 20  .**.**     Each 
13c0: 6c 65 61 66 20 70 61 67 65 20 62 65 67 69 6e 73  leaf page begins
13d0: 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   with:.**.**    
13e0: 20 20 20 2b 20 32 2d 62 79 74 65 20 75 6e 73 69     + 2-byte unsi
13f0: 67 6e 65 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  gned containing 
1400: 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
1410: 72 6f 77 69 64 20 28 6f 72 20 30 29 2e 0a 2a 2a  rowid (or 0)..**
1420: 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74 65 20         + 2-byte 
1430: 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61 69 6e  unsigned contain
1440: 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20 66 69  ing offset to fi
1450: 72 73 74 20 74 65 72 6d 20 28 6f 72 20 30 29 2e  rst term (or 0).
1460: 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 6c 6c 6f 77 65  .**.**   Followe
1470: 64 20 62 79 20 74 65 72 6d 2f 64 6f 63 6c 69 73  d by term/doclis
1480: 74 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 34 2e  t data..**.** 4.
1490: 20 53 65 67 6d 65 6e 74 20 69 6e 74 65 72 69 6f   Segment interio
14a0: 72 20 6e 6f 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  r nodes:.**.**  
14b0: 20 54 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   The interior no
14c0: 64 65 73 20 74 75 72 6e 20 74 68 65 20 6c 69 73  des turn the lis
14d0: 74 20 6f 66 20 6c 65 61 76 65 73 20 69 6e 74 6f  t of leaves into
14e0: 20 61 20 62 2b 74 72 65 65 2e 20 0a 2a 2a 0a 2a   a b+tree. .**.*
14f0: 2a 20 20 20 45 61 63 68 20 69 6e 74 65 72 69 6f  *   Each interio
1500: 72 20 6e 6f 64 65 20 62 65 67 69 6e 73 20 77 69  r node begins wi
1510: 74 68 20 61 20 76 61 72 69 6e 74 20 2d 20 74 68  th a varint - th
1520: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1530: 20 74 68 65 20 6c 65 66 74 0a 2a 2a 20 20 20 6d   the left.**   m
1540: 6f 73 74 20 63 68 69 6c 64 20 6e 6f 64 65 2e 20  ost child node. 
1550: 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 20  Following this, 
1560: 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70 61  for each leaf pa
1570: 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66 69  ge except the fi
1580: 72 73 74 2c 0a 2a 2a 20 20 20 74 68 65 20 69 6e  rst,.**   the in
1590: 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 63 6f 6e  terior nodes con
15a0: 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tain:.**.**     
15b0: 61 29 20 49 66 20 74 68 65 20 6c 65 61 66 20 70  a) If the leaf p
15c0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 74 20  age contains at 
15d0: 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20  least one term, 
15e0: 74 68 65 6e 20 61 20 74 65 72 6d 2d 70 72 65 66  then a term-pref
15f0: 69 78 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ix that.**      
1600: 20 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61    is greater tha
1610: 6e 20 61 6c 6c 20 70 72 65 76 69 6f 75 73 20 74  n all previous t
1620: 65 72 6d 73 2c 20 61 6e 64 20 6c 65 73 73 20 74  erms, and less t
1630: 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1640: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 66 69  the.**        fi
1650: 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  rst term on the 
1660: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
1670: 20 20 20 20 20 62 29 20 49 66 20 74 68 65 20 6c       b) If the l
1680: 65 61 66 20 70 61 67 65 20 6e 6f 20 74 65 72 6d  eaf page no term
1690: 73 2c 20 61 20 72 65 63 6f 72 64 20 69 6e 64 69  s, a record indi
16a0: 63 61 74 69 6e 67 20 68 6f 77 20 6d 61 6e 79 20  cating how many 
16b0: 63 6f 6e 73 65 63 75 74 69 76 65 0a 2a 2a 20 20  consecutive.**  
16c0: 20 20 20 20 20 20 6c 65 61 76 65 73 20 63 6f 6e        leaves con
16d0: 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2c 20 61  tain no terms, a
16e0: 6e 64 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  nd whether or no
16f0: 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 73  t there is an as
1700: 73 6f 63 69 61 74 65 64 0a 2a 2a 20 20 20 20 20  sociated.**     
1710: 20 20 20 62 79 2d 72 6f 77 69 64 20 69 6e 64 65     by-rowid inde
1720: 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  x record..**.** 
1730: 20 20 42 79 20 64 65 66 69 6e 69 74 69 6f 6e 2c    By definition,
1740: 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
1750: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 74 79  more than one ty
1760: 70 65 20 28 62 29 20 72 65 63 6f 72 64 20 69 6e  pe (b) record in
1770: 20 61 20 72 6f 77 2e 0a 2a 2a 20 20 20 54 79 70   a row..**   Typ
1780: 65 20 28 62 29 20 72 65 63 6f 72 64 73 20 6f 6e  e (b) records on
1790: 6c 79 20 65 76 65 72 20 61 70 70 65 61 72 20 6f  ly ever appear o
17a0: 6e 20 68 65 69 67 68 74 3d 31 20 70 61 67 65 73  n height=1 pages
17b0: 20 2d 20 69 6d 6d 65 64 69 61 74 65 20 70 61 72   - immediate par
17c0: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 6c 65 61  ents.**   of lea
17d0: 76 65 73 2e 20 4f 6e 6c 79 20 74 79 70 65 20 28  ves. Only type (
17e0: 61 29 20 72 65 63 6f 72 64 73 20 61 72 65 20 70  a) records are p
17f0: 75 73 68 65 64 20 74 6f 20 68 69 67 68 65 72 20  ushed to higher 
1800: 6c 65 76 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  levels..**.**   
1810: 54 65 72 6d 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a  Term format:.**.
1820: 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72 20  **     * Number 
1830: 6f 66 20 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d  of bytes in comm
1840: 6f 6e 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  on with previous
1850: 20 74 65 72 6d 20 70 6c 75 73 20 32 2c 20 61 73   term plus 2, as
1860: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20   a varint..**   
1870: 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79    * Number of by
1880: 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20  tes of new term 
1890: 64 61 74 61 2c 20 61 73 20 61 20 76 61 72 69 6e  data, as a varin
18a0: 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 6e 65 77 20  t..**     * new 
18b0: 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  term data..**.**
18c0: 20 20 20 4e 6f 2d 74 65 72 6d 20 66 6f 72 6d 61     No-term forma
18d0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 65  t:.**.**     * e
18e0: 69 74 68 65 72 20 61 6e 20 30 78 30 30 20 6f 72  ither an 0x00 or
18f0: 20 30 78 30 31 20 62 79 74 65 2e 20 49 66 20 74   0x01 byte. If t
1900: 68 65 20 76 61 6c 75 65 20 30 78 30 31 20 69 73  he value 0x01 is
1910: 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 72   used, then ther
1920: 65 20 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 61  e .**       is a
1930: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  n associated ind
1940: 65 78 2d 62 79 2d 72 6f 77 69 64 20 72 65 63 6f  ex-by-rowid reco
1950: 72 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 74 68 65  rd..**     * the
1960: 20 6e 75 6d 62 65 72 20 6f 66 20 7a 65 72 6f 2d   number of zero-
1970: 74 65 72 6d 20 6c 65 61 76 65 73 20 61 73 20 61  term leaves as a
1980: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 35   varint..**.** 5
1990: 2e 20 53 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73  . Segment doclis
19a0: 74 20 69 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a  t indexes:.**.**
19b0: 20 20 20 41 20 6c 69 73 74 20 6f 66 20 76 61 72     A list of var
19c0: 69 6e 74 73 20 2d 20 74 68 65 20 66 69 72 73 74  ints - the first
19d0: 20 64 6f 63 69 64 20 6f 6e 20 65 61 63 68 20 70   docid on each p
19e0: 61 67 65 20 28 73 74 61 72 74 69 6e 67 20 77 69  age (starting wi
19f0: 74 68 20 74 68 65 0a 2a 2a 20 20 20 66 69 72 73  th the.**   firs
1a00: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 29  t termless page)
1a10: 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2e   of the doclist.
1a20: 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 69   First element i
1a30: 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 61 0a  n the list is a.
1a40: 2a 2a 20 20 20 6c 69 74 65 72 61 6c 20 64 6f 63  **   literal doc
1a50: 69 64 2e 20 45 61 63 68 20 64 6f 63 69 64 20 74  id. Each docid t
1a60: 68 65 72 65 61 66 74 65 72 20 69 73 20 61 20 28  hereafter is a (
1a70: 6e 65 67 61 74 69 76 65 29 20 64 65 6c 74 61 2e  negative) delta.
1a80: 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 20 20 61   If there.**   a
1a90: 72 65 20 6e 6f 20 64 6f 63 69 64 73 20 61 74 20  re no docids at 
1aa0: 61 6c 6c 20 6f 6e 20 61 20 70 61 67 65 2c 20 61  all on a page, a
1ab0: 20 30 78 30 30 20 62 79 74 65 20 74 61 6b 65 73   0x00 byte takes
1ac0: 20 74 68 65 20 70 6c 61 63 65 20 6f 66 20 74 68   the place of th
1ad0: 65 0a 2a 2a 20 20 20 64 65 6c 74 61 20 76 61 6c  e.**   delta val
1ae0: 75 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ue..*/../*.** Ro
1af0: 77 69 64 73 20 66 6f 72 20 74 68 65 20 61 76 65  wids for the ave
1b00: 72 61 67 65 73 20 61 6e 64 20 73 74 72 75 63 74  rages and struct
1b10: 75 72 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74  ure records in t
1b20: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
1b30: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .*/.#define FTS5
1b40: 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
1b50: 20 20 20 20 31 20 20 20 20 2f 2a 20 52 6f 77 69      1    /* Rowi
1b60: 64 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 61  d used for the a
1b70: 76 65 72 61 67 65 73 20 72 65 63 6f 72 64 20 2a  verages record *
1b80: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  /.#define FTS5_S
1b90: 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69  TRUCTURE_ROWID(i
1ba0: 49 64 78 29 20 28 31 30 20 2b 20 28 69 49 64 78  Idx) (10 + (iIdx
1bb0: 29 29 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 74  ))     /* For st
1bc0: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 73 20  ructure records 
1bd0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73  */../*.** Macros
1be0: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65   determining the
1bf0: 20 72 6f 77 69 64 73 20 75 73 65 64 20 62 79 20   rowids used by 
1c00: 73 65 67 6d 65 6e 74 20 6e 6f 64 65 73 2e 20 41  segment nodes. A
1c10: 6c 6c 20 6e 6f 64 65 73 20 69 6e 20 61 6c 6c 0a  ll nodes in all.
1c20: 2a 2a 20 73 65 67 6d 65 6e 74 73 20 66 6f 72 20  ** segments for 
1c30: 61 6c 6c 20 69 6e 64 65 78 65 73 20 28 74 68 65  all indexes (the
1c40: 20 72 65 67 75 6c 61 72 20 46 54 53 20 69 6e 64   regular FTS ind
1c50: 65 78 20 61 6e 64 20 61 6e 79 20 70 72 65 66 69  ex and any prefi
1c60: 78 20 69 6e 64 65 78 65 73 29 0a 2a 2a 20 61 72  x indexes).** ar
1c70: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1c80: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 77 69 74  %_data table wit
1c90: 68 20 6c 61 72 67 65 20 70 6f 73 69 74 69 76 65  h large positive
1ca0: 20 72 6f 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 54   rowids..**.** T
1cb0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
1cc0: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 75 70 20 74  may contain up t
1cd0: 6f 20 28 31 3c 3c 46 54 53 35 5f 53 45 47 4d 45  o (1<<FTS5_SEGME
1ce0: 4e 54 5f 49 4e 44 45 58 5f 42 49 54 53 29 20 0a  NT_INDEX_BITS) .
1cf0: 2a 2a 20 69 6e 64 65 78 65 73 20 2d 20 6f 6e 65  ** indexes - one
1d00: 20 72 65 67 75 6c 61 72 20 74 65 72 6d 20 69 6e   regular term in
1d10: 64 65 78 20 61 6e 64 20 7a 65 72 6f 20 6f 72 20  dex and zero or 
1d20: 6d 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65  more prefix inde
1d30: 78 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  xes..**.** Each 
1d40: 73 65 67 6d 65 6e 74 20 69 6e 20 61 6e 20 69 6e  segment in an in
1d50: 64 65 78 20 68 61 73 20 61 20 75 6e 69 71 75 65  dex has a unique
1d60: 20 69 64 20 67 72 65 61 74 65 72 20 74 68 61 6e   id greater than
1d70: 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45 61 63   zero..**.** Eac
1d80: 68 20 6e 6f 64 65 20 69 6e 20 61 20 73 65 67 6d  h node in a segm
1d90: 65 6e 74 20 62 2d 74 72 65 65 20 69 73 20 61 73  ent b-tree is as
1da0: 73 69 67 6e 65 64 20 61 20 22 70 61 67 65 20 6e  signed a "page n
1db0: 75 6d 62 65 72 22 20 74 68 61 74 20 69 73 20 75  umber" that is u
1dc0: 6e 69 71 75 65 0a 2a 2a 20 77 69 74 68 69 6e 20  nique.** within 
1dd0: 6e 6f 64 65 73 20 6f 66 20 69 74 73 20 68 65 69  nodes of its hei
1de0: 67 68 74 20 77 69 74 68 69 6e 20 74 68 65 20 73  ght within the s
1df0: 65 67 6d 65 6e 74 20 28 6c 65 61 66 20 6e 6f 64  egment (leaf nod
1e00: 65 73 20 68 61 76 65 20 61 20 68 65 69 67 68 74  es have a height
1e10: 20 0a 2a 2a 20 6f 66 20 30 2c 20 70 61 72 65 6e   .** of 0, paren
1e20: 74 73 20 31 2c 20 65 74 63 2e 29 2e 20 50 61 67  ts 1, etc.). Pag
1e30: 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
1e40: 6c 6f 63 61 74 65 64 20 73 65 71 75 65 6e 74 69  located sequenti
1e50: 61 6c 6c 79 20 73 6f 20 74 68 61 74 0a 2a 2a 20  ally so that.** 
1e60: 61 20 6e 6f 64 65 73 20 70 61 67 65 20 6e 75 6d  a nodes page num
1e70: 62 65 72 20 69 73 20 61 6c 77 61 79 73 20 6f 6e  ber is always on
1e80: 65 20 6d 6f 72 65 20 74 68 61 6e 20 69 74 73 20  e more than its 
1e90: 6c 65 66 74 20 73 69 62 6c 69 6e 67 2e 0a 2a 2a  left sibling..**
1ea0: 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f  .** The rowid fo
1eb0: 72 20 61 20 6e 6f 64 65 20 69 73 20 74 68 65 6e  r a node is then
1ec0: 20 66 6f 75 6e 64 20 75 73 69 6e 67 20 74 68 65   found using the
1ed0: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1ee0: 57 49 44 28 29 20 6d 61 63 72 6f 0a 2a 2a 20 62  WID() macro.** b
1ef0: 65 6c 6f 77 2e 20 54 68 65 20 46 54 53 35 5f 53  elow. The FTS5_S
1f00: 45 47 4d 45 4e 54 5f 2a 5f 42 49 54 53 20 6d 61  EGMENT_*_BITS ma
1f10: 63 72 6f 73 20 64 65 66 69 6e 65 20 74 68 65 20  cros define the 
1f20: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 75  number of bits u
1f30: 73 65 64 0a 2a 2a 20 74 6f 20 65 6e 63 6f 64 65  sed.** to encode
1f40: 20 74 68 65 20 74 68 72 65 65 20 46 54 53 35 5f   the three FTS5_
1f50: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20  SEGMENT_ROWID() 
1f60: 61 72 67 75 6d 65 6e 74 73 2e 20 54 68 69 73 20  arguments. This 
1f70: 6d 6f 64 75 6c 65 20 72 65 74 75 72 6e 73 0a 2a  module returns.*
1f80: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  * SQLITE_FULL an
1f90: 64 20 66 61 69 6c 73 20 74 68 65 20 63 75 72 72  d fails the curr
1fa0: 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 66  ent operation if
1fb0: 20 74 68 65 79 20 65 76 65 72 20 70 72 6f 76 65   they ever prove
1fc0: 20 74 6f 6f 20 73 6d 61 6c 6c 2e 0a 2a 2f 0a 23   too small..*/.#
1fd0: 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41  define FTS5_DATA
1fe0: 5f 49 44 58 5f 42 20 20 20 20 20 35 20 20 20 20  _IDX_B     5    
1ff0: 20 2f 2a 20 4d 61 78 20 6f 66 20 33 31 20 70 72   /* Max of 31 pr
2000: 65 66 69 78 20 69 6e 64 65 78 65 73 20 2a 2f 0a  efix indexes */.
2010: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
2020: 41 5f 49 44 5f 42 20 20 20 20 20 31 36 20 20 20  A_ID_B     16   
2030: 20 20 2f 2a 20 4d 61 78 20 73 65 67 20 69 64 20    /* Max seg id 
2040: 6e 75 6d 62 65 72 20 36 35 35 33 35 20 2a 2f 0a  number 65535 */.
2050: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
2060: 41 5f 48 45 49 47 48 54 5f 42 20 20 35 20 20 20  A_HEIGHT_B  5   
2070: 20 20 2f 2a 20 4d 61 78 20 62 2d 74 72 65 65 20    /* Max b-tree 
2080: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
2090: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
20a0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
20b0: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
20c0: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
20d0: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46  48 */..#define F
20e0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
20f0: 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20 68 65  D(idx, segid, he
2100: 69 67 68 74 2c 20 70 67 6e 6f 29 20 28 20 20 20  ight, pgno) (   
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2130: 69 64 78 29 20 20 20 20 3c 3c 20 28 46 54 53 35  idx)    << (FTS5
2140: 5f 44 41 54 41 5f 49 44 5f 42 20 2b 20 46 54 53  _DATA_ID_B + FTS
2150: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
2160: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2170: 5f 42 29 29 20 2b 20 5c 0a 20 28 28 69 36 34 29  _B)) + \. ((i64)
2180: 28 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53  (segid)  << (FTS
2190: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
21a0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
21b0: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
21c0: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
21d0: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
21e0: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
21f0: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2220: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
2270: 69 66 20 46 54 53 35 5f 4d 41 58 5f 50 52 45 46  if FTS5_MAX_PREF
2280: 49 58 5f 49 4e 44 45 58 45 53 20 3e 20 28 28 31  IX_INDEXES > ((1
2290: 3c 3c 46 54 53 35 5f 44 41 54 41 5f 49 44 58 5f  <<FTS5_DATA_IDX_
22a0: 42 29 2d 31 29 20 0a 23 20 65 72 72 6f 72 20 22  B)-1) .# error "
22b0: 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49 58 5f  FTS5_MAX_PREFIX_
22c0: 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f 20 6c  INDEXES is too l
22d0: 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a  arge".#endif../*
22e0: 0a 2a 2a 20 54 68 65 20 68 65 69 67 68 74 20 6f  .** The height o
22f0: 66 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  f segment b-tree
2300: 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 6c 69  s is actually li
2310: 6d 69 74 65 64 20 74 6f 20 6f 6e 65 20 6c 65 73  mited to one les
2320: 73 20 74 68 61 6e 20 0a 2a 2a 20 28 31 3c 3c 48  s than .** (1<<H
2330: 45 49 47 48 54 5f 42 49 54 53 29 2e 20 54 68 69  EIGHT_BITS). Thi
2340: 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
2350: 20 72 6f 77 69 64 20 61 64 64 72 65 73 73 20 73   rowid address s
2360: 70 61 63 65 20 66 6f 72 20 6e 6f 64 65 73 0a 2a  pace for nodes.*
2370: 2a 20 77 69 74 68 20 73 75 63 68 20 61 20 68 65  * with such a he
2380: 69 67 68 74 20 69 73 20 75 73 65 64 20 62 79 20  ight is used by 
2390: 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 2e  doclist indexes.
23a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .*/.#define FTS5
23b0: 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49  _SEGMENT_MAX_HEI
23c0: 47 48 54 20 28 28 31 20 3c 3c 20 46 54 53 35 5f  GHT ((1 << FTS5_
23d0: 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29 2d 31  DATA_HEIGHT_B)-1
23e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 77  )../*.** The row
23f0: 69 64 20 66 6f 72 20 74 68 65 20 64 6f 63 6c 69  id for the docli
2400: 73 74 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  st index associa
2410: 74 65 64 20 77 69 74 68 20 6c 65 61 66 20 70 61  ted with leaf pa
2420: 67 65 20 70 67 6e 6f 20 6f 66 20 73 65 67 6d 65  ge pgno of segme
2430: 6e 74 0a 2a 2a 20 73 65 67 69 64 20 69 6e 20 69  nt.** segid in i
2440: 6e 64 65 78 20 69 64 78 2e 0a 2a 2f 0a 23 64 65  ndex idx..*/.#de
2450: 66 69 6e 65 20 46 54 53 35 5f 44 4f 43 4c 49 53  fine FTS5_DOCLIS
2460: 54 5f 49 44 58 5f 52 4f 57 49 44 28 69 64 78 2c  T_IDX_ROWID(idx,
2470: 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 20 5c 0a   segid, pgno) \.
2480: 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47          FTS5_SEG
2490: 4d 45 4e 54 5f 52 4f 57 49 44 28 69 64 78 2c 20  MENT_ROWID(idx, 
24a0: 73 65 67 69 64 2c 20 46 54 53 35 5f 53 45 47 4d  segid, FTS5_SEGM
24b0: 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48 54 2c 20  ENT_MAX_HEIGHT, 
24c0: 70 67 6e 6f 29 0a 0a 23 69 66 64 65 66 20 53 51  pgno)..#ifdef SQ
24d0: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
24e0: 63 20 69 6e 74 20 66 74 73 35 43 6f 72 72 75 70  c int fts5Corrup
24f0: 74 28 29 20 7b 20 72 65 74 75 72 6e 20 53 51 4c  t() { return SQL
2500: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
2510: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 46 54 53  ; }.# define FTS
2520: 35 5f 43 4f 52 52 55 50 54 20 66 74 73 35 43 6f  5_CORRUPT fts5Co
2530: 72 72 75 70 74 28 29 0a 23 65 6c 73 65 0a 23 20  rrupt().#else.# 
2540: 64 65 66 69 6e 65 20 46 54 53 35 5f 43 4f 52 52  define FTS5_CORR
2550: 55 50 54 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  UPT SQLITE_CORRU
2560: 50 54 5f 56 54 41 42 0a 23 65 6e 64 69 66 0a 0a  PT_VTAB.#endif..
2570: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2580: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66  BUG.static int f
2590: 74 73 35 4d 69 73 73 69 6e 67 44 61 74 61 28 29  ts5MissingData()
25a0: 20 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 0a 23   { return 0; }.#
25b0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
25c0: 73 35 4d 69 73 73 69 6e 67 44 61 74 61 28 29 20  s5MissingData() 
25d0: 0a 23 65 6e 64 69 66 0a 0a 0a 74 79 70 65 64 65  .#endif...typede
25e0: 66 20 73 74 72 75 63 74 20 46 74 73 35 42 74 72  f struct Fts5Btr
25f0: 65 65 49 74 65 72 20 46 74 73 35 42 74 72 65 65  eeIter Fts5Btree
2600: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
2610: 72 75 63 74 20 46 74 73 35 42 74 72 65 65 49 74  ruct Fts5BtreeIt
2620: 65 72 4c 65 76 65 6c 20 46 74 73 35 42 74 72 65  erLevel Fts5Btre
2630: 65 49 74 65 72 4c 65 76 65 6c 3b 0a 74 79 70 65  eIterLevel;.type
2640: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 43  def struct Fts5C
2650: 68 75 6e 6b 49 74 65 72 20 46 74 73 35 43 68 75  hunkIter Fts5Chu
2660: 6e 6b 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  nkIter;.typedef 
2670: 73 74 72 75 63 74 20 46 74 73 35 44 61 74 61 20  struct Fts5Data 
2680: 46 74 73 35 44 61 74 61 3b 0a 74 79 70 65 64 65  Fts5Data;.typede
2690: 66 20 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  f struct Fts5Dli
26a0: 64 78 49 74 65 72 20 46 74 73 35 44 6c 69 64 78  dxIter Fts5Dlidx
26b0: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
26c0: 72 75 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65  ruct Fts5MultiSe
26d0: 67 49 74 65 72 20 46 74 73 35 4d 75 6c 74 69 53  gIter Fts5MultiS
26e0: 65 67 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  egIter;.typedef 
26f0: 73 74 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49  struct Fts5NodeI
2700: 74 65 72 20 46 74 73 35 4e 6f 64 65 49 74 65 72  ter Fts5NodeIter
2710: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2720: 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
2730: 46 74 73 35 50 61 67 65 57 72 69 74 65 72 3b 0a  Fts5PageWriter;.
2740: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2750: 74 73 35 50 6f 73 49 74 65 72 20 46 74 73 35 50  ts5PosIter Fts5P
2760: 6f 73 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20  osIter;.typedef 
2770: 73 74 72 75 63 74 20 46 74 73 35 53 65 67 49 74  struct Fts5SegIt
2780: 65 72 20 46 74 73 35 53 65 67 49 74 65 72 3b 0a  er Fts5SegIter;.
2790: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
27a0: 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 46  ts5DoclistIter F
27b0: 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 3b 0a  ts5DoclistIter;.
27c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
27d0: 74 73 35 53 65 67 57 72 69 74 65 72 20 46 74 73  ts5SegWriter Fts
27e0: 35 53 65 67 57 72 69 74 65 72 3b 0a 74 79 70 65  5SegWriter;.type
27f0: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2800: 74 72 75 63 74 75 72 65 20 46 74 73 35 53 74 72  tructure Fts5Str
2810: 75 63 74 75 72 65 3b 0a 74 79 70 65 64 65 66 20  ucture;.typedef 
2820: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2830: 74 75 72 65 4c 65 76 65 6c 20 46 74 73 35 53 74  tureLevel Fts5St
2840: 72 75 63 74 75 72 65 4c 65 76 65 6c 3b 0a 74 79  ructureLevel;.ty
2850: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2860: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
2870: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2880: 65 67 6d 65 6e 74 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  egment;../*.** O
2890: 6e 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f  ne object per %_
28a0: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  data table..*/.s
28b0: 74 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20  truct Fts5Index 
28c0: 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
28d0: 70 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20  pConfig;        
28e0: 20 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74      /* Virtual t
28f0: 61 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69  able configurati
2900: 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  on */.  char *zD
2910: 61 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20  ataTbl;         
2920: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2930: 6f 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  of %_data table 
2940: 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 3b 20 20  */.  int pgsz;  
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 2f 2a 20 54 61 72 67 65 74 20 70       /* Target p
2970: 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74 68 69  age size for thi
2980: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  s index */.  int
2990: 20 6e 4d 69 6e 4d 65 72 67 65 3b 20 20 20 20 20   nMinMerge;     
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b0: 4d 69 6e 69 6d 75 6d 20 69 6e 70 75 74 20 73 65  Minimum input se
29c0: 67 6d 65 6e 74 73 20 69 6e 20 61 20 6d 65 72 67  gments in a merg
29d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b  e */.  int nWork
29e0: 55 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Unit;           
29f0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
2a00: 61 67 65 73 20 69 6e 20 61 20 22 75 6e 69 74 22  ages in a "unit"
2a10: 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f   of work */..  /
2a20: 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 73  *.  ** Variables
2a30: 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20   related to the 
2a40: 61 63 63 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20  accumulation of 
2a50: 74 6f 6b 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69  tokens and docli
2a60: 73 74 73 20 77 69 74 68 69 6e 20 74 68 65 0a 20  sts within the. 
2a70: 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61   ** in-memory ha
2a80: 73 68 20 74 61 62 6c 65 73 20 62 65 66 6f 72 65  sh tables before
2a90: 20 74 68 65 79 20 61 72 65 20 66 6c 75 73 68 65   they are flushe
2aa0: 64 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  d to disk..  */.
2ab0: 20 20 46 74 73 35 48 61 73 68 20 2a 2a 61 70 48    Fts5Hash **apH
2ac0: 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
2ad0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 68 61    /* Array of ha
2ae0: 73 68 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69  sh tables */.  i
2af0: 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  nt nMaxPendingDa
2b00: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ta;            /
2b10: 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67 20 64 61  * Max pending da
2b20: 74 61 20 62 65 66 6f 72 65 20 66 6c 75 73 68 20  ta before flush 
2b30: 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74  to disk */.  int
2b40: 20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b 20 20   nPendingData;  
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b60: 43 75 72 72 65 6e 74 20 62 79 74 65 73 20 6f 66  Current bytes of
2b70: 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f   pending data */
2b80: 0a 20 20 69 36 34 20 69 57 72 69 74 65 52 6f 77  .  i64 iWriteRow
2b90: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2ba0: 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
2bb0: 63 75 72 72 65 6e 74 20 64 6f 63 20 62 65 69 6e  current doc bein
2bc0: 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20  g written */..  
2bd0: 2f 2a 20 45 72 72 6f 72 20 73 74 61 74 65 2e 20  /* Error state. 
2be0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2c10: 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 0a 20  error code */.. 
2c20: 20 2f 2a 20 53 74 61 74 65 20 75 73 65 64 20 62   /* State used b
2c30: 79 20 74 68 65 20 66 74 73 35 44 61 74 61 58 58  y the fts5DataXX
2c40: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 2a  X() functions. *
2c50: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
2c60: 20 2a 70 52 65 61 64 65 72 3b 20 20 20 20 20 20   *pReader;      
2c70: 20 20 20 20 2f 2a 20 52 4f 20 69 6e 63 72 2d 62      /* RO incr-b
2c80: 6c 6f 62 20 6f 70 65 6e 20 6f 6e 20 25 5f 64 61  lob open on %_da
2c90: 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ta table */.  sq
2ca0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57 72 69  lite3_stmt *pWri
2cb0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ter;          /*
2cc0: 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 64   "INSERT ... %_d
2cd0: 61 74 61 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22  ata VALUES(?,?)"
2ce0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2cf0: 6d 74 20 2a 70 44 65 6c 65 74 65 72 3b 20 20 20  mt *pDeleter;   
2d00: 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45 54 45        /* "DELETE
2d10: 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 2e 2e 2e   FROM %_data ...
2d20: 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f   id>=? AND id<=?
2d30: 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  " */.  int nRead
2d40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d50: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
2d60: 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73  number of blocks
2d70: 20 72 65 61 64 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   read */.};..str
2d80: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2d90: 74 65 72 20 7b 0a 20 20 69 6e 74 20 62 41 73 63  ter {.  int bAsc
2da0: 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e 74  ;.  u8 *a;.  int
2db0: 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   n;.  int i;..  
2dc0: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
2dd0: 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30  les. aPoslist==0
2de0: 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34   at EOF */.  i64
2df0: 20 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61   iRowid;.  u8 *a
2e00: 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e  Poslist;.  int n
2e10: 50 6f 73 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a  Poslist;.};../*.
2e20: 2a 2a 20 45 61 63 68 20 69 74 65 72 61 74 6f 72  ** Each iterator
2e30: 20 75 73 65 64 20 62 79 20 65 78 74 65 72 6e 61   used by externa
2e40: 6c 20 6d 6f 64 75 6c 65 73 20 69 73 20 61 6e 20  l modules is an 
2e50: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
2e60: 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   type..*/.struct
2e70: 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b   Fts5IndexIter {
2e80: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
2e90: 6e 64 65 78 3b 0a 20 20 46 74 73 35 53 74 72 75  ndex;.  Fts5Stru
2ea0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
2eb0: 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
2ec0: 65 72 20 2a 70 4d 75 6c 74 69 3b 0a 20 20 46 74  er *pMulti;.  Ft
2ed0: 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
2ee0: 44 6f 63 6c 69 73 74 3b 0a 20 20 46 74 73 35 42  Doclist;.  Fts5B
2ef0: 75 66 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20  uffer poslist;  
2f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
2f10: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2f20: 63 75 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20  current poslist 
2f30: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  */.};../*.** A s
2f40: 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 72 65 61  ingle record rea
2f50: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
2f60: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2f70: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2f80: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2fb0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2fc0: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2fd0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2ff0: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
3000: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
3010: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
3020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
3030: 65 66 20 63 6f 75 6e 74 20 2a 2f 0a 7d 3b 0a 0a  ef count */.};..
3040: 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  /*.** The conten
3050: 74 73 20 6f 66 20 74 68 65 20 22 73 74 72 75 63  ts of the "struc
3060: 74 75 72 65 22 20 72 65 63 6f 72 64 20 66 6f 72  ture" record for
3070: 20 65 61 63 68 20 69 6e 64 65 78 20 61 72 65 20   each index are 
3080: 72 65 70 72 65 73 65 6e 74 65 64 0a 2a 2a 20 75  represented.** u
3090: 73 69 6e 67 20 61 6e 20 46 74 73 35 53 74 72 75  sing an Fts5Stru
30a0: 63 74 75 72 65 20 72 65 63 6f 72 64 20 69 6e 20  cture record in 
30b0: 6d 65 6d 6f 72 79 2e 20 57 68 69 63 68 20 75 73  memory. Which us
30c0: 65 73 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  es instances of 
30d0: 74 68 65 20 0a 2a 2a 20 6f 74 68 65 72 20 46 74  the .** other Ft
30e0: 73 35 53 74 72 75 63 74 75 72 65 58 58 58 20 74  s5StructureXXX t
30f0: 79 70 65 73 20 61 73 20 63 6f 6d 70 6f 6e 65 6e  ypes as componen
3100: 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  ts..*/.struct Ft
3110: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
3120: 6e 74 20 7b 0a 20 20 69 6e 74 20 69 53 65 67 69  nt {.  int iSegi
3130: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3140: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
3150: 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 48  t id */.  int nH
3160: 65 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  eight;          
3170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69            /* Hei
3180: 67 68 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62  ght of segment b
3190: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 70  -tree */.  int p
31a0: 67 6e 6f 46 69 72 73 74 3b 20 20 20 20 20 20 20  gnoFirst;       
31b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
31c0: 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  rst leaf page nu
31d0: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
31e0: 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73  */.  int pgnoLas
31f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3200: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61       /* Last lea
3210: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  f page number in
3220: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 73   segment */.};.s
3230: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
3240: 75 72 65 4c 65 76 65 6c 20 7b 0a 20 20 69 6e 74  ureLevel {.  int
3250: 20 6e 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20   nMerge;        
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3270: 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  Number of segmen
3280: 74 73 20 69 6e 20 69 6e 63 72 2d 6d 65 72 67 65  ts in incr-merge
3290: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20   */.  int nSeg; 
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
32c0: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
32d0: 73 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  s on level */.  
32e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
32f0: 6d 65 6e 74 20 2a 61 53 65 67 3b 20 20 20 20 20  ment *aSeg;     
3300: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d  /* Array of segm
3310: 65 6e 74 73 2e 20 61 53 65 67 5b 30 5d 20 69 73  ents. aSeg[0] is
3320: 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d 3b 0a 73   oldest. */.};.s
3330: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
3340: 75 72 65 20 7b 0a 20 20 75 36 34 20 6e 57 72 69  ure {.  u64 nWri
3350: 74 65 43 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  teCounter;      
3360: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3370: 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
3380: 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f 0a 20 20  to level 0 */.  
3390: 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20  int nLevel;     
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76  /* Number of lev
33c0: 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65  els in this inde
33d0: 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
33e0: 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c  tureLevel aLevel
33f0: 5b 30 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  [0];   /* Array 
3400: 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20  of nLevel level 
3410: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
3420: 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f  *.** An object o
3430: 66 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72  f type Fts5SegWr
3440: 69 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  iter is used to 
3450: 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74  write to segment
3460: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  s..*/.struct Fts
3470: 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20  5PageWriter {.  
3480: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
34b0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
34c0: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
34d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34e0: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
34f0: 61 69 6e 69 6e 67 20 70 61 67 65 20 64 61 74 61  aining page data
3500: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
3510: 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20   term;          
3520: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
3530: 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69  containing previ
3540: 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65  ous term on page
3550: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
3560: 73 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20 20  s5SegWriter {.  
3570: 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69 74  /* Index to writ
35a0: 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 53  e to */.  int iS
35b0: 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  egid;           
35c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
35d0: 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  id to write to *
35e0: 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 72 3b  /.  int nWriter;
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3600: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3610: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 57 72 69   entries in aWri
3620: 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 50 61 67  ter */.  Fts5Pag
3630: 65 57 72 69 74 65 72 20 2a 61 57 72 69 74 65 72  eWriter *aWriter
3640: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61  ;        /* Arra
3650: 79 20 6f 66 20 50 61 67 65 57 72 69 74 65 72 20  y of PageWriter 
3660: 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69 36 34  objects */.  i64
3670: 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20 20 20   iPrevRowid;    
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3690: 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64 20 77  Previous docid w
36a0: 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72 65 6e  ritten to curren
36b0: 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38 20 62  t leaf */.  u8 b
36c0: 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
36d0: 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ist;        /* T
36e0: 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69  rue if next rowi
36f0: 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 64 6f  d is first in do
3700: 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 62 46  clist */.  u8 bF
3710: 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3b  irstRowidInPage;
3720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3730: 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77 69 64  ue if next rowid
3740: 20 69 73 20 66 69 72 73 74 20 69 6e 20 70 61 67   is first in pag
3750: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  e */.  int nLeaf
3760: 57 72 69 74 74 65 6e 3b 20 20 20 20 20 20 20 20  Written;        
3770: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3780: 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 77   of leaf pages w
3790: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
37a0: 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20 20 20  nEmpty;         
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37c0: 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74 69 67 75  umber of contigu
37d0: 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f  ous term-less no
37e0: 64 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  des */.  Fts5Buf
37f0: 66 65 72 20 64 6c 69 64 78 3b 20 20 20 20 20 20  fer dlidx;      
3800: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
3810: 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ist index */.  i
3820: 36 34 20 69 44 6c 69 64 78 50 72 65 76 3b 20 20  64 iDlidxPrev;  
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3840: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64  * Previous rowid
3850: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 64 6c 69   appended to dli
3860: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 44 6c 69  dx */.  int bDli
3870: 64 78 50 72 65 76 56 61 6c 69 64 3b 20 20 20 20  dxPrevValid;    
3880: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3890: 69 66 20 69 44 6c 69 64 78 50 72 65 76 20 69 73  if iDlidxPrev is
38a0: 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   valid */.};../*
38b0: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
38c0: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
38d0: 20 74 68 65 20 6d 65 72 67 65 64 20 72 65 73 75   the merged resu
38e0: 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f  lts of one or mo
38f0: 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20  re segments,.** 
3900: 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65  visiting each te
3910: 72 6d 2f 64 6f 63 69 64 20 70 61 69 72 20 69 6e  rm/docid pair in
3920: 20 74 68 65 20 6d 65 72 67 65 64 20 64 61 74 61   the merged data
3930: 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69 73 20  ..**.** nSeg is 
3940: 61 6c 77 61 79 73 20 61 20 70 6f 77 65 72 20 6f  always a power o
3950: 66 20 74 77 6f 20 67 72 65 61 74 65 72 20 74 68  f two greater th
3960: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
3970: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3980: 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 74 68  segments that th
3990: 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6d 65 72  is object is mer
39a0: 67 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 2e 20  ging data from. 
39b0: 42 6f 74 68 20 74 68 65 20 61 53 65 67 5b 5d 20  Both the aSeg[] 
39c0: 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b 5d 20  and.** aFirst[] 
39d0: 61 72 72 61 79 73 20 61 72 65 20 73 69 7a 65 64  arrays are sized
39e0: 20 61 74 20 6e 53 65 67 20 65 6e 74 72 69 65 73   at nSeg entries
39f0: 2e 20 54 68 65 20 61 53 65 67 5b 5d 20 61 72 72  . The aSeg[] arr
3a00: 61 79 20 69 73 20 70 61 64 64 65 64 0a 2a 2a 20  ay is padded.** 
3a10: 77 69 74 68 20 7a 65 72 6f 65 64 20 6f 62 6a 65  with zeroed obje
3a20: 63 74 73 20 2d 20 74 68 65 73 65 20 61 72 65 20  cts - these are 
3a30: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 74 68  handled as if th
3a40: 65 79 20 77 65 72 65 20 69 74 65 72 61 74 6f 72  ey were iterator
3a50: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65  s opened.** on e
3a60: 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  mpty segments..*
3a70: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
3a80: 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 73 65   of comparing se
3a90: 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d 20 61  gments aSeg[N] a
3aa0: 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20 77 68  nd aSeg[N+1], wh
3ab0: 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a 20 65  ere N is an.** e
3ac0: 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73 20 73  ven number, is s
3ad0: 74 6f 72 65 64 20 69 6e 20 61 46 69 72 73 74 5b  tored in aFirst[
3ae0: 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54 68 65  (nSeg+N)/2]. The
3af0: 20 22 72 65 73 75 6c 74 22 20 6f 66 20 74 68 65   "result" of the
3b00: 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20   .** comparison 
3b10: 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20  in this context 
3b20: 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
3b30: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61  the iterator tha
3b40: 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  t currently.** p
3b50: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 6d 61  oints to the sma
3b60: 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69 64 20  ller term/rowid 
3b70: 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49 74 65  combination. Ite
3b80: 72 61 74 6f 72 73 20 61 74 20 45 4f 46 20 61 72  rators at EOF ar
3b90: 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20  e.** considered 
3ba0: 74 6f 20 62 65 20 67 72 65 61 74 65 72 20 74 68  to be greater th
3bb0: 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69 74 65  an all other ite
3bc0: 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46  rators..**.** aF
3bd0: 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69 6e 73  irst[1] contains
3be0: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 61 53   the index in aS
3bf0: 65 67 5b 5d 20 6f 66 20 74 68 65 20 69 74 65 72  eg[] of the iter
3c00: 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ator that points
3c10: 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61 6c 6c   to.** the small
3c20: 65 73 74 20 6b 65 79 20 6f 76 65 72 61 6c 6c 2e  est key overall.
3c30: 20 61 46 69 72 73 74 5b 30 5d 20 69 73 20 75 6e   aFirst[0] is un
3c40: 75 73 65 64 2e 20 0a 2a 2f 0a 73 74 72 75 63 74  used. .*/.struct
3c50: 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
3c60: 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20  r {.  int nSeg; 
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c80: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
3c90: 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f   aSeg[] array */
3ca0: 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20  .  int bRev;    
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cc0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74     /* True to it
3cd0: 65 72 61 74 65 20 69 6e 20 72 65 76 65 72 73 65  erate in reverse
3ce0: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73 35   order */.  Fts5
3cf0: 53 65 67 49 74 65 72 20 2a 61 53 65 67 3b 20 20  SegIter *aSeg;  
3d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3d10: 72 72 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 20  rray of segment 
3d20: 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 75  iterators */.  u
3d30: 31 36 20 2a 61 46 69 72 73 74 3b 20 20 20 20 20  16 *aFirst;     
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3d50: 2a 20 43 75 72 72 65 6e 74 20 6d 65 72 67 65 20  * Current merge 
3d60: 73 74 61 74 65 20 28 73 65 65 20 61 62 6f 76 65  state (see above
3d70: 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f  ) */.};../*.** O
3d80: 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61 74  bject for iterat
3d90: 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20 73 69  ing through a si
3da0: 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2c 20 76 69  ngle segment, vi
3db0: 73 69 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d  siting each term
3dc0: 2f 64 6f 63 69 64 0a 2a 2a 20 70 61 69 72 20 69  /docid.** pair i
3dd0: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
3de0: 2a 0a 2a 2a 20 70 53 65 67 3a 0a 2a 2a 20 20 20  *.** pSeg:.**   
3df0: 54 68 65 20 73 65 67 6d 65 6e 74 20 74 6f 20 69  The segment to i
3e00: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 2e 0a  terate through..
3e10: 2a 2a 0a 2a 2a 20 69 4c 65 61 66 50 67 6e 6f 3a  **.** iLeafPgno:
3e20: 0a 2a 2a 20 20 20 43 75 72 72 65 6e 74 20 6c 65  .**   Current le
3e30: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 77  af page number w
3e40: 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 2e 0a 2a  ithin segment..*
3e50: 2a 0a 2a 2a 20 69 4c 65 61 66 4f 66 66 73 65 74  *.** iLeafOffset
3e60: 3a 0a 2a 2a 20 20 20 42 79 74 65 20 6f 66 66 73  :.**   Byte offs
3e70: 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  et within the cu
3e80: 72 72 65 6e 74 20 6c 65 61 66 20 74 68 61 74 20  rrent leaf that 
3e90: 69 73 20 6f 6e 65 20 62 79 74 65 20 70 61 73 74  is one byte past
3ea0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
3eb0: 2a 2a 20 20 20 72 6f 77 69 64 20 66 69 65 6c 64  **   rowid field
3ec0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3ed0: 65 6e 74 72 79 2e 20 55 73 75 61 6c 6c 79 20 74  entry. Usually t
3ee0: 68 69 73 20 69 73 20 74 68 65 20 73 69 7a 65 20  his is the size 
3ef0: 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a 2a 20  field of the.** 
3f00: 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20    position list 
3f10: 64 61 74 61 2e 20 54 68 65 20 65 78 63 65 70 74  data. The except
3f20: 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 72 6f  ion is if the ro
3f30: 77 69 64 20 66 6f 72 20 74 68 65 20 63 75 72 72  wid for the curr
3f40: 65 6e 74 20 65 6e 74 72 79 20 0a 2a 2a 20 20 20  ent entry .**   
3f50: 69 73 20 74 68 65 20 6c 61 73 74 20 74 68 69 6e  is the last thin
3f60: 67 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61  g on the leaf pa
3f70: 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 4c 65 61 66 3a  ge..**.** pLeaf:
3f80: 0a 2a 2a 20 20 20 42 75 66 66 65 72 20 63 6f 6e  .**   Buffer con
3f90: 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20  taining current 
3fa0: 6c 65 61 66 20 70 61 67 65 20 64 61 74 61 2e 20  leaf page data. 
3fb0: 53 65 74 20 74 6f 20 4e 55 4c 4c 20 61 74 20 45  Set to NULL at E
3fc0: 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72 6d 4c  OF..**.** iTermL
3fd0: 65 61 66 50 67 6e 6f 2c 20 69 54 65 72 6d 4c 65  eafPgno, iTermLe
3fe0: 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 4c  afOffset:.**   L
3ff0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
4000: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
4010: 61 73 74 20 74 65 72 6d 20 72 65 61 64 20 66 72  ast term read fr
4020: 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20  om the segment. 
4030: 41 6e 64 0a 2a 2a 20 20 20 74 68 65 20 6f 66 66  And.**   the off
4040: 73 65 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  set immediately 
4050: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 65  following the te
4060: 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 66  rm data..**.** f
4070: 6c 61 67 73 3a 0a 2a 2a 20 20 20 4d 61 73 6b 20  lags:.**   Mask 
4080: 6f 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  of FTS5_SEGITER_
4090: 58 58 58 20 76 61 6c 75 65 73 2e 20 49 6e 74 65  XXX values. Inte
40a0: 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
40b0: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35  ws:.**.**   FTS5
40c0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
40d0: 3a 0a 2a 2a 20 20 20 20 20 49 66 20 73 65 74 2c  :.**     If set,
40e0: 20 73 65 74 20 74 68 65 20 69 74 65 72 61 74 6f   set the iterato
40f0: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f  r to point to EO
4100: 46 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72  F after the curr
4110: 65 6e 74 20 64 6f 63 6c 69 73 74 20 0a 2a 2a 20  ent doclist .** 
4120: 20 20 20 20 68 61 73 20 62 65 65 6e 20 65 78 68      has been exh
4130: 61 75 73 74 65 64 2e 20 44 6f 20 6e 6f 74 20 70  austed. Do not p
4140: 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20 6e 65  roceed to the ne
4150: 78 74 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73  xt term in the s
4160: 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20  egment..**.**   
4170: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
4180: 45 52 53 45 3a 0a 2a 2a 20 20 20 20 20 54 68 69  ERSE:.**     Thi
4190: 73 20 66 6c 61 67 20 69 73 20 6f 6e 6c 79 20 65  s flag is only e
41a0: 76 65 72 20 73 65 74 20 69 66 20 46 54 53 35 5f  ver set if FTS5_
41b0: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
41c0: 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 49 66 0a  is also set. If.
41d0: 2a 2a 20 20 20 20 20 69 74 20 69 73 20 73 65 74  **     it is set
41e0: 2c 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  , iterate throug
41f0: 68 20 64 6f 63 69 64 73 20 69 6e 20 61 73 63 65  h docids in asce
4200: 6e 64 69 6e 67 20 6f 72 64 65 72 20 69 6e 73 74  nding order inst
4210: 65 61 64 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  ead of the.**   
4220: 20 20 64 65 66 61 75 6c 74 20 64 65 73 63 65 6e    default descen
4230: 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2a 0a 2a  ding order..**.*
4240: 2a 20 69 52 6f 77 69 64 4f 66 66 73 65 74 2f 6e  * iRowidOffset/n
4250: 52 6f 77 69 64 4f 66 66 73 65 74 2f 61 52 6f 77  RowidOffset/aRow
4260: 69 64 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 20  idOffset:.**    
4270: 20 54 68 65 73 65 20 61 72 65 20 75 73 65 64 20   These are used 
4280: 69 66 20 74 68 65 20 46 54 53 35 5f 53 45 47 49  if the FTS5_SEGI
4290: 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67  TER_REVERSE flag
42a0: 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 20   is set..**.**  
42b0: 20 20 20 45 61 63 68 20 74 69 6d 65 20 61 20 6e     Each time a n
42c0: 65 77 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  ew page is loade
42d0: 64 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  d, the iterator 
42e0: 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
42f0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 66 69  to the.**     fi
4300: 6e 61 6c 20 72 6f 77 69 64 2e 20 41 64 64 69 74  nal rowid. Addit
4310: 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 61 52 6f  ionally, the aRo
4320: 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61  widOffset[] arra
4330: 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 0a  y is populated .
4340: 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
4350: 62 79 74 65 20 6f 66 66 73 65 74 73 20 6f 66 20  byte offsets of 
4360: 61 6c 6c 20 72 65 6c 65 76 61 6e 74 20 72 6f 77  all relevant row
4370: 69 64 20 66 69 65 6c 64 73 20 6f 6e 20 74 68 65  id fields on the
4380: 20 70 61 67 65 2e 20 0a 2a 2f 0a 73 74 72 75 63   page. .*/.struc
4390: 74 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a  t Fts5SegIter {.
43a0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
43b0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
43c0: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
43d0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
43e0: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20  */.  int iIdx;  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
4410: 73 65 74 20 77 69 74 68 69 6e 20 63 75 72 72 65  set within curre
4420: 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74  nt leaf */.  int
4430: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4450: 4d 61 73 6b 20 6f 66 20 63 6f 6e 66 69 67 75 72  Mask of configur
4460: 61 74 69 6f 6e 20 66 6c 61 67 73 20 2a 2f 0a 20  ation flags */. 
4470: 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b 20   int iLeafPgno; 
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66   /* Current leaf
44a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
44b0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
44c0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
44d0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61    /* Current lea
44e0: 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  f data */.  int 
44f0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20  iLeafOffset;    
4500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
4510: 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69  yte offset withi
4520: 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a  n current leaf *
4530: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61 67 65  /..  /* The page
4540: 20 61 6e 64 20 6f 66 66 73 65 74 20 66 72 6f 6d   and offset from
4550: 20 77 68 69 63 68 20 74 68 65 20 63 75 72 72 65   which the curre
4560: 6e 74 20 74 65 72 6d 20 77 61 73 20 72 65 61 64  nt term was read
4570: 2e 20 54 68 65 20 6f 66 66 73 65 74 20 0a 20 20  . The offset .  
4580: 2a 2a 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  ** is the offset
4590: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f   of the first ro
45a0: 77 69 64 20 69 6e 20 74 68 65 20 63 75 72 72 65  wid in the curre
45b0: 6e 74 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a  nt doclist.  */.
45c0: 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66 50    int iTermLeafP
45d0: 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  gno;.  int iTerm
45e0: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 2f  LeafOffset;..  /
45f0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4600: 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66  are only used if
4610: 20 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45   the FTS5_SEGITE
4620: 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69  R_REVERSE flag i
4630: 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20  s set. */.  int 
4640: 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  iRowidOffset;   
4650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4660: 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20  urrent entry in 
4670: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a  aRowidOffset[] *
4680: 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66  /.  int nRowidOf
4690: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
46a0: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
46b0: 20 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f   size of aRowidO
46c0: 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f  ffset[] array */
46d0: 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66  .  int *aRowidOf
46e0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
46f0: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
4700: 66 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66  ffset to rowid f
4710: 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35  ields */..  Fts5
4720: 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
4730: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  x;          /* I
4740: 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
4750: 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20  list-index */.. 
4760: 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f   /* Variables po
4770: 70 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  pulated based on
4780: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
4790: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
47a0: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
47b0: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
47c0: 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52  term */.  i64 iR
47d0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
47e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
47f0: 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 7d 3b  rent rowid */.};
4800: 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53  ..#define FTS5_S
4810: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 30  EGITER_ONETERM 0
4820: 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53 35  x01.#define FTS5
4830: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
4840: 20 30 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62   0x02.../*.** Ob
4850: 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69  ject for iterati
4860: 6e 67 20 74 68 72 6f 75 67 68 20 70 61 67 69 6e  ng through pagin
4870: 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ated data..*/.st
4880: 72 75 63 74 20 46 74 73 35 43 68 75 6e 6b 49 74  ruct Fts5ChunkIt
4890: 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74 61 20  er {.  Fts5Data 
48a0: 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  *pLeaf;         
48b0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
48c0: 74 20 6c 65 61 66 20 64 61 74 61 2e 20 4e 55 4c  t leaf data. NUL
48d0: 4c 20 2d 3e 20 45 4f 46 2e 20 2a 2f 0a 20 20 69  L -> EOF. */.  i
48e0: 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 20 20  64 iLeafRowid;  
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4900: 2a 20 41 62 73 6f 6c 75 74 65 20 72 6f 77 69 64  * Absolute rowid
4910: 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66   of current leaf
4920: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20   */.  int nRem; 
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4940: 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69 6e 69        /* Remaini
4950: 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ng bytes of data
4960: 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20 20 2f   to read */..  /
4970: 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d 65 74  * Output paramet
4980: 65 72 73 20 2a 2f 0a 20 20 75 38 20 2a 70 3b 20  ers */.  u8 *p; 
4990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
49b0: 74 65 72 20 74 6f 20 63 68 75 6e 6b 20 6f 66 20  ter to chunk of 
49c0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  data */.  int n;
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
49f0: 65 20 6f 66 20 62 75 66 66 65 72 20 70 20 69 6e  e of buffer p in
4a00: 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   bytes */.};../*
4a10: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
4a20: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
4a30: 20 61 20 73 69 6e 67 6c 65 20 70 6f 73 69 74 69   a single positi
4a40: 6f 6e 20 6c 69 73 74 20 6f 6e 20 64 69 73 6b 2e  on list on disk.
4a50: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50  .*/.struct Fts5P
4a60: 6f 73 49 74 65 72 20 7b 0a 20 20 46 74 73 35 43  osIter {.  Fts5C
4a70: 68 75 6e 6b 49 74 65 72 20 63 68 75 6e 6b 3b 20  hunkIter chunk; 
4a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4a90: 72 72 65 6e 74 20 63 68 75 6e 6b 20 6f 66 20 64  rrent chunk of d
4aa0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  ata */.  int iOf
4ab0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
4ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4ad0: 65 74 20 77 69 74 68 69 6e 20 63 68 75 6e 6b 20  et within chunk 
4ae0: 64 61 74 61 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  data */..  int i
4af0: 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 50 6f 73 3b  Col;.  int iPos;
4b00: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
4b10: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
4b20: 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f 6e 65  through the cone
4b30: 6e 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  nts of a single 
4b40: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e  internal node in
4b50: 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a   .** memory..*/.
4b60: 73 74 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49  struct Fts5NodeI
4b70: 74 65 72 20 7b 0a 20 20 2f 2a 20 49 6e 74 65 72  ter {.  /* Inter
4b80: 6e 61 6c 2e 20 53 65 74 20 61 6e 64 20 6d 61 6e  nal. Set and man
4b90: 61 67 65 64 20 62 79 20 66 74 73 35 4e 6f 64 65  aged by fts5Node
4ba0: 49 74 65 72 58 58 58 28 29 20 66 75 6e 63 74 69  IterXXX() functi
4bb0: 6f 6e 73 2e 20 45 78 63 65 70 74 2c 20 0a 20 20  ons. Except, .  
4bc0: 2a 2a 20 74 68 65 20 45 4f 46 20 74 65 73 74 20  ** the EOF test 
4bd0: 66 6f 72 20 74 68 65 20 69 74 65 72 61 74 6f 72  for the iterator
4be0: 20 69 73 20 28 46 74 73 35 4e 6f 64 65 49 74 65   is (Fts5NodeIte
4bf0: 72 2e 61 44 61 74 61 3d 3d 30 29 2e 20 20 2a 2f  r.aData==0).  */
4c00: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  .  const u8 *aDa
4c10: 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74 61 3b  ta;.  int nData;
4c20: 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20  .  int iOff;..  
4c30: 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  /* Output variab
4c40: 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  les */.  Fts5Buf
4c50: 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20  fer term;.  int 
4c60: 6e 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20 69 43  nEmpty;.  int iC
4c70: 68 69 6c 64 3b 0a 20 20 69 6e 74 20 62 44 6c 69  hild;.  int bDli
4c80: 64 78 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dx;.};../*.** An
4c90: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4ca0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
4cb0: 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  is used to itera
4cc0: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  te through the c
4cd0: 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20  ontents.** of a 
4ce0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65  doclist-index re
4cf0: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74  cord..**.** pDat
4d00: 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63  a:.**   Record c
4d10: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f  ontaining the do
4d20: 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61  clist-index data
4d30: 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a  ..**.** bEof:.**
4d40: 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f     Set to true o
4d50: 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61 73  nce iterator has
4d60: 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a   reached EOF..**
4d70: 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53  .** iOff:.**   S
4d80: 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  et to the curren
4d90: 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  t offset within 
4da0: 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f  record pData..*/
4db0: 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64  .struct Fts5Dlid
4dc0: 78 49 74 65 72 20 7b 0a 20 20 46 74 73 35 44 61  xIter {.  Fts5Da
4dd0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
4de0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
4df0: 66 6f 72 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  for doclist inde
4e00: 78 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69  x, if any */.  i
4e10: 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20  nt iOff;        
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e30: 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20 69  Current offset i
4e40: 6e 74 6f 20 70 44 6c 69 64 78 20 2a 2f 0a 20 20  nto pDlidx */.  
4e50: 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20  int bEof;       
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4e70: 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64 79 20   At EOF already 
4e80: 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 4f  */.  int iFirstO
4e90: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
4ea0: 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 72 65     /* Used by re
4eb0: 76 65 72 73 65 20 69 74 65 72 61 74 6f 72 73 20  verse iterators 
4ec0: 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75  only */..  /* Ou
4ed0: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a  tput variables *
4ee0: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
4ef0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
4f00: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
4f10: 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66   of current leaf
4f20: 20 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69   page */.  i64 i
4f30: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
4f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
4f50: 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20  t rowid on leaf 
4f60: 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a  iLeafPgno */.};.
4f70: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 46 74 73 35 42  ../*.** An Fts5B
4f80: 74 72 65 65 49 74 65 72 20 6f 62 6a 65 63 74 20  treeIter object 
4f90: 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  is used to itera
4fa0: 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 65  te through all e
4fb0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a  ntries in the.**
4fc0: 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
4fd0: 79 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  y belonging to a
4fe0: 20 73 69 6e 67 6c 65 20 66 74 73 35 20 73 65 67   single fts5 seg
4ff0: 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63 61  ment. In this ca
5000: 73 65 20 74 68 65 0a 2a 2a 20 22 62 2d 74 72 65  se the.** "b-tre
5010: 65 20 68 69 65 72 61 72 63 68 79 22 20 69 73 20  e hierarchy" is 
5020: 61 6c 6c 20 62 2d 74 72 65 65 20 6e 6f 64 65 73  all b-tree nodes
5030: 20 65 78 63 65 70 74 20 6c 65 61 76 65 73 2e 20   except leaves. 
5040: 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
5050: 65 0a 2a 2a 20 62 2d 74 72 65 65 20 68 69 65 72  e.** b-tree hier
5060: 61 72 63 68 79 20 63 6f 6e 73 69 73 74 73 20 6f  archy consists o
5070: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
5080: 0a 2a 2a 0a 2a 2a 20 20 20 69 4c 65 61 66 3a 20  .**.**   iLeaf: 
5090: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
50a0: 20 6f 66 20 74 68 65 20 6c 65 61 66 20 70 61 67   of the leaf pag
50b0: 65 20 74 68 65 20 65 6e 74 72 79 20 70 6f 69 6e  e the entry poin
50c0: 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 74  ts to..**.**   t
50d0: 65 72 6d 3a 20 20 20 41 20 73 70 6c 69 74 2d 6b  erm:   A split-k
50e0: 65 79 20 74 68 61 74 20 61 6c 6c 20 74 65 72 6d  ey that all term
50f0: 73 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 24  s on leaf page $
5100: 69 4c 65 61 66 20 6d 75 73 74 20 62 65 20 67 72  iLeaf must be gr
5110: 65 61 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  eater.**        
5120: 20 20 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c     than or equal
5130: 20 74 6f 2e 20 54 68 65 20 22 74 65 72 6d 22 20   to. The "term" 
5140: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5150: 74 68 65 20 66 69 72 73 74 20 62 2d 74 72 65 65  the first b-tree
5160: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 68 69  .**           hi
5170: 65 72 61 72 63 68 79 20 65 6e 74 72 79 20 28 74  erarchy entry (t
5180: 68 65 20 6f 6e 65 20 74 68 61 74 20 70 6f 69 6e  he one that poin
5190: 74 73 20 74 6f 20 6c 65 61 66 20 70 61 67 65 20  ts to leaf page 
51a0: 31 29 20 69 73 20 61 6c 77 61 79 73 20 0a 2a 2a  1) is always .**
51b0: 20 20 20 20 20 20 20 20 20 20 20 61 6e 20 65 6d             an em
51c0: 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  pty string..**.*
51d0: 2a 20 20 20 6e 45 6d 70 74 79 3a 20 54 68 65 20  *   nEmpty: The 
51e0: 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20  number of empty 
51f0: 28 74 65 72 6d 6c 65 73 73 29 20 6c 65 61 66 20  (termless) leaf 
5200: 70 61 67 65 73 20 74 68 61 74 20 69 6d 6d 65 64  pages that immed
5210: 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20  iately.**       
5220: 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c      following iL
5230: 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46  eaf..**.** The F
5240: 74 73 35 42 74 72 65 65 49 74 65 72 20 6f 62 6a  ts5BtreeIter obj
5250: 65 63 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ect is only used
5260: 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
5270: 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20  integrity-check 
5280: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  code..*/.struct 
5290: 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
52a0: 65 6c 20 7b 0a 20 20 46 74 73 35 4e 6f 64 65 49  el {.  Fts5NodeI
52b0: 74 65 72 20 73 3b 20 20 20 20 20 20 20 20 20 20  ter s;          
52c0: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
52d0: 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  or for the curre
52e0: 6e 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46 74 73  nt node */.  Fts
52f0: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20  5Data *pData;   
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5310: 44 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72  Data for the cur
5320: 72 65 6e 74 20 6e 6f 64 65 20 2a 2f 0a 7d 3b 0a  rent node */.};.
5330: 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65  struct Fts5Btree
5340: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 49 6e 64  Iter {.  Fts5Ind
5350: 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ex *p;          
5360: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
5370: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
5380: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
5390: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
53a0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20       /* Iterate 
53b0: 74 68 72 6f 75 67 68 20 74 68 69 73 20 73 65 67  through this seg
53c0: 6d 65 6e 74 27 73 20 62 2d 74 72 65 65 20 2a 2f  ment's b-tree */
53d0: 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20  .  int iIdx;    
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53f0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 70 53 65 67     /* Index pSeg
5400: 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 20   belongs to */. 
5410: 20 69 6e 74 20 6e 4c 76 6c 3b 20 20 20 20 20 20   int nLvl;      
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 4c 76 6c   /* Size of aLvl
5440: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74  [] array */.  Ft
5450: 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
5460: 20 2a 61 4c 76 6c 3b 20 20 20 20 20 20 20 2f 2a   *aLvl;       /*
5470: 20 4c 65 76 65 6c 20 66 6f 72 20 65 61 63 68 20   Level for each 
5480: 74 69 65 72 20 6f 66 20 62 2d 74 72 65 65 20 2a  tier of b-tree *
5490: 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76  /..  /* Output v
54a0: 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74  ariables */.  Ft
54b0: 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
54d0: 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f   Current term */
54e0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 3b 20 20 20  .  int iLeaf;   
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 20 20 20 2f 2a 20 4c 65 61 66 20 63 6f 6e 74 61     /* Leaf conta
5510: 69 6e 69 6e 67 20 74 65 72 6d 73 20 3e 3d 20 63  ining terms >= c
5520: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
5530: 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20 20   int nEmpty;    
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22 65   /* Number of "e
5560: 6d 70 74 79 22 20 6c 65 61 76 65 73 20 66 6f 6c  mpty" leaves fol
5570: 6c 6f 77 69 6e 67 20 69 4c 65 61 66 20 2a 2f 0a  lowing iLeaf */.
5580: 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20    int bEof;     
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
55b0: 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 6e 74   at EOF */.  int
55c0: 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20   bDlidx;        
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55e0: 54 72 75 65 20 69 66 20 74 68 65 72 65 20 65 78  True if there ex
55f0: 69 73 74 73 20 61 20 64 6c 69 64 78 20 2a 2f 0a  ists a dlidx */.
5600: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  };.../*.** Decod
5610: 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61  e a segment-data
5620: 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20   rowid from the 
5630: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68  %_data table. Th
5640: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
5650: 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f  * the opposite o
5660: 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47  f macro FTS5_SEG
5670: 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f  MENT_ROWID()..*/
5680: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
5690: 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20  5DecodeRowid(.  
56a0: 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20  i64 iRowid,     
56b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56c0: 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f  /* Rowid from %_
56d0: 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
56e0: 69 6e 74 20 2a 70 69 49 64 78 2c 20 20 20 20 20  int *piIdx,     
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 2f 2a 20 4f 55 54 3a 20 49 6e 64 65 78 20 2a 2f  /* OUT: Index */
5710: 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c  .  int *piSegid,
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65     /* OUT: Segme
5740: 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  nt id */.  int *
5750: 70 69 48 65 69 67 68 74 2c 20 20 20 20 20 20 20  piHeight,       
5760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
5770: 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69  T: Height */.  i
5780: 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20  nt *piPgno      
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
57a0: 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62  * OUT: Page numb
57b0: 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67  er */.){.  *piPg
57c0: 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  no = (int)(iRowi
57d0: 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
57e0: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
57f0: 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69  ) - 1));.  iRowi
5800: 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
5810: 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65  PAGE_B;..  *piHe
5820: 69 67 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f  ight = (int)(iRo
5830: 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
5840: 3c 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  < FTS5_DATA_HEIG
5850: 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69  HT_B) - 1));.  i
5860: 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44  Rowid >>= FTS5_D
5870: 41 54 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20  ATA_HEIGHT_B;.. 
5880: 20 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74   *piSegid = (int
5890: 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
58a0: 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
58b0: 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20  _ID_B) - 1));.  
58c0: 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
58d0: 44 41 54 41 5f 49 44 5f 42 3b 0a 0a 20 20 2a 70  DATA_ID_B;..  *p
58e0: 69 49 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f  iIdx = (int)(iRo
58f0: 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c  wid & (((i64)1 <
5900: 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 58 5f  < FTS5_DATA_IDX_
5910: 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61  B) - 1));.}..sta
5920: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
5930: 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63  ugRowid(int *pRc
5940: 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
5950: 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20  uf, i64 iKey){. 
5960: 20 69 6e 74 20 69 49 64 78 2c 69 53 65 67 69 64   int iIdx,iSegid
5970: 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20  ,iHeight,iPgno; 
5980: 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e   /* Rowid compen
5990: 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65  ents */.  fts5De
59a0: 63 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20  codeRowid(iKey, 
59b0: 26 69 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20  &iIdx, &iSegid, 
59c0: 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f  &iHeight, &iPgno
59d0: 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64  );..  if( iSegid
59e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ==0 ){.    if( i
59f0: 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47  Key==FTS5_AVERAG
5a00: 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  ES_ROWID ){.    
5a10: 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
5a20: 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
5a30: 70 52 63 2c 20 70 42 75 66 2c 20 22 28 61 76 65  pRc, pBuf, "(ave
5a40: 72 61 67 65 73 29 20 22 29 3b 0a 20 20 20 20 7d  rages) ");.    }
5a50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
5a60: 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
5a70: 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
5a80: 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20  Buf, .          
5a90: 22 7b 73 74 72 75 63 74 75 72 65 20 69 64 78 3d  "{structure idx=
5aa0: 25 64 7d 22 2c 20 28 69 6e 74 29 28 69 4b 65 79  %d}", (int)(iKey
5ab0: 2d 31 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  -10).      );.  
5ac0: 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69    }.  }.  else i
5ad0: 66 28 20 69 48 65 69 67 68 74 3d 3d 46 54 53 35  f( iHeight==FTS5
5ae0: 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49  _SEGMENT_MAX_HEI
5af0: 47 48 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  GHT ){.    sqlit
5b00: 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
5b10: 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
5b20: 75 66 2c 20 22 28 64 6c 69 64 78 20 69 64 78 3d  uf, "(dlidx idx=
5b30: 25 64 20 73 65 67 69 64 3d 25 64 20 70 67 6e 6f  %d segid=%d pgno
5b40: 3d 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 69  =%d)",.        i
5b50: 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 50 67  Idx, iSegid, iPg
5b60: 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73  no.    );.  }els
5b70: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  e{.    sqlite3Ft
5b80: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
5b90: 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
5ba0: 22 28 69 64 78 3d 25 64 20 73 65 67 69 64 3d 25  "(idx=%d segid=%
5bb0: 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22  d h=%d pgno=%d)"
5bc0: 2c 0a 20 20 20 20 20 20 20 20 69 49 64 78 2c 20  ,.        iIdx, 
5bd0: 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c  iSegid, iHeight,
5be0: 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20   iPgno.    );.  
5bf0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
5c00: 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
5c10: 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ure(.  int *pRc,
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
5c40: 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : error code */.
5c50: 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
5c60: 75 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  uf,.  Fts5Struct
5c70: 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20  ure *p.){.  int 
5c80: 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20  iLvl, iSeg;     
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
5ca0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
5cb0: 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20  evels, segments 
5cc0: 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30  */..  for(iLvl=0
5cd0: 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c  ; iLvl<p->nLevel
5ce0: 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46  ; iLvl++){.    F
5cf0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
5d00: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c  l *pLvl = &p->aL
5d10: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
5d20: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
5d30: 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
5d40: 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20  c, pBuf, .      
5d50: 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72    " {lvl=%d nMer
5d60: 67 65 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c  ge=%d", iLvl, pL
5d70: 76 6c 2d 3e 6e 4d 65 72 67 65 0a 20 20 20 20 29  vl->nMerge.    )
5d80: 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30  ;.    for(iSeg=0
5d90: 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65  ; iSeg<pLvl->nSe
5da0: 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
5db0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
5dc0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
5dd0: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
5de0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
5df0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
5e00: 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
5e10: 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 7b 69   .          " {i
5e20: 64 3d 25 64 20 68 3d 25 64 20 6c 65 61 76 65 73  d=%d h=%d leaves
5e30: 3d 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67 2d  =%d..%d}", pSeg-
5e40: 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 6e  >iSegid, pSeg->n
5e50: 48 65 69 67 68 74 2c 20 0a 20 20 20 20 20 20 20  Height, .       
5e60: 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
5e70: 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  st, pSeg->pgnoLa
5e80: 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
5e90: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
5ea0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
5eb0: 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
5ec0: 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 73 74  }");.  }.}....st
5ed0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 75  atic void fts5Pu
5ee0: 74 55 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75  tU16(u8 *aOut, u
5ef0: 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74  16 iVal){.  aOut
5f00: 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b  [0] = (iVal>>8);
5f10: 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56  .  aOut[1] = (iV
5f20: 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61  al&0xFF);.}..sta
5f30: 74 69 63 20 75 31 36 20 66 74 73 35 47 65 74 55  tic u16 fts5GetU
5f40: 31 36 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e  16(const u8 *aIn
5f50: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31  ){.  return ((u1
5f60: 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b  6)aIn[0] << 8) +
5f70: 20 61 49 6e 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a   aIn[1];.}../*.*
5f80: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
5f90: 65 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61  eturn a buffer a
5fa0: 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79  t least nByte by
5fb0: 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
5fc0: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
5fd0: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
5fe0: 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  d, return NULL a
5ff0: 6e 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  nd set the error
6000: 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20   code in.** the 
6010: 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
6020: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
6030: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
6040: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66  /.static void *f
6050: 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73  ts5IdxMalloc(Fts
6060: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e  5Index *p, int n
6070: 42 79 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Byte){.  void *p
6080: 52 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Ret;.  assert( p
6090: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
60a0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 73 71 6c 69  );.  pRet = sqli
60b0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
60c0: 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d 30  );.  if( pRet==0
60d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
60e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
60f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65  }else{.    memse
6100: 74 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65  t(pRet, 0, nByte
6110: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6120: 70 52 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  pRet;.}..static 
6130: 76 6f 69 64 20 2a 66 74 73 35 4d 61 6c 6c 6f 63  void *fts5Malloc
6140: 5a 65 72 6f 28 69 6e 74 20 2a 70 52 63 2c 20 69  Zero(int *pRc, i
6150: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 76 6f 69  nt nByte){.  voi
6160: 64 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  d *pRet = 0;.  i
6170: 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
6180: 4f 4b 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  OK ){.    pRet =
6190: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
61a0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
61b0: 70 52 65 74 3d 3d 30 20 26 26 20 6e 42 79 74 65  pRet==0 && nByte
61c0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  >0 ){.      *pRc
61d0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
61e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
61f0: 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30    memset(pRet, 0
6200: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
6210: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
6220: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  t;.}../*.** Comp
6230: 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  are the contents
6240: 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62 75   of the pLeft bu
6250: 66 66 65 72 20 77 69 74 68 20 74 68 65 20 70 52  ffer with the pR
6260: 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f 62  ight/nRight blob
6270: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d  ..**.** Return -
6280: 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73  ve if pLeft is s
6290: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67  maller than pRig
62a0: 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72  ht, 0 if they ar
62b0: 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76  e equal or.** +v
62c0: 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73  e if pRight is s
62d0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66  maller than pLef
62e0: 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  t. In other word
62f0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73  s:.**.**     res
6300: 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69   = *pLeft - *pRi
6310: 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ght.*/.static in
6320: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
6330: 61 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42  areBlob(.  Fts5B
6340: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20  uffer *pLeft,   
6350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
6360: 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft hand side of 
6370: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
6380: 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74  const u8 *pRight
6390: 2c 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20  , int nRight    
63a0: 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73 69  /* Right hand si
63b0: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
63c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
63d0: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
63e0: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
63f0: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
6400: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20  eft->p, pRight, 
6410: 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  nCmp);.  return 
6420: 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74  (res==0 ? (pLeft
6430: 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20  ->n - nRight) : 
6440: 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 73  res);.}..#if 0.s
6450: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f  tatic int fts5Co
6460: 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 63 6f 6e  mpareBlob(.  con
6470: 73 74 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e  st u8 *pLeft, in
6480: 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74  t nLeft,.  const
6490: 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74   u8 *pRight, int
64a0: 20 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74   nRight.){.  int
64b0: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66   nCmp = MIN(nLef
64c0: 74 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e  t, nRight);.  in
64d0: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
64e0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43  Left, pRight, nC
64f0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
6500: 65 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d  es==0 ? (nLeft -
6510: 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b   nRight) : res);
6520: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
6530: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   Compare the con
6540: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74 77 6f  tents of the two
6550: 20 62 75 66 66 65 72 73 20 75 73 69 6e 67 20 6d   buffers using m
6560: 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65 20  emcmp(). If one 
6570: 62 75 66 66 65 72 0a 2a 2a 20 69 73 20 61 20 70  buffer.** is a p
6580: 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68  refix of the oth
6590: 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69 64  er, it is consid
65a0: 65 72 65 64 20 74 68 65 20 6c 65 73 73 65 72 2e  ered the lesser.
65b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76  .**.** Return -v
65c0: 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73 6d  e if pLeft is sm
65d0: 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67 68  aller than pRigh
65e0: 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72 65  t, 0 if they are
65f0: 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65   equal or.** +ve
6600: 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73 6d   if pRight is sm
6610: 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66 74  aller than pLeft
6620: 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
6630: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20  :.**.**     res 
6640: 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69 67  = *pLeft - *pRig
6650: 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ht.*/.static int
6660: 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
6670: 72 65 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  re(Fts5Buffer *p
6680: 4c 65 66 74 2c 20 46 74 73 35 42 75 66 66 65 72  Left, Fts5Buffer
6690: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 6e 74   *pRight){.  int
66a0: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66   nCmp = MIN(pLef
66b0: 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d 3e 6e 29  t->n, pRight->n)
66c0: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
66d0: 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70  mcmp(pLeft->p, p
66e0: 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d 70 29 3b  Right->p, nCmp);
66f0: 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d  .  return (res==
6700: 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20  0 ? (pLeft->n - 
6710: 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20 72 65 73  pRight->n) : res
6720: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  );.}.../*.** Clo
6730: 73 65 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c 79  se the read-only
6740: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c 20 69 66   blob handle, if
6750: 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a   it is open..*/.
6760: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6770: 43 6c 6f 73 65 52 65 61 64 65 72 28 46 74 73 35  CloseReader(Fts5
6780: 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66 28  Index *p){.  if(
6790: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
67a0: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
67b0: 63 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64 65 72  close(p->pReader
67c0: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65  );.    p->pReade
67d0: 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  r = 0;.  }.}..st
67e0: 61 74 69 63 20 46 74 73 35 44 61 74 61 20 2a 66  atic Fts5Data *f
67f0: 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66  ts5DataReadOrBuf
6800: 66 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78  fer(.  Fts5Index
6810: 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66 66   *p, .  Fts5Buff
6820: 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 69 36 34  er *pBuf, .  i64
6830: 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 46 74 73   iRowid.){.  Fts
6840: 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20 30 3b  5Data *pRet = 0;
6850: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
6860: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
6870: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6880: 4b 3b 0a 0a 23 69 66 20 30 0a 46 74 73 35 42 75  K;..#if 0.Fts5Bu
6890: 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 30 2c  ffer buf = {0,0,
68a0: 30 7d 3b 0a 66 74 73 35 44 65 62 75 67 52 6f 77  0};.fts5DebugRow
68b0: 69 64 28 26 72 63 2c 20 26 62 75 66 2c 20 69 52  id(&rc, &buf, iR
68c0: 6f 77 69 64 29 3b 0a 66 70 72 69 6e 74 66 28 73  owid);.fprintf(s
68d0: 74 64 6f 75 74 2c 20 22 72 65 61 64 3a 20 25 73  tdout, "read: %s
68e0: 5c 6e 22 2c 20 62 75 66 2e 70 29 3b 0a 66 66 6c  \n", buf.p);.ffl
68f0: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 73 71 6c  ush(stdout);.sql
6900: 69 74 65 33 5f 66 72 65 65 28 62 75 66 2e 70 29  ite3_free(buf.p)
6910: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
6920: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
6930: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
6940: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
6950: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
6960: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
6970: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
6980: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
6990: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
69a0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
69b0: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
69c0: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
69d0: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
69e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
69f0: 6f 62 5f 72 65 6f 70 65 6e 28 70 2d 3e 70 52 65  ob_reopen(p->pRe
6a00: 61 64 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ader, iRowid);. 
6a10: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6a20: 49 54 45 5f 41 42 4f 52 54 20 29 7b 0a 20 20 20  ITE_ABORT ){.   
6a30: 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65       fts5CloseRe
6a40: 61 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 20  ader(p);.       
6a50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6a60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6a70: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 62 6c      /* If the bl
6a80: 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74  ob handle is not
6a90: 20 79 65 74 20 6f 70 65 6e 2c 20 6f 70 65 6e 20   yet open, open 
6aa0: 61 6e 64 20 73 65 65 6b 20 69 74 2e 20 4f 74 68  and seek it. Oth
6ab0: 65 72 77 69 73 65 2c 20 75 73 65 0a 20 20 20 20  erwise, use.    
6ac0: 2a 2a 20 74 68 65 20 62 6c 6f 62 5f 72 65 6f 70  ** the blob_reop
6ad0: 65 6e 28 29 20 41 50 49 20 74 6f 20 72 65 73 65  en() API to rese
6ae0: 65 6b 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ek the existing 
6af0: 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  blob handle.  */
6b00: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61  .    if( p->pRea
6b10: 64 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  der==0 ){.      
6b20: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
6b30: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
6b40: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6b50: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70  ite3_blob_open(p
6b60: 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20  Config->db, .   
6b70: 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e         pConfig->
6b80: 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
6b90: 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69  , "block", iRowi
6ba0: 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65  d, 0, &p->pReade
6bb0: 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  r.      );.    }
6bc0: 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 66  ..    if( rc ) f
6bd0: 74 73 35 4d 69 73 73 69 6e 67 44 61 74 61 28 29  ts5MissingData()
6be0: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
6bf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6c00: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71    int nByte = sq
6c10: 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73  lite3_blob_bytes
6c20: 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20  (p->pReader);.  
6c30: 20 20 20 20 69 66 28 20 70 42 75 66 20 29 7b 0a      if( pBuf ){.
6c40: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
6c50: 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20 20  erZero(pBuf);.  
6c60: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
6c70: 47 72 6f 77 28 26 72 63 2c 20 70 42 75 66 2c 20  Grow(&rc, pBuf, 
6c80: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
6c90: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
6ca0: 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65  b_read(p->pReade
6cb0: 72 2c 20 70 42 75 66 2d 3e 70 2c 20 6e 42 79 74  r, pBuf->p, nByt
6cc0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
6cd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6ce0: 20 29 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79   ) pBuf->n = nBy
6cf0: 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  te;.      }else{
6d00: 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20  .        pRet = 
6d10: 28 46 74 73 35 44 61 74 61 2a 29 66 74 73 35 49  (Fts5Data*)fts5I
6d20: 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
6d30: 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 6e  of(Fts5Data) + n
6d40: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
6d50: 66 28 20 21 70 52 65 74 20 29 20 72 65 74 75 72  f( !pRet ) retur
6d60: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 70 52  n 0;..        pR
6d70: 65 74 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  et->n = nByte;. 
6d80: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 70 20 3d         pRet->p =
6d90: 20 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b 0a   (u8*)&pRet[1];.
6da0: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 52          pRet->nR
6db0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ef = 1;.        
6dc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
6dd0: 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65  b_read(p->pReade
6de0: 72 2c 20 70 52 65 74 2d 3e 70 2c 20 6e 42 79 74  r, pRet->p, nByt
6df0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
6e00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
6e20: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
6e30: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  ;.          pRet
6e40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
6e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6e60: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
6e70: 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20    p->nRead++;.  
6e80: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
6e90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
6ea0: 65 76 65 20 61 20 72 65 63 6f 72 64 20 66 72 6f  eve a record fro
6eb0: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
6ec0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
6ed0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
6ee0: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
6ef0: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65 66 74  nd an error left
6f00: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74 73 35   in the .** Fts5
6f10: 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Index object..*/
6f20: 0a 73 74 61 74 69 63 20 46 74 73 35 44 61 74 61  .static Fts5Data
6f30: 20 2a 66 74 73 35 44 61 74 61 52 65 61 64 28 46   *fts5DataRead(F
6f40: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
6f50: 20 69 52 6f 77 69 64 29 7b 0a 20 20 46 74 73 35   iRowid){.  Fts5
6f60: 44 61 74 61 20 2a 70 52 65 74 20 3d 20 66 74 73  Data *pRet = fts
6f70: 35 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65  5DataReadOrBuffe
6f80: 72 28 70 2c 20 30 2c 20 69 52 6f 77 69 64 29 3b  r(p, 0, iRowid);
6f90: 0a 20 20 61 73 73 65 72 74 28 20 28 70 52 65 74  .  assert( (pRet
6fa0: 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51  ==0)==(p->rc!=SQ
6fb0: 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65  LITE_OK) );.  re
6fc0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
6fd0: 0a 2a 2a 20 52 65 61 64 20 61 20 72 65 63 6f 72  .** Read a recor
6fe0: 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74  d from the %_dat
6ff0: 61 20 74 61 62 6c 65 20 69 6e 74 6f 20 74 68 65  a table into the
7000: 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64   buffer supplied
7010: 20 61 73 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e   as the.** secon
7020: 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
7030: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
7040: 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 69  curs, an error i
7050: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 46 74  s left in the Ft
7060: 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20  s5Index object. 
7070: 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68  If an.** error h
7080: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
7090: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
70a0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
70b0: 2c 20 69 74 20 69 73 20 61 20 0a 2a 2a 20 6e 6f  , it is a .** no
70c0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
70d0: 6f 69 64 20 66 74 73 35 44 61 74 61 42 75 66 66  oid fts5DataBuff
70e0: 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  er(Fts5Index *p,
70f0: 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
7100: 66 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  f, i64 iRowid){.
7110: 20 20 28 76 6f 69 64 29 66 74 73 35 44 61 74 61    (void)fts5Data
7120: 52 65 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20  ReadOrBuffer(p, 
7130: 70 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 7d  pBuf, iRowid);.}
7140: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
7150: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64  a reference to d
7160: 61 74 61 20 72 65 63 6f 72 64 20 72 65 74 75 72  ata record retur
7170: 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
7180: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73  r call to.** fts
7190: 35 44 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a  5DataRead()..*/.
71a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
71b0: 44 61 74 61 52 65 6c 65 61 73 65 28 46 74 73 35  DataRelease(Fts5
71c0: 44 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20  Data *pData){.  
71d0: 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
71e0: 20 61 73 73 65 72 74 28 20 70 44 61 74 61 2d 3e   assert( pData->
71f0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 44  nRef>0 );.    pD
7200: 61 74 61 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ata->nRef--;.   
7210: 20 69 66 28 20 70 44 61 74 61 2d 3e 6e 52 65 66   if( pData->nRef
7220: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72  ==0 ) sqlite3_fr
7230: 65 65 28 70 44 61 74 61 29 3b 0a 20 20 7d 0a 7d  ee(pData);.  }.}
7240: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
7250: 73 35 44 61 74 61 52 65 66 65 72 65 6e 63 65 28  s5DataReference(
7260: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29  Fts5Data *pData)
7270: 7b 0a 20 20 70 44 61 74 61 2d 3e 6e 52 65 66 2b  {.  pData->nRef+
7280: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45  +;.}../*.** INSE
7290: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20  RT OR REPLACE a 
72a0: 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
72b0: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f  %_data table..*/
72c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
72d0: 35 44 61 74 61 57 72 69 74 65 28 46 74 73 35 49  5DataWrite(Fts5I
72e0: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f  ndex *p, i64 iRo
72f0: 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  wid, const u8 *p
7300: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
7310: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  {.  if( p->rc!=S
7320: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
7330: 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72  n;..  if( p->pWr
7340: 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iter==0 ){.    i
7350: 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43  nt rc;.    Fts5C
7360: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
7370: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
7380: 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
7390: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
73a0: 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45 20         "REPLACE 
73b0: 49 4e 54 4f 20 27 25 71 27 2e 25 51 28 69 64 2c  INTO '%q'.%Q(id,
73c0: 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f   block) VALUES(?
73d0: 2c 3f 29 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  ,?)", pConfig->z
73e0: 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 0a  Db, p->zDataTbl.
73f0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a      );.    if( z
7400: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
7410: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7420: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
7430: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7440: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e  _prepare_v2(pCon
7450: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
7460: 31 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20  1, &p->pWriter, 
7470: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
7480: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
7490: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
74a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
74b0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
74c0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
74d0: 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
74e0: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
74f0: 70 57 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77  pWriter, 1, iRow
7500: 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  id);.  sqlite3_b
7510: 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69  ind_blob(p->pWri
7520: 74 65 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e  ter, 2, pData, n
7530: 44 61 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41  Data, SQLITE_STA
7540: 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
7550: 73 74 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29  step(p->pWriter)
7560: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
7570: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72  te3_reset(p->pWr
7580: 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  iter);.}../*.** 
7590: 45 78 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c  Execute the foll
75a0: 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a  owing SQL:.**.**
75b0: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
75c0: 20 25 5f 64 61 74 61 20 57 48 45 52 45 20 69 64   %_data WHERE id
75d0: 20 42 45 54 57 45 45 4e 20 24 69 46 69 72 73 74   BETWEEN $iFirst
75e0: 20 41 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73   AND $iLast.*/.s
75f0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
7600: 61 74 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e  ataDelete(Fts5In
7610: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72  dex *p, i64 iFir
7620: 73 74 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a  st, i64 iLast){.
7630: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
7640: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
7650: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65  ..  if( p->pDele
7660: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ter==0 ){.    in
7670: 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f  t rc;.    Fts5Co
7680: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
7690: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
76a0: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
76b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
76c0: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
76d0: 4f 4d 20 27 25 71 27 2e 25 51 20 57 48 45 52 45  OM '%q'.%Q WHERE
76e0: 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f   id>=? AND id<=?
76f0: 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c  ", pConfig->zDb,
7700: 20 70 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20   p->zDataTbl.   
7710: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   );.    if( zSql
7720: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
7730: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
7760: 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67  epare_v2(pConfig
7770: 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
7780: 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30 29  &p->pDeleter, 0)
7790: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
77a0: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
77b0: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
77c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
77d0: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
77e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
77f0: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
7800: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44  bind_int64(p->pD
7810: 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72 73  eleter, 1, iFirs
7820: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  t);.  sqlite3_bi
7830: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c  nd_int64(p->pDel
7840: 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b  eter, 2, iLast);
7850: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
7860: 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20  p->pDeleter);.  
7870: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
7880: 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74 65  reset(p->pDelete
7890: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  r);.}../*.** Clo
78a0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  se the sqlite3_b
78b0: 6c 6f 62 20 68 61 6e 64 6c 65 20 75 73 65 64 20  lob handle used 
78c0: 74 6f 20 72 65 61 64 20 72 65 63 6f 72 64 73 20  to read records 
78d0: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
78e0: 74 61 62 6c 65 2e 0a 2a 2a 20 41 6e 64 20 64 69  table..** And di
78f0: 73 63 61 72 64 20 61 6e 79 20 63 61 63 68 65 64  scard any cached
7900: 20 72 65 61 64 73 2e 20 54 68 69 73 20 66 75 6e   reads. This fun
7910: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
7920: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 2a 2a  at the end of.**
7930: 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
7940: 69 6f 6e 20 6f 72 20 77 68 65 6e 20 61 6e 79 20  ion or when any 
7950: 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  sub-transaction 
7960: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
7970: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7980: 74 73 35 44 61 74 61 52 65 73 65 74 28 46 74 73  ts5DataReset(Fts
7990: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66  5Index *p){.  if
79a0: 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a  ( p->pReader ){.
79b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
79c0: 5f 63 6c 6f 73 65 28 70 2d 3e 70 52 65 61 64 65  _close(p->pReade
79d0: 72 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64  r);.    p->pRead
79e0: 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  er = 0;.  }.}../
79f0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  *.** Remove all 
7a00: 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61 74  records associat
7a10: 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74 20  ed with segment 
7a20: 69 53 65 67 69 64 20 69 6e 20 69 6e 64 65 78 20  iSegid in index 
7a30: 69 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iIdx..*/.static 
7a40: 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6d  void fts5DataRem
7a50: 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35 49  oveSegment(Fts5I
7a60: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64  ndex *p, int iId
7a70: 78 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b 0a  x, int iSegid){.
7a80: 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 46    i64 iFirst = F
7a90: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
7aa0: 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
7ab0: 30 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c 61  0, 0);.  i64 iLa
7ac0: 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  st = FTS5_SEGMEN
7ad0: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53  T_ROWID(iIdx, iS
7ae0: 65 67 69 64 2b 31 2c 20 30 2c 20 30 29 2d 31 3b  egid+1, 0, 0)-1;
7af0: 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  .  fts5DataDelet
7b00: 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61  e(p, iFirst, iLa
7b10: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  st);.}../*.** De
7b20: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
7b30: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
7b40: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
7b50: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
7b60: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
7b70: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
7b80: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
7b90: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
7ba0: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
7bb0: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
7bc0: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
7bd0: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
7be0: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
7bf0: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
7c00: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
7c10: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
7c20: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
7c30: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
7c40: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7c50: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
7c60: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
7c70: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
7c80: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7c90: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7ca0: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7cb0: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
7cc0: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
7cd0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7ce0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7cf0: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7d00: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
7d10: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7d20: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
7d30: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
7d40: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
7d50: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
7d80: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7d90: 65 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  es */.  Fts5Stru
7da0: 63 74 75 72 65 20 2a 2a 70 70 4f 75 74 20 20 20  cture **ppOut   
7db0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
7dc0: 44 65 73 65 72 69 61 6c 69 7a 65 64 20 6f 62 6a  Deserialized obj
7dd0: 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
7de0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
7df0: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
7e00: 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e  nt iLvl;.  int n
7e10: 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  Level = 0;.  int
7e20: 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20   nSegment = 0;. 
7e30: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e50: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
7e60: 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  ce to allocate a
7e70: 74 20 70 52 65 74 20 2a 2f 0a 20 20 46 74 73 35  t pRet */.  Fts5
7e80: 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74 20  Structure *pRet 
7e90: 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  = 0;        /* S
7ea0: 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
7eb0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20  to return */..  
7ec0: 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74 61  /* Read the tota
7ed0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  l number of leve
7ee0: 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73 20  ls and segments 
7ef0: 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
7f00: 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75 63  f the.  ** struc
7f10: 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a 2f  ture record.  */
7f20: 0a 20 20 69 20 3d 20 67 65 74 56 61 72 69 6e 74  .  i = getVarint
7f30: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c  32(&pData[i], nL
7f40: 65 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 67 65  evel);.  i += ge
7f50: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
7f60: 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a  [i], nSegment);.
7f70: 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20    nByte = (.    
7f80: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7f90: 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20  ucture) +       
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7fb0: 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a  Main structure *
7fc0: 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  /.      sizeof(F
7fd0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7fe0: 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 29 20 20 20  l) * (nLevel)   
7ff0: 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61     /* aLevel[] a
8000: 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70  rray */.  );.  p
8010: 52 65 74 20 3d 20 28 46 74 73 35 53 74 72 75 63  Ret = (Fts5Struc
8020: 74 75 72 65 2a 29 66 74 73 35 4d 61 6c 6c 6f 63  ture*)fts5Malloc
8030: 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29  Zero(&rc, nByte)
8040: 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  ;..  if( pRet ){
8050: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65  .    pRet->nLeve
8060: 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20  l = nLevel;.    
8070: 69 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  i += sqlite3GetV
8080: 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c  arint(&pData[i],
8090: 20 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f   &pRet->nWriteCo
80a0: 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72  unter);..    for
80b0: 28 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c  (iLvl=0; rc==SQL
80c0: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e  ITE_OK && iLvl<n
80d0: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
80e0: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
80f0: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
8100: 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69   &pRet->aLevel[i
8110: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Lvl];.      int 
8120: 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69 6e  nTotal;.      in
8130: 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20 69  t iSeg;..      i
8140: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
8150: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
8160: 3e 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20  >nMerge);.      
8170: 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
8180: 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74  (&pData[i], nTot
8190: 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
81a0: 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d  t( nTotal>=pLvl-
81b0: 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20  >nMerge );.     
81c0: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46   pLvl->aSeg = (F
81d0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
81e0: 65 6e 74 2a 29 66 74 73 35 4d 61 6c 6c 6f 63 5a  ent*)fts5MallocZ
81f0: 65 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20  ero(&rc, .      
8200: 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a      nTotal * siz
8210: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8220: 65 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20  eSegment).      
8230: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  );..      if( rc
8240: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8250: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
8260: 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20  g = nTotal;.    
8270: 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
8280: 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65  iSeg<nTotal; iSe
8290: 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
82a0: 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
82b0: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
82c0: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ->aSeg[iSeg].iSe
82d0: 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  gid);.          
82e0: 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
82f0: 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c  (&pData[i], pLvl
8300: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65  ->aSeg[iSeg].nHe
8310: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
8320: 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   i += getVarint3
8330: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
8340: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
8350: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
8360: 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69      i += getVari
8370: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
8380: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
8390: 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20  .pgnoLast);.    
83a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
83b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75    }.  }..  *ppOu
83c0: 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75  t = pRet;.  retu
83d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  rn rc;.}../*.**.
83e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
83f0: 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
8400: 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46  evel(int *pRc, F
8410: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
8420: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20  pStruct){.  if( 
8430: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
8440: 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
8450: 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
8460: 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69  *ppStruct;.    i
8470: 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72  nt nLevel = pStr
8480: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20  uct->nLevel;.   
8490: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20   int nByte = (. 
84a0: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
84b0: 73 35 53 74 72 75 63 74 75 72 65 29 20 2b 20 20  s5Structure) +  
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84d0: 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72  /* Main structur
84e0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a  e */.        siz
84f0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
8500: 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65  eLevel) * (nLeve
8510: 6c 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b  l+1)  /* aLevel[
8520: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29  ] array */.    )
8530: 3b 0a 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d  ;..    pStruct =
8540: 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
8550: 28 70 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29  (pStruct, nByte)
8560: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63  ;.    if( pStruc
8570: 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  t ){.      memse
8580: 74 28 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  t(&pStruct->aLev
8590: 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73  el[nLevel], 0, s
85a0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
85b0: 75 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20  ureLevel));.    
85c0: 20 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65    pStruct->nLeve
85d0: 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74  l++;.      *ppSt
85e0: 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
85f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8600: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
8610: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
8620: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20  }../*.** Extend 
8630: 6c 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68  level iLvl so th
8640: 61 74 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  at there is room
8650: 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45   for at least nE
8660: 78 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67  xtra more.** seg
8670: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
8680: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
8690: 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a  ureExtendLevel(.
86a0: 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46    int *pRc, .  F
86b0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
86c0: 74 72 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c  truct, .  int iL
86d0: 76 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72  vl, .  int nExtr
86e0: 61 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72  a, .  int bInser
86f0: 74 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d  t.){.  if( *pRc=
8700: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8710: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
8720: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
8730: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
8740: 76 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72  vl];.    Fts5Str
8750: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61  uctureSegment *a
8760: 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79  New;.    int nBy
8770: 74 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d  te;..    nByte =
8780: 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e   (pLvl->nSeg + n
8790: 45 78 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28  Extra) * sizeof(
87a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
87b0: 6d 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20  ment);.    aNew 
87c0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  = sqlite3_reallo
87d0: 63 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42  c(pLvl->aSeg, nB
87e0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  yte);.    if( aN
87f0: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
8800: 62 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20  bInsert==0 ){.  
8810: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e        memset(&aN
8820: 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20  ew[pLvl->nSeg], 
8830: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
8840: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20  ructureSegment) 
8850: 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  * nExtra);.     
8860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8870: 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c  int nMove = pLvl
8880: 2d 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28  ->nSeg * sizeof(
8890: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
88a0: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  ment);.        m
88b0: 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78  emmove(&aNew[nEx
88c0: 74 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76  tra], aNew, nMov
88d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  e);.        mems
88e0: 65 74 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(aNew, 0, size
88f0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
8900: 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72  Segment) * nExtr
8910: 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
8920: 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61    pLvl->aSeg = a
8930: 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  New;.    }else{.
8940: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
8950: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
8960: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
8970: 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20  ad, deserialize 
8980: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
8990: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20  tructure record 
89a0: 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a  for index iIdx..
89b0: 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74  **.** The Fts5St
89c0: 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d  ructure.aLevel[]
89d0: 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74   and each Fts5St
89e0: 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65  ructureLevel.aSe
89f0: 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65  g[] array.** are
8a00: 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20   over-allocated 
8a10: 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f 72  as described for
8a20: 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53 74   function fts5St
8a30: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 20  ructureDecode() 
8a40: 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  .** above..**.**
8a50: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
8a60: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
8a70: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
8a80: 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20  or code left in 
8a90: 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78  the.** Fts5Index
8aa0: 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65   handle. If an e
8ab0: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
8ac0: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
8ad0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
8ae0: 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
8af0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
8b00: 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72  tic Fts5Structur
8b10: 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72 65  e *fts5Structure
8b20: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
8b30: 70 2c 20 69 6e 74 20 69 49 64 78 29 7b 0a 20 20  p, int iIdx){.  
8b40: 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
8b50: 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
8b60: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
8b70: 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  e *pRet = 0;    
8b80: 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
8b90: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73   return */.  Fts
8ba0: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20  5Data *pData;   
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8bc0: 25 5f 64 61 74 61 20 65 6e 74 72 79 20 63 6f 6e  %_data entry con
8bd0: 74 61 69 6e 69 6e 67 20 73 74 72 75 63 74 75 72  taining structur
8be0: 65 20 72 65 63 6f 72 64 20 2a 2f 0a 0a 20 20 61  e record */..  a
8bf0: 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 43 6f  ssert( iIdx<=pCo
8c00: 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 3b  nfig->nPrefix );
8c10: 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
8c20: 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
8c30: 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28  STRUCTURE_ROWID(
8c40: 69 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21 70  iIdx));.  if( !p
8c50: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 30 3b  Data ) return 0;
8c60: 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53  .  p->rc = fts5S
8c70: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70  tructureDecode(p
8c80: 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
8c90: 6e 2c 20 26 70 52 65 74 29 3b 0a 0a 20 20 66 74  n, &pRet);..  ft
8ca0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
8cb0: 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
8cc0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
8cd0: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
8ce0: 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72 75  e to an Fts5Stru
8cf0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65 74  cture object ret
8d00: 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  urned by an earl
8d10: 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20  ier .** call to 
8d20: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
8d30: 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75 63  d() or fts5Struc
8d40: 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a 2f  tureDecode()..*/
8d50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8d60: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
8d70: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e(Fts5Structure 
8d80: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
8d90: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
8da0: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
8db0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
8dc0: 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63 74  te3_free(pStruct
8dd0: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67  ->aLevel[i].aSeg
8de0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8df0: 5f 66 72 65 65 28 70 53 74 72 75 63 74 29 3b 0a  _free(pStruct);.
8e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8e10: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
8e20: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20   of segments in 
8e30: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
8e40: 70 53 74 72 75 63 74 2e 0a 2a 2f 0a 73 74 61 74  pStruct..*/.stat
8e50: 69 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63  ic int fts5Struc
8e60: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
8e70: 73 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  s(Fts5Structure 
8e80: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
8e90: 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20   nSegment = 0;  
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8eb0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
8ec0: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  segments */.  in
8ed0: 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8ef0: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
8f00: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
8f10: 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30  */..  for(iLvl=0
8f20: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
8f30: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
8f40: 0a 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d  .    nSegment +=
8f50: 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
8f60: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 7d  [iLvl].nSeg;.  }
8f70: 0a 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d  ..  return nSegm
8f80: 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ent;.}../*.** Se
8f90: 72 69 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72  rialize and stor
8fa0: 65 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65  e the "structure
8fb0: 22 20 72 65 63 6f 72 64 20 66 6f 72 20 69 6e 64  " record for ind
8fc0: 65 78 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49  ex iIdx..**.** I
8fd0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8fe0: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
8ff0: 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74  r code in the Ft
9000: 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20  s5Index object. 
9010: 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68  If an.** error h
9020: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
9030: 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
9040: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
9050: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
9060: 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
9070: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
9080: 6e 74 20 69 49 64 78 2c 20 46 74 73 35 53 74 72  nt iIdx, Fts5Str
9090: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
90a0: 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74  {.  int nSegment
90b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
90c0: 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
90d0: 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
90e0: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
90f0: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
9100: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
9110: 6f 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f  o serialize reco
9120: 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 69 6e 74  rd into */.  int
9130: 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20   iLvl;          
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9150: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
9160: 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
9170: 2f 0a 0a 20 20 6e 53 65 67 6d 65 6e 74 20 3d 20  /..  nSegment = 
9180: 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
9190: 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75  ntSegments(pStru
91a0: 63 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  ct);.  memset(&b
91b0: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
91c0: 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 74  s5Buffer));.  ft
91d0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
91e0: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
91f0: 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  f, pStruct->nLev
9200: 65 6c 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  el);.  fts5Buffe
9210: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9220: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 53 65 67  ->rc, &buf, nSeg
9230: 6d 65 6e 74 29 3b 0a 20 20 66 74 73 35 42 75 66  ment);.  fts5Buf
9240: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
9250: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 28 69  &p->rc, &buf, (i
9260: 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69  64)pStruct->nWri
9270: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 66  teCounter);..  f
9280: 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
9290: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
92a0: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e   iLvl++){.    in
92b0: 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
92d0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
92e0: 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
92f0: 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  */.    Fts5Struc
9300: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
9310: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
9320: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 66 74  el[iLvl];.    ft
9330: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
9340: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
9350: 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29  f, pLvl->nMerge)
9360: 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
9370: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9380: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9390: 3e 6e 53 65 67 29 3b 0a 20 20 20 20 61 73 73 65  >nSeg);.    asse
93a0: 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
93b0: 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
93c0: 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b  .    for(iSeg=0;
93d0: 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67   iSeg<pLvl->nSeg
93e0: 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
93f0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
9400: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
9410: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
9420: 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a  [iSeg].iSegid);.
9430: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9440: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9450: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9460: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48 65 69  >aSeg[iSeg].nHei
9470: 67 68 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ght);.      fts5
9480: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9490: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
94a0: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
94b0: 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20  ].pgnoFirst);.  
94c0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
94d0: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
94e0: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61  c, &buf, pLvl->a
94f0: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61  Seg[iSeg].pgnoLa
9500: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  st);.    }.  }..
9510: 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
9520: 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  p, FTS5_STRUCTUR
9530: 45 5f 52 4f 57 49 44 28 69 49 64 78 29 2c 20 62  E_ROWID(iIdx), b
9540: 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20  uf.p, buf.n);.  
9550: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
9560: 62 75 66 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 73  buf);.}..#if 0.s
9570: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
9580: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f  rintStructure(co
9590: 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69  nst char *zCapti
95a0: 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  on, Fts5Structur
95b0: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
95c0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
95d0: 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  K;.  Fts5Buffer 
95e0: 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
95f0: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75  uf, 0, sizeof(bu
9600: 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67  f));.  fts5Debug
9610: 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26  Structure(&rc, &
9620: 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  buf, pStruct);. 
9630: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
9640: 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61   "%s: %s\n", zCa
9650: 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20  ption, buf.p);. 
9660: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
9670: 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
9680: 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65  e(&buf);.}.#else
9690: 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50 72  .# define fts5Pr
96a0: 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c 79  intStructure(x,y
96b0: 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  ).#endif..static
96c0: 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74   int fts5Segment
96d0: 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74 75  Size(Fts5Structu
96e0: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29  reSegment *pSeg)
96f0: 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70  {.  return 1 + p
9700: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
9710: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b  pSeg->pgnoFirst;
9720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9730: 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78   a copy of index
9740: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
9750: 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d  ct. Except, prom
9760: 6f 74 65 20 61 73 20 6d 61 6e 79 20 73 65 67 6d  ote as many segm
9770: 65 6e 74 73 0a 2a 2a 20 61 73 20 70 6f 73 73 69  ents.** as possi
9780: 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72  ble to level iPr
9790: 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d  omote. If an OOM
97a0: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
97b0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
97c0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
97d0: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
97e0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
97f0: 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65  ,.  int iPromote
9800: 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74  ,.  int szPromot
9810: 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  e,.  Fts5Structu
9820: 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20  re *pStruct.){. 
9830: 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46   int il, is;.  F
9840: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
9850: 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75  l *pOut = &pStru
9860: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d  ct->aLevel[iProm
9870: 6f 74 65 5d 3b 0a 0a 20 20 66 6f 72 28 69 6c 3d  ote];..  for(il=
9880: 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70  iPromote+1; il<p
9890: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
98a0: 69 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53  il++){.    Fts5S
98b0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
98c0: 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
98d0: 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20  aLevel[il];.    
98e0: 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65  for(is=pLvl->nSe
98f0: 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d  g-1; is>=0; is--
9900: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20  ){.      int sz 
9910: 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a  = fts5SegmentSiz
9920: 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73  e(&pLvl->aSeg[is
9930: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  ]);.      if( sz
9940: 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74  >szPromote ) ret
9950: 75 72 6e 3b 0a 20 20 20 20 20 20 66 74 73 35 53  urn;.      fts5S
9960: 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
9970: 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
9980: 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31  uct, iPromote, 1
9990: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
99a0: 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
99b0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75        memcpy(pOu
99c0: 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  t->aSeg, &pLvl->
99d0: 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66  aSeg[is], sizeof
99e0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
99f0: 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 70  gment));.      p
9a00: 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20  Out->nSeg++;.   
9a10: 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b     pLvl->nSeg--;
9a20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9a30: 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e  .** A new segmen
9a40: 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  t has just been 
9a50: 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c  written to level
9a60: 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73   iLvl of index s
9a70: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72  tructure.** pStr
9a80: 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  uct. This functi
9a90: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  on determines if
9aa0: 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68   any segments sh
9ab0: 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64  ould be promoted
9ac0: 0a 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e  .** as a result.
9ad0: 20 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72   Segments are pr
9ae0: 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63  omoted in two sc
9af0: 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
9b00: 20 61 29 20 49 66 20 74 68 65 20 73 65 67 6d 65   a) If the segme
9b10: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
9b20: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
9b30: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  one or more segm
9b40: 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74  ents.**      wit
9b50: 68 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hin the previous
9b60: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
9b70: 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64  , it is promoted
9b80: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
9b90: 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74  .**      populat
9ba0: 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ed level..**.** 
9bb0: 20 20 62 29 20 49 66 20 74 68 65 20 73 65 67 6d    b) If the segm
9bc0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9bd0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
9be0: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
9bf0: 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68  nt on.**      th
9c00: 65 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64  e next populated
9c10: 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61   level, then tha
9c20: 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61  t segment, and a
9c30: 6e 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e  ny other adjacen
9c40: 74 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e  t.**      segmen
9c50: 74 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ts that are also
9c60: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
9c70: 65 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74  e one just writt
9c80: 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  en, are .**     
9c90: 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a   promoted. .**.*
9ca0: 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * If one or more
9cb0: 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72   segments are pr
9cc0: 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75  omoted, the stru
9cd0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20  cture object is 
9ce0: 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65  updated.** to re
9cf0: 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73  flect this..*/.s
9d00: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
9d10: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
9d20: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
9d50: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
9d60: 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20  nt iLvl,        
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9d80: 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75  * Index level ju
9d90: 73 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  st updated */.  
9da0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
9db0: 53 74 72 75 63 74 20 20 20 20 20 20 20 20 20 20  Struct          
9dc0: 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
9dd0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  re */.){.  if( p
9de0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9df0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b  ){.    int iTst;
9e00: 0a 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74  .    int iPromot
9e10: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  e = -1;.    int 
9e20: 73 7a 50 72 6f 6d 6f 74 65 3b 20 20 20 20 20 20  szPromote;      
9e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
9e40: 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68  mote anything th
9e50: 69 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c  is size or small
9e60: 65 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74  er */.    Fts5St
9e70: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
9e80: 70 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65  pSeg;   /* Segme
9e90: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
9ea0: 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  */.    Fts5Struc
9eb0: 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 3b  tureLevel *pTst;
9ec0: 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20  .    int szSeg; 
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ee0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65     /* Size of se
9ef0: 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74  gment just writt
9f00: 65 6e 20 2a 2f 0a 0a 0a 20 20 20 20 70 53 65 67  en */...    pSeg
9f10: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9f20: 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70  vel[iLvl].aSeg[p
9f30: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9f40: 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20  Lvl].nSeg-1];.  
9f50: 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70    szSeg = (1 + p
9f60: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
9f70: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29  pSeg->pgnoFirst)
9f80: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
9f90: 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61  for condition (a
9fa0: 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73  ) */.    for(iTs
9fb0: 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d  t=iLvl-1; iTst>=
9fc0: 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  0 && pStruct->aL
9fd0: 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d  evel[iTst].nSeg=
9fe0: 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20  =0; iTst--);.   
9ff0: 20 70 54 73 74 20 3d 20 26 70 53 74 72 75 63 74   pTst = &pStruct
a000: 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a  ->aLevel[iTst];.
a010: 20 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20      if( iTst>=0 
a020: 26 26 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d  && pTst->nMerge=
a030: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
a040: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 4d  i;.      int szM
a050: 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  ax = 0;.      fo
a060: 72 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e  r(i=0; i<pTst->n
a070: 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Seg; i++){.     
a080: 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74     int sz = pTst
a090: 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61  ->aSeg[i].pgnoLa
a0a0: 73 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b  st - pTst->aSeg[
a0b0: 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31  i].pgnoFirst + 1
a0c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
a0d0: 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d  >szMax ) szMax =
a0e0: 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   sz;.      }.   
a0f0: 20 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a     if( szMax>=sz
a100: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Seg ){.        /
a110: 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  * Condition (a) 
a120: 69 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65  is true. Promote
a130: 20 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d   the newest segm
a140: 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20  ent on level .  
a150: 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f        ** iLvl to
a160: 20 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f   level iTst.  */
a170: 0a 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74  .        iPromot
a180: 65 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20  e = iTst;.      
a190: 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a    szPromote = sz
a1a0: 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Max;.      }.   
a1b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
a1c0: 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28   for condition (
a1d0: 62 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50  b) */.    if( iP
a1e0: 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20  romote<0 ){.    
a1f0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
a200: 65 76 65 6c 20 2a 70 54 73 74 3b 0a 20 20 20 20  evel *pTst;.    
a210: 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2b    for(iTst=iLvl+
a220: 31 3b 20 69 54 73 74 3c 70 53 74 72 75 63 74 2d  1; iTst<pStruct-
a230: 3e 6e 4c 65 76 65 6c 3b 20 69 54 73 74 2b 2b 29  >nLevel; iTst++)
a240: 7b 0a 20 20 20 20 20 20 20 20 70 54 73 74 20 3d  {.        pTst =
a250: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
a260: 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 20  l[iTst];.       
a270: 20 69 66 28 20 70 54 73 74 2d 3e 6e 53 65 67 20   if( pTst->nSeg 
a280: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
a290: 0a 20 20 20 20 20 20 69 66 28 20 69 54 73 74 3c  .      if( iTst<
a2a0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20  pStruct->nLevel 
a2b0: 26 26 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65 3d  && pTst->nMerge=
a2c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74  =0 ){.        Ft
a2d0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
a2e0: 6e 74 20 2a 70 53 65 67 32 20 3d 20 26 70 54 73  nt *pSeg2 = &pTs
a2f0: 74 2d 3e 61 53 65 67 5b 70 54 73 74 2d 3e 6e 53  t->aSeg[pTst->nS
a300: 65 67 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  eg-1];.        i
a310: 6e 74 20 73 7a 20 3d 20 70 53 65 67 32 2d 3e 70  nt sz = pSeg2->p
a320: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 32 2d  gnoLast - pSeg2-
a330: 3e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b 0a  >pgnoFirst + 1;.
a340: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3c 3d          if( sz<=
a350: 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20  szSeg ){.       
a360: 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c     iPromote = iL
a370: 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  vl;.          sz
a380: 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b  Promote = szSeg;
a390: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a3a0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a3b0: 20 49 66 20 69 50 72 6f 6d 6f 74 65 20 69 73 20   If iPromote is 
a3c0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
a3d0: 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 20 61 74  equal to zero at
a3e0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
a3f0: 6e 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  n it.    ** is t
a400: 68 65 20 6c 65 76 65 6c 20 6e 75 6d 62 65 72 20  he level number 
a410: 6f 66 20 61 20 6c 65 76 65 6c 20 74 6f 20 77 68  of a level to wh
a420: 69 63 68 20 73 65 67 6d 65 6e 74 73 20 74 68 61  ich segments tha
a430: 74 20 63 6f 6e 73 69 73 74 20 6f 66 0a 20 20 20  t consist of.   
a440: 20 2a 2a 20 73 7a 50 72 6f 6d 6f 74 65 20 6f 72   ** szPromote or
a450: 20 66 65 77 65 72 20 70 61 67 65 73 20 73 68 6f   fewer pages sho
a460: 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 2e  uld be promoted.
a470: 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 69 50 72   */ .    if( iPr
a480: 6f 6d 6f 74 65 3e 3d 30 20 29 7b 0a 20 20 20 20  omote>=0 ){.    
a490: 20 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63    fts5PrintStruc
a4a0: 74 75 72 65 28 22 42 45 46 4f 52 45 22 2c 20 70  ture("BEFORE", p
a4b0: 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 66  Struct);.      f
a4c0: 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
a4d0: 6f 74 65 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74  oteTo(p, iPromot
a4e0: 65 2c 20 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53  e, szPromote, pS
a4f0: 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74  truct);.      ft
a500: 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65  s5PrintStructure
a510: 28 22 41 46 54 45 52 22 2c 20 70 53 74 72 75 63  ("AFTER", pStruc
a520: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
a530: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ../*.** If the p
a540: 49 74 65 72 2d 3e 69 4f 66 66 20 6f 66 66 73 65  Iter->iOff offse
a550: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
a560: 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 69  ts to an entry i
a570: 6e 64 69 63 61 74 69 6e 67 20 6f 6e 65 0a 2a 2a  ndicating one.**
a580: 20 6f 72 20 6d 6f 72 65 20 74 65 72 6d 2d 6c 65   or more term-le
a590: 73 73 20 6e 6f 64 65 73 2c 20 61 64 76 61 6e 63  ss nodes, advanc
a5a0: 65 20 70 61 73 74 20 69 74 20 61 6e 64 20 73 65  e past it and se
a5b0: 74 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20  t pIter->nEmpty 
a5c0: 74 6f 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  to.** the number
a5d0: 20 6f 66 20 65 6d 70 74 79 20 63 68 69 6c 64 20   of empty child 
a5e0: 6e 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  nodes..*/.static
a5f0: 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74   void fts5NodeIt
a600: 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 46  erGobbleNEmpty(F
a610: 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74  ts5NodeIter *pIt
a620: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
a630: 2d 3e 69 4f 66 66 3c 70 49 74 65 72 2d 3e 6e 44  ->iOff<pIter->nD
a640: 61 74 61 20 26 26 20 30 3d 3d 28 70 49 74 65 72  ata && 0==(pIter
a650: 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69  ->aData[pIter->i
a660: 4f 66 66 5d 20 26 20 30 78 66 65 29 20 29 7b 0a  Off] & 0xfe) ){.
a670: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64      pIter->bDlid
a680: 78 20 3d 20 70 49 74 65 72 2d 3e 61 44 61 74 61  x = pIter->aData
a690: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20  [pIter->iOff] & 
a6a0: 30 78 30 31 3b 0a 20 20 20 20 70 49 74 65 72 2d  0x01;.    pIter-
a6b0: 3e 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 70 49 74  >iOff++;.    pIt
a6c0: 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56  er->iOff += getV
a6d0: 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e  arint32(&pIter->
a6e0: 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66  aData[pIter->iOf
a6f0: 66 5d 2c 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74  f], pIter->nEmpt
a700: 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  y);.  }else{.   
a710: 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d   pIter->nEmpty =
a720: 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62   0;.    pIter->b
a730: 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Dlidx = 0;.  }.}
a740: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
a750: 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
a760: 79 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 64  y within the nod
a770: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
a780: 64 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65  d fts5NodeIterNe
a790: 78 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  xt(int *pRc, Fts
a7a0: 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72  5NodeIter *pIter
a7b0: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ){.  if( pIter->
a7c0: 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 6e 44 61  iOff>=pIter->nDa
a7d0: 74 61 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  ta ){.    pIter-
a7e0: 3e 61 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >aData = 0;.    
a7f0: 70 49 74 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d  pIter->iChild +=
a800: 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 3b 0a   pIter->nEmpty;.
a810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
a820: 20 6e 50 72 65 2c 20 6e 4e 65 77 3b 0a 20 20 20   nPre, nNew;.   
a830: 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20   pIter->iOff += 
a840: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  getVarint32(&pIt
a850: 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d  er->aData[pIter-
a860: 3e 69 4f 66 66 5d 2c 20 6e 50 72 65 29 3b 0a 20  >iOff], nPre);. 
a870: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
a880: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
a890: 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65  Iter->aData[pIte
a8a0: 72 2d 3e 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b  r->iOff], nNew);
a8b0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 74 65 72 6d  .    pIter->term
a8c0: 2e 6e 20 3d 20 6e 50 72 65 2d 32 3b 0a 20 20 20  .n = nPre-2;.   
a8d0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
a8e0: 64 42 6c 6f 62 28 70 52 63 2c 20 26 70 49 74 65  dBlob(pRc, &pIte
a8f0: 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 70  r->term, nNew, p
a900: 49 74 65 72 2d 3e 61 44 61 74 61 2b 70 49 74 65  Iter->aData+pIte
a910: 72 2d 3e 69 4f 66 66 29 3b 0a 20 20 20 20 70 49  r->iOff);.    pI
a920: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 6e 4e 65  ter->iOff += nNe
a930: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43  w;.    pIter->iC
a940: 68 69 6c 64 20 2b 3d 20 28 31 20 2b 20 70 49 74  hild += (1 + pIt
a950: 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 20  er->nEmpty);.   
a960: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62   fts5NodeIterGob
a970: 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29  bleNEmpty(pIter)
a980: 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63 20 29  ;.    if( *pRc )
a990: 20 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20   pIter->aData = 
a9a0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  0;.  }.}.../*.**
a9b0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
a9c0: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
a9d0: 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74 65  pIter to iterate
a9e0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 74   through the int
a9f0: 65 72 6e 61 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74  ernal.** segment
aa00: 20 6e 6f 64 65 20 69 6e 20 70 44 61 74 61 2e 0a   node in pData..
aa10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
aa20: 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28  ts5NodeIterInit(
aa30: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c  const u8 *aData,
aa40: 20 69 6e 74 20 6e 44 61 74 61 2c 20 46 74 73 35   int nData, Fts5
aa50: 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72 29  NodeIter *pIter)
aa60: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  {.  memset(pIter
aa70: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
aa80: 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61  er));.  pIter->a
aa90: 44 61 74 61 20 3d 20 61 44 61 74 61 3b 0a 20 20  Data = aData;.  
aaa0: 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 3d 20 6e  pIter->nData = n
aab0: 44 61 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 69  Data;.  pIter->i
aac0: 4f 66 66 20 3d 20 67 65 74 56 61 72 69 6e 74 33  Off = getVarint3
aad0: 32 28 61 44 61 74 61 2c 20 70 49 74 65 72 2d 3e  2(aData, pIter->
aae0: 69 43 68 69 6c 64 29 3b 0a 20 20 66 74 73 35 4e  iChild);.  fts5N
aaf0: 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d  odeIterGobbleNEm
ab00: 70 74 79 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  pty(pIter);.}../
ab10: 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6d 65  *.** Free any me
ab20: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  mory allocated b
ab30: 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  y the iterator o
ab40: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
ab50: 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74   void fts5NodeIt
ab60: 65 72 46 72 65 65 28 46 74 73 35 4e 6f 64 65 49  erFree(Fts5NodeI
ab70: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66  ter *pIter){.  f
ab80: 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
ab90: 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 7d 0a 0a  Iter->term);.}..
aba0: 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  /*.** The iterat
abb0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
abc0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
abd0: 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  has the followin
abe0: 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a 2a 20  g fields set.** 
abf0: 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68 69 73  as follows. This
ac00: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 75   function sets u
ac10: 70 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  p the rest of th
ac20: 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68  e iterator so th
ac30: 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74 73 20  at it.** points 
ac40: 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
ac50: 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73  id in the doclis
ac60: 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 20  t-index..**.**  
ac70: 20 70 44 61 74 61 3a 20 70 6f 69 6e 74 65 72 20   pData: pointer 
ac80: 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  to doclist-index
ac90: 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 20 20 20 69   record, .**   i
aca0: 4c 65 61 66 50 67 6e 6f 3a 20 70 61 67 65 20 6e  LeafPgno: page n
acb0: 75 6d 62 65 72 20 74 68 61 74 20 74 68 69 73 20  umber that this 
acc0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73  doclist-index is
acd0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
ace0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
acf0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72  fts5DlidxIterFir
ad00: 73 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  st(Fts5DlidxIter
ad10: 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
ad20: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70 49  Data *pData = pI
ad30: 74 65 72 2d 3e 70 44 61 74 61 3b 0a 20 20 69 6e  ter->pData;.  in
ad40: 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
ad50: 70 49 74 65 72 2d 3e 70 44 61 74 61 20 29 3b 0a  pIter->pData );.
ad60: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
ad70: 3e 69 4c 65 61 66 50 67 6e 6f 3e 30 20 29 3b 0a  >iLeafPgno>0 );.
ad80: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
ad90: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 64 69 6e  number of leadin
ada0: 67 20 30 78 30 30 20 62 79 74 65 73 2e 20 54 68  g 0x00 bytes. Th
adb0: 65 6e 20 73 65 74 20 69 4c 65 61 66 50 67 6e 6f  en set iLeafPgno
adc0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
add0: 69 3c 70 44 61 74 61 2d 3e 6e 3b 20 69 2b 2b 29  i<pData->n; i++)
ade0: 7b 20 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  { .    if( pData
adf0: 2d 3e 70 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  ->p[i] ) break;.
ae00: 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65    }.  pIter->iLe
ae10: 61 66 50 67 6e 6f 20 2b 3d 20 28 69 2b 31 29 3b  afPgno += (i+1);
ae20: 0a 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d  .  pIter->iOff =
ae30: 20 69 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 65 73 73   i;..  /* Unless
ae40: 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20   we are already 
ae50: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
ae60: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c  e doclist-index,
ae70: 20 6c 6f 61 64 20 74 68 65 20 66 69 72 73 74 0a   load the first.
ae80: 20 20 2a 2a 20 72 6f 77 69 64 20 76 61 6c 75 65    ** rowid value
ae90: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65  .  */.  if( pIte
aea0: 72 2d 3e 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e  r->iOff<pData->n
aeb0: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
aec0: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
aed0: 28 26 70 44 61 74 61 2d 3e 70 5b 70 49 74 65 72  (&pData->p[pIter
aee0: 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  ->iOff], (u64*)&
aef0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
af00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
af10: 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  er->bEof = 1;.  
af20: 7d 0a 20 20 70 49 74 65 72 2d 3e 69 46 69 72 73  }.  pIter->iFirs
af30: 74 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4f  tOff = pIter->iO
af40: 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74  ff;.  return pIt
af50: 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a  er->bEof;.}../*.
af60: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
af70: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
af80: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
af90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
afa0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
afb0: 4e 65 78 74 28 46 74 73 35 44 6c 69 64 78 49 74  Next(Fts5DlidxIt
afc0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74  er *pIter){.  Ft
afd0: 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  s5Data *pData = 
afe0: 70 49 74 65 72 2d 3e 70 44 61 74 61 3b 0a 20 20  pIter->pData;.  
aff0: 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 66 6f 72  int iOff;..  for
b000: 28 69 4f 66 66 3d 70 49 74 65 72 2d 3e 69 4f 66  (iOff=pIter->iOf
b010: 66 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e  f; iOff<pData->n
b020: 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 69  ; iOff++){.    i
b030: 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  f( pData->p[iOff
b040: 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20 7d 0a  ] ) break; .  }.
b050: 0a 20 20 69 66 28 20 69 4f 66 66 3c 70 44 61 74  .  if( iOff<pDat
b060: 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20  a->n ){.    i64 
b070: 69 56 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d  iVal;.    pIter-
b080: 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69  >iLeafPgno += (i
b090: 4f 66 66 20 2d 20 70 49 74 65 72 2d 3e 69 4f 66  Off - pIter->iOf
b0a0: 66 29 20 2b 20 31 3b 0a 20 20 20 20 69 4f 66 66  f) + 1;.    iOff
b0b0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70   += getVarint(&p
b0c0: 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Data->p[iOff], (
b0d0: 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20  u64*)&iVal);.   
b0e0: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d   pIter->iRowid -
b0f0: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 49 74 65  = iVal;.    pIte
b100: 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  r->iOff = iOff;.
b110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
b120: 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  er->bEof = 1;.  
b130: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
b140: 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74  r->bEof;.}..stat
b150: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
b160: 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
b170: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
b180: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
b190: 65 74 75 72 6e 20 28 70 2d 3e 72 63 21 3d 53 51  eturn (p->rc!=SQ
b1a0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
b1b0: 2d 3e 62 45 6f 66 29 3b 0a 7d 0a 0a 73 74 61 74  ->bEof);.}..stat
b1c0: 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64  ic void fts5Dlid
b1d0: 78 49 74 65 72 4c 61 73 74 28 46 74 73 35 44 6c  xIterLast(Fts5Dl
b1e0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
b1f0: 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69 64 78  .  if( fts5Dlidx
b200: 49 74 65 72 46 69 72 73 74 28 70 49 74 65 72 29  IterFirst(pIter)
b210: 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  ==0 ){.    while
b220: 28 20 30 3d 3d 66 74 73 35 44 6c 69 64 78 49 74  ( 0==fts5DlidxIt
b230: 65 72 4e 65 78 74 28 70 49 74 65 72 29 20 29 3b  erNext(pIter) );
b240: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
b250: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 0;.  }.}..sta
b260: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
b270: 78 49 74 65 72 50 72 65 76 28 46 74 73 35 44 6c  xIterPrev(Fts5Dl
b280: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
b290: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49  .  int iOff = pI
b2a0: 74 65 72 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73  ter->iOff;..  as
b2b0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f  sert( pIter->bEo
b2c0: 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f  f==0 );.  if( iO
b2d0: 66 66 3c 3d 70 49 74 65 72 2d 3e 69 46 69 72 73  ff<=pIter->iFirs
b2e0: 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 49 74 65  tOff ){.    pIte
b2f0: 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d  r->bEof = 1;.  }
b300: 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20  else{.    u8 *a 
b310: 3d 20 70 49 74 65 72 2d 3e 70 44 61 74 61 2d 3e  = pIter->pData->
b320: 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  p;.    i64 iVal;
b330: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
b340: 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ..    /* Current
b350: 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74  ly iOff points t
b360: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
b370: 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68   of a varint. Th
b380: 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  is block .    **
b390: 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66   decrements iOff
b3a0: 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
b3b0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
b3c0: 74 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  te of the previo
b3d0: 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e  us .    ** varin
b3e0: 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e  t. Taking care n
b3f0: 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d  ot to read any m
b400: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
b410: 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a  that occur.    *
b420: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66  * before the buf
b430: 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  fer in memory.  
b440: 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  */.    iLimit = 
b450: 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39  (iOff>9 ? iOff-9
b460: 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69   : 0);.    for(i
b470: 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d  Off--; iOff>iLim
b480: 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20  it; iOff--){.   
b490: 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31     if( (a[iOff-1
b4a0: 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62  ] & 0x80)==0 ) b
b4b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
b4c0: 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f   getVarint(&a[iO
b4d0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
b4e0: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
b4f0: 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
b500: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
b510: 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 77 68 69 6c 65  no--;..    while
b520: 28 20 69 4f 66 66 3e 70 49 74 65 72 2d 3e 69 46  ( iOff>pIter->iF
b530: 69 72 73 74 4f 66 66 20 0a 20 20 20 20 20 20 20  irstOff .       
b540: 20 26 26 20 61 5b 69 4f 66 66 2d 31 5d 3d 3d 30   && a[iOff-1]==0
b550: 78 30 30 20 26 26 20 28 61 5b 69 4f 66 66 2d 32  x00 && (a[iOff-2
b560: 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 0a 20 20  ] & 0x80)==0 .  
b570: 20 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 2d    ){.      iOff-
b580: 2d 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  -;.      pIter->
b590: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
b5a0: 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f   }.    pIter->iO
b5b0: 66 66 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a  ff = iOff;.  }..
b5c0: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
b5d0: 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  bEof;.}..static 
b5e0: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
b5f0: 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  erInit(.  Fts5In
b600: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
b610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73            /* Fts
b620: 35 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 Backend to ite
b630: 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
b640: 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20   int bRev,      
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44   /* True for ORD
b670: 45 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69  ER BY ASC */.  i
b680: 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69 53 65  nt iIdx, int iSe
b690: 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gid,           /
b6a0: 2a 20 53 65 67 6d 65 6e 74 20 69 53 65 67 69 64  * Segment iSegid
b6b0: 20 77 69 74 68 69 6e 20 69 6e 64 65 78 20 69 49   within index iI
b6c0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  dx */.  int iLea
b6d0: 66 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  fPgno,          
b6e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20          /* Leaf 
b6f0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c  page number to l
b700: 6f 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f  oad dlidx for */
b710: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
b720: 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20   **ppIter       
b730: 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 70 75 6c     /* OUT: Popul
b740: 61 74 65 64 20 69 74 65 72 61 74 6f 72 20 2a 2f  ated iterator */
b750: 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  .){.  Fts5DlidxI
b760: 74 65 72 20 2a 70 49 74 65 72 20 3d 20 2a 70 70  ter *pIter = *pp
b770: 49 74 65 72 3b 0a 20 20 46 74 73 35 44 61 74 61  Iter;.  Fts5Data
b780: 20 2a 70 44 6c 69 64 78 3b 0a 0a 20 20 70 44 6c   *pDlidx;..  pDl
b790: 69 64 78 20 3d 20 66 74 73 35 44 61 74 61 52 65  idx = fts5DataRe
b7a0: 61 64 28 70 2c 20 46 54 53 35 5f 44 4f 43 4c 49  ad(p, FTS5_DOCLI
b7b0: 53 54 5f 49 44 58 5f 52 4f 57 49 44 28 69 49 64  ST_IDX_ROWID(iId
b7c0: 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  x, iSegid, iLeaf
b7d0: 50 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 44  Pgno));.  if( pD
b7e0: 6c 69 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  lidx==0 ) return
b7f0: 3b 0a 20 20 69 66 28 20 70 49 74 65 72 3d 3d 30  ;.  if( pIter==0
b800: 20 29 7b 0a 20 20 20 20 2a 70 70 49 74 65 72 20   ){.    *ppIter 
b810: 3d 20 70 49 74 65 72 20 3d 20 28 46 74 73 35 44  = pIter = (Fts5D
b820: 6c 69 64 78 49 74 65 72 2a 29 66 74 73 35 49 64  lidxIter*)fts5Id
b830: 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
b840: 66 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 29  f(Fts5DlidxIter)
b850: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
b860: 3d 3d 30 20 29 7b 20 0a 20 20 20 20 20 20 66 74  ==0 ){ .      ft
b870: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
b880: 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 72 65 74  lidx);.      ret
b890: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  urn;.    }.  }el
b8a0: 73 65 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  se{.    memset(p
b8b0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
b8c0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 29 3b  Fts5DlidxIter));
b8d0: 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70  .  }..  pIter->p
b8e0: 44 61 74 61 20 3d 20 70 44 6c 69 64 78 3b 0a 20  Data = pDlidx;. 
b8f0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b900: 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  o = iLeafPgno;. 
b910: 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a   if( bRev==0 ){.
b920: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
b930: 72 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20  rFirst(pIter);. 
b940: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
b950: 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70 49  DlidxIterLast(pI
b960: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
b970: 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c 69 73  ** Free a doclis
b980: 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74 6f 72  t-index iterator
b990: 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65   object allocate
b9a0: 64 20 62 79 20 66 74 73 35 44 6c 69 64 78 49 74  d by fts5DlidxIt
b9b0: 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  erInit()..*/.sta
b9c0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
b9d0: 64 78 49 74 65 72 46 72 65 65 28 46 74 73 35 44  dxIterFree(Fts5D
b9e0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b9f0: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
ba00: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
ba10: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 44 61 74  ease(pIter->pDat
ba20: 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  a);.    sqlite3_
ba30: 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
ba40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  .}../*.** Load t
ba50: 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67  he next leaf pag
ba60: 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65  e into the segme
ba70: 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a  nt iterator..*/.
ba80: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ba90: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
baa0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bac0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
bad0: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
bae0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
baf0: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
bb00: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
bb10: 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61  vance to next pa
bb20: 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  ge */.){.  Fts5S
bb30: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
bb40: 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70  *pSeg = pIter->p
bb50: 53 65 67 3b 0a 20 20 69 66 28 20 70 49 74 65 72  Seg;.  if( pIter
bb60: 2d 3e 70 4c 65 61 66 20 29 20 66 74 73 35 44 61  ->pLeaf ) fts5Da
bb70: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
bb80: 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
bb90: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20  ->iLeafPgno++;. 
bba0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
bbb0: 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e  fPgno<=pSeg->pgn
bbc0: 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74  oLast ){.    pIt
bbd0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35  er->pLeaf = fts5
bbe0: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
bbf0: 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e       FTS5_SEGMEN
bc00: 54 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69  T_ROWID(pIter->i
bc10: 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  Idx, pSeg->iSegi
bc20: 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65  d, 0, pIter->iLe
bc30: 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20  afPgno).    );. 
bc40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
bc50: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
bc60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 65 61 76 65  }.}../*.** Leave
bc70: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
bc80: 73 65 74 20 61 73 20 74 68 65 20 6f 66 66 73 65  set as the offse
bc90: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 66 69  t to the size fi
bca0: 65 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73 74  eld of the first
bcb0: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  .** position lis
bcc0: 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20  t. The position 
bcd0: 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74  list belonging t
bce0: 6f 20 64 6f 63 75 6d 65 6e 74 20 70 49 74 65 72  o document pIter
bcf0: 2d 3e 69 52 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61  ->iRowid..*/.sta
bd00: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
bd10: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73  IterLoadTerm(Fts
bd20: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
bd30: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
bd40: 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20  nt nKeep){.  u8 
bd50: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
bd60: 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  f->p;        /* 
bd70: 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64  Buffer to read d
bd80: 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ata from */.  in
bd90: 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
bda0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a  iLeafOffset;  /*
bdb0: 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20   Offset to read 
bdc0: 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  at */.  int nNew
bdd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bde0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
bdf0: 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a   of new data */.
be00: 0a 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61  .  iOff += getVa
be10: 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
be20: 20 6e 4e 65 77 29 3b 0a 20 20 70 49 74 65 72 2d   nNew);.  pIter-
be30: 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b  >term.n = nKeep;
be40: 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
be50: 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
be60: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e  &pIter->term, nN
be70: 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20  ew, &a[iOff]);. 
be80: 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20   iOff += nNew;. 
be90: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
bea0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
beb0: 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
bec0: 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e  afPgno = pIter->
bed0: 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 66 28  iLeafPgno;.  if(
bee0: 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c   iOff>=pIter->pL
bef0: 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 66 74  eaf->n ){.    ft
bf00: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
bf10: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
bf20: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
bf30: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  f==0 ){.      if
bf40: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
bf50: 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  OK ) p->rc = FTS
bf60: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
bf70: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
bf80: 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20     iOff = 4;.   
bf90: 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   a = pIter->pLea
bfa0: 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66  f->p;.  }.  iOff
bfb0: 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61   += sqlite3GetVa
bfc0: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
bfd0: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
bfe0: 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  wid);.  pIter->i
bff0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
c000: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  f;.}../*.** Init
c010: 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61  ialize the itera
c020: 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72  tor object pIter
c030: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
c040: 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20  ugh the entries 
c050: 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53  in.** segment pS
c060: 65 67 20 77 69 74 68 69 6e 20 69 6e 64 65 78 20  eg within index 
c070: 69 49 64 78 2e 20 54 68 65 20 69 74 65 72 61 74  iIdx. The iterat
c080: 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
c090: 69 6e 67 20 74 6f 20 74 68 65 20 0a 2a 2a 20 66  ing to the .** f
c0a0: 69 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20  irst entry when 
c0b0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
c0c0: 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  turns..**.** If 
c0d0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
c0e0: 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73   Fts5Index.rc is
c0f0: 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f   set to an appro
c100: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
c110: 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  e. If .** an err
c120: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
c130: 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
c140: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
c150: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
c160: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
c170: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 49  oid fts5SegIterI
c180: 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
c190: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 0a 20   *p,          . 
c1a0: 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73 68   /* Config.aHash
c1d0: 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46 54 53 20  [] index of FTS 
c1e0: 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53  index */.  Fts5S
c1f0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
c200: 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65  *pSeg,     /* De
c210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67  scription of seg
c220: 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ment */.  Fts5Se
c230: 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
c240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
c250: 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
c260: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67  */.){.  if( pSeg
c270: 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29  ->pgnoFirst==0 )
c280: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
c290: 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65 67  ppens if the seg
c2a0: 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73  ment is being us
c2b0: 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74  ed as an input t
c2c0: 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  o an incremental
c2d0: 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e  .    ** merge an
c2e0: 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61  d all data has a
c2f0: 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72 69  lready been "tri
c300: 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74  mmed". See funct
c310: 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54  ion.    ** fts5T
c320: 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f  rimSegments() fo
c330: 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68  r details. In th
c340: 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74 68  is case leave th
c350: 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79  e iterator empty
c360: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
c370: 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65  ler will see the
c380: 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d   (pIter->pLeaf==
c390: 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68  0) and assume th
c3a0: 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20  e iterator is.  
c3b0: 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65    ** at EOF alre
c3c0: 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ady. */.    asse
c3d0: 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  rt( pIter->pLeaf
c3e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
c3f0: 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  n;.  }..  if( p-
c400: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
c410: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  {.    memset(pIt
c420: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  er, 0, sizeof(*p
c430: 49 74 65 72 29 29 3b 0a 20 20 20 20 70 49 74 65  Iter));.    pIte
c440: 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
c450: 20 20 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20      pIter->iIdx 
c460: 3d 20 69 49 64 78 3b 0a 20 20 20 20 70 49 74 65  = iIdx;.    pIte
c470: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  r->iLeafPgno = p
c480: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31  Seg->pgnoFirst-1
c490: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
c4a0: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
c4b0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  er);.  }..  if( 
c4c0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
c4d0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20   ){.    u8 *a = 
c4e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
c4f0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
c500: 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
c510: 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20  tU16(&a[2]);.   
c520: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
c530: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30  Term(p, pIter, 0
c540: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
c550: 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66 48 65   void fts5LeafHe
c560: 61 64 65 72 28 46 74 73 35 44 61 74 61 20 2a 70  ader(Fts5Data *p
c570: 4c 65 61 66 2c 20 69 6e 74 20 2a 70 69 52 6f 77  Leaf, int *piRow
c580: 69 64 2c 20 69 6e 74 20 2a 70 69 54 65 72 6d 29  id, int *piTerm)
c590: 7b 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 28  {.  *piRowid = (
c5a0: 69 6e 74 29 66 74 73 35 47 65 74 55 31 36 28 26  int)fts5GetU16(&
c5b0: 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20  pLeaf->p[0]);.  
c5c0: 2a 70 69 54 65 72 6d 20 3d 20 28 69 6e 74 29 66  *piTerm = (int)f
c5d0: 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
c5e0: 2d 3e 70 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->p[2]);.}../*.*
c5f0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
c600: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
c610: 6c 65 64 20 6f 6e 20 69 74 65 72 61 74 6f 72 73  led on iterators
c620: 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c   created by call
c630: 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65  s to.** Fts5Inde
c640: 78 51 75 65 72 79 28 29 20 77 69 74 68 20 74 68  xQuery() with th
c650: 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
c660: 59 5f 41 53 43 20 66 6c 61 67 20 73 65 74 2e 0a  Y_ASC flag set..
c670: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
c680: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
c690: 65 64 2c 20 69 74 65 72 61 74 6f 72 20 70 49 74  ed, iterator pIt
c6a0: 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
c6b0: 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 20   first rowid.** 
c6c0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
c6d0: 65 61 66 20 61 73 73 6f 63 69 61 74 65 64 20 77  eaf associated w
c6e0: 69 74 68 20 74 68 65 20 74 65 72 6d 20 62 65 69  ith the term bei
c6f0: 6e 67 20 71 75 65 72 69 65 64 2e 20 54 68 69 73  ng queried. This
c700: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 64 76   function.** adv
c710: 61 6e 63 65 73 20 69 74 20 74 6f 20 70 6f 69 6e  ances it to poin
c720: 74 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 75  t to the last su
c730: 63 68 20 72 6f 77 69 64 20 61 6e 64 2c 20 69 66  ch rowid and, if
c740: 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74   necessary, init
c750: 69 61 6c 69 7a 65 73 0a 2a 2a 20 74 68 65 20 61  ializes.** the a
c760: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e  RowidOffset[] an
c770: 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76  d iRowidOffset v
c780: 61 72 69 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61  ariables..*/.sta
c790: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
c7a0: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
c7b0: 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  age(Fts5Index *p
c7c0: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
c7d0: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  Iter){.  int n =
c7e0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
c7f0: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 49 74 65  ;.  int i = pIte
c800: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
c810: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
c820: 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74  >pLeaf->p;.  int
c830: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20   iRowidOffset = 
c840: 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e  0;..  while( p->
c850: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
c860: 20 69 3c 6e 20 29 7b 0a 20 20 20 20 69 36 34 20   i<n ){.    i64 
c870: 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20  iDelta = 0;.    
c880: 69 6e 74 20 6e 50 6f 73 3b 0a 0a 20 20 20 20 69  int nPos;..    i
c890: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
c8a0: 26 61 5b 69 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20  &a[i], nPos);.  
c8b0: 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20    i += nPos;.   
c8c0: 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65 61   if( i>=n ) brea
c8d0: 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56  k;.    i += getV
c8e0: 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36  arint(&a[i], (u6
c8f0: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
c900: 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
c910: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 49 74 65   break;.    pIte
c920: 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65  r->iRowid -= iDe
c930: 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20 69 52  lta;..    if( iR
c940: 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65  owidOffset>=pIte
c950: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
c960: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
c970: 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69  w = pIter->nRowi
c980: 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20  dOffset + 8;.   
c990: 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28     int *aNew = (
c9a0: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  int*)sqlite3_rea
c9b0: 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77  lloc(pIter->aRow
c9c0: 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73  idOffset, nNew*s
c9d0: 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
c9e0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
c9f0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
ca00: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
ca10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ca20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
ca30: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
ca40: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
ca50: 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73  Iter->nRowidOffs
ca60: 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d  et = nNew;.    }
ca70: 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f  ..    pIter->aRo
ca80: 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64  widOffset[iRowid
ca90: 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65  Offset++] = pIte
caa0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
cab0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
cac0: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a  Offset = i;.  }.
cad0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
cae0: 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66  ffset = iRowidOf
caf0: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  fset;.}../*.**.*
cb00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
cb10: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
cb20: 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e 64 65  NewPage(Fts5Inde
cb30: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
cb40: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
cb50: 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67  ert( pIter->flag
cb60: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
cb70: 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73  _REVERSE );.  as
cb80: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
cb90: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
cba0: 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20  R_ONETERM );..  
cbb0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
cbc0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
cbd0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
cbe0: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  0;.  while( p->r
cbf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
cc00: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
cc10: 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61  >pIter->iTermLea
cc20: 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73  fPgno ){.    Fts
cc30: 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20  5Data *pNew;.   
cc40: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
cc50: 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  o--;.    pNew = 
cc60: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
cc70: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
cc80: 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 49  ID(.          pI
cc90: 74 65 72 2d 3e 69 49 64 78 2c 20 70 49 74 65 72  ter->iIdx, pIter
cca0: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  ->pSeg->iSegid, 
ccb0: 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  0, pIter->iLeafP
ccc0: 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20  gno.    ));.    
ccd0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
cce0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65    if( pIter->iLe
ccf0: 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69  afPgno==pIter->i
cd00: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a  TermLeafPgno ){.
cd10: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
cd20: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
cd30: 65 74 3c 70 4e 65 77 2d 3e 6e 20 29 7b 0a 20 20  et<pNew->n ){.  
cd40: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
cd50: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
cd60: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
cd70: 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65  eafOffset = pIte
cd80: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
cd90: 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  et;.        }.  
cda0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cdb0: 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
cdc0: 2c 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  , dummy;.       
cdd0: 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28   fts5LeafHeader(
cde0: 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 4f 66 66  pNew, &iRowidOff
cdf0: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  , &dummy);.     
ce00: 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
ce10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
ce20: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65  ter->pLeaf = pNe
ce30: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  w;.          pIt
ce40: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
ce50: 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20  = iRowidOff;.   
ce60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
ce70: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
ce80: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
ce90: 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72    u8 *a = &pIter
cea0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72  ->pLeaf->p[pIter
ceb0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
cec0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
ced0: 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 67 65  LeafOffset += ge
cee0: 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a  tVarint(a, (u64*
cef0: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
cf00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
cf10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cf20: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
cf30: 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
cf40: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
cf50: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
cf60: 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65  af ){.    fts5Se
cf70: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
cf80: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
cf90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76    }.}../*.** Adv
cfa0: 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70 49  ance iterator pI
cfb0: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ter to the next 
cfc0: 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  entry. .**.** If
cfd0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
cfe0: 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69  , Fts5Index.rc i
cff0: 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72  s set to an appr
d000: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
d010: 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f  de. It .** is no
d020: 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20  t considered an 
d030: 65 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65  error if the ite
d040: 72 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f  rator reaches EO
d050: 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  F. If an error h
d060: 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
d070: 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
d080: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d090: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
d0a0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
d0b0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
d0c0: 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ext(.  Fts5Index
d0d0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
d0e0: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
d0f0: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
d100: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
d110: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
d120: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
d130: 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b 0a  o advance */.){.
d140: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
d150: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
d160: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
d170: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
d180: 56 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20 69  VERSE ){.      i
d190: 66 28 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  f( pIter->iRowid
d1a0: 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20 20 20 20  Offset>0 ){.    
d1b0: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65      u8 *a = pIte
d1c0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
d1d0: 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20       int iOff;. 
d1e0: 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b         int nPos;
d1f0: 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65  .        i64 iDe
d200: 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 70 49 74  lta;.        pIt
d210: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
d220: 2d 2d 3b 0a 0a 20 20 20 20 20 20 20 20 70 49 74  --;..        pIt
d230: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d240: 3d 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  = iOff = pIter->
d250: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74  aRowidOffset[pIt
d260: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
d270: 5d 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ];.        iOff 
d280: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
d290: 61 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a  a[iOff], nPos);.
d2a0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
d2b0: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 67 65  nPos;.        ge
d2c0: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
d2d0: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
d2e0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
d2f0: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
d300: 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  a;.      }else{.
d310: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
d320: 74 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67  terReverseNewPag
d330: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
d340: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
d350: 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
d360: 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70  pLeaf = pIter->p
d370: 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  Leaf;.      int 
d380: 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  iOff;.      int 
d390: 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
d3a0: 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20      int nKeep = 
d3b0: 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 61  0;..      /* Sea
d3c0: 72 63 68 20 66 6f 72 20 74 68 65 20 65 6e 64 20  rch for the end 
d3d0: 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
d3e0: 6c 69 73 74 20 77 69 74 68 69 6e 20 74 68 65 20  list within the 
d3f0: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f  current page. */
d400: 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70  .      u8 *a = p
d410: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
d420: 6e 74 20 6e 20 3d 20 70 4c 65 61 66 2d 3e 6e 3b  nt n = pLeaf->n;
d430: 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 70  ..      iOff = p
d440: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d450: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  t;.      if( iOf
d460: 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  f<n ){.        i
d470: 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20  nt nPoslist;.   
d480: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74       iOff += get
d490: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
d4a0: 5d 2c 20 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20  ], nPoslist);.  
d4b0: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50        iOff += nP
d4c0: 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a  oslist;.      }.
d4d0: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
d4e0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  n ){.        /* 
d4f0: 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  The next entry i
d500: 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s on the current
d510: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
d520: 20 75 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   u64 iDelta;.   
d530: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
d540: 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
d550: 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29  [iOff], &iDelta)
d560: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
d570: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
d580: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Off;.        if(
d590: 20 69 44 65 6c 74 61 3d 3d 30 20 29 7b 0a 20 20   iDelta==0 ){.  
d5a0: 20 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d          bNewTerm
d5b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
d5c0: 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20  if( iOff>=n ){. 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
d5e0: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
d5f0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
d600: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
d610: 61 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20  afOffset = 4;.  
d620: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
d630: 28 20 69 4f 66 66 21 3d 66 74 73 35 47 65 74 55  ( iOff!=fts5GetU
d640: 31 36 28 26 61 5b 32 5d 29 20 29 7b 0a 20 20 20  16(&a[2]) ){.   
d650: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
d660: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 67  iLeafOffset += g
d670: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
d680: 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
d690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d6a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d6b0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
d6c0: 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  -= iDelta;.     
d6d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
d6e0: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  {.        iOff =
d6f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e   0;.        /* N
d700: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f 74  ext entry is not
d710: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
d720: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
d730: 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30 20 29  while( iOff==0 )
d740: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
d750: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
d760: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
d770: 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74       pLeaf = pIt
d780: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
d790: 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d       if( pLeaf==
d7a0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
d7b0: 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20 3d       if( (iOff =
d7c0: 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
d7d0: 61 66 2d 3e 70 5b 30 5d 29 29 20 29 7b 0a 20 20  af->p[0])) ){.  
d7e0: 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
d7f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
d800: 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  nt(&pLeaf->p[iOf
d810: 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
d820: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
d830: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
d840: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
d850: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d860: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
d870: 20 28 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74   (iOff = fts5Get
d880: 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d  U16(&pLeaf->p[2]
d890: 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
d8a0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
d8b0: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
d8c0: 20 20 20 20 20 20 20 20 20 62 4e 65 77 54 65 72           bNewTer
d8d0: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  m = 1;.         
d8e0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
d8f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
d900: 68 65 63 6b 20 69 66 20 74 68 65 20 69 74 65 72  heck if the iter
d910: 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74 20 45  ator is now at E
d920: 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72  OF. If so, retur
d930: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20  n early. */.    
d940: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
d950: 61 66 20 26 26 20 62 4e 65 77 54 65 72 6d 20 29  af && bNewTerm )
d960: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
d970: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
d980: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
d990: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  M ){.          f
d9a0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
d9b0: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
d9c0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
d9d0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
d9e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d9f0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
da00: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
da10: 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20   nKeep);.       
da20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
da30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  .  }.}../*.** It
da40: 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
da50: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
da60: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
da70: 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   in a doclist. T
da80: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
da90: 73 65 74 73 20 74 68 65 20 69 74 65 72 61 74 6f  sets the iterato
daa0: 72 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 65  r up so that ite
dab0: 72 61 74 65 73 20 69 6e 20 72 65 76 65 72 73 65  rates in reverse
dac0: 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a   order through.*
dad0: 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a  * the doclist..*
dae0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
daf0: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
db00: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
db10: 6e 74 20 69 49 64 78 2c 20 46 74 73 35 53 65 67  nt iIdx, Fts5Seg
db20: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
db30: 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db50: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20  /* Current leaf 
db60: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  data */.  int iO
db70: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
db80: 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 42 79 74  fOffset;  /* Byt
db90: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
dba0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
dbb0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73    Fts5Data *pLas
dbc0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e  t = 0;.  int pgn
dbd0: 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  oLast = 0;..  /*
dbe0: 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 70 61 67   Move to the pag
dbf0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
dc00: 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69  the last rowid i
dc10: 6e 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2e 20  n this doclist. 
dc20: 2a 2f 0a 20 20 70 4c 65 61 66 20 3d 20 70 49 74  */.  pLeaf = pIt
dc30: 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66  er->pLeaf;..  if
dc40: 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20  ( pIter->pDlidx 
dc50: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  ){.    int iSegi
dc60: 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  d = pIter->pSeg-
dc70: 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e  >iSegid;.    pgn
dc80: 6f 4c 61 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  oLast = pIter->p
dc90: 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f  Dlidx->iLeafPgno
dca0: 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66 74  ;.    pLast = ft
dcb0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
dcc0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
dcd0: 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 30  (iIdx, iSegid, 0
dce0: 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20  , pgnoLast));.  
dcf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
dd00: 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20  ( iOff<pLeaf->n 
dd10: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  ){.      int nPo
dd20: 73 3b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  s;.      i64 iDe
dd30: 6c 74 61 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 50  lta;..      /* P
dd40: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a  osition list siz
dd50: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
dd60: 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56      iOff += getV
dd70: 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
dd80: 70 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a  p[iOff], nPos);.
dd90: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50        iOff += nP
dda0: 6f 73 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f  os;.      if( iO
ddb0: 66 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29 20 62  ff>=pLeaf->n ) b
ddc0: 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  reak;..      /* 
ddd0: 52 6f 77 69 64 20 64 65 6c 74 61 2e 20 4f 72 2c  Rowid delta. Or,
dde0: 20 69 66 20 30 78 30 30 2c 20 74 68 65 20 65 6e   if 0x00, the en
ddf0: 64 20 6f 66 20 64 6f 63 6c 69 73 74 20 6d 61 72  d of doclist mar
de00: 6b 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 50  ker. */.      nP
de10: 6f 73 20 3d 20 67 65 74 56 61 72 69 6e 74 28 26  os = getVarint(&
de20: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
de30: 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a  (u64*)&iDelta);.
de40: 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61        if( iDelta
de50: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
de60: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b     iOff += nPos;
de70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
de80: 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20 29  iOff>=pLeaf->n )
de90: 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
dea0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
deb0: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
dec0: 3b 0a 20 20 20 20 20 20 69 36 34 20 69 41 62 73  ;.      i64 iAbs
ded0: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
dee0: 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67  ROWID(iIdx, pSeg
def0: 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74  ->iSegid, 0, pIt
df00: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a  er->iLeafPgno);.
df10: 20 20 20 20 20 20 69 36 34 20 69 4c 61 73 74 20        i64 iLast 
df20: 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
df30: 4f 57 49 44 28 69 49 64 78 2c 20 70 53 65 67 2d  OWID(iIdx, pSeg-
df40: 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 53 65 67  >iSegid, 0, pSeg
df50: 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20  ->pgnoLast);..  
df60: 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20      /* The last 
df70: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
df80: 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  list may not be 
df90: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
dfa0: 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20  age. Search.    
dfb0: 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f     ** forward to
dfc0: 20 66 69 6e 64 20 74 68 65 20 70 61 67 65 20 63   find the page c
dfd0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61  ontaining the la
dfe0: 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20  st rowid.  */.  
dff0: 20 20 20 20 66 6f 72 28 69 41 62 73 2b 2b 3b 20      for(iAbs++; 
e000: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
e010: 20 26 26 20 69 41 62 73 3c 3d 69 4c 61 73 74 3b   && iAbs<=iLast;
e020: 20 69 41 62 73 2b 2b 29 7b 0a 20 20 20 20 20 20   iAbs++){.      
e030: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
e040: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
e050: 70 2c 20 69 41 62 73 29 3b 0a 20 20 20 20 20 20  p, iAbs);.      
e060: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
e070: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
e080: 69 64 2c 20 69 54 65 72 6d 3b 0a 20 20 20 20 20  id, iTerm;.     
e090: 20 20 20 20 20 66 74 73 35 4c 65 61 66 48 65 61       fts5LeafHea
e0a0: 64 65 72 28 70 4e 65 77 2c 20 26 69 52 6f 77 69  der(pNew, &iRowi
e0b0: 64 2c 20 26 69 54 65 72 6d 29 3b 0a 20 20 20 20  d, &iTerm);.    
e0c0: 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
e0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e0e0: 46 74 73 35 44 61 74 61 20 2a 70 54 6d 70 20 3d  Fts5Data *pTmp =
e0f0: 20 70 4c 61 73 74 3b 0a 20 20 20 20 20 20 20 20   pLast;.        
e100: 20 20 20 20 70 4c 61 73 74 20 3d 20 70 4e 65 77      pLast = pNew
e110: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  ;.            pN
e120: 65 77 20 3d 20 70 54 6d 70 3b 0a 20 20 20 20 20  ew = pTmp;.     
e130: 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20         pgnoLast 
e140: 3d 20 69 41 62 73 20 26 20 28 28 28 69 36 34 29  = iAbs & (((i64)
e150: 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50  1 << FTS5_DATA_P
e160: 41 47 45 5f 42 29 20 2d 20 31 29 3b 0a 20 20 20  AGE_B) - 1);.   
e170: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e180: 20 20 20 69 66 28 20 69 54 65 72 6d 20 29 7b 0a     if( iTerm ){.
e190: 20 20 20 20 20 20 20 20 20 20 20 20 69 41 62 73              iAbs
e1a0: 20 3d 20 69 4c 61 73 74 3b 0a 20 20 20 20 20 20   = iLast;.      
e1b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
e1c0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
e1d0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  pNew);.        }
e1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e1f0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73   }..  /* If pLas
e200: 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69  t is NULL at thi
e210: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
e220: 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72  e last rowid for
e230: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20   this doclist.  
e240: 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  ** lies on the p
e250: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  age currently in
e260: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
e270: 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73  terator. In this
e280: 20 63 61 73 65 20 0a 20 20 2a 2a 20 69 4c 61 73   case .  ** iLas
e290: 74 4f 66 66 20 69 73 20 73 65 74 20 74 6f 20 74  tOff is set to t
e2a0: 68 65 20 76 61 6c 75 65 20 74 68 61 74 20 70 49  he value that pI
e2b0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
e2c0: 20 77 69 6c 6c 20 74 61 6b 65 20 77 68 65 6e 0a   will take when.
e2d0: 20 20 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f    ** the iterato
e2e0: 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 61 74  r points to that
e2f0: 20 72 6f 77 69 64 2e 0a 20 20 2a 2a 0a 20 20 2a   rowid..  **.  *
e300: 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73 74 20 69  * Or, if pLast i
e310: 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
e320: 20 69 74 20 69 73 20 74 68 65 20 70 61 67 65 20   it is the page 
e330: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
e340: 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69  e last.  ** rowi
e350: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  d..  */.  if( pL
e360: 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  ast ){.    int d
e370: 75 6d 6d 79 3b 0a 20 20 20 20 66 74 73 35 44 61  ummy;.    fts5Da
e380: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
e390: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
e3a0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73  er->pLeaf = pLas
e3b0: 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  t;.    pIter->iL
e3c0: 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61  eafPgno = pgnoLa
e3d0: 73 74 3b 0a 20 20 20 20 66 74 73 35 4c 65 61 66  st;.    fts5Leaf
e3e0: 48 65 61 64 65 72 28 70 4c 61 73 74 2c 20 26 69  Header(pLast, &i
e3f0: 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Off, &dummy);.  
e400: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
e410: 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f  int(&pLast->p[iO
e420: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
e430: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
e440: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e450: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a  et = iOff;.  }..
e460: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
e470: 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
e480: 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pIter);.}../*.**
e490: 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
e4a0: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
e4b0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
e4c0: 77 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  wid of a doclist
e4d0: 20 77 69 74 68 69 6e 0a 2a 2a 20 69 6e 64 65 78   within.** index
e4e0: 20 69 49 64 78 2e 20 54 68 65 72 65 20 69 73 20   iIdx. There is 
e4f0: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
e500: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
e510: 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f  the final term o
e520: 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  n.** the current
e530: 20 70 61 67 65 2e 20 49 66 20 74 68 65 20 63 75   page. If the cu
e540: 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 74 68  rrent term is th
e550: 65 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 74  e last term on t
e560: 68 65 20 70 61 67 65 2c 20 0a 2a 2a 20 6c 6f 61  he page, .** loa
e570: 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  d the doclist-in
e580: 64 65 78 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e  dex from disk an
e590: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20  d initialize an 
e5a0: 69 74 65 72 61 74 6f 72 20 61 74 20 0a 2a 2a 20  iterator at .** 
e5b0: 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e  (pIter->pDlidx).
e5c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e5d0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44  fts5SegIterLoadD
e5e0: 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a  lidx(Fts5Index *
e5f0: 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74 73  p, int iIdx, Fts
e600: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
e610: 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d  {.  int iSegid =
e620: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
e630: 65 67 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76  egid;.  int bRev
e640: 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73   = (pIter->flags
e650: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
e660: 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35  REVERSE);.  Fts5
e670: 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
e680: 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43  ter->pLeaf; /* C
e690: 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61  urrent leaf data
e6a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d   */.  int iOff =
e6b0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e6c0: 73 65 74 3b 20 20 2f 2a 20 42 79 74 65 20 6f 66  set;  /* Byte of
e6d0: 66 73 65 74 20 77 69 74 68 69 6e 20 63 75 72 72  fset within curr
e6e0: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 61  ent leaf */..  a
e6f0: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
e700: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e710: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20  ER_ONETERM );.  
e720: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
e730: 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f  Dlidx==0 );..  /
e740: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63  * Check if the c
e750: 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65  urrent doclist e
e760: 6e 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65  nds on this page
e770: 2e 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65  . If it does, re
e780: 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20  turn.  ** early 
e790: 77 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20  without loading 
e7a0: 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
e7b0: 78 20 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73  x (as it belongs
e7c0: 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a   to a different.
e7d0: 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20    ** term. */.  
e7e0: 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61  while( iOff<pLea
e7f0: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20  f->n ){.    i64 
e800: 69 44 65 6c 74 61 3b 0a 20 20 20 20 69 6e 74 20  iDelta;.    int 
e810: 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20 2f  nPoslist;..    /
e820: 2a 20 69 4f 66 66 20 69 73 20 63 75 72 72 65 6e  * iOff is curren
e830: 74 6c 79 20 74 68 65 20 6f 66 66 73 65 74 20 6f  tly the offset o
e840: 66 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64  f the size field
e850: 20 6f 66 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c   of a position l
e860: 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 4f 66 66  ist. */.    iOff
e870: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
e880: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
e890: 20 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20   nPoslist);.    
e8a0: 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 6c 69 73 74  iOff += nPoslist
e8b0: 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c  ;..    if( iOff<
e8c0: 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20  pLeaf->n ){.    
e8d0: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
e8e0: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
e8f0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
e900: 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ta);.      if( i
e910: 44 65 6c 74 61 3d 3d 30 20 29 20 72 65 74 75 72  Delta==0 ) retur
e920: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
e930: 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
e940: 74 28 70 2c 20 62 52 65 76 2c 20 69 49 64 78 2c  t(p, bRev, iIdx,
e950: 20 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e   iSegid, pIter->
e960: 69 4c 65 61 66 50 67 6e 6f 2c 20 26 70 49 74 65  iLeafPgno, &pIte
e970: 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 7d 0a 0a 2f  r->pDlidx);.}../
e980: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
e990: 74 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72  the object pIter
e9a0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72   to point to ter
e9b0: 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69  m pTerm/nTerm wi
e9c0: 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20  thin segment.** 
e9d0: 70 53 65 67 2c 20 69 6e 64 65 78 20 69 49 64 78  pSeg, index iIdx
e9e0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
e9f0: 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68   such term in th
ea00: 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65  e index, the ite
ea10: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 73 65 74 20  rator.** is set 
ea20: 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66  to EOF..**.** If
ea30: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
ea40: 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69  , Fts5Index.rc i
ea50: 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72  s set to an appr
ea60: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
ea70: 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  de. If .** an er
ea80: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
ea90: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
eaa0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
eab0: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
eac0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
ead0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
eae0: 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74 73 35  SeekInit(.  Fts5
eaf0: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
eb10: 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20  TS5 backend */. 
eb20: 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48 61 73 68   /* Config.aHash
eb50: 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46 54 53 20  [] index of FTS 
eb60: 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
eb70: 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
eb80: 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
eb90: 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
eba0: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebc0: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
ebd0: 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
ebe0: 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  s */.  Fts5Struc
ebf0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
ec00: 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69  g,     /* Descri
ec10: 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74  ption of segment
ec20: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
ec30: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
ec40: 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
ec50: 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29  to populate */.)
ec60: 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b  {.  int iPg = 1;
ec70: 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
ec80: 62 47 65 20 3d 20 28 28 66 6c 61 67 73 20 26 20  bGe = ((flags & 
ec90: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
eca0: 50 52 45 46 49 58 29 20 26 26 20 69 49 64 78 3d  PREFIX) && iIdx=
ecb0: 3d 30 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64  =0);.  int bDlid
ecc0: 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
ecd0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
ece0: 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
ecf0: 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20  list-index */.. 
ed00: 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20   assert( bGe==0 
ed10: 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
ed20: 49 4e 44 45 58 5f 51 55 45 52 59 5f 41 53 43 29  INDEX_QUERY_ASC)
ed30: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
ed40: 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 20   pTerm && nTerm 
ed50: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  );.  memset(pIte
ed60: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
ed70: 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
ed80: 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 70  pSeg = pSeg;.  p
ed90: 49 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64  Iter->iIdx = iId
eda0: 78 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c  x;..  /* This bl
edb0: 6f 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20 76  ock sets stack v
edc0: 61 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20 74  ariable iPg to t
edd0: 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  he leaf page num
ede0: 62 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20 2a  ber that may.  *
edf0: 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28  * contain term (
ee00: 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66  pTerm/nTerm), if
ee10: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 20 69   it is present i
ee20: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a  n the segment. *
ee30: 2f 0a 20 20 66 6f 72 28 68 3d 70 53 65 67 2d 3e  /.  for(h=pSeg->
ee40: 6e 48 65 69 67 68 74 2d 31 3b 20 68 3e 30 3b 20  nHeight-1; h>0; 
ee50: 68 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 4e 6f  h--){.    Fts5No
ee60: 64 65 49 74 65 72 20 6e 6f 64 65 3b 20 20 20 20  deIter node;    
ee70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
ee80: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
ee90: 67 68 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  gh internal node
eea0: 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52 6f  s */.    i64 iRo
eeb0: 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
eec0: 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70  NT_ROWID(iIdx, p
eed0: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 68 2c 20  Seg->iSegid, h, 
eee0: 69 50 67 29 3b 0a 20 20 20 20 46 74 73 35 44 61  iPg);.    Fts5Da
eef0: 74 61 20 2a 70 4e 6f 64 65 20 3d 20 66 74 73 35  ta *pNode = fts5
ef00: 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
ef10: 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 6f  id);.    if( pNo
ef20: 64 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  de==0 ) break;..
ef30: 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
ef40: 49 6e 69 74 28 70 4e 6f 64 65 2d 3e 70 2c 20 70  Init(pNode->p, p
ef50: 4e 6f 64 65 2d 3e 6e 2c 20 26 6e 6f 64 65 29 3b  Node->n, &node);
ef60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 6f 64  .    assert( nod
ef70: 65 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 0a  e.term.n==0 );..
ef80: 20 20 20 20 69 50 67 20 3d 20 6e 6f 64 65 2e 69      iPg = node.i
ef90: 43 68 69 6c 64 3b 0a 20 20 20 20 62 44 6c 69 64  Child;.    bDlid
efa0: 78 20 3d 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b  x = node.bDlidx;
efb0: 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4e 6f 64  .    for(fts5Nod
efc0: 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
efd0: 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  , &node);.      
efe0: 20 20 6e 6f 64 65 2e 61 44 61 74 61 20 26 26 20    node.aData && 
eff0: 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
f000: 65 42 6c 6f 62 28 26 6e 6f 64 65 2e 74 65 72 6d  eBlob(&node.term
f010: 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3c  , pTerm, nTerm)<
f020: 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  =0;.        fts5
f030: 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
f040: 3e 72 63 2c 20 26 6e 6f 64 65 29 0a 20 20 20 20  >rc, &node).    
f050: 29 7b 0a 20 20 20 20 20 20 69 50 67 20 3d 20 6e  ){.      iPg = n
f060: 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20  ode.iChild;.    
f070: 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e    bDlidx = node.
f080: 62 44 6c 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20  bDlidx;.    }.  
f090: 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72    fts5NodeIterFr
f0a0: 65 65 28 26 6e 6f 64 65 29 3b 0a 20 20 20 20 66  ee(&node);.    f
f0b0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
f0c0: 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Node);.  }..  if
f0d0: 28 20 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f  ( iPg<pSeg->pgno
f0e0: 46 69 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67  First ){.    iPg
f0f0: 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   = pSeg->pgnoFir
f100: 73 74 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d  st;.    bDlidx =
f110: 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72   0;.  }..  pIter
f120: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50  ->iLeafPgno = iP
f130: 67 20 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67  g - 1;.  fts5Seg
f140: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
f150: 70 49 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  pIter);..  if( p
f160: 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
f170: 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
f180: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f190: 65 74 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  et = fts5GetU16(
f1a0: 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
f1b0: 5b 32 5d 29 3b 0a 20 20 20 20 66 74 73 35 53 65  [2]);.    fts5Se
f1c0: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c  gIterLoadTerm(p,
f1d0: 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20   pIter, 0);.    
f1e0: 64 6f 20 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  do {.      res =
f1f0: 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
f200: 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74  reBlob(&pIter->t
f210: 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
f220: 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  m);.      if( re
f230: 73 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  s>=0 ) break;.  
f240: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
f250: 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ext(p, pIter);. 
f260: 20 20 20 7d 77 68 69 6c 65 28 20 70 49 74 65 72     }while( pIter
f270: 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20  ->pLeaf );..    
f280: 69 66 28 20 62 47 65 3d 3d 30 20 26 26 20 72 65  if( bGe==0 && re
f290: 73 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 65  s ){.      /* Se
f2a0: 74 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f  t iterator to po
f2b0: 69 6e 74 20 74 6f 20 45 4f 46 20 2a 2f 0a 20 20  int to EOF */.  
f2c0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
f2d0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
f2e0: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
f2f0: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 7d  pLeaf = 0;.    }
f300: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 47 65 3d  .  }..  if( bGe=
f310: 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  =0 ){.    pIter-
f320: 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
f330: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
f340: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
f350: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66  Leaf ){.      if
f360: 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
f370: 44 45 58 5f 51 55 45 52 59 5f 41 53 43 20 29 7b  DEX_QUERY_ASC ){
f380: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
f390: 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
f3a0: 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
f3b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f3c0: 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20   bDlidx ){.     
f3d0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
f3e0: 61 64 44 6c 69 64 78 28 70 2c 20 69 49 64 78 2c  adDlidx(p, iIdx,
f3f0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
f400: 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
f410: 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
f420: 52 59 5f 41 53 43 20 29 7b 0a 20 20 20 20 20 20  RY_ASC ){.      
f430: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
f440: 65 72 73 65 28 70 2c 20 69 49 64 78 2c 20 70 49  erse(p, iIdx, pI
f450: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
f460: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
f470: 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61 74   Zero the iterat
f480: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
f490: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
f4a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
f4b0: 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
f4c0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
f4d0: 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  er){.  fts5Buffe
f4e0: 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65  rFree(&pIter->te
f4f0: 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52  rm);.  fts5DataR
f500: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
f510: 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64  eaf);.  fts5Dlid
f520: 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d  xIterFree(pIter-
f530: 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69  >pDlidx);.  sqli
f540: 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e  te3_free(pIter->
f550: 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20  aRowidOffset);. 
f560: 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
f570: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
f580: 49 74 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Iter));.}../*.**
f590: 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73   Do the comparis
f5a0: 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  on necessary to 
f5b0: 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d 3e  populate pIter->
f5c0: 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a  aFirst[iOut]..**
f5d0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72  .** If the retur
f5e0: 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e  ned value is non
f5f0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
f600: 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
f610: 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68  n entry.** in th
f620: 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20  e pIter->aSeg[] 
f630: 61 72 72 61 79 20 74 68 61 74 20 69 73 20 28 61  array that is (a
f640: 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e  ) not at EOF, an
f650: 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a  d (b) pointing.*
f660: 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20  * to a key that 
f670: 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20 6f  is a duplicate o
f680: 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68 65  f another, highe
f690: 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20  r priority, .** 
f6a0: 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72  segment-iterator
f6b0: 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61 53   in the pSeg->aS
f6c0: 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  eg[] array..*/.s
f6d0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
f6e0: 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
f6f0: 28 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65  (Fts5MultiSegIte
f700: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f  r *pIter, int iO
f710: 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20  ut){.  int i1;  
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
f740: 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73  of left-hand Fts
f750: 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e  5SegIter */.  in
f760: 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20  t i2;           
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f780: 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
f790: 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
f7a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a   */.  int iRes;.
f7b0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
f7c0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
f7d0: 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46    /* Left-hand F
f7e0: 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
f7f0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b  Fts5SegIter *p2;
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74  /* Right-hand Ft
f820: 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 0a 20 20  s5SegIter */..  
f830: 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49 74  assert( iOut<pIt
f840: 65 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75 74  er->nSeg && iOut
f850: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
f860: 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c  pIter->bRev==0 |
f870: 7c 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31  | pIter->bRev==1
f880: 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e   );..  if( iOut>
f890: 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29  =(pIter->nSeg/2)
f8a0: 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69 4f   ){.    i1 = (iO
f8b0: 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67  ut - pIter->nSeg
f8c0: 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32 20  /2) * 2;.    i2 
f8d0: 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73  = i1 + 1;.  }els
f8e0: 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74 65  e{.    i1 = pIte
f8f0: 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32  r->aFirst[iOut*2
f900: 5d 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65  ];.    i2 = pIte
f910: 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32  r->aFirst[iOut*2
f920: 2b 31 5d 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20  +1];.  }.  p1 = 
f930: 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d  &pIter->aSeg[i1]
f940: 3b 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72 2d  ;.  p2 = &pIter-
f950: 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 69 66  >aSeg[i2];..  if
f960: 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  ( p1->pLeaf==0 )
f970: 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {           /* I
f980: 66 20 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a  f p1 is at EOF *
f990: 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b  /.    iRes = i2;
f9a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d  .  }else if( p2-
f9b0: 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20  >pLeaf==0 ){    
f9c0: 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74 20   /* If p2 is at 
f9d0: 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20  EOF */.    iRes 
f9e0: 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = i1;.  }else{. 
f9f0: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73     int res = fts
fa00: 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26  5BufferCompare(&
fa10: 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74  p1->term, &p2->t
fa20: 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65  erm);.    if( re
fa30: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  s==0 ){.      as
fa40: 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20  sert( i2>i1 );. 
fa50: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32 21       assert( i2!
fa60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
fa70: 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e  p1->iRowid==p2->
fa80: 69 52 6f 77 69 64 20 29 20 72 65 74 75 72 6e 20  iRowid ) return 
fa90: 69 32 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  i2;.      res = 
faa0: 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3c 20 70  ((p1->iRowid < p
fab0: 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  2->iRowid)==pIte
fac0: 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20  r->bRev) ? -1 : 
fad0: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  +1;.    }.    as
fae0: 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a  sert( res!=0 );.
faf0: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
fb00: 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 31  .      iRes = i1
fb10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
fb20: 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
fb30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72    }.  }..  pIter
fb40: 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 20 3d  ->aFirst[iOut] =
fb50: 20 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20   iRes;.  return 
fb60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  0;.}../*.** Free
fb70: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
fb80: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
fb90: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
fba0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
fbb0: 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
fbc0: 46 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Free(Fts5Index *
fbd0: 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  p, Fts5MultiSegI
fbe0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
fbf0: 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
fc00: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
fc10: 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
fc20: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  g; i++){.      f
fc30: 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
fc40: 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29  &pIter->aSeg[i])
fc50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
fc60: 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
fc70: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
fc80: 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
fc90: 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73  rAdvanced(.  Fts
fca0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
fcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fcc0: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
fcd0: 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
fce0: 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67  /.  Fts5MultiSeg
fcf0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
fd00: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
fd10: 74 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74  to update aFirst
fd20: 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a  [] array for */.
fd30: 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20    int iChanged, 
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75    /* Index of su
fd60: 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20  b-iterator just 
fd70: 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  advanced */.  in
fd80: 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20  t iMinset       
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fda0: 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69   Minimum entry i
fdb0: 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65  n aFirst[] to se
fdc0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
fdd0: 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d  .  for(i=(pIter-
fde0: 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f  >nSeg+iChanged)/
fdf0: 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26  2; i>=iMinset &&
fe00: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
fe10: 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69  K; i=i/2){.    i
fe20: 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20  nt iEq;.    if( 
fe30: 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
fe40: 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49  IterDoCompare(pI
fe50: 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20  ter, i)) ){.    
fe60: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
fe70: 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65  t(p, &pIter->aSe
fe80: 67 5b 69 45 71 5d 29 3b 0a 20 20 20 20 20 20 69  g[iEq]);.      i
fe90: 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b   = pIter->nSeg +
fea0: 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iEq;.    }.  }.
feb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
fec0: 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68  e seg-iter so th
fed0: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
fee0: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
fef0: 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e  on page iLeafPgn
ff00: 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65  o..** It is an e
ff10: 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65  rror if leaf iLe
ff20: 61 66 50 67 6e 6f 20 63 6f 6e 74 61 69 6e 73 20  afPgno contains 
ff30: 6e 6f 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61  no rowid..*/.sta
ff40: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
ff50: 49 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20 20  IterGotoPage(.  
ff60: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff80: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
ff90: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
ffa0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
ffc0: 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
ffd0: 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  ce */.  int iLea
ffe0: 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72  fPgno.){.  asser
fff0: 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74  t( iLeafPgno>pIt
10000 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b  er->iLeafPgno );
10010 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
10020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
10030 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
10040 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20  = iLeafPgno-1;. 
10050 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
10060 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
10070 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
10080 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
10090 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  | pIter->iLeafPg
100a0 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b  no==iLeafPgno );
100b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
100c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
100d0 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
100e0 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
100f0 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 69  >pLeaf->p;.    i
10100 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
10110 65 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20 69 4f 66  eaf->n;..    iOf
10120 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
10130 61 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 69  a[0]);.    if( i
10140 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e  Off<4 || iOff>=n
10150 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
10160 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
10170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10180 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69   iOff += getVari
10190 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
101a0 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
101b0 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  d);.      pIter-
101c0 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
101d0 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Off;.    }.  }.}
101e0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
101f0 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
10200 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
10210 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c  d argument until
10220 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a   it is at or .**
10230 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72 6f   past rowid iFro
10240 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  m. Regardless of
10250 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 46   the value of iF
10260 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74 6f  rom, the iterato
10270 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61  r is.** always a
10280 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73 74  dvanced at least
10290 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   once..*/.static
102a0 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
102b0 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73  rNextFrom(.  Fts
102c0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
102e0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
102f0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
10300 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
10310 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
10320 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
10330 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68 20  */.  i64 iMatch 
10340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10350 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20       /* Advance 
10360 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61 73  iterator at leas
10370 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b  t this far */.){
10380 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70  .  int bRev = (p
10390 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
103a0 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
103b0 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64 78  SE);.  Fts5Dlidx
103c0 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70  Iter *pDlidx = p
103d0 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20  Iter->pDlidx;.  
103e0 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20  int iLeafPgno = 
103f0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
10400 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20  ;.  int bMove = 
10410 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  1;..  assert( pI
10420 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
10430 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
10440 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  M );.  assert( p
10450 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a  Iter->pDlidx );.
10460 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
10470 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66 28  >pLeaf );..  if(
10480 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20   bRev==0 ){.    
10490 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
104a0 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
104b0 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68 3c  x)==0 && iMatch<
104c0 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29  pDlidx->iRowid )
104d0 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e  {.      iLeafPgn
104e0 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61  o = pDlidx->iLea
104f0 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 66 74 73  fPgno;.      fts
10500 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
10510 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20  Dlidx);.    }.  
10520 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50    assert( iLeafP
10530 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno>=pIter->iLea
10540 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29  fPgno || p->rc )
10550 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ;.    if( iLeafP
10560 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
10570 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74  Pgno ){.      ft
10580 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
10590 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61  e(p, pIter, iLea
105a0 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d  fPgno);.      bM
105b0 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
105c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
105d0 72 74 28 20 69 4d 61 74 63 68 3e 70 49 74 65 72  rt( iMatch>pIter
105e0 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  ->iRowid );.    
105f0 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
10600 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
10610 78 29 3d 3d 30 20 26 26 20 69 4d 61 74 63 68 3e  x)==0 && iMatch>
10620 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29  pDlidx->iRowid )
10630 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  {.      fts5Dlid
10640 78 49 74 65 72 50 72 65 76 28 70 44 6c 69 64 78  xIterPrev(pDlidx
10650 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65  );.    }.    iLe
10660 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d  afPgno = pDlidx-
10670 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 20  >iLeafPgno;..   
10680 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69   assert( fts5Dli
10690 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
106a0 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e  idx) || iLeafPgn
106b0 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o<=pIter->iLeafP
106c0 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  gno );..    if( 
106d0 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d  iLeafPgno<pIter-
106e0 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
106f0 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
10700 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f  Pgno = iLeafPgno
10710 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  +1;.      fts5Se
10720 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77 50  gIterReverseNewP
10730 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
10740 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a       bMove = 0;.
10750 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 68 69      }.  }..  whi
10760 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 66 28  le( 1 ){.    if(
10770 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65 67   bMove ) fts5Seg
10780 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
10790 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  r);.    if( pIte
107a0 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72  r->pLeaf==0 ) br
107b0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65  eak;.    if( bRe
107c0 76 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69  v==0 && pIter->i
107d0 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20  Rowid<=iMatch ) 
107e0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62  break;.    if( b
107f0 52 65 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d  Rev!=0 && pIter-
10800 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20  >iRowid>=iMatch 
10810 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f  ) break;.    bMo
10820 76 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ve = 1;.  }.}../
10830 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
10840 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
10850 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
10860 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
10870 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
10880 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
10890 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69  s5Index.rc. It i
108a0 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  s not .** consid
108b0 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
108c0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
108d0 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66  aches EOF, or if
108e0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
108f0 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74  t .** EOF when t
10900 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
10910 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
10920 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
10930 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35  IterNext(.  Fts5
10940 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
10950 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
10960 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f  Iter,.  int bFro
10970 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
10980 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10990 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f  if argument iFro
109a0 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  m is valid */.  
109b0 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20  i64 iFrom       
109c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109d0 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65  /* Advance at le
109e0 61 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68  ast as far as th
109f0 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  is */.){.  if( p
10a00 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10a10 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 69 72 73  ){.    int iFirs
10a20 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  t = pIter->aFirs
10a30 74 5b 31 5d 3b 0a 20 20 20 20 46 74 73 35 53 65  t[1];.    Fts5Se
10a40 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
10a50 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73  Iter->aSeg[iFirs
10a60 74 5d 3b 0a 20 20 20 20 69 66 28 20 62 46 72 6f  t];.    if( bFro
10a70 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64  m && pSeg->pDlid
10a80 78 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  x ){.      fts5S
10a90 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  egIterNextFrom(p
10aa0 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a  , pSeg, iFrom);.
10ab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10ac0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
10ad0 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 7d  (p, pSeg);.    }
10ae0 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
10af0 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49  erAdvanced(p, pI
10b00 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b  ter, iFirst, 1);
10b10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
10b20 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74 73  locate a new Fts
10b30 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 6f 62  5MultiSegIter ob
10b40 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
10b50 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  new object will 
10b60 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
10b70 74 65 20 74 68 72 6f 75 67 68 20 64 61 74 61 20  te through data 
10b80 69 6e 20 73 74 72 75 63 74 75 72 65 20 70 53 74  in structure pSt
10b90 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76  ruct..** If iLev
10ba0 65 6c 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20  el is -ve, then 
10bb0 61 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20  all data in all 
10bc0 73 65 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67  segments is merg
10bd0 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65  ed. Or, if iLeve
10be0 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20  l.** is zero or 
10bf0 67 72 65 61 74 65 72 2c 20 64 61 74 61 20 66 72  greater, data fr
10c00 6f 6d 20 74 68 65 20 66 69 72 73 74 20 6e 53 65  om the first nSe
10c10 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f  gment segments o
10c20 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a  n level iLevel.*
10c30 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a  * is merged..**.
10c40 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
10c50 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73  initially points
10c60 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 74 65   to the first te
10c70 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69  rm/rowid entry i
10c80 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  n the .** iterat
10c90 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
10ca0 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
10cb0 69 49 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35  iIterNew(.  Fts5
10cc0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
10ce0 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
10cf0 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
10d00 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
10d10 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20 20   *pStruct,      
10d20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20     /* Structure 
10d30 6f 66 20 73 70 65 63 69 66 69 63 20 69 6e 64 65  of specific inde
10d40 78 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  x */.  int iIdx,
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d60 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
10d70 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f  .aHash[] index o
10d80 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20  f FTS index */. 
10d90 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
10da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10db0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 3e 3d 20   /* True for >= 
10dc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
10dd0 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
10de0 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
10df0 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c  seek to (or NULL
10e00 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  /0) */.  int iLe
10e10 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
10e20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
10e30 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d 31  l to iterate (-1
10e40 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69   for all) */.  i
10e50 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20  nt nSegment,    
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
10e80 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28 69  ents to merge (i
10e90 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46  Level>=0) */.  F
10ea0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
10eb0 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 2f  **ppOut        /
10ec0 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
10ed0 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20  ){.  int nSeg;  
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10f00 66 20 73 65 67 6d 65 6e 74 73 20 6d 65 72 67 65  f segments merge
10f10 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  d */.  int nSlot
10f20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10f30 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20         /* Power 
10f40 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a  of two >= nSeg *
10f50 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20  /.  int iIter = 
10f60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10f70 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20      /* */.  int 
10f80 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
10f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
10fa0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
10fb0 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
10fc0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
10fd0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
10fe0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
10ff0 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65  r *pNew;..  asse
11000 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20 26 26  rt( (pTerm==0 &&
11010 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c   nTerm==0) || iL
11020 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20  evel<0 );..  /* 
11030 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
11040 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c 74 69  or the new multi
11050 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a  -seg-iterator. *
11060 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30  /.  if( iLevel<0
11070 20 29 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 66   ){.    nSeg = f
11080 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
11090 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
110a0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
110b0 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72   nSeg = MIN(pStr
110c0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
110d0 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65  el].nSeg, nSegme
110e0 6e 74 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e  nt);.  }.  for(n
110f0 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53  Slot=2; nSlot<nS
11100 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a  eg; nSlot=nSlot*
11110 32 29 3b 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70  2);.  *ppOut = p
11120 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  New = fts5IdxMal
11130 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73 69  loc(p, .      si
11140 7a 65 6f 66 28 46 74 73 35 4d 75 6c 74 69 53 65  zeof(Fts5MultiSe
11150 67 49 74 65 72 29 20 2b 20 20 20 20 20 20 20 20  gIter) +        
11160 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20    /* pNew */.   
11170 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65     sizeof(Fts5Se
11180 67 49 74 65 72 29 20 2a 20 6e 53 6c 6f 74 20 2b  gIter) * nSlot +
11190 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e         /* pNew->
111a0 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20  aSeg[] */.      
111b0 73 69 7a 65 6f 66 28 75 31 36 29 20 2a 20 6e 53  sizeof(u16) * nS
111c0 6c 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  lot             
111d0 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69      /* pNew->aFi
111e0 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20  rst[] */.  );.  
111f0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
11200 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  turn;.  pNew->nS
11210 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 70 4e  eg = nSlot;.  pN
11220 65 77 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  ew->aSeg = (Fts5
11230 53 65 67 49 74 65 72 2a 29 26 70 4e 65 77 5b 31  SegIter*)&pNew[1
11240 5d 3b 0a 20 20 70 4e 65 77 2d 3e 61 46 69 72 73  ];.  pNew->aFirs
11250 74 20 3d 20 28 75 31 36 2a 29 26 70 4e 65 77 2d  t = (u16*)&pNew-
11260 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20  >aSeg[nSlot];.  
11270 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21  pNew->bRev = (0!
11280 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  =(flags & FTS5IN
11290 44 45 58 5f 51 55 45 52 59 5f 41 53 43 29 29 3b  DEX_QUERY_ASC));
112a0 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
112b0 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f  e each of the co
112c0 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20  mponent segment 
112d0 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20  iterators. */.  
112e0 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a  if( iLevel<0 ){.
112f0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
11300 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26  eLevel *pEnd = &
11310 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
11320 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d  pStruct->nLevel]
11330 3b 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26  ;.    for(pLvl=&
11340 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
11350 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70  0]; pLvl<pEnd; p
11360 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  Lvl++){.      fo
11370 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65  r(iSeg=pLvl->nSe
11380 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
11390 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 46  eg--){.        F
113a0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
113b0 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76  ent *pSeg = &pLv
113c0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l->aSeg[iSeg];. 
113d0 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
113e0 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
113f0 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
11400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
11410 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  erm==0 ){.      
11420 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
11430 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 70 53 65  nit(p, iIdx, pSe
11440 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  g, pIter);.     
11450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11460 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53      fts5SegIterS
11470 65 65 6b 49 6e 69 74 28 70 2c 20 69 49 64 78 2c  eekInit(p, iIdx,
11480 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
11490 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65  lags, pSeg, pIte
114a0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
114b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
114c0 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c 20 3d 20  lse{.    pLvl = 
114d0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
114e0 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f  [iLevel];.    fo
114f0 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69  r(iSeg=nSeg-1; i
11500 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b  Seg>=0; iSeg--){
11510 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
11520 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20  erInit(p, iIdx, 
11530 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
11540 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  ], &pNew->aSeg[i
11550 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a  Iter++]);.    }.
11560 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 49    }.  assert( iI
11570 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20  ter==nSeg );..  
11580 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20  /* If the above 
11590 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20  was successful, 
115a0 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69  each component i
115b0 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69  terators now poi
115c0 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65  nts .  ** to the
115d0 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
115e0 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20  its segment. In 
115f0 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61  this case initia
11600 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61  lize the .  ** a
11610 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f  First[] array. O
11620 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  r, if an error h
11630 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65  as occurred, fre
11640 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20  e the iterator. 
11650 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73   ** object and s
11660 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
11670 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20  riable to NULL. 
11680 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
11690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
116a0 20 20 66 6f 72 28 69 49 74 65 72 3d 6e 53 6c 6f    for(iIter=nSlo
116b0 74 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49  t-1; iIter>0; iI
116c0 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e  ter--){.      in
116d0 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28  t iEq;.      if(
116e0 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74   (iEq = fts5Mult
116f0 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70  iIterDoCompare(p
11700 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a  New, iIter)) ){.
11710 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
11720 74 65 72 4e 65 78 74 28 70 2c 20 26 70 4e 65 77  terNext(p, &pNew
11730 2d 3e 61 53 65 67 5b 69 45 71 5d 29 3b 0a 20 20  ->aSeg[iEq]);.  
11740 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
11750 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
11760 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29  New, iEq, iIter)
11770 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
11790 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
117a0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70  , pNew);.    *pp
117b0 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  Out = 0;.  }.}..
117c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
117d0 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  e if the iterato
117e0 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20 69  r is at EOF or i
117f0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
11800 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c  ccurred. .** Fal
11810 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
11820 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
11830 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74 73  MultiIterEof(Fts
11840 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d  5Index *p, Fts5M
11850 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74  ultiSegIter *pIt
11860 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
11870 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 61  ->rc || pIter->a
11880 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
11890 73 74 5b 31 5d 20 5d 2e 70 4c 65 61 66 3d 3d 30  st[1] ].pLeaf==0
118a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
118b0 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  rn the rowid of 
118c0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
118d0 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
118e0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  ently points.** 
118f0 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61  to. If the itera
11900 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
11910 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
11920 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
11930 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72  he.** results ar
11940 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  e undefined..*/.
11950 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d  static i64 fts5M
11960 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74  ultiIterRowid(Ft
11970 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
11980 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
11990 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  ( pIter->aSeg[ p
119a0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20  Iter->aFirst[1] 
119b0 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74  ].pLeaf );.  ret
119c0 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  urn pIter->aSeg[
119d0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
119e0 5d 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  ] ].iRowid;.}../
119f0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
11a00 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
11a10 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66  xt entry at or f
11a20 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e  ollowing iMatch.
11a30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11a40 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
11a50 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
11a60 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 4d 75  ex *p, .  Fts5Mu
11a70 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
11a80 72 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68  r, .  i64 iMatch
11a90 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  .){.  while( 1 )
11aa0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
11ab0 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  ;.    fts5MultiI
11ac0 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
11ad0 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  , 1, iMatch);.  
11ae0 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
11af0 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
11b00 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52   ) break;.    iR
11b10 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
11b20 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
11b30 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
11b40 3e 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77  >bRev==0 && iRow
11b50 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id<=iMatch ) bre
11b60 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  ak;.    if( pIte
11b70 72 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52  r->bRev!=0 && iR
11b80 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62  owid>=iMatch ) b
11b90 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  reak;.  }.}../*.
11ba0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
11bb0 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
11bc0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
11bd0 65 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77  erm associated w
11be0 69 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72  ith the .** entr
11bf0 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61  y that the itera
11c00 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  tor currently po
11c10 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74  ints to..*/.stat
11c20 69 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73  ic const u8 *fts
11c30 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46  5MultiIterTerm(F
11c40 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
11c50 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
11c60 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
11c70 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  *p = &pIter->aSe
11c80 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
11c90 5b 31 5d 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70  [1] ];.  *pn = p
11ca0 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75  ->term.n;.  retu
11cb0 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a  rn p->term.p;.}.
11cc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
11cd0 75 65 20 69 66 20 74 68 65 20 63 68 75 6e 6b 20  ue if the chunk 
11ce0 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
11cf0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
11d00 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 61 74 20  gument is.** at 
11d10 45 4f 46 2e 20 4f 72 20 69 66 20 61 6e 20 65 72  EOF. Or if an er
11d20 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
11d30 6f 63 63 75 72 72 65 64 2e 20 4f 74 68 65 72 77  occurred. Otherw
11d40 69 73 65 2c 20 72 65 74 75 72 6e 20 66 61 6c 73  ise, return fals
11d50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11d60 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f   fts5ChunkIterEo
11d70 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  f(Fts5Index *p, 
11d80 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70  Fts5ChunkIter *p
11d90 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
11da0 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
11db0 3e 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f  >pLeaf==0);.}../
11dc0 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
11dd0 20 63 68 75 6e 6b 2d 69 74 65 72 61 74 6f 72 20   chunk-iterator 
11de0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
11df0 6b 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65 61  k of data to rea
11e00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
11e10 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e  d fts5ChunkIterN
11e20 65 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ext(Fts5Index *p
11e30 2c 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20  , Fts5ChunkIter 
11e40 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
11e50 74 28 20 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 3d  t( pIter->nRem>=
11e60 70 49 74 65 72 2d 3e 6e 20 29 3b 0a 20 20 70 49  pIter->n );.  pI
11e70 74 65 72 2d 3e 6e 52 65 6d 20 2d 3d 20 70 49 74  ter->nRem -= pIt
11e80 65 72 2d 3e 6e 3b 0a 20 20 66 74 73 35 44 61 74  er->n;.  fts5Dat
11e90 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
11ea0 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d  pLeaf);.  pIter-
11eb0 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 70 49  >pLeaf = 0;.  pI
11ec0 74 65 72 2d 3e 70 20 3d 20 30 3b 0a 20 20 69 66  ter->p = 0;.  if
11ed0 28 20 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 30 20  ( pIter->nRem>0 
11ee0 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
11ef0 2a 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65  *pLeaf;.    pIte
11f00 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 2b 2b 3b  r->iLeafRowid++;
11f10 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74  .    pLeaf = pIt
11f20 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35  er->pLeaf = fts5
11f30 44 61 74 61 52 65 61 64 28 70 2c 20 70 49 74 65  DataRead(p, pIte
11f40 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  r->iLeafRowid);.
11f50 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
11f60 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 20  .      pIter->n 
11f70 3d 20 4d 49 4e 28 70 49 74 65 72 2d 3e 6e 52 65  = MIN(pIter->nRe
11f80 6d 2c 20 70 4c 65 61 66 2d 3e 6e 2d 34 29 3b 0a  m, pLeaf->n-4);.
11f90 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 20 3d        pIter->p =
11fa0 20 70 4c 65 61 66 2d 3e 70 2b 34 3b 0a 20 20 20   pLeaf->p+4;.   
11fb0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11fc0 49 6e 74 69 61 6c 69 7a 65 20 74 68 65 20 63 68  Intialize the ch
11fd0 75 6e 6b 20 69 74 65 72 61 74 6f 72 20 74 6f 20  unk iterator to 
11fe0 72 65 61 64 20 74 68 65 20 70 6f 73 69 74 69 6f  read the positio
11ff0 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20  n list data for 
12000 77 68 69 63 68 20 0a 2a 2a 20 74 68 65 20 73 69  which .** the si
12010 7a 65 20 66 69 65 6c 64 20 69 73 20 61 74 20 6f  ze field is at o
12020 66 66 73 65 74 20 69 4f 66 66 20 6f 66 20 6c 65  ffset iOff of le
12030 61 66 20 70 4c 65 61 66 2e 20 0a 2a 2f 0a 73 74  af pLeaf. .*/.st
12040 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68  atic void fts5Ch
12050 75 6e 6b 49 74 65 72 49 6e 69 74 28 0a 20 20 46  unkIterInit(.  F
12060 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12080 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
12090 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
120a0 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20 20 20  egIter *pSeg,   
120b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
120c0 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 74  gment iterator t
120d0 6f 20 72 65 61 64 20 70 6f 73 6c 69 73 74 20 66  o read poslist f
120e0 72 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 43 68 75  rom */.  Fts5Chu
120f0 6e 6b 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  nkIter *pIter   
12100 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
12110 69 61 6c 69 7a 65 20 74 68 69 73 20 6f 62 6a 65  ialize this obje
12120 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ct */.){.  int i
12130 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d  Id = pSeg->pSeg-
12140 3e 69 53 65 67 69 64 3b 0a 20 20 69 36 34 20 72  >iSegid;.  i64 r
12150 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
12160 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
12170 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 70 53  iIdx, iId, 0, pS
12180 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a  eg->iLeafPgno);.
12190 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
121a0 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3b  f = pSeg->pLeaf;
121b0 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53  .  int iOff = pS
121c0 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  eg->iLeafOffset;
121d0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  ..  memset(pIter
121e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
121f0 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69  er));.  pIter->i
12200 4c 65 61 66 52 6f 77 69 64 20 3d 20 72 6f 77 69  LeafRowid = rowi
12210 64 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 70 4c  d;.  if( iOff<pL
12220 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 66 74  eaf->n ){.    ft
12230 73 35 44 61 74 61 52 65 66 65 72 65 6e 63 65 28  s5DataReference(
12240 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65  pLeaf);.    pIte
12250 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66  r->pLeaf = pLeaf
12260 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12270 49 74 65 72 2d 3e 6e 52 65 6d 20 3d 20 31 3b 0a  Iter->nRem = 1;.
12280 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
12290 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  rNext(p, pIter);
122a0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
122b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 4f 66   return;.    iOf
122c0 66 20 3d 20 34 3b 0a 20 20 20 20 70 4c 65 61 66  f = 4;.    pLeaf
122d0 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
122e0 0a 20 20 7d 0a 0a 20 20 69 4f 66 66 20 2b 3d 20  .  }..  iOff += 
122f0 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  getVarint32(&pLe
12300 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 70 49 74  af->p[iOff], pIt
12310 65 72 2d 3e 6e 52 65 6d 29 3b 0a 20 20 70 49 74  er->nRem);.  pIt
12320 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 4c 65 61  er->n = MIN(pLea
12330 66 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20 70 49 74  f->n - iOff, pIt
12340 65 72 2d 3e 6e 52 65 6d 29 3b 0a 20 20 70 49 74  er->nRem);.  pIt
12350 65 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70  er->p = pLeaf->p
12360 20 2b 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20   + iOff;..  if( 
12370 70 49 74 65 72 2d 3e 6e 3d 3d 30 20 29 7b 0a 20  pIter->n==0 ){. 
12380 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
12390 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
123a0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
123b0 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  id fts5ChunkIter
123c0 52 65 6c 65 61 73 65 28 46 74 73 35 43 68 75 6e  Release(Fts5Chun
123d0 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  kIter *pIter){. 
123e0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
123f0 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
12400 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
12410 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61   0;.}../*.** Rea
12420 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  d and return the
12430 20 6e 65 78 74 20 33 32 2d 62 69 74 20 76 61 72   next 32-bit var
12440 69 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 6f 73  int from the pos
12450 69 74 69 6f 6e 2d 6c 69 73 74 20 69 74 65 72 61  ition-list itera
12460 74 6f 72 20 0a 2a 2a 20 70 61 73 73 65 64 20 61  tor .** passed a
12470 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
12480 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
12490 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
124a0 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   zero is returne
124b0 64 20 61 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  d an an error co
124c0 64 65 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20 46  de left in .** F
124d0 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20  ts5Index.rc. If 
124e0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
124f0 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
12500 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
12510 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 69   is.** called, i
12520 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
12530 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
12540 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69 6e  PosIterReadVarin
12550 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
12560 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74  Fts5PosIter *pIt
12570 65 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 20  er){.  int iVal 
12580 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  = 0;.  if( p->rc
12590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
125a0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f     if( pIter->iO
125b0 66 66 3e 3d 70 49 74 65 72 2d 3e 63 68 75 6e 6b  ff>=pIter->chunk
125c0 2e 6e 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  .n ){.      fts5
125d0 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c  ChunkIterNext(p,
125e0 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3b   &pIter->chunk);
125f0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 43  .      if( fts5C
12600 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
12610 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 20 29 20  pIter->chunk) ) 
12620 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
12630 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 30 3b  pIter->iOff = 0;
12640 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72  .    }.    pIter
12650 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72  ->iOff += getVar
12660 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 63 68  int32(&pIter->ch
12670 75 6e 6b 2e 70 5b 70 49 74 65 72 2d 3e 69 4f 66  unk.p[pIter->iOf
12680 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20  f], iVal);.  }. 
12690 20 72 65 74 75 72 6e 20 69 56 61 6c 3b 0a 7d 0a   return iVal;.}.
126a0 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
126b0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
126c0 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65   iterator to the
126d0 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2f 0a   next entry..*/.
126e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
126f0 50 6f 73 49 74 65 72 4e 65 78 74 28 46 74 73 35  PosIterNext(Fts5
12700 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 50 6f  Index *p, Fts5Po
12710 73 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  sIter *pIter){. 
12720 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 61 73 73   int iVal;.  ass
12730 65 72 74 28 20 66 74 73 35 43 68 75 6e 6b 49 74  ert( fts5ChunkIt
12740 65 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d  erEof(p, &pIter-
12750 3e 63 68 75 6e 6b 29 3d 3d 30 20 29 3b 0a 20 20  >chunk)==0 );.  
12760 69 56 61 6c 20 3d 20 66 74 73 35 50 6f 73 49 74  iVal = fts5PosIt
12770 65 72 52 65 61 64 56 61 72 69 6e 74 28 70 2c 20  erReadVarint(p, 
12780 70 49 74 65 72 29 3b 0a 20 20 69 66 28 20 66 74  pIter);.  if( ft
12790 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70  s5ChunkIterEof(p
127a0 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29  , &pIter->chunk)
127b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ==0 ){.    if( i
127c0 56 61 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Val==1 ){.      
127d0 70 49 74 65 72 2d 3e 69 43 6f 6c 20 3d 20 66 74  pIter->iCol = ft
127e0 73 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72  s5PosIterReadVar
127f0 69 6e 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  int(p, pIter);. 
12800 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 6f 73       pIter->iPos
12810 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52 65   = fts5PosIterRe
12820 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74 65  adVarint(p, pIte
12830 72 29 20 2d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  r) - 2;.    }els
12840 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
12850 69 50 6f 73 20 2b 3d 20 28 69 56 61 6c 20 2d 20  iPos += (iVal - 
12860 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  2);.    }.  }.}.
12870 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
12880 65 20 74 68 65 20 46 74 73 35 50 6f 73 49 74 65  e the Fts5PosIte
12890 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
128a0 61 73 20 74 68 65 20 66 69 6e 61 6c 20 61 72 67  as the final arg
128b0 75 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65  ument to iterate
128c0 0a 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20  .** through the 
128d0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 61 73  position-list as
128e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
128f0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
12900 61 74 20 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20  at iterator .** 
12910 70 4d 75 6c 74 69 20 63 75 72 72 65 6e 74 6c 79  pMulti currently
12920 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
12930 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
12940 6f 73 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  osIterInit(.  Ft
12950 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12970 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
12980 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 4d 75  ject */.  Fts5Mu
12990 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c  ltiSegIter *pMul
129a0 74 69 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c  ti,       /* Mul
129b0 74 69 2d 73 65 67 20 69 74 65 72 61 74 6f 72 20  ti-seg iterator 
129c0 74 6f 20 72 65 61 64 20 70 6f 73 2d 6c 69 73 74  to read pos-list
129d0 20 66 72 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 50   from */.  Fts5P
129e0 6f 73 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  osIter *pIter   
129f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
12a00 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6f 62  itialize this ob
12a10 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ject */.){.  if(
12a20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12a30 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  K ){.    Fts5Seg
12a40 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d  Iter *pSeg = &pM
12a50 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c  ulti->aSeg[ pMul
12a60 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b  ti->aFirst[1] ];
12a70 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
12a80 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
12a90 74 65 72 29 29 3b 0a 20 20 20 20 66 74 73 35 43  ter));.    fts5C
12aa0 68 75 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c 20  hunkIterInit(p, 
12ab0 70 53 65 67 2c 20 26 70 49 74 65 72 2d 3e 63 68  pSeg, &pIter->ch
12ac0 75 6e 6b 29 3b 0a 20 20 20 20 69 66 28 20 66 74  unk);.    if( ft
12ad0 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70  s5ChunkIterEof(p
12ae0 2c 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29  , &pIter->chunk)
12af0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
12b00 35 50 6f 73 49 74 65 72 4e 65 78 74 28 70 2c 20  5PosIterNext(p, 
12b10 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
12b20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
12b30 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 6f  n true if the po
12b40 73 69 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 20  sition iterator 
12b50 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
12b60 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12b70 0a 2a 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69  .** at EOF. Or i
12b80 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
12b90 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e  lready occurred.
12ba0 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
12bb0 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61  rn false..*/.sta
12bc0 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73 49  tic int fts5PosI
12bd0 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
12be0 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74 65 72   *p, Fts5PosIter
12bf0 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
12c00 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74  rn (p->rc || pIt
12c10 65 72 2d 3e 63 68 75 6e 6b 2e 70 4c 65 61 66 3d  er->chunk.pLeaf=
12c20 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  =0);.}../*.** Ad
12c30 64 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 28  d an entry for (
12c40 69 52 6f 77 69 64 2f 69 43 6f 6c 2f 69 50 6f 73  iRowid/iCol/iPos
12c50 29 20 74 6f 20 74 68 65 20 64 6f 63 6c 69 73 74  ) to the doclist
12c60 20 66 6f 72 20 28 70 54 6f 6b 65 6e 2f 6e 54 6f   for (pToken/nTo
12c70 6b 65 6e 29 0a 2a 2a 20 69 6e 20 68 61 73 68 20  ken).** in hash 
12c80 74 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 20  table for index 
12c90 69 49 64 78 2e 20 49 66 20 69 49 64 78 20 69 73  iIdx. If iIdx is
12ca0 20 7a 65 72 6f 2c 20 74 68 69 73 20 69 73 20 74   zero, this is t
12cb0 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 0a 2a  he main terms .*
12cc0 2a 20 69 6e 64 65 78 2e 20 56 61 6c 75 65 73 20  * index. Values 
12cd0 6f 66 20 31 20 61 6e 64 20 67 72 65 61 74 65 72  of 1 and greater
12ce0 20 66 6f 72 20 69 49 64 78 20 61 72 65 20 70 72   for iIdx are pr
12cf0 65 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a  efix indexes..**
12d00 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
12d10 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
12d20 65 64 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  ed, set the Fts5
12d30 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
12d40 6f 64 65 20 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  ode .** accordin
12d50 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  gly..*/.static v
12d60 6f 69 64 20 66 74 73 35 41 64 64 54 65 72 6d 54  oid fts5AddTermT
12d70 6f 48 61 73 68 28 0a 20 20 46 74 73 35 49 6e 64  oHash(.  Fts5Ind
12d80 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
12d90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12da0 78 20 6f 62 6a 65 63 74 20 74 6f 20 77 72 69 74  x object to writ
12db0 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 49  e to */.  int iI
12dc0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
12dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 74            /* Ent
12de0 72 79 20 69 6e 20 70 2d 3e 61 48 61 73 68 5b 5d  ry in p->aHash[]
12df0 20 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20   to update */.  
12e00 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
12e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20  /* Column token 
12e30 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20  appears in (-ve 
12e40 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20  -> delete) */.  
12e50 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20  int iPos,       
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e70 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74  /* Position of t
12e80 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75  oken within colu
12e90 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  mn */.  const ch
12ea0 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20  ar *pToken, int 
12eb0 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e  nToken  /* Token
12ec0 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76   to add or remov
12ed0 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64  e to or from ind
12ee0 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ex */.){.  if( p
12ef0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12f00 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
12f10 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
12f20 69 74 65 28 0a 20 20 20 20 20 20 20 20 70 2d 3e  ite(.        p->
12f30 61 70 48 61 73 68 5b 69 49 64 78 5d 2c 20 70 2d  apHash[iIdx], p-
12f40 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43  >iWriteRowid, iC
12f50 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e  ol, iPos, pToken
12f60 2c 20 6e 54 6f 6b 65 6e 0a 20 20 20 20 29 3b 0a  , nToken.    );.
12f70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
12f80 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61  ert or remove da
12f90 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ta to or from th
12fa0 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69  e index. Each ti
12fb0 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73  me a document is
12fc0 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72   .** added to or
12fd0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
12fe0 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75  e index, this fu
12ff0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13000 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   one or more.** 
13010 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  times..**.** For
13020 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d   an insert, it m
13030 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  ust be called on
13040 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65  ce for each toke
13050 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63  n in the new doc
13060 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65  ument..** If the
13070 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
13080 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20  delete, it must 
13090 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65  be called (at le
130a0 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61  ast) once for ea
130b0 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b  ch.** unique tok
130c0 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65  en in the docume
130d0 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20  nt with an iCol 
130e0 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20  value less than 
130f0 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a  zero. The iPos.*
13100 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67  * argument is ig
13110 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65  nored for a dele
13120 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
13130 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
13140 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
13150 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13160 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
13170 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
13180 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
131a0 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
131b0 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
131c0 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
131d0 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
131f0 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
13200 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
13210 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
13220 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
13230 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
13240 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
13250 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
13260 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  x */.){.  int i;
13270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
13290 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
132a0 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
132b0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
132c0 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
132d0 69 67 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  ig;..  /* If an 
132e0 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
132f0 79 20 6f 63 63 75 72 65 64 20 74 68 69 73 20 63  y occured this c
13300 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  all is a no-op. 
13310 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  */.  if( p->rc!=
13320 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
13330 72 6e 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  rn;..  /* Alloca
13340 74 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 69  te hash tables i
13350 66 20 74 68 65 79 20 68 61 76 65 20 6e 6f 74 20  f they have not 
13360 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
13370 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  ocated */.  if( 
13380 70 2d 3e 61 70 48 61 73 68 3d 3d 30 20 29 7b 0a  p->apHash==0 ){.
13390 20 20 20 20 69 6e 74 20 6e 48 61 73 68 20 3d 20      int nHash = 
133a0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
133b0 20 2b 20 31 3b 0a 20 20 20 20 70 2d 3e 61 70 48   + 1;.    p->apH
133c0 61 73 68 20 3d 20 28 46 74 73 35 48 61 73 68 2a  ash = (Fts5Hash*
133d0 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
133e0 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 48 61  p, sizeof(Fts5Ha
133f0 73 68 2a 29 20 2a 20 6e 48 61 73 68 29 3b 0a 20  sh*) * nHash);. 
13400 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72     for(i=0; p->r
13410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
13420 69 3c 6e 48 61 73 68 3b 20 69 2b 2b 29 7b 0a 20  i<nHash; i++){. 
13430 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
13440 69 74 65 33 46 74 73 35 48 61 73 68 4e 65 77 28  ite3Fts5HashNew(
13450 26 70 2d 3e 61 70 48 61 73 68 5b 69 5d 2c 20 26  &p->apHash[i], &
13460 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 29  p->nPendingData)
13470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13480 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 74 6f  * Add the new to
13490 6b 65 6e 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  ken to the main 
134a0 74 65 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65  terms hash table
134b0 2e 20 41 6e 64 20 74 6f 20 65 61 63 68 20 6f 66  . And to each of
134c0 20 74 68 65 0a 20 20 2a 2a 20 70 72 65 66 69 78   the.  ** prefix
134d0 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 68 61   hash tables tha
134e0 74 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e  t it is large en
134f0 6f 75 67 68 20 66 6f 72 2e 20 2a 2f 0a 20 20 66  ough for. */.  f
13500 74 73 35 41 64 64 54 65 72 6d 54 6f 48 61 73 68  ts5AddTermToHash
13510 28 70 2c 20 30 2c 20 69 43 6f 6c 2c 20 69 50 6f  (p, 0, iCol, iPo
13520 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  s, pToken, nToke
13530 6e 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  n);.  for(i=0; i
13540 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  <pConfig->nPrefi
13550 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  x; i++){.    if(
13560 20 6e 54 6f 6b 65 6e 3e 3d 70 43 6f 6e 66 69 67   nToken>=pConfig
13570 2d 3e 61 50 72 65 66 69 78 5b 69 5d 20 29 7b 0a  ->aPrefix[i] ){.
13580 20 20 20 20 20 20 66 74 73 35 41 64 64 54 65 72        fts5AddTer
13590 6d 54 6f 48 61 73 68 28 70 2c 20 69 2b 31 2c 20  mToHash(p, i+1, 
135a0 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 6f 6b  iCol, iPos, pTok
135b0 65 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  en, pConfig->aPr
135c0 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  efix[i]);.    }.
135d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
135e0 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d  ocate a new segm
135f0 65 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73  ent-id for the s
13600 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
13610 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
13620 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
13630 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
13640 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
13650 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74  op. 0 is .** ret
13660 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
13670 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
13680 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  t fts5AllocateSe
13690 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  gid(Fts5Index *p
136a0 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
136b0 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
136c0 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21   i;.  if( p->rc!
136d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
136e0 75 72 6e 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  urn 0;..  for(i=
136f0 30 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a  0; i<100; i++){.
13700 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a      int iSegid;.
13710 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
13720 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e  omness(sizeof(in
13730 74 29 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67  t), (void*)&iSeg
13740 69 64 29 3b 0a 20 20 20 20 69 53 65 67 69 64 20  id);.    iSegid 
13750 3d 20 69 53 65 67 69 64 20 26 20 28 28 31 20 3c  = iSegid & ((1 <
13760 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42  < FTS5_DATA_ID_B
13770 29 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 69 53  )-1);.    if( iS
13780 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  egid ){.      in
13790 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20  t iLvl, iSeg;.  
137a0 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
137b0 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
137c0 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
137d0 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
137e0 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
137f0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
13800 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
13810 20 20 20 20 20 20 20 69 66 28 20 69 53 65 67 69         if( iSegi
13820 64 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  d==pStruct->aLev
13830 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
13840 65 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20  eg].iSegid ){.  
13850 20 20 20 20 20 20 20 20 20 20 69 53 65 67 69 64            iSegid
13860 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
13870 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
13880 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13890 28 20 69 53 65 67 69 64 20 29 20 72 65 74 75 72  ( iSegid ) retur
138a0 6e 20 69 53 65 67 69 64 3b 0a 20 20 7d 0a 0a 20  n iSegid;.  }.. 
138b0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
138c0 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
138d0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  0;.}../*.** Disc
138e0 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72  ard all data cur
138f0 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e  rently cached in
13900 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73   the hash-tables
13910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
13920 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72   fts5IndexDiscar
13930 64 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20  dData(Fts5Index 
13940 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69  *p){.  Fts5Confi
13950 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
13960 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20 69  pConfig;.  int i
13970 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
13980 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
13990 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
139a0 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72  te3Fts5HashClear
139b0 28 70 2d 3e 61 70 48 61 73 68 5b 69 5d 29 3b 0a  (p->apHash[i]);.
139c0 20 20 7d 0a 20 20 70 2d 3e 6e 50 65 6e 64 69 6e    }.  p->nPendin
139d0 67 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  gData = 0;.}../*
139e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
139f0 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69  ize of the prefi
13a00 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61  x, in bytes, tha
13a10 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f 70  t buffer (nNew/p
13a20 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20 77  New) shares.** w
13a30 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c 64  ith buffer (nOld
13a40 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  /pOld)..*/.stati
13a50 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78  c int fts5Prefix
13a60 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74 20  Compress(.  int 
13a70 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nOld, const u8 *
13a80 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77  pOld,.  int nNew
13a90 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77  , const u8 *pNew
13aa0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
13ab0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 20 26  or(i=0; i<nNew &
13ac0 26 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  & i<nOld; i++){.
13ad0 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21      if( pOld[i]!
13ae0 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b  =pNew[i] ) break
13af0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69  ;.  }.  return i
13b00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  ;.}../*.** If an
13b10 20 22 6e 45 6d 70 74 79 22 20 72 65 63 6f 72 64   "nEmpty" record
13b20 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
13b30 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65 20 62   to the b-tree b
13b40 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74 0a 2a  efore the next.*
13b50 2a 20 74 65 72 6d 2c 20 77 72 69 74 65 20 69 74  * term, write it
13b60 20 6e 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   now..*/.static 
13b70 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
13b80 72 65 65 4e 45 6d 70 74 79 28 46 74 73 35 49 6e  reeNEmpty(Fts5In
13b90 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
13ba0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
13bb0 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
13bc0 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 69 6e  nEmpty ){.    in
13bd0 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20 20 20  t bFlag = 0;.   
13be0 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
13bf0 2a 70 50 67 3b 0a 20 20 20 20 70 50 67 20 3d 20  *pPg;.    pPg = 
13c00 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
13c10 72 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 70 57  r[1];.    if( pW
13c20 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46  riter->nEmpty>=F
13c30 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
13c40 5a 45 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ZE ){.      i64 
13c50 69 4b 65 79 20 3d 20 46 54 53 35 5f 44 4f 43 4c  iKey = FTS5_DOCL
13c60 49 53 54 5f 49 44 58 5f 52 4f 57 49 44 28 0a 20  IST_IDX_ROWID(. 
13c70 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72           pWriter
13c80 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72 2d  ->iIdx, pWriter-
13c90 3e 69 53 65 67 69 64 2c 20 0a 20 20 20 20 20 20  >iSegid, .      
13ca0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72      pWriter->aWr
13cb0 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 2d 20 31  iter[0].pgno - 1
13cc0 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70   - pWriter->nEmp
13cd0 74 79 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  ty.      );.    
13ce0 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65    assert( pWrite
13cf0 72 2d 3e 64 6c 69 64 78 2e 6e 3e 30 20 29 3b 0a  r->dlidx.n>0 );.
13d00 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
13d10 69 74 65 28 70 2c 20 69 4b 65 79 2c 20 70 57 72  ite(p, iKey, pWr
13d20 69 74 65 72 2d 3e 64 6c 69 64 78 2e 70 2c 20 70  iter->dlidx.p, p
13d30 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2e 6e 29  Writer->dlidx.n)
13d40 3b 0a 20 20 20 20 20 20 62 46 6c 61 67 20 3d 20  ;.      bFlag = 
13d50 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  1;.    }.    fts
13d60 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
13d70 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67  int(&p->rc, &pPg
13d80 2d 3e 62 75 66 2c 20 62 46 6c 61 67 29 3b 0a 20  ->buf, bFlag);. 
13d90 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
13da0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
13db0 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 70 57 72  , &pPg->buf, pWr
13dc0 69 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20  iter->nEmpty);. 
13dd0 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70     pWriter->nEmp
13de0 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ty = 0;.  }..  /
13df0 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
13e00 20 69 74 20 77 61 73 20 77 72 69 74 74 65 6e 20   it was written 
13e10 74 6f 20 64 69 73 6b 2c 20 7a 65 72 6f 20 74 68  to disk, zero th
13e20 65 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  e doclist index 
13e30 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
13e40 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  nt */.  sqlite3F
13e50 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
13e60 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 29 3b 0a  Writer->dlidx);.
13e70 20 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64    pWriter->bDlid
13e80 78 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a  xPrevValid = 0;.
13e90 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
13ea0 74 73 35 57 72 69 74 65 42 74 72 65 65 47 72 6f  ts5WriteBtreeGro
13eb0 77 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  w(Fts5Index *p, 
13ec0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
13ed0 57 72 69 74 65 72 29 7b 0a 20 20 46 74 73 35 50  Writer){.  Fts5P
13ee0 61 67 65 57 72 69 74 65 72 20 2a 61 4e 65 77 3b  ageWriter *aNew;
13ef0 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
13f00 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
13f10 4e 65 77 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  New = sizeof(Fts
13f20 35 50 61 67 65 57 72 69 74 65 72 29 20 2a 20 28  5PageWriter) * (
13f30 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
13f40 2b 31 29 3b 0a 0a 20 20 61 4e 65 77 20 3d 20 28  +1);..  aNew = (
13f50 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a 29  Fts5PageWriter*)
13f60 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
13f70 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
13f80 2c 20 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 61  , nNew);.  if( a
13f90 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
13fa0 0a 0a 20 20 70 4e 65 77 20 3d 20 26 61 4e 65 77  ..  pNew = &aNew
13fb0 5b 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65  [pWriter->nWrite
13fc0 72 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65  r];.  memset(pNe
13fd0 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  w, 0, sizeof(Fts
13fe0 35 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20  5PageWriter));. 
13ff0 20 70 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20 31 3b   pNew->pgno = 1;
14000 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
14010 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
14020 2c 20 26 70 4e 65 77 2d 3e 62 75 66 2c 20 31 29  , &pNew->buf, 1)
14030 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57  ;..  pWriter->nW
14040 72 69 74 65 72 2b 2b 3b 0a 20 20 70 57 72 69 74  riter++;.  pWrit
14050 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 61 4e  er->aWriter = aN
14060 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ew;.}../*.** Thi
14070 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  s is called once
14080 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70   for each leaf p
14090 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66  age except the f
140a0 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69  irst that contai
140b0 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  ns.** at least o
140c0 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e  ne term. Argumen
140d0 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20  t (nTerm/pTerm) 
140e0 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  is the split-key
140f0 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a   - a term that.*
14100 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
14110 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74   all terms writt
14120 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65  en to earlier le
14130 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20  aves, and equal 
14140 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72  to or.** smaller
14150 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20   than the first 
14160 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20  term on the new 
14170 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  leaf..**.** If a
14180 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
14190 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
141a0 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64   left in Fts5Ind
141b0 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  ex.rc. If an err
141c0 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  or.** has alread
141d0 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
141e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
141f0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
14200 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
14210 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
14220 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73  BtreeTerm(.  Fts
14230 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14250 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
14260 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
14270 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
14280 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
14290 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
142a0 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20  nt nTerm, const 
142b0 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f  u8 *pTerm      /
142c0 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  * First term on 
142d0 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  new page */.){. 
142e0 20 69 6e 74 20 69 48 65 69 67 68 74 3b 0a 20 20   int iHeight;.  
142f0 66 6f 72 28 69 48 65 69 67 68 74 3d 31 3b 20 31  for(iHeight=1; 1
14300 3b 20 69 48 65 69 67 68 74 2b 2b 29 7b 0a 20 20  ; iHeight++){.  
14310 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
14320 20 2a 70 50 61 67 65 3b 0a 0a 20 20 20 20 69 66   *pPage;..    if
14330 28 20 69 48 65 69 67 68 74 3e 3d 70 57 72 69 74  ( iHeight>=pWrit
14340 65 72 2d 3e 6e 57 72 69 74 65 72 20 29 7b 0a 20  er->nWriter ){. 
14350 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
14360 72 65 65 47 72 6f 77 28 70 2c 20 70 57 72 69 74  reeGrow(p, pWrit
14370 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
14380 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
14390 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 20 3d     }.    pPage =
143a0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
143b0 65 72 5b 69 48 65 69 67 68 74 5d 3b 0a 0a 20 20  er[iHeight];..  
143c0 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
143d0 4e 45 6d 70 74 79 28 70 2c 20 70 57 72 69 74 65  NEmpty(p, pWrite
143e0 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61  r);..    if( pPa
143f0 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67  ge->buf.n>=p->pg
14400 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  sz ){.      /* p
14410 50 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69  Page will be wri
14420 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68  tten to disk. Th
14430 65 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77  e term will be w
14440 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
14450 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20        ** parent 
14460 6f 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20  of pPage.  */.  
14470 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
14480 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
14490 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
144a0 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
144b0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
144c0 48 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70  Height, pPage->p
144d0 67 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  gno.      );.   
144e0 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
144f0 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67  (p, iRowid, pPag
14500 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
14510 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66  >buf.n);.      f
14520 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
14530 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20  Page->buf);.    
14540 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
14550 28 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a  (&pPage->term);.
14560 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
14570 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
14580 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
14590 2c 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f  , pPage[-1].pgno
145a0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  );.      pPage->
145b0 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  pgno++;.    }els
145c0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72  e{.      int nPr
145d0 65 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  e = fts5PrefixCo
145e0 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
145f0 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
14600 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
14610 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  m);.      fts5Bu
14620 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
14630 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
14640 3e 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20  >buf, nPre+2);. 
14650 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
14660 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
14670 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
14680 20 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20   nTerm-nPre);.  
14690 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
146a0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
146b0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
146c0 65 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b  erm-nPre, pTerm+
146d0 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73  nPre);.      fts
146e0 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
146f0 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c  c, &pPage->term,
14700 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
14710 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14720 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
14730 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42   void fts5WriteB
14740 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74  treeNoTerm(.  Ft
14750 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14770 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
14780 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
14790 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
147a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
147b0 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ter object */.){
147c0 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
147d0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
147e0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72  e ){.    /* No r
147f0 6f 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70 61  owids on this pa
14800 67 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30 78  ge. Append an 0x
14810 30 30 20 62 79 74 65 20 74 6f 20 74 68 65 20 63  00 byte to the c
14820 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64  urrent .    ** d
14830 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
14840 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
14850 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
14860 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  t(&p->rc, &pWrit
14870 65 72 2d 3e 64 6c 69 64 78 2c 20 30 29 3b 0a 20  er->dlidx, 0);. 
14880 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45   }.  pWriter->nE
14890 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpty++;.}../*.**
148a0 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61   Rowid iRowid ha
148b0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65  s just been appe
148c0 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
148d0 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 41  ent leaf page. A
148e0 73 20 69 74 20 69 73 0a 2a 2a 20 74 68 65 20 66  s it is.** the f
148f0 69 72 73 74 20 6f 6e 20 69 74 73 20 70 61 67 65  irst on its page
14900 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 6e 74 72  , append an entr
14910 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  y to the current
14920 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a   doclist-index..
14930 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
14940 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
14950 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  end(.  Fts5Index
14960 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
14970 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
14980 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
14990 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 69  .  i64 iVal;.  i
149a0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69  f( pWriter->bDli
149b0 64 78 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20  dxPrevValid ){. 
149c0 20 20 20 69 56 61 6c 20 3d 20 70 57 72 69 74 65     iVal = pWrite
149d0 72 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 2d 20  r->iDlidxPrev - 
149e0 69 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b  iRowid;.  }else{
149f0 0a 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77  .    iVal = iRow
14a00 69 64 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  id;.  }.  sqlite
14a10 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
14a20 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
14a30 26 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2c  &pWriter->dlidx,
14a40 20 69 56 61 6c 29 3b 0a 20 20 70 57 72 69 74 65   iVal);.  pWrite
14a50 72 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c  r->bDlidxPrevVal
14a60 69 64 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65  id = 1;.  pWrite
14a70 72 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 3d 20  r->iDlidxPrev = 
14a80 69 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61 74 69  iRowid;.}..stati
14a90 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
14aa0 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e  FlushLeaf(Fts5In
14ab0 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
14ac0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
14ad0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
14ae0 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78  u8 zero[] = { 0x
14af0 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  00, 0x00, 0x00, 
14b00 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61  0x00 };.  Fts5Pa
14b10 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
14b20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
14b30 74 65 72 5b 30 5d 3b 0a 20 20 69 36 34 20 69 52  ter[0];.  i64 iR
14b40 6f 77 69 64 3b 0a 0a 20 20 69 66 28 20 70 50 61  owid;..  if( pPa
14b50 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b  ge->term.n==0 ){
14b60 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20  .    /* No term 
14b70 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  was written to t
14b80 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  his page. */.   
14b90 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35   assert( 0==fts5
14ba0 47 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  GetU16(&pPage->b
14bb0 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20  uf.p[2]) );.    
14bc0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f  fts5WriteBtreeNo
14bd0 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29  Term(p, pWriter)
14be0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74  ;.  }..  /* Writ
14bf0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
14c00 67 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f  ge to the db. */
14c10 0a 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  .  iRowid = FTS5
14c20 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
14c30 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
14c40 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30  riter->iSegid, 0
14c50 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
14c60 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
14c70 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
14c80 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
14c90 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e  buf.n);..  /* In
14ca0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78  itialize the nex
14cb0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  t page. */.  fts
14cc0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
14cd0 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35  ge->buf);.  fts5
14ce0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
14cf0 65 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35  e->term);.  fts5
14d00 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
14d10 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
14d20 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a  >buf, 4, zero);.
14d30 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b    pPage->pgno++;
14d40 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20  ..  /* Increase 
14d50 74 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74  the leaves writt
14d60 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  en counter */.  
14d70 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72  pWriter->nLeafWr
14d80 69 74 74 65 6e 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  itten++;.}../*.*
14d90 2a 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54  * Append term pT
14da0 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65  erm/nTerm to the
14db0 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77   segment being w
14dc0 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72  ritten by the wr
14dd0 69 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61  iter passed.** a
14de0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
14df0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
14e00 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
14e10 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
14e20 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
14e30 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
14e40 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
14e50 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
14e60 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
14e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14e80 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
14e90 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
14ea0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
14eb0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
14ec0 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f  .  int nTerm, co
14ed0 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29  nst u8 *pTerm .)
14ee0 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  {.  int nPrefix;
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
14f10 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69  prefix compressi
14f20 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20  on for term */. 
14f30 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
14f40 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
14f50 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a  r->aWriter[0];..
14f60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
14f70 3e 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61  >buf.n==0 || pPa
14f80 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20  ge->buf.n>4 );. 
14f90 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
14fa0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a  n==0 ){.    /* Z
14fb0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 74 65  ero the first te
14fc0 72 6d 20 61 6e 64 20 66 69 72 73 74 20 64 6f 63  rm and first doc
14fd0 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20  id fields */.   
14fe0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
14ff0 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30   zero[] = { 0x00
15000 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
15010 30 30 20 7d 3b 0a 20 20 20 20 66 74 73 35 42 75  00 };.    fts5Bu
15020 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
15030 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
15040 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20  uf, 4, zero);.  
15050 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
15060 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20  >term.n==0 );.  
15070 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20  }.  if( p->rc ) 
15080 72 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28  return;.  .  if(
15090 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d   pPage->term.n==
150a0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61  0 ){.    /* Upda
150b0 74 65 20 74 68 65 20 22 66 69 72 73 74 20 74 65  te the "first te
150c0 72 6d 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65  rm" field of the
150d0 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 2a 2f   page header. */
150e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
150f0 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20  ge->buf.p[2]==0 
15100 26 26 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  && pPage->buf.p[
15110 33 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73  3]==0 );.    fts
15120 35 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e  5PutU16(&pPage->
15130 62 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d  buf.p[2], pPage-
15140 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72  >buf.n);.    nPr
15150 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66  efix = 0;.    if
15160 28 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74  ( pWriter->aWrit
15170 65 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b  er[0].pgno!=1 ){
15180 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
15190 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72  BtreeTerm(p, pWr
151a0 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65  iter, nTerm, pTe
151b0 72 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  rm);.      pPage
151c0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
151d0 69 74 65 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20  iter[0];.    }. 
151e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65   }else{.    nPre
151f0 66 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78  fix = fts5Prefix
15200 43 6f 6d 70 72 65 73 73 28 0a 20 20 20 20 20 20  Compress(.      
15210 20 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c    pPage->term.n,
15220 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
15230 6e 54 65 72 6d 2c 20 70 54 65 72 6d 0a 20 20 20  nTerm, pTerm.   
15240 20 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66   );.    fts5Buff
15250 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
15260 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
15270 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  uf, nPrefix);.  
15280 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
15290 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
152a0 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20  es of new data, 
152b0 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61  then the term da
152c0 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74  ta itself.  ** t
152d0 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  o the page. */. 
152e0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
152f0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
15300 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
15310 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20  rm - nPrefix);. 
15320 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
15330 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
15340 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
15350 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65   - nPrefix, &pTe
15360 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20  rm[nPrefix]);.. 
15370 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46   /* Update the F
15380 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65  ts5PageWriter.te
15390 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66  rm field. */.  f
153a0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
153b0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72  >rc, &pPage->ter
153c0 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
153d0 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  ;..  pWriter->bF
153e0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
153f0 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 0;.  pWriter->
15400 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
15410 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  list = 1;..  /* 
15420 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  If the current l
15430 65 61 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c  eaf page is full
15440 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69  , flush it to di
15450 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  sk. */.  if( pPa
15460 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 67  ge->buf.n>=p->pg
15470 73 7a 20 29 7b 0a 20 20 20 20 66 74 73 35 57 72  sz ){.    fts5Wr
15480 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
15490 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 57  pWriter);.    pW
154a0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
154b0 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  idInPage = 1;.  
154c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  }.}../*.** Appen
154d0 64 20 61 20 64 6f 63 69 64 20 74 6f 20 74 68 65  d a docid to the
154e0 20 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e   writers output.
154f0 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
15500 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
15510 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64  Rowid(.  Fts5Ind
15520 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
15530 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
15540 2c 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29  ,.  i64 iRowid.)
15550 7b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74  {.  Fts5PageWrit
15560 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72  er *pPage = &pWr
15570 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
15580 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
15590 69 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72  is to be the fir
155a0 73 74 20 64 6f 63 69 64 20 77 72 69 74 74 65 6e  st docid written
155b0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65   to the page, se
155c0 74 20 74 68 65 20 0a 20 20 2a 2a 20 64 6f 63 69  t the .  ** doci
155d0 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  d-pointer in the
155e0 20 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c   page-header. Al
155f0 73 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75  so append a valu
15600 65 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20  e to the dlidx. 
15610 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63   ** buffer, in c
15620 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ase a doclist-in
15630 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e  dex is required.
15640 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74    */.  if( pWrit
15650 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
15660 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 66 74 73  nPage ){.    fts
15670 35 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62  5PutU16(pPage->b
15680 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66  uf.p, pPage->buf
15690 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  .n);.    fts5Wri
156a0 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c  teDlidxAppend(p,
156b0 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64   pWriter, iRowid
156c0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69  );.  }..  /* Wri
156d0 74 65 20 74 68 65 20 64 6f 63 69 64 2e 20 2a 2f  te the docid. */
156e0 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
156f0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
15700 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d  list || pWriter-
15710 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
15720 67 65 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  ge ){.    fts5Bu
15730 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
15740 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
15750 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20  >buf, iRowid);. 
15760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
15770 72 74 28 20 69 52 6f 77 69 64 3c 70 57 72 69 74  rt( iRowid<pWrit
15780 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 29  er->iPrevRowid )
15790 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
157a0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
157b0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
157c0 2c 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76  , pWriter->iPrev
157d0 52 6f 77 69 64 20 2d 20 69 52 6f 77 69 64 29 3b  Rowid - iRowid);
157e0 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e  .  }.  pWriter->
157f0 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f  iPrevRowid = iRo
15800 77 69 64 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  wid;.  pWriter->
15810 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
15820 6c 69 73 74 20 3d 20 30 3b 0a 20 20 70 57 72 69  list = 0;.  pWri
15830 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
15840 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 69  InPage = 0;..  i
15850 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
15860 3d 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  =p->pgsz ){.    
15870 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
15880 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
15890 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
158a0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
158b0 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   1;.  }.}..stati
158c0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
158d0 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74  AppendPoslistInt
158e0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
158f0 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
15900 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
15910 6e 74 20 69 56 61 6c 0a 29 7b 0a 20 20 46 74 73  nt iVal.){.  Fts
15920 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
15930 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  ge = &pWriter->a
15940 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 66 74 73  Writer[0];.  fts
15950 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
15960 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
15970 67 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a  ge->buf, iVal);.
15980 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66    if( pPage->buf
15990 2e 6e 3e 3d 70 2d 3e 70 67 73 7a 20 29 7b 0a 20  .n>=p->pgsz ){. 
159a0 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
159b0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
159c0 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  );.    pWriter->
159d0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
159e0 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  e = 1;.  }.}..st
159f0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
15a00 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
15a10 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65  Data(.  Fts5Inde
15a20 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
15a30 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
15a40 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44   .  const u8 *aD
15a50 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74  ata, .  int nDat
15a60 61 0a 29 7b 0a 20 20 46 74 73 35 50 61 67 65 57  a.){.  Fts5PageW
15a70 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
15a80 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
15a90 5b 30 5d 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  [0];.  const u8 
15aa0 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e  *a = aData;.  in
15ab0 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a  t n = nData;.  .
15ac0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
15ad0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50  SQLITE_OK && (pP
15ae0 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 6e 29 3e  age->buf.n + n)>
15af0 3d 70 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  =p->pgsz ){.    
15b00 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70 67  int nReq = p->pg
15b10 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e  sz - pPage->buf.
15b20 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79  n;.    int nCopy
15b30 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
15b40 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20   nCopy<nReq ){. 
15b50 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a       i64 dummy;.
15b60 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 67        nCopy += g
15b70 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70  etVarint(&a[nCop
15b80 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d 79  y], (u64*)&dummy
15b90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
15ba0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
15bb0 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
15bc0 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29  ->buf, nCopy, a)
15bd0 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79  ;.    a += nCopy
15be0 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79  ;.    n -= nCopy
15bf0 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46  ;.    fts5WriteF
15c00 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
15c10 74 65 72 29 3b 0a 20 20 20 20 70 57 72 69 74 65  ter);.    pWrite
15c20 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
15c30 50 61 67 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Page = 1;.  }.  
15c40 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66  if( n>0 ){.    f
15c50 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
15c60 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
15c70 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a  ge->buf, n, a);.
15c80 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
15c90 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
15ca0 6e 64 5a 65 72 6f 62 79 74 65 28 46 74 73 35 49  ndZerobyte(Fts5I
15cb0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
15cc0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
15cd0 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  {.  fts5BufferAp
15ce0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
15cf0 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72  c, &pWriter->aWr
15d00 69 74 65 72 5b 30 5d 2e 62 75 66 2c 20 30 29 3b  iter[0].buf, 0);
15d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
15d20 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64 20  any data cached 
15d30 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f 62  by the writer ob
15d40 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74 61  ject to the data
15d50 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a  base. Free any.*
15d60 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  * allocations as
15d70 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
15d80 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61  e writer..*/.sta
15d90 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
15da0 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35  teFinish(.  Fts5
15db0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
15dc0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
15dd0 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
15de0 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
15df0 0a 20 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74  .  int *pnHeight
15e00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15e10 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68     /* OUT: Heigh
15e20 74 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  t of the b-tree 
15e30 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66  */.  int *pnLeaf
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d       /* OUT: Num
15e60 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
15e70 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29  s in b-tree */.)
15e80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2a 70 6e  {.  int i;.  *pn
15e90 4c 65 61 66 20 3d 20 70 57 72 69 74 65 72 2d 3e  Leaf = pWriter->
15ea0 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 3b  aWriter[0].pgno;
15eb0 0a 20 20 69 66 28 20 2a 70 6e 4c 65 61 66 3d 3d  .  if( *pnLeaf==
15ec0 31 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 57  1 && pWriter->aW
15ed0 72 69 74 65 72 5b 30 5d 2e 62 75 66 2e 6e 3d 3d  riter[0].buf.n==
15ee0 30 20 29 7b 0a 20 20 20 20 2a 70 6e 4c 65 61 66  0 ){.    *pnLeaf
15ef0 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 48 65 69   = 0;.    *pnHei
15f00 67 68 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ght = 0;.  }else
15f10 7b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46  {.    fts5WriteF
15f20 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
15f30 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 57  ter);.    if( pW
15f40 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3d 3d  riter->nWriter==
15f50 31 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45  1 && pWriter->nE
15f60 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44  mpty>=FTS5_MIN_D
15f70 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20  LIDX_SIZE ){.   
15f80 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65     fts5WriteBtre
15f90 65 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72  eGrow(p, pWriter
15fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
15fb0 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65   pWriter->nWrite
15fc0 72 3e 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73  r>1 ){.      fts
15fd0 35 57 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74  5WriteBtreeNEmpt
15fe0 79 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  y(p, pWriter);. 
15ff0 20 20 20 7d 0a 20 20 20 20 2a 70 6e 48 65 69 67     }.    *pnHeig
16000 68 74 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 57  ht = pWriter->nW
16010 72 69 74 65 72 3b 0a 0a 20 20 20 20 66 6f 72 28  riter;..    for(
16020 69 3d 31 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=1; i<pWriter->
16030 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nWriter; i++){. 
16040 20 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69       Fts5PageWri
16050 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69  ter *pPg = &pWri
16060 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b  ter->aWriter[i];
16070 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
16080 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
16090 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f     FTS5_SEGMENT_
160a0 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
160b0 49 64 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53  Idx, pWriter->iS
160c0 65 67 69 64 2c 20 69 2c 20 70 50 67 2d 3e 70 67  egid, i, pPg->pg
160d0 6e 6f 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  no), .          
160e0 70 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d  pPg->buf.p, pPg-
160f0 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a  >buf.n.      );.
16100 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
16110 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
16120 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nWriter; i++){. 
16130 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
16140 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65  r *pPg = &pWrite
16150 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20  r->aWriter[i];. 
16160 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
16170 65 28 26 70 50 67 2d 3e 74 65 72 6d 29 3b 0a 20  e(&pPg->term);. 
16180 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
16190 65 28 26 70 50 67 2d 3e 62 75 66 29 3b 0a 20 20  e(&pPg->buf);.  
161a0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
161b0 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  (pWriter->aWrite
161c0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  r);.  sqlite3Fts
161d0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72  5BufferFree(&pWr
161e0 69 74 65 72 2d 3e 64 6c 69 64 78 29 3b 0a 7d 0a  iter->dlidx);.}.
161f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16200 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46 74  5WriteInit(.  Ft
16210 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
16220 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16230 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69 49  riter, .  int iI
16240 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64 0a 29  dx, int iSegid.)
16250 7b 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74  {.  memset(pWrit
16260 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
16270 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
16280 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d   pWriter->iIdx =
16290 20 69 49 64 78 3b 0a 20 20 70 57 72 69 74 65 72   iIdx;.  pWriter
162a0 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
162b0 64 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 61  d;..  pWriter->a
162c0 57 72 69 74 65 72 20 3d 20 28 46 74 73 35 50 61  Writer = (Fts5Pa
162d0 67 65 57 72 69 74 65 72 2a 29 66 74 73 35 49 64  geWriter*)fts5Id
162e0 78 4d 61 6c 6c 6f 63 28 70 2c 73 69 7a 65 6f 66  xMalloc(p,sizeof
162f0 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72 29  (Fts5PageWriter)
16300 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  );.  if( pWriter
16310 2d 3e 61 57 72 69 74 65 72 3d 3d 30 20 29 20 72  ->aWriter==0 ) r
16320 65 74 75 72 6e 3b 0a 20 20 70 57 72 69 74 65 72  eturn;.  pWriter
16330 2d 3e 6e 57 72 69 74 65 72 20 3d 20 31 3b 0a 20  ->nWriter = 1;. 
16340 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
16350 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 31 3b 0a 7d  r[0].pgno = 1;.}
16360 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16370 73 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70  s5WriteInitForAp
16380 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65  pend(.  Fts5Inde
16390 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
163a0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
163b0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
163c0 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
163d0 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
163e0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 74 6f      /* Writer to
163f0 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f 0a 20   initialize */. 
16400 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20   int iIdx,      
16410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16420 20 2f 2a 20 49 6e 64 65 78 20 73 65 67 6d 65 6e   /* Index segmen
16430 74 20 69 73 20 61 20 70 61 72 74 20 6f 66 20 2a  t is a part of *
16440 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
16450 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20  eSegment *pSeg  
16460 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6f      /* Segment o
16470 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e 64 20  bject to append 
16480 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  to */.){.  int n
16490 42 79 74 65 20 3d 20 70 53 65 67 2d 3e 6e 48 65  Byte = pSeg->nHe
164a0 69 67 68 74 20 2a 20 73 69 7a 65 6f 66 28 46 74  ight * sizeof(Ft
164b0 73 35 50 61 67 65 57 72 69 74 65 72 29 3b 0a 20  s5PageWriter);. 
164c0 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c   memset(pWriter,
164d0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
164e0 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57  egWriter));.  pW
164f0 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49  riter->iIdx = iI
16500 64 78 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  dx;.  pWriter->i
16510 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53  Segid = pSeg->iS
16520 65 67 69 64 3b 0a 20 20 70 57 72 69 74 65 72 2d  egid;.  pWriter-
16530 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74 73 35  >aWriter = (Fts5
16540 50 61 67 65 57 72 69 74 65 72 2a 29 66 74 73 35  PageWriter*)fts5
16550 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79  IdxMalloc(p, nBy
16560 74 65 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  te);.  pWriter->
16570 6e 57 72 69 74 65 72 20 3d 20 70 53 65 67 2d 3e  nWriter = pSeg->
16580 6e 48 65 69 67 68 74 3b 0a 0a 20 20 69 66 28 20  nHeight;..  if( 
16590 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
165a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f   ){.    int pgno
165b0 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b   = 1;.    int i;
165c0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61 57  .    pWriter->aW
165d0 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20  riter[0].pgno = 
165e0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31  pSeg->pgnoLast+1
165f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 65 67  ;.    for(i=pSeg
16600 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20 69 3e 30  ->nHeight-1; i>0
16610 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 69 36  ; i--){.      i6
16620 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  4 iRowid = FTS5_
16630 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
16640 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
16650 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
16660 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 46 74   pgno);.      Ft
16670 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
16680 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  g = &pWriter->aW
16690 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  riter[i];.      
166a0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
166b0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
166c0 42 75 66 66 65 72 28 70 2c 20 26 70 50 67 2d 3e  Buffer(p, &pPg->
166d0 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  buf, iRowid);.  
166e0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
166f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16700 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72      Fts5NodeIter
16710 20 73 73 3b 0a 20 20 20 20 20 20 20 20 66 74 73   ss;.        fts
16720 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70 50  5NodeIterInit(pP
16730 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62  g->buf.p, pPg->b
16740 75 66 2e 6e 2c 20 26 73 73 29 3b 0a 20 20 20 20  uf.n, &ss);.    
16750 20 20 20 20 77 68 69 6c 65 28 20 73 73 2e 61 44      while( ss.aD
16760 61 74 61 20 29 20 66 74 73 35 4e 6f 64 65 49 74  ata ) fts5NodeIt
16770 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c 20 26  erNext(&p->rc, &
16780 73 73 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ss);.        fts
16790 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
167a0 63 2c 20 26 70 50 67 2d 3e 74 65 72 6d 2c 20 73  c, &pPg->term, s
167b0 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72  s.term.n, ss.ter
167c0 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 70 67  m.p);.        pg
167d0 6e 6f 20 3d 20 73 73 2e 69 43 68 69 6c 64 3b 0a  no = ss.iChild;.
167e0 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65          fts5Node
167f0 49 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20  IterFree(&ss);. 
16800 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16810 20 69 66 28 20 70 53 65 67 2d 3e 6e 48 65 69 67   if( pSeg->nHeig
16820 68 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  ht==1 ){.      p
16830 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d  Writer->nEmpty =
16840 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2d   pSeg->pgnoLast-
16850 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
16860 65 72 74 28 20 28 70 67 6e 6f 2b 70 57 72 69 74  ert( (pgno+pWrit
16870 65 72 2d 3e 6e 45 6d 70 74 79 29 3d 3d 70 53 65  er->nEmpty)==pSe
16880 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20  g->pgnoLast );. 
16890 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72   }.}../*.** Iter
168a0 61 74 6f 72 20 70 49 74 65 72 20 77 61 73 20 75  ator pIter was u
168b0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
168c0 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74  hrough the input
168d0 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20   segments of on 
168e0 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61  an.** incrementa
168f0 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f  l merge operatio
16900 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
16910 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68   is called if th
16920 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a  e incremental.**
16930 20 6d 65 72 67 65 20 73 74 65 70 20 68 61 73 20   merge step has 
16940 66 69 6e 69 73 68 65 64 20 62 75 74 20 74 68 65  finished but the
16950 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62   input has not b
16960 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65  een completely e
16970 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61  xhausted..*/.sta
16980 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69  tic void fts5Tri
16990 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e  mSegments(Fts5In
169a0 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c 74  dex *p, Fts5Mult
169b0 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  iSegIter *pIter)
169c0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73  {.  int i;.  Fts
169d0 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d  5Buffer buf;.  m
169e0 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
169f0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
16a00 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ));.  for(i=0; i
16a10 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
16a20 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49  +){.    Fts5SegI
16a30 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
16a40 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
16a50 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d   if( pSeg->pSeg=
16a60 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  =0 ){.      /* n
16a70 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  o-op */.    }els
16a80 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61  e if( pSeg->pLea
16a90 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 53  f==0 ){.      pS
16aa0 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  eg->pSeg->pgnoLa
16ab0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  st = 0;.      pS
16ac0 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eg->pSeg->pgnoFi
16ad0 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rst = 0;.    }el
16ae0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f  se{.      int iO
16af0 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d  ff = pSeg->iTerm
16b00 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20  LeafOffset;     
16b10 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77  /* Offset on new
16b20 20 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65   first leaf page
16b30 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c   */.      i64 iL
16b40 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  eafRowid;.      
16b50 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
16b60 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d  .      int iId =
16b70 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65   pSeg->pSeg->iSe
16b80 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48  gid;.      u8 aH
16b90 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30  dr[4] = {0x00, 0
16ba0 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 34 7d  x00, 0x00, 0x04}
16bb0 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f  ;..      iLeafRo
16bc0 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
16bd0 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
16be0 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 70 53 65  Idx, iId, 0, pSe
16bf0 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
16c00 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d  );.      pData =
16c10 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
16c20 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20   iLeafRowid);.  
16c30 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b      if( pData ){
16c40 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
16c50 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20  ferZero(&buf);. 
16c60 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
16c70 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
16c80 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66  rc, &buf, sizeof
16c90 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20  (aHdr), aHdr);. 
16ca0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
16cb0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
16cc0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67  ->rc, &buf, pSeg
16cd0 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20  ->term.n);.     
16ce0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
16cf0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
16d00 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d  &buf, pSeg->term
16d10 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70  .n, pSeg->term.p
16d20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
16d30 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
16d40 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44  &p->rc, &buf, pD
16d50 61 74 61 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20 26  ata->n - iOff, &
16d60 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b  pData->p[iOff]);
16d70 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
16d80 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
16d90 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70  .        pSeg->p
16da0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
16db0 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
16dc0 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 66 74  Pgno;.        ft
16dd0 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20  s5DataDelete(p, 
16de0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
16df0 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c 20 69  ID(pSeg->iIdx, i
16e00 49 64 2c 20 30 2c 20 31 29 2c 69 4c 65 61 66 52  Id, 0, 1),iLeafR
16e10 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
16e20 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
16e30 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75 66 2e  iLeafRowid, buf.
16e40 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20  p, buf.n);.     
16e50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
16e60 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
16e70 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  uf);.}../*.**.*/
16e80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16e90 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
16ea0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16ec0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
16ed0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
16ee0 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f 72 6b  /* Index to work
16f10 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72   on */.  Fts5Str
16f20 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c  ucture *pStruct,
16f30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 75 63           /* Stuc
16f40 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 69 49  ture of index iI
16f50 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c  dx */.  int iLvl
16f60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16f70 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c          /* Level
16f80 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 66   to read input f
16f90 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rom */.  int *pn
16fa0 52 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Rem             
16fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
16fc0 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d 61 6e  e up to this man
16fd0 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20  y output leaves 
16fe0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
16ff0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
17000 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
17010 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73  vel[iLvl];.  Fts
17020 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
17030 2a 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72  *pLvlOut = &pStr
17040 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
17050 2b 31 5d 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69  +1];.  Fts5Multi
17060 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d  SegIter *pIter =
17070 20 30 3b 20 20 20 20 2f 2a 20 49 74 65 72 61 74   0;    /* Iterat
17080 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  or to read input
17090 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
170a0 52 65 6d 20 3d 20 2a 70 6e 52 65 6d 3b 20 20 20  Rem = *pnRem;   
170b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
170c0 74 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20  tput leaf pages 
170d0 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
170e0 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20  .  int nInput;  
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17100 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17110 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
17120 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
17130 72 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20  r writer;       
17140 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
17150 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
17160 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
17170 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74  pSeg;     /* Out
17180 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  put segment */. 
17190 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
171a0 3b 0a 20 20 69 6e 74 20 62 52 65 71 75 69 72 65  ;.  int bRequire
171b0 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 30 3b  DoclistTerm = 0;
171c0 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74      /* Doclist t
171d0 65 72 6d 69 6e 61 74 6f 72 20 28 30 78 30 30 29  erminator (0x00)
171e0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
171f0 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20  nt bOldest;     
17200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17210 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75  * True if the ou
17220 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20  tput segment is 
17230 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 0a 20  the oldest */.. 
17240 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53   assert( iLvl<pS
17250 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b  truct->nLevel );
17260 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d  .  assert( pLvl-
17270 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
17280 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74  Seg );..  memset
17290 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
172a0 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
172b0 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74  r));.  memset(&t
172c0 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  erm, 0, sizeof(F
172d0 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 77  ts5Buffer));.  w
172e0 72 69 74 65 72 2e 69 49 64 78 20 3d 20 69 49 64  riter.iIdx = iId
172f0 78 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e  x;.  if( pLvl->n
17300 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 61 73 73  Merge ){.    ass
17310 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53  ert( pLvlOut->nS
17320 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70  eg>0 );.    nInp
17330 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ut = pLvl->nMerg
17340 65 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  e;.    fts5Write
17350 49 6e 69 74 46 6f 72 41 70 70 65 6e 64 28 70 2c  InitForAppend(p,
17360 20 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c 20   &writer, iIdx, 
17370 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
17380 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 29  LvlOut->nSeg-1])
17390 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c  ;.    pSeg = &pL
173a0 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
173b0 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20  Out->nSeg-1];.  
173c0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
173d0 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f  Segid = fts5Allo
173e0 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74  cateSegid(p, pSt
173f0 72 75 63 74 29 3b 0a 20 20 20 20 66 74 73 35 57  ruct);.    fts5W
17400 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
17410 74 65 72 2c 20 69 49 64 78 2c 20 69 53 65 67 69  ter, iIdx, iSegi
17420 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20  d);..    /* Add 
17430 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  the new segment 
17440 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65  to the output le
17450 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  vel */.    if( i
17460 4c 76 6c 2b 31 3d 3d 70 53 74 72 75 63 74 2d 3e  Lvl+1==pStruct->
17470 6e 4c 65 76 65 6c 20 29 20 70 53 74 72 75 63 74  nLevel ) pStruct
17480 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20  ->nLevel++;.    
17490 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d  pSeg = &pLvlOut-
174a0 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
174b0 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75  Seg];.    pLvlOu
174c0 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70  t->nSeg++;.    p
174d0 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
174e0 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69 53   1;.    pSeg->iS
174f0 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a  egid = iSegid;..
17500 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75      /* Read inpu
17510 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65  t from all segme
17520 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  nts in the input
17530 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49   level */.    nI
17540 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  nput = pLvl->nSe
17550 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74  g;.  }.  bOldest
17560 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65   = (pLvlOut->nSe
17570 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d  g==1 && pStruct-
17580 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29  >nLevel==iLvl+2)
17590 3b 0a 0a 23 69 66 20 30 0a 66 70 72 69 6e 74 66  ;..#if 0.fprintf
175a0 28 73 74 64 6f 75 74 2c 20 22 6d 65 72 67 69 6e  (stdout, "mergin
175b0 67 20 25 64 20 73 65 67 6d 65 6e 74 73 20 66 72  g %d segments fr
175c0 6f 6d 20 6c 65 76 65 6c 20 25 64 21 22 2c 20 6e  om level %d!", n
175d0 49 6e 70 75 74 2c 20 69 4c 76 6c 29 3b 0a 66 66  Input, iLvl);.ff
175e0 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 23 65  lush(stdout);.#e
175f0 6e 64 69 66 0a 0a 20 20 66 6f 72 28 66 74 73 35  ndif..  for(fts5
17600 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
17610 70 53 74 72 75 63 74 2c 20 69 49 64 78 2c 20 30  pStruct, iIdx, 0
17620 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49  , 0, 0, iLvl, nI
17630 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20  nput, &pIter);. 
17640 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
17650 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
17660 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
17670 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
17680 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
17690 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
176a0 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
176b0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
176c0 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20 20 20 46  irst[1] ];.    F
176d0 74 73 35 43 68 75 6e 6b 49 74 65 72 20 73 50 6f  ts5ChunkIter sPo
176e0 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s;           /* 
176f0 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
17700 74 68 72 6f 75 67 68 20 70 6f 73 69 74 69 6f 6e  through position
17710 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a   list */..    /*
17720 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
17730 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 73  being written is
17740 20 74 68 65 20 6f 6c 64 65 73 74 20 69 6e 20 74   the oldest in t
17750 68 65 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20  he entire index 
17760 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  and.    ** the p
17770 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73 20  osition list is 
17780 65 6d 70 74 79 20 28 69 2e 65 2e 20 74 68 65 20  empty (i.e. the 
17790 65 6e 74 72 79 20 69 73 20 61 20 64 65 6c 65 74  entry is a delet
177a0 65 20 6d 61 72 6b 65 72 29 2c 20 6e 6f 0a 20 20  e marker), no.  
177b0 20 20 2a 2a 20 65 6e 74 72 79 20 6e 65 65 64 20    ** entry need 
177c0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
177d0 65 20 6f 75 74 70 75 74 2e 20 20 2a 2f 0a 20 20  e output.  */.  
177e0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49    fts5ChunkIterI
177f0 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 26 73 50  nit(p, pSeg, &sP
17800 6f 73 29 3b 0a 20 20 20 20 69 66 28 20 62 4f 6c  os);.    if( bOl
17810 64 65 73 74 3d 3d 30 20 7c 7c 20 73 50 6f 73 2e  dest==0 || sPos.
17820 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRem>0 ){.      
17830 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  int nTerm;.     
17840 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
17850 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
17860 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65  Term(pIter, &nTe
17870 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  rm);.      if( n
17880 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20  Term!=term.n || 
17890 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65  memcmp(pTerm, te
178a0 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a  rm.p, nTerm) ){.
178b0 20 20 20 20 20 20 20 20 69 66 28 20 77 72 69 74          if( writ
178c0 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e  er.nLeafWritten>
178d0 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  nRem ){.        
178e0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52    fts5ChunkIterR
178f0 65 6c 65 61 73 65 28 26 73 50 6f 73 29 3b 0a 20  elease(&sPos);. 
17900 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
17910 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
17920 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20     /* This is a 
17930 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64  new term. Append
17940 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f   a term to the o
17950 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a  utput segment. *
17960 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52  /.        if( bR
17970 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72  equireDoclistTer
17980 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  m ){.          f
17990 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65  ts5WriteAppendZe
179a0 72 6f 62 79 74 65 28 70 2c 20 26 77 72 69 74 65  robyte(p, &write
179b0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
179c0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
179d0 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72  ppendTerm(p, &wr
179e0 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65  iter, nTerm, pTe
179f0 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  rm);.        fts
17a00 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
17a10 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c  c, &term, nTerm,
17a20 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   pTerm);.       
17a30 20 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74   bRequireDoclist
17a40 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
17a50 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65  }..      /* Appe
17a60 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20  nd the rowid to 
17a70 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
17a80 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
17a90 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69  endRowid(p, &wri
17aa0 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74  ter, fts5MultiIt
17ab0 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b  erRowid(pIter));
17ac0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ..      /* Copy 
17ad0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
17ae0 74 20 66 72 6f 6d 20 69 6e 70 75 74 20 74 6f 20  t from input to 
17af0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20  output */.      
17b00 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50  fts5WriteAppendP
17b10 6f 73 6c 69 73 74 49 6e 74 28 70 2c 20 26 77 72  oslistInt(p, &wr
17b20 69 74 65 72 2c 20 73 50 6f 73 2e 6e 52 65 6d 29  iter, sPos.nRem)
17b30 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 20 6e  ;.      for(/* n
17b40 6f 6f 70 20 2a 2f 3b 20 21 66 74 73 35 43 68 75  oop */; !fts5Chu
17b50 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50  nkIterEof(p, &sP
17b60 6f 73 29 3b 20 66 74 73 35 43 68 75 6e 6b 49 74  os); fts5ChunkIt
17b70 65 72 4e 65 78 74 28 70 2c 20 26 73 50 6f 73 29  erNext(p, &sPos)
17b80 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57  ){.        fts5W
17b90 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
17ba0 74 44 61 74 61 28 70 2c 20 26 77 72 69 74 65 72  tData(p, &writer
17bb0 2c 20 73 50 6f 73 2e 70 2c 20 73 50 6f 73 2e 6e  , sPos.p, sPos.n
17bc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
17bd0 0a 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49  ..    fts5ChunkI
17be0 74 65 72 52 65 6c 65 61 73 65 28 26 73 50 6f 73  terRelease(&sPos
17bf0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75  );.  }..  /* Flu
17c00 73 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66  sh the last leaf
17c10 20 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53   page to disk. S
17c20 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  et the output se
17c30 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69  gment b-tree hei
17c40 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73  ght.  ** and las
17c50 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
17c60 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  er at the same t
17c70 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57  ime.  */.  fts5W
17c80 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77  riteFinish(p, &w
17c90 72 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 6e 48  riter, &pSeg->nH
17ca0 65 69 67 68 74 2c 20 26 70 53 65 67 2d 3e 70 67  eight, &pSeg->pg
17cb0 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20  noLast);..  if( 
17cc0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
17cd0 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20  (p, pIter) ){.  
17ce0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a    int i;..    /*
17cf0 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75   Remove the redu
17d00 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66  ndant segments f
17d10 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
17d20 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  able */.    for(
17d30 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69  i=0; i<nInput; i
17d40 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  ++){.      fts5D
17d50 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74  ataRemoveSegment
17d60 28 70 2c 20 69 49 64 78 2c 20 70 4c 76 6c 2d 3e  (p, iIdx, pLvl->
17d70 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b  aSeg[i].iSegid);
17d80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
17d90 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64  emove the redund
17da0 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  ant segments fro
17db0 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65  m the input leve
17dc0 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76  l */.    if( pLv
17dd0 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20  l->nSeg!=nInput 
17de0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f  ){.      int nMo
17df0 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67  ve = (pLvl->nSeg
17e00 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a   - nInput) * siz
17e10 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
17e20 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20  eSegment);.     
17e30 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61   memmove(pLvl->a
17e40 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Seg, &pLvl->aSeg
17e50 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29  [nInput], nMove)
17e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c  ;.    }.    pLvl
17e70 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74  ->nSeg -= nInput
17e80 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72  ;.    pLvl->nMer
17e90 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ge = 0;.    if( 
17ea0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d  pSeg->pgnoLast==
17eb0 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f  0 ){.      pLvlO
17ec0 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20  ut->nSeg--;.    
17ed0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
17ee0 73 73 65 72 74 28 20 70 53 65 67 2d 3e 6e 48 65  ssert( pSeg->nHe
17ef0 69 67 68 74 3e 30 20 26 26 20 70 53 65 67 2d 3e  ight>0 && pSeg->
17f00 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20  pgnoLast>0 );.  
17f10 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e    fts5TrimSegmen
17f20 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ts(p, pIter);.  
17f30 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d    pLvl->nMerge =
17f40 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20   nInput;.  }..  
17f50 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
17f60 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66  e(p, pIter);.  f
17f70 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
17f80 65 72 6d 29 3b 0a 20 20 2a 70 6e 52 65 6d 20 2d  erm);.  *pnRem -
17f90 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72  = writer.nLeafWr
17fa0 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  itten;.}../*.** 
17fb0 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66  A total of nLeaf
17fc0 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 64   leaf pages of d
17fd0 61 74 61 20 68 61 73 20 6a 75 73 74 20 62 65 65  ata has just bee
17fe0 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c  n flushed to a l
17ff0 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e  evel-0.** segmen
18000 74 73 20 69 6e 20 69 6e 64 65 78 20 69 49 64 78  ts in index iIdx
18010 20 77 69 74 68 20 73 74 72 75 63 74 75 72 65 20   with structure 
18020 70 53 74 72 75 63 74 2e 20 54 68 69 73 20 66 75  pStruct. This fu
18030 6e 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74  nction updates t
18040 68 65 0a 2a 2a 20 77 72 69 74 65 2d 63 6f 75 6e  he.** write-coun
18050 74 65 72 20 61 63 63 6f 72 64 69 6e 67 6c 79 20  ter accordingly 
18060 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72  and, if necessar
18070 79 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72  y, performs incr
18080 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 0a 2a 2a  emental merge.**
18090 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   work..**.** If 
180a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
180b0 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
180c0 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
180d0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
180e0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
180f0 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
18100 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
18110 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18120 20 66 74 73 35 49 6e 64 65 78 57 6f 72 6b 28 0a   fts5IndexWork(.
18130 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
18160 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  d object */.  in
18170 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20  t iIdx,         
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18190 20 49 6e 64 65 78 20 74 6f 20 77 6f 72 6b 20 6f   Index to work o
181a0 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  n */.  Fts5Struc
181b0 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c  ture **ppStruct,
181c0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
181d0 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74  : Current struct
181e0 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
181f0 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20    int nLeaf     
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
18220 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73  utput leaves jus
18230 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a  t written */.){.
18240 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
18250 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
18260 72 75 63 74 3b 0a 20 20 69 36 34 20 6e 57 72 69  ruct;.  i64 nWri
18270 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
18280 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
18290 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74  al value of writ
182a0 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  e-counter */.  i
182b0 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20  nt nWork;       
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
182d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b  * Number of work
182e0 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f  -quanta to perfo
182f0 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d  rm */.  int nRem
18300 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18310 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18320 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
18330 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
18340 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
18350 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e  e write-counter.
18360 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   While doing so,
18370 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20   set nWork. */. 
18380 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72 75 63   nWrite = pStruc
18390 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
183a0 3b 0a 20 20 6e 57 6f 72 6b 20 3d 20 28 28 6e 57  ;.  nWork = ((nW
183b0 72 69 74 65 20 2b 20 6e 4c 65 61 66 29 20 2f 20  rite + nLeaf) / 
183c0 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 20 2d 20  p->nWorkUnit) - 
183d0 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e 6e 57 6f  (nWrite / p->nWo
183e0 72 6b 55 6e 69 74 29 3b 0a 20 20 70 53 74 72 75  rkUnit);.  pStru
183f0 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
18400 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 6e 52  r += nLeaf;.  nR
18410 65 6d 20 3d 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  em = p->nWorkUni
18420 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72  t * nWork * pStr
18430 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 0a 20 20  uct->nLevel;..  
18440 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b  while( nRem>0 ){
18450 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18470 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74   /* To iterate t
18480 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
18490 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76  .    int iBestLv
184a0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
184b0 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69   /* Level offeri
184c0 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75  ng the most inpu
184d0 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
184e0 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b    int nBest = 0;
184f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18500 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
18510 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73   segments on bes
18520 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20  t level */..    
18530 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20  /* Set iBestLvl 
18540 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20  to the level to 
18550 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65  read input segme
18560 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20  nts from. */.   
18570 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
18580 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20  ->nLevel>0 );.  
18590 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
185a0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
185b0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
185c0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
185d0 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
185e0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
185f0 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Lvl];.      if( 
18600 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
18610 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
18620 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29  ->nMerge>nBest )
18630 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73  {.          iBes
18640 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
18650 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
18660 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
18670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
18680 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18690 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
186a0 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  eg>nBest ){.    
186b0 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c      nBest = pLvl
186c0 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20  ->nSeg;.        
186d0 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
186e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
186f0 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20      /* If nBest 
18700 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e  is still 0, then
18710 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   the index must 
18720 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66  be empty. */.#if
18730 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
18740 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
18750 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76   nBest==0 && iLv
18760 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
18770 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
18780 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
18790 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
187a0 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  nSeg==0 );.    }
187b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
187c0 20 6e 42 65 73 74 3c 70 2d 3e 6e 4d 69 6e 4d 65   nBest<p->nMinMe
187d0 72 67 65 20 26 26 20 70 53 74 72 75 63 74 2d 3e  rge && pStruct->
187e0 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d  aLevel[iBestLvl]
187f0 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 20 62 72 65  .nMerge==0 ) bre
18800 61 6b 3b 0a 20 20 20 20 69 66 28 20 69 42 65 73  ak;.    if( iBes
18810 74 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e  tLvl==pStruct->n
18820 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20  Level-1 ){.     
18830 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64   fts5StructureAd
18840 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26  dLevel(&p->rc, &
18850 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
18860 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
18870 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d  eExtendLevel(&p-
18880 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 42  >rc, pStruct, iB
18890 65 73 74 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b  estLvl+1, 1, 0);
188a0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65  .    fts5IndexMe
188b0 72 67 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78  rgeLevel(p, iIdx
188c0 2c 20 70 53 74 72 75 63 74 2c 20 69 42 65 73 74  , pStruct, iBest
188d0 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
188e0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
188f0 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76  omote(p, iBestLv
18900 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  l+1, pStruct);. 
18910 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 6d 3d     assert( nRem=
18920 3d 30 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  =0 || p->rc==SQL
18930 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 2a 70  ITE_OK );.    *p
18940 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
18950 74 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65  t;.  }.}..typede
18960 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c 75  f struct Fts5Flu
18970 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68 43  shCtx Fts5FlushC
18980 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46  tx;.struct Fts5F
18990 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35  lushCtx {.  Fts5
189a0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46  Index *pIdx;.  F
189b0 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
189c0 74 65 72 3b 20 0a 7d 3b 0a 0a 73 74 61 74 69 63  ter; .};..static
189d0 20 69 6e 74 20 66 74 73 35 46 6c 75 73 68 4e 65   int fts5FlushNe
189e0 77 54 65 72 6d 28 76 6f 69 64 20 2a 70 43 74 78  wTerm(void *pCtx
189f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
18a00 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 29 7b  erm, int nTerm){
18a10 0a 20 20 46 74 73 35 46 6c 75 73 68 43 74 78 20  .  Fts5FlushCtx 
18a20 2a 70 20 3d 20 28 46 74 73 35 46 6c 75 73 68 43  *p = (Fts5FlushC
18a30 74 78 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20  tx*)pCtx;.  int 
18a40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18a50 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
18a60 64 54 65 72 6d 28 70 2d 3e 70 49 64 78 2c 20 26  dTerm(p->pIdx, &
18a70 70 2d 3e 77 72 69 74 65 72 2c 20 6e 54 65 72 6d  p->writer, nTerm
18a80 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65  , (const u8*)zTe
18a90 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rm);.  return rc
18aa0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
18ab0 66 74 73 35 46 6c 75 73 68 54 65 72 6d 44 6f 6e  fts5FlushTermDon
18ac0 65 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20  e(void *pCtx){. 
18ad0 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 2a 70   Fts5FlushCtx *p
18ae0 20 3d 20 28 46 74 73 35 46 6c 75 73 68 43 74 78   = (Fts5FlushCtx
18af0 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72 63  *)pCtx;.  int rc
18b00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18b10 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f 63  /* Write the doc
18b20 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20  list terminator 
18b30 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 41 70  */.  fts5WriteAp
18b40 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2d 3e  pendZerobyte(p->
18b50 70 49 64 78 2c 20 26 70 2d 3e 77 72 69 74 65 72  pIdx, &p->writer
18b60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18b70 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
18b80 73 35 46 6c 75 73 68 4e 65 77 45 6e 74 72 79 28  s5FlushNewEntry(
18b90 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
18ba0 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20    i64 iRowid, . 
18bb0 20 63 6f 6e 73 74 20 75 38 20 2a 61 50 6f 73 6c   const u8 *aPosl
18bc0 69 73 74 2c 20 0a 20 20 69 6e 74 20 6e 50 6f 73  ist, .  int nPos
18bd0 6c 69 73 74 0a 29 7b 0a 20 20 46 74 73 35 42 75  list.){.  Fts5Bu
18be0 66 66 65 72 20 2a 70 42 75 66 3b 0a 20 20 46 74  ffer *pBuf;.  Ft
18bf0 73 35 46 6c 75 73 68 43 74 78 20 2a 70 20 3d 20  s5FlushCtx *p = 
18c00 28 46 74 73 35 46 6c 75 73 68 43 74 78 2a 29 70  (Fts5FlushCtx*)p
18c10 43 74 78 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Ctx;.  int rc = 
18c20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
18c30 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f 77 69   Append the rowi
18c40 64 20 69 74 73 65 6c 66 20 2a 2f 0a 20 20 66 74  d itself */.  ft
18c50 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
18c60 69 64 28 70 2d 3e 70 49 64 78 2c 20 26 70 2d 3e  id(p->pIdx, &p->
18c70 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b  writer, iRowid);
18c80 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
18c90 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 6f  e size of the po
18ca0 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62  sition list in b
18cb0 79 74 65 73 20 2a 2f 0a 20 20 66 74 73 35 57 72  ytes */.  fts5Wr
18cc0 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
18cd0 49 6e 74 28 70 2d 3e 70 49 64 78 2c 20 26 70 2d  Int(p->pIdx, &p-
18ce0 3e 77 72 69 74 65 72 2c 20 6e 50 6f 73 6c 69 73  >writer, nPoslis
18cf0 74 29 3b 0a 0a 20 20 2f 2a 20 41 6e 64 20 74 68  t);..  /* And th
18d00 65 20 70 6f 73 6c 69 73 74 20 64 61 74 61 20 2a  e poslist data *
18d10 2f 0a 20 20 66 74 73 35 57 72 69 74 65 41 70 70  /.  fts5WriteApp
18d20 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70  endPoslistData(p
18d30 2d 3e 70 49 64 78 2c 20 26 70 2d 3e 77 72 69 74  ->pIdx, &p->writ
18d40 65 72 2c 20 61 50 6f 73 6c 69 73 74 2c 20 6e 50  er, aPoslist, nP
18d50 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  oslist);.  retur
18d60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
18d70 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  lush the content
18d80 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68  s of in-memory h
18d90 61 73 68 20 74 61 62 6c 65 20 69 48 61 73 68 20  ash table iHash 
18da0 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30  to a new level-0
18db0 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20   .** segment on 
18dc0 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74  disk. Also updat
18dd0 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  e the correspond
18de0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65  ing structure re
18df0 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
18e00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
18e10 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
18e20 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
18e30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
18e40 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
18e50 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
18e60 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
18e70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18e80 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
18e90 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
18ea0 6e 74 20 69 48 61 73 68 2c 20 69 6e 74 20 2a 70  nt iHash, int *p
18eb0 6e 4c 65 61 66 29 7b 0a 20 20 46 74 73 35 53 74  nLeaf){.  Fts5St
18ec0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
18ed0 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
18ee0 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d    int pgnoLast =
18ef0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18f00 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66      /* Last leaf
18f10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
18f20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  segment */..  /*
18f30 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72 65   Obtain a refere
18f40 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78  nce to the index
18f50 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
18f60 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
18f70 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f  gment-id.  ** fo
18f80 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d  r the new level-
18f90 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20  0 segment.  */. 
18fa0 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
18fb0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20  tructureRead(p, 
18fc0 69 48 61 73 68 29 3b 0a 20 20 69 53 65 67 69 64  iHash);.  iSegid
18fd0 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53   = fts5AllocateS
18fe0 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29  egid(p, pStruct)
18ff0 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 20  ;..  if( iSegid 
19000 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
19010 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
19020 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d  g;   /* New segm
19030 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72 75  ent within pStru
19040 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 48  ct */.    int nH
19050 65 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  eight;          
19060 20 20 20 20 20 20 20 20 2f 2a 20 48 65 69 67 68          /* Heigh
19070 74 20 6f 66 20 6e 65 77 20 73 65 67 6d 65 6e 74  t of new segment
19080 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 69   b-tree */.    i
19090 6e 74 20 72 63 3b 0a 20 20 20 20 46 74 73 35 46  nt rc;.    Fts5F
190a0 6c 75 73 68 43 74 78 20 63 74 78 3b 0a 0a 20 20  lushCtx ctx;..  
190b0 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28    fts5WriteInit(
190c0 70 2c 20 26 63 74 78 2e 77 72 69 74 65 72 2c 20  p, &ctx.writer, 
190d0 69 48 61 73 68 2c 20 69 53 65 67 69 64 29 3b 0a  iHash, iSegid);.
190e0 20 20 20 20 63 74 78 2e 70 49 64 78 20 3d 20 70      ctx.pIdx = p
190f0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
19100 74 65 33 46 74 73 35 48 61 73 68 49 74 65 72 61  te3Fts5HashItera
19110 74 65 28 20 70 2d 3e 61 70 48 61 73 68 5b 69 48  te( p->apHash[iH
19120 61 73 68 5d 2c 20 28 76 6f 69 64 2a 29 26 63 74  ash], (void*)&ct
19130 78 2c 20 0a 20 20 20 20 20 20 20 20 66 74 73 35  x, .        fts5
19140 46 6c 75 73 68 4e 65 77 54 65 72 6d 2c 20 66 74  FlushNewTerm, ft
19150 73 35 46 6c 75 73 68 4e 65 77 45 6e 74 72 79 2c  s5FlushNewEntry,
19160 20 66 74 73 35 46 6c 75 73 68 54 65 72 6d 44 6f   fts5FlushTermDo
19170 6e 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ne.    );.    if
19180 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19190 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b  OK ) p->rc = rc;
191a0 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 69  .    fts5WriteFi
191b0 6e 69 73 68 28 70 2c 20 26 63 74 78 2e 77 72 69  nish(p, &ctx.wri
191c0 74 65 72 2c 20 26 6e 48 65 69 67 68 74 2c 20 26  ter, &nHeight, &
191d0 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20  pgnoLast);..    
191e0 2f 2a 20 45 64 69 74 20 74 68 65 20 46 74 73 35  /* Edit the Fts5
191f0 53 74 72 75 63 74 75 72 65 20 61 6e 64 20 77 72  Structure and wr
19200 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 74  ite it back to t
19210 68 65 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a  he database. */.
19220 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d      if( pStruct-
19230 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20  >nLevel==0 ){.  
19240 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
19250 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  eAddLevel(&p->rc
19260 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20  , &pStruct);.   
19270 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
19280 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
19290 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
192a0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
192b0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
192c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65  _OK ){.      pSe
192d0 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
192e0 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53  evel[0].aSeg[ pS
192f0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
19300 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20  .nSeg++ ];.     
19310 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
19320 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53  iSegid;.      pS
19330 65 67 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48  eg->nHeight = nH
19340 65 69 67 68 74 3b 0a 20 20 20 20 20 20 70 53 65  eight;.      pSe
19350 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31  g->pgnoFirst = 1
19360 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67  ;.      pSeg->pg
19370 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73  noLast = pgnoLas
19380 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
19390 66 74 73 35 49 6e 64 65 78 57 6f 72 6b 28 70 2c  fts5IndexWork(p,
193a0 20 69 48 61 73 68 2c 20 26 70 53 74 72 75 63 74   iHash, &pStruct
193b0 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66  , pgnoLast);.  f
193c0 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
193d0 65 28 70 2c 20 69 48 61 73 68 2c 20 70 53 74 72  e(p, iHash, pStr
193e0 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
193f0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
19400 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ruct);.}../*.** 
19410 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73  Flush any data s
19420 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
19430 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
19440 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
19450 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
19460 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  id fts5IndexFlus
19470 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  h(Fts5Index *p){
19480 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
19490 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
194a0 66 69 67 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20  fig;.  int i;   
194b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194c0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
194d0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
194e0 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  h indexes */.  i
194f0 6e 74 20 6e 4c 65 61 66 20 3d 20 30 3b 20 20 20  nt nLeaf = 0;   
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19510 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
19520 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20  es written */.. 
19530 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
19540 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
19550 72 65 64 20 74 68 69 73 20 63 61 6c 6c 20 69 73  red this call is
19560 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
19570 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
19580 5f 4f 4b 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69  _OK || p->nPendi
19590 6e 67 44 61 74 61 3d 3d 30 20 29 20 72 65 74 75  ngData==0 ) retu
195a0 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rn;.  assert( p-
195b0 3e 61 70 48 61 73 68 20 29 3b 0a 0a 20 20 2f 2a  >apHash );..  /*
195c0 20 46 6c 75 73 68 20 74 68 65 20 74 65 72 6d 73   Flush the terms
195d0 20 61 6e 64 20 65 61 63 68 20 70 72 65 66 69 78   and each prefix
195e0 20 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 20 2a   index to disk *
195f0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  /.  for(i=0; i<=
19600 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
19610 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35  ; i++){.    fts5
19620 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 2c 20  FlushOneHash(p, 
19630 69 2c 20 26 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a  i, &nLeaf);.  }.
19640 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
19650 61 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  a = 0;.}../*.** 
19660 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c  Indicate that al
19670 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  l subsequent cal
19680 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ls to sqlite3Fts
19690 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65  5IndexWrite() pe
196a0 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  rtain.** to the 
196b0 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f  document with ro
196c0 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 76  wid iRowid..*/.v
196d0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49  oid sqlite3Fts5I
196e0 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46  ndexBeginWrite(F
196f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
19700 20 69 52 6f 77 69 64 29 7b 0a 20 20 69 66 28 20   iRowid){.  if( 
19710 69 52 6f 77 69 64 3c 3d 70 2d 3e 69 57 72 69 74  iRowid<=p->iWrit
19720 65 52 6f 77 69 64 20 7c 7c 20 28 70 2d 3e 6e 50  eRowid || (p->nP
19730 65 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e  endingData > p->
19740 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 29  nMaxPendingData)
19750 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
19760 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20  xFlush(p);.  }. 
19770 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20   p->iWriteRowid 
19780 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  = iRowid;.}../*.
19790 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20 74  ** Commit data t
197a0 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
197b0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
197c0 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ync(Fts5Index *p
197d0 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
197e0 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
197f0 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d  (p);.  if( bComm
19800 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52 65  it ) fts5CloseRe
19810 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75 72  ader(p);.  retur
19820 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  n p->rc;.}../*.*
19830 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64 61  * Discard any da
19840 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
19850 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
19860 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77  tables. Do not w
19870 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68  rite it.** to th
19880 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
19890 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65  tionally, assume
198a0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
198b0 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74 61  ts of the %_data
198c0 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68 61  .** table may ha
198d0 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69  ve changed on di
198e0 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65  sk. So any in-me
198f0 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20 25  mory caches of %
19900 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64  _data .** record
19910 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c 69  s must be invali
19920 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  dated..*/.int sq
19930 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 6f  lite3Fts5IndexRo
19940 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65 78  llback(Fts5Index
19950 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73   *p){.  fts5Clos
19960 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66 74  eReader(p);.  ft
19970 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61  s5IndexDiscardDa
19980 74 61 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ta(p);.  return 
19990 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
199a0 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 46  .** Open a new F
199b0 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
199c0 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65 20   If the bCreate 
199d0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65  argument is true
199e0 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20  , create.** and 
199f0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 75  initialize the u
19a00 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74 61  nderlying %_data
19a10 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
19a20 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
19a30 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
19a40 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
19a50 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
19a60 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  E_OK..** Otherwi
19a70 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  se, set *pp to N
19a80 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ULL and return a
19a90 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
19aa0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
19ab0 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e  te3Fts5IndexOpen
19ac0 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  (.  Fts5Config *
19ad0 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20  pConfig, .  int 
19ae0 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73 35  bCreate, .  Fts5
19af0 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68  Index **pp,.  ch
19b00 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
19b10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19b20 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  OK;.  Fts5Index 
19b30 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
19b40 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
19b50 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20  ect */..  *pp = 
19b60 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a 29  p = (Fts5Index*)
19b70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
19b80 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29  izeof(Fts5Index)
19b90 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  );.  if( !p ) re
19ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
19bb0 4d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  M;..  memset(p, 
19bc0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e  0, sizeof(Fts5In
19bd0 64 65 78 29 29 3b 0a 20 20 70 2d 3e 70 43 6f 6e  dex));.  p->pCon
19be0 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20  fig = pConfig;. 
19bf0 20 70 2d 3e 70 67 73 7a 20 3d 20 31 30 30 30 3b   p->pgsz = 1000;
19c00 0a 20 20 70 2d 3e 6e 4d 69 6e 4d 65 72 67 65 20  .  p->nMinMerge 
19c10 3d 20 46 54 53 35 5f 4d 49 4e 5f 4d 45 52 47 45  = FTS5_MIN_MERGE
19c20 3b 0a 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  ;.  p->nWorkUnit
19c30 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49   = FTS5_WORK_UNI
19c40 54 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64  T;.  p->nMaxPend
19c50 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31  ingData = 1024*1
19c60 30 32 34 3b 0a 20 20 70 2d 3e 7a 44 61 74 61 54  024;.  p->zDataT
19c70 62 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  bl = sqlite3_mpr
19c80 69 6e 74 66 28 22 25 73 5f 64 61 74 61 22 2c 20  intf("%s_data", 
19c90 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b  pConfig->zName);
19ca0 0a 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54  .  if( p->zDataT
19cb0 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  bl==0 ){.    rc 
19cc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
19cd0 20 20 7d 65 6c 73 65 20 69 66 28 20 62 43 72 65    }else if( bCre
19ce0 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ate ){.    int i
19cf0 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  ;.    Fts5Struct
19d00 75 72 65 20 73 3b 0a 20 20 20 20 72 63 20 3d 20  ure s;.    rc = 
19d10 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
19d20 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20  eTable(.        
19d30 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c  pConfig, "data",
19d40 20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   "id INTEGER PRI
19d50 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20  MARY KEY, block 
19d60 42 4c 4f 42 22 2c 20 70 7a 45 72 72 0a 20 20 20  BLOB", pzErr.   
19d70 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
19d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19d90 20 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c     memset(&s, 0,
19da0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
19db0 63 74 75 72 65 29 29 3b 0a 20 20 20 20 20 20 66  cture));.      f
19dc0 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69  or(i=0; i<pConfi
19dd0 67 2d 3e 6e 50 72 65 66 69 78 2b 31 3b 20 69 2b  g->nPrefix+1; i+
19de0 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  +){.        fts5
19df0 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
19e00 2c 20 69 2c 20 26 73 29 3b 0a 20 20 20 20 20 20  , i, &s);.      
19e10 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e  }.      rc = p->
19e20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rc;.    }.    sq
19e30 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65  lite3Fts5IndexSe
19e40 74 41 76 65 72 61 67 65 73 28 70 2c 20 28 63 6f  tAverages(p, (co
19e50 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a  nst u8*)"", 0);.
19e60 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
19e70 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
19e80 49 6e 64 65 78 43 6c 6f 73 65 28 70 2c 20 30 29  IndexClose(p, 0)
19e90 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  ;.    *pp = 0;. 
19ea0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
19ec0 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62   handle opened b
19ed0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
19ee0 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  l to sqlite3Fts5
19ef0 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a  IndexOpen()..*/.
19f00 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
19f10 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35 49 6e  ndexClose(Fts5In
19f20 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44 65 73  dex *p, int bDes
19f30 74 72 6f 79 29 7b 0a 20 20 69 6e 74 20 72 63 20  troy){.  int rc 
19f40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
19f50 66 28 20 62 44 65 73 74 72 6f 79 20 29 7b 0a 20  f( bDestroy ){. 
19f60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
19f70 74 73 35 44 72 6f 70 54 61 62 6c 65 28 70 2d 3e  ts5DropTable(p->
19f80 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 29  pConfig, "data")
19f90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19fa0 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b  p->pReader==0 );
19fb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
19fc0 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b  ize(p->pWriter);
19fd0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
19fe0 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  ize(p->pDeleter)
19ff0 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73  ;.  if( p->apHas
1a000 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  h ){.    int i;.
1a010 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1a020 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  p->pConfig->nPre
1a030 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  fix; i++){.     
1a040 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1a050 46 72 65 65 28 70 2d 3e 61 70 48 61 73 68 5b 69  Free(p->apHash[i
1a060 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ]);.    }.    sq
1a070 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
1a080 48 61 73 68 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Hash);.  }.  sql
1a090 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61  ite3_free(p->zDa
1a0a0 74 61 54 62 6c 29 3b 0a 20 20 73 71 6c 69 74 65  taTbl);.  sqlite
1a0b0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
1a0c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a0d0 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c 65   Return a simple
1a0e0 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   checksum value 
1a0f0 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72 67  based on the arg
1a100 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  uments..*/.stati
1a110 63 20 75 36 34 20 66 74 73 35 49 6e 64 65 78 45  c u64 fts5IndexE
1a120 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36 34  ntryCksum(.  i64
1a130 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74 20   iRowid, .  int 
1a140 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50 6f  iCol, .  int iPo
1a150 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
1a160 20 2a 70 54 65 72 6d 2c 20 0a 20 20 69 6e 74 20   *pTerm, .  int 
1a170 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69  nTerm.){.  int i
1a180 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52  ;.  u64 ret = iR
1a190 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28  owid;.  ret += (
1a1a0 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a  ret<<3) + iCol;.
1a1b0 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
1a1c0 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f 72 28  ) + iPos;.  for(
1a1d0 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
1a1e0 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c  +) ret += (ret<<
1a1f0 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20  3) + pTerm[i];. 
1a200 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
1a210 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74 65 20  /*.** Calculate 
1a220 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
1a230 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20 74 68  cksum that is th
1a240 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69 6e 64  e XOR of the ind
1a250 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68 65 63  ex entry.** chec
1a260 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72  ksum of all entr
1a270 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20 62  ies that would b
1a280 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
1a290 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69 66 69  he token specifi
1a2a0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 69 6e  ed.** by the fin
1a2b0 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73 2e 0a  al 5 arguments..
1a2c0 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74  */.u64 sqlite3Ft
1a2d0 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a 20 20  s5IndexCksum(.  
1a2e0 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1a2f0 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  fig,            
1a300 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
1a310 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34   object */.  i64
1a320 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a340 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20 61 70  Document term ap
1a350 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e  pears in */.  in
1a360 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a380 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61 70 70   Column term app
1a390 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  ears in */.  int
1a3a0 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a3c0 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20 61 70  Position term ap
1a3d0 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 63 6f  pears in */.  co
1a3e0 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c  nst char *pTerm,
1a3f0 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 2f 2a   int nTerm    /*
1a400 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20 2a 2f   Term at iPos */
1a410 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20 3d 20  .){.  u64 ret = 
1a420 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1a430 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1a440 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
1a450 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1a460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1a470 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
1a480 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 0a  ugh indexes */..
1a490 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49    for(iIdx=0; iI
1a4a0 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
1a4b0 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
1a4c0 20 20 20 69 6e 74 20 6e 20 3d 20 28 28 69 49 64     int n = ((iId
1a4d0 78 3d 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x==pConfig->nPre
1a4e0 66 69 78 29 20 3f 20 6e 54 65 72 6d 20 3a 20 70  fix) ? nTerm : p
1a4f0 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
1a500 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20  iIdx]);.    if( 
1a510 6e 3c 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  n<=nTerm ){.    
1a520 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64    ret ^= fts5Ind
1a530 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
1a540 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
1a550 20 70 54 65 72 6d 2c 20 6e 29 3b 0a 20 20 20 20   pTerm, n);.    
1a560 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1a570 72 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ret;.}..static v
1a580 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65  oid fts5BtreeIte
1a590 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
1a5a0 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 49  ex *p, .  int iI
1a5b0 64 78 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  dx,.  Fts5Struct
1a5c0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
1a5d0 2c 20 0a 20 20 46 74 73 35 42 74 72 65 65 49 74  , .  Fts5BtreeIt
1a5e0 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69  er *pIter.){.  i
1a5f0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
1a600 69 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  i;.  nByte = siz
1a610 65 6f 66 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  eof(pIter->aLvl[
1a620 30 5d 29 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65  0]) * (pSeg->nHe
1a630 69 67 68 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65  ight-1);.  memse
1a640 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
1a650 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
1a660 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65  Iter->nLvl = pSe
1a670 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 0a 20 20  g->nHeight-1;.  
1a680 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49  pIter->iIdx = iI
1a690 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d  dx;.  pIter->p =
1a6a0 20 70 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65   p;.  pIter->pSe
1a6b0 67 20 3d 20 70 53 65 67 3b 0a 20 20 69 66 28 20  g = pSeg;.  if( 
1a6c0 6e 42 79 74 65 20 26 26 20 70 2d 3e 72 63 3d 3d  nByte && p->rc==
1a6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a6e0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 20 3d 20 28   pIter->aLvl = (
1a6f0 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
1a700 65 6c 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  el*)fts5IdxMallo
1a710 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  c(p, nByte);.  }
1a720 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
1a730 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1a740 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
1a750 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  ++){.    i64 iRo
1a760 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
1a770 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70  NT_ROWID(iIdx, p
1a780 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 2b 31  Seg->iSegid, i+1
1a790 2c 20 31 29 3b 0a 20 20 20 20 46 74 73 35 44 61  , 1);.    Fts5Da
1a7a0 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  ta *pData;.    p
1a7b0 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44  Iter->aLvl[i].pD
1a7c0 61 74 61 20 3d 20 70 44 61 74 61 20 3d 20 66 74  ata = pData = ft
1a7d0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
1a7e0 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70  owid);.    if( p
1a7f0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74  Data ){.      ft
1a800 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
1a810 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
1a820 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  n, &pIter->aLvl[
1a830 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  i].s);.    }.  }
1a840 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e  ..  if( pIter->n
1a850 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20  Lvl==0 || p->rc 
1a860 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45  ){.    pIter->bE
1a870 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 74 65  of = 1;.    pIte
1a880 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53 65 67 2d  r->iLeaf = pSeg-
1a890 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c  >pgnoLast;.  }el
1a8a0 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e  se{.    pIter->n
1a8b0 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61  Empty = pIter->a
1a8c0 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b  Lvl[0].s.nEmpty;
1a8d0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
1a8e0 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
1a8f0 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20  0].s.iChild;.   
1a900 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d   pIter->bDlidx =
1a910 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
1a920 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a  s.bDlidx;.  }.}.
1a930 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a940 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28 46  5BtreeIterNext(F
1a950 74 73 35 42 74 72 65 65 49 74 65 72 20 2a 70 49  ts5BtreeIter *pI
1a960 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  ter){.  Fts5Inde
1a970 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 3b  x *p = pIter->p;
1a980 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
1a990 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f 66  ert( pIter->bEof
1a9a0 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 61 4c  ==0 && pIter->aL
1a9b0 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61 20 29 3b  vl[0].s.aData );
1a9c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
1a9d0 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e  ter->nLvl && p->
1a9e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1a9f0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74 72  ++){.    Fts5Btr
1aa00 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76  eeIterLevel *pLv
1aa10 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
1aa20 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64  [i];.    fts5Nod
1aa30 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
1aa40 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20  , &pLvl->s);.   
1aa50 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e 61 44 61   if( pLvl->s.aDa
1aa60 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ta ){.      fts5
1aa70 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1aa80 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
1aa90 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20  pLvl->s.term.n, 
1aaa0 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b  pLvl->s.term.p);
1aab0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1aac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
1aad0 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
1aae0 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20  &pLvl->s);.     
1aaf0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1ab00 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
1ab10 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
1ab20 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1ab30 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e    if( i==pIter->
1ab40 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63 20 29 7b  nLvl || p->rc ){
1ab50 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
1ab60 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
1ab70 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
1ab80 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
1ab90 67 69 64 3b 0a 20 20 20 20 66 6f 72 28 69 2d 2d  gid;.    for(i--
1aba0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
1abb0 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74 65      Fts5BtreeIte
1abc0 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  rLevel *pLvl = &
1abd0 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  pIter->aLvl[i];.
1abe0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
1abf0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1ac00 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 49 64  ROWID(pIter->iId
1ac10 78 2c 69 53 65 67 69 64 2c 69 2b 31 2c 70 4c 76  x,iSegid,i+1,pLv
1ac20 6c 5b 31 5d 2e 73 2e 69 43 68 69 6c 64 29 3b 0a  l[1].s.iChild);.
1ac30 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
1ac40 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
1ac50 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  (p, iRowid);.   
1ac60 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61     if( pLvl->pDa
1ac70 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ta ){.        ft
1ac80 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
1ac90 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 2c 20 70  Lvl->pData->p, p
1aca0 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 6e 2c 20 26  Lvl->pData->n, &
1acb0 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20  pLvl->s);.      
1acc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
1acd0 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70  Iter->nEmpty = p
1ace0 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
1acf0 6e 45 6d 70 74 79 3b 0a 20 20 70 49 74 65 72 2d  nEmpty;.  pIter-
1ad00 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
1ad10 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64  >aLvl[0].s.bDlid
1ad20 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  x;.  pIter->iLea
1ad30 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
1ad40 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 61  0].s.iChild;.  a
1ad50 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1ad60 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
1ad70 2d 3e 62 45 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61  ->bEof );.}..sta
1ad80 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72  tic void fts5Btr
1ad90 65 65 49 74 65 72 46 72 65 65 28 46 74 73 35 42  eeIterFree(Fts5B
1ada0 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29  treeIter *pIter)
1adb0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1adc0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
1add0 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Lvl; i++){.    F
1ade0 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
1adf0 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
1ae00 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66  ->aLvl[i];.    f
1ae10 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
1ae20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69  &pLvl->s);.    i
1ae30 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
1ae40 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
1ae50 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44  Release(pLvl->pD
1ae60 61 74 61 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  ata);.      pLvl
1ae70 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->pData = 0;.   
1ae80 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1ae90 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 4c 76  _free(pIter->aLv
1aea0 6c 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  l);.  fts5Buffer
1aeb0 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72  Free(&pIter->ter
1aec0 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  m);.}../*.** Thi
1aed0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75  s function is pu
1aee0 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
1aef0 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
1af00 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
1af10 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
1af20 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
1af30 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
1af40 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
1af50 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  .**.** Instead, 
1af60 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74 68  it tests that th
1af70 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67  e same set of pg
1af80 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61  no/rowid combina
1af90 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69  tions are .** vi
1afa0 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73 73  sited regardless
1afb0 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
1afc0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64  doclist-index id
1afd0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
1afe0 6d 65 74 65 72 73 0a 2a 2a 20 69 49 64 78 2f 69  meters.** iIdx/i
1aff0 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73 20 69  Segid/iLeaf is i
1b000 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72 77 61  terated in forwa
1b010 72 64 73 20 6f 72 20 72 65 76 65 72 73 65 20 6f  rds or reverse o
1b020 72 64 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rder..*/.#ifdef 
1b030 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
1b040 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
1b050 64 78 49 74 65 72 54 65 73 74 52 65 76 65 72 73  dxIterTestRevers
1b060 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
1b070 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20  p, .  int iIdx, 
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b090 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1b0a0 6f 20 6c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69  o load doclist-i
1b0b0 6e 64 65 78 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ndex from */.  i
1b0c0 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20  nt iSegid,      
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b0e0 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20  * Segment id to 
1b0f0 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  load from */.  i
1b100 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20 20 20  nt iLeaf        
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b120 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69  * Load doclist-i
1b130 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65  ndex for this le
1b140 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  af */.){.  Fts5D
1b150 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
1b160 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 6b 73 75   = 0;.  i64 cksu
1b170 6d 31 20 3d 20 31 33 3b 0a 20 20 69 36 34 20 63  m1 = 13;.  i64 c
1b180 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66  ksum2 = 13;..  f
1b190 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
1b1a0 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
1b1b0 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 2c 20   iSegid, iLeaf, 
1b1c0 26 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  &pDlidx);.      
1b1d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
1b1e0 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
1b1f0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
1b200 74 65 72 4e 65 78 74 28 70 44 6c 69 64 78 29 0a  terNext(pDlidx).
1b210 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
1b220 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67   pDlidx->iLeafPg
1b230 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  no>iLeaf );.    
1b240 63 6b 73 75 6d 31 20 3d 20 28 63 6b 73 75 6d 31  cksum1 = (cksum1
1b250 20 5e 20 28 20 28 69 36 34 29 28 70 44 6c 69 64   ^ ( (i64)(pDlid
1b260 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c  x->iLeafPgno) <<
1b270 20 33 32 20 29 29 3b 0a 20 20 20 20 63 6b 73 75   32 ));.    cksu
1b280 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 70  m1 = (cksum1 ^ p
1b290 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a  Dlidx->iRowid);.
1b2a0 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49    }.  fts5DlidxI
1b2b0 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
1b2c0 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a  .  pDlidx = 0;..
1b2d0 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49    for(fts5DlidxI
1b2e0 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 49  terInit(p, 1, iI
1b2f0 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61  dx, iSegid, iLea
1b300 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20  f, &pDlidx);.   
1b310 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1b320 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
1b330 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  0;.      fts5Dli
1b340 64 78 49 74 65 72 50 72 65 76 28 70 44 6c 69 64  dxIterPrev(pDlid
1b350 78 29 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  x).  ){.    asse
1b360 72 74 28 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61  rt( pDlidx->iLea
1b370 66 50 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20  fPgno>iLeaf );. 
1b380 20 20 20 63 6b 73 75 6d 32 20 3d 20 28 63 6b 73     cksum2 = (cks
1b390 75 6d 32 20 5e 20 28 20 28 69 36 34 29 28 70 44  um2 ^ ( (i64)(pD
1b3a0 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  lidx->iLeafPgno)
1b3b0 20 3c 3c 20 33 32 20 29 29 3b 0a 20 20 20 20 63   << 32 ));.    c
1b3c0 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20  ksum2 = (cksum2 
1b3d0 5e 20 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64  ^ pDlidx->iRowid
1b3e0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69  );.  }.  fts5Dli
1b3f0 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
1b400 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30  x);.  pDlidx = 0
1b410 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
1b420 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
1b430 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d  um1!=cksum2 ) p-
1b440 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1b450 50 54 3b 20 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  PT; .}.#else.# d
1b460 65 66 69 6e 65 20 66 74 73 35 44 6c 69 64 78 49  efine fts5DlidxI
1b470 74 65 72 54 65 73 74 52 65 76 65 72 73 65 28 77  terTestReverse(w
1b480 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
1b490 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1b4a0 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
1b4b0 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  eckSegment(.  Ft
1b4c0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b4e0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
1b4f0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ject */.  int iI
1b500 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
1b510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1b520 65 78 20 74 68 61 74 20 70 53 65 67 20 69 73 20  ex that pSeg is 
1b530 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46  a part of */.  F
1b540 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1b550 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f  ent *pSeg      /
1b560 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65  * Segment to che
1b570 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73  ck internal cons
1b580 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20  istency */.){.  
1b590 46 74 73 35 42 74 72 65 65 49 74 65 72 20 69 74  Fts5BtreeIter it
1b5a0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1b5b0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
1b5c0 74 65 20 74 68 72 6f 75 67 68 20 62 2d 74 72 65  te through b-tre
1b5d0 65 20 68 69 65 72 61 72 63 68 79 20 2a 2f 0a 0a  e hierarchy */..
1b5e0 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
1b5f0 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65 20  ough the b-tree 
1b600 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20  hierarchy.  */. 
1b610 20 66 6f 72 28 66 74 73 35 42 74 72 65 65 49 74   for(fts5BtreeIt
1b620 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20  erInit(p, iIdx, 
1b630 70 53 65 67 2c 20 26 69 74 65 72 29 3b 0a 20 20  pSeg, &iter);.  
1b640 20 20 20 20 69 74 65 72 2e 62 45 6f 66 3d 3d 30      iter.bEof==0
1b650 3b 0a 20 20 20 20 20 20 66 74 73 35 42 74 72 65  ;.      fts5Btre
1b660 65 49 74 65 72 4e 65 78 74 28 26 69 74 65 72 29  eIterNext(&iter)
1b670 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
1b680 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
1b690 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1b6a0 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
1b6b0 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
1b6c0 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
1b6d0 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
1b6e0 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20  this leaf */.   
1b6f0 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b710 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
1b720 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a  t term on leaf *
1b730 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b750 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
1b760 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65  terate through e
1b770 6d 70 74 79 20 6c 65 61 76 65 73 20 2a 2f 0a 0a  mpty leaves */..
1b780 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
1b790 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
1b7a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1b7b0 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
1b7c0 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
1b7d0 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
1b7e0 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
1b7f0 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
1b800 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
1b810 20 20 20 69 66 28 20 69 74 65 72 2e 69 4c 65 61     if( iter.iLea
1b820 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  f<pSeg->pgnoFirs
1b830 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1b840 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45    iRow = FTS5_SE
1b850 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
1b860 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
1b870 30 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a  0, iter.iLeaf);.
1b880 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
1b890 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
1b8a0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
1b8b0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
1b8c0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1b8d0 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e  the leaf contain
1b8e0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  s at least one t
1b8f0 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20 69 74  erm, and that it
1b900 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a   is equal.    **
1b910 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68   to or larger th
1b920 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  an the split-key
1b930 20 69 6e 20 69 74 65 72 2e 74 65 72 6d 2e 20 20   in iter.term.  
1b940 2a 2f 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74  */.    iOff = ft
1b950 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
1b960 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  >p[2]);.    if( 
1b970 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
1b980 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1b990 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
1b9a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  {.      int nTer
1b9b0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1b9c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1b9d0 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62  erm on leaf in b
1b9e0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ytes */.      in
1b9f0 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
1ba00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1ba10 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20  parison of term 
1ba20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f  and split-key */
1ba30 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
1ba40 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
1ba50 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
1ba60 6d 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  m);.      res = 
1ba70 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70  memcmp(&pLeaf->p
1ba80 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72  [iOff], iter.ter
1ba90 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20  m.p, MIN(nTerm, 
1baa0 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20  iter.term.n));. 
1bab0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1bac0 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
1bad0 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20  iter.term.n;.   
1bae0 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
1baf0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1bb00 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
1bb10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bb20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1bb30 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
1bb40 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
1bb50 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b      /* Now check
1bb60 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
1bb70 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
1bb80 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
1bb90 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28  nt leaf.    ** (
1bba0 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
1bbb0 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
1bbc0 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  s. */.    for(i=
1bbd0 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  1; p->rc==SQLITE
1bbe0 5f 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e  _OK && i<=iter.n
1bbf0 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  Empty; i++){.   
1bc00 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1bc10 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b  ataRead(p, iRow+
1bc20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  i);.      if( pL
1bc30 65 61 66 20 26 26 20 30 21 3d 66 74 73 35 47 65  eaf && 0!=fts5Ge
1bc40 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
1bc50 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ]) ){.        p-
1bc60 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1bc70 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1bc80 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1bc90 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  e(pLeaf);.    }.
1bca0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1bcb0 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
1bcc0 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20  dex, check that 
1bcd0 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20  it looks right. 
1bce0 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e  */.    if( iter.
1bcf0 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  bDlidx ){.      
1bd00 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
1bd10 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46  Dlidx = 0;  /* F
1bd20 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
1bd30 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64  ough doclist ind
1bd40 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
1bd50 69 50 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72  iPrevLeaf = iter
1bd60 2e 69 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e  .iLeaf;.      in
1bd70 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  t iSegid = pSeg-
1bd80 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69  >iSegid;.      i
1bd90 6e 74 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36  nt iPg;.      i6
1bda0 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66  4 iKey;..      f
1bdb0 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
1bdc0 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
1bdd0 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c   iSegid, iter.iL
1bde0 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20  eaf, &pDlidx);. 
1bdf0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
1be00 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
1be10 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
1be20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1be30 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 20  Next(pDlidx).   
1be40 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f     ){..        /
1be50 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69  * Check any rowi
1be60 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  d-less pages tha
1be70 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
1be80 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1be90 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
1bea0 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b  iPg=iPrevLeaf+1;
1beb0 20 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65   iPg<pDlidx->iLe
1bec0 61 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a  afPgno; iPg++){.
1bed0 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d            iKey =
1bee0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1bef0 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1bf00 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20  , 0, iPg);.     
1bf10 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
1bf20 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65  5DataRead(p, iKe
1bf30 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1bf40 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
1bf50 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 47         if( fts5G
1bf60 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
1bf70 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  0])!=0 ) p->rc =
1bf80 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
1bf90 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44             fts5D
1bfa0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
1bfb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1bfc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bfd0 20 69 50 72 65 76 4c 65 61 66 20 3d 20 70 44 6c   iPrevLeaf = pDl
1bfe0 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  idx->iLeafPgno;.
1bff0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
1c000 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
1c010 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62  page indicated b
1c020 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  y the iterator r
1c030 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20  eally does.     
1c040 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68     ** contain th
1c050 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65  e rowid suggeste
1c060 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a  d by the same. *
1c070 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  /.        iKey =
1c080 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1c090 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1c0a0 2c 20 30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c 65  , 0, pDlidx->iLe
1c0b0 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  afPgno);.       
1c0c0 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1c0d0 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1c0e0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1c0f0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1c100 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
1c110 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
1c120 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
1c130 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
1c140 20 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69           getVari
1c150 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
1c160 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
1c170 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1c180 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 70     if( iRowid!=p
1c190 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 20  Dlidx->iRowid ) 
1c1a0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1c1b0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
1c1c0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1c1d0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
1c1e0 7d 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  }..      }..    
1c1f0 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
1c200 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65  eaf+1; iPg<=(ite
1c210 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e  r.iLeaf + iter.n
1c220 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a  Empty); iPg++){.
1c230 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
1c240 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1c250 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
1c260 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  0, iPg);.       
1c270 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1c280 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1c290 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1c2a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1c2b0 66 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70  f( fts5GetU16(&p
1c2c0 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29  Leaf->p[0])!=0 )
1c2d0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1c2e0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
1c2f0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1c300 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
1c310 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
1c320 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
1c330 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  ree(pDlidx);.   
1c340 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1c350 54 65 73 74 52 65 76 65 72 73 65 28 70 2c 20 69  TestReverse(p, i
1c360 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 74 65  Idx, iSegid, ite
1c370 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  r.iLeaf);.    }.
1c380 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1c390 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1c3a0 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d  ter.iLeaf!=pSeg-
1c3b0 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
1c3c0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1c3d0 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74  RRUPT;.  }..  ft
1c3e0 73 35 42 74 72 65 65 49 74 65 72 46 72 65 65 28  s5BtreeIterFree(
1c3f0 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &iter);.}../*.**
1c400 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68   Run internal ch
1c410 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ecks to ensure t
1c420 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65  hat the FTS inde
1c430 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61  x (a) is interna
1c440 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65  lly .** consiste
1c450 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  nt and (b) conta
1c460 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
1c470 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66  which the XOR of
1c480 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a   the checksums.*
1c490 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20  * as calculated 
1c4a0 62 79 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  by fts5IndexEntr
1c4b0 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75  yCksum() is cksu
1c4c0 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  m..**.** Return 
1c4d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
1c4e0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74  f any of the int
1c4f0 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69  ernal checks fai
1c500 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20  l, or if the.** 
1c510 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f  checksum does no
1c520 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20  t match. Return 
1c530 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
1c540 20 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74   checks pass wit
1c550 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f  hout.** error, o
1c560 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c  r some other SQL
1c570 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1c580 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  f another error 
1c590 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63  (e.g. OOM).** oc
1c5a0 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  curs..*/.int sql
1c5b0 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74  ite3Fts5IndexInt
1c5c0 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35  egrityCheck(Fts5
1c5d0 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b  Index *p, u64 ck
1c5e0 73 75 6d 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  sum){.  Fts5Conf
1c5f0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
1c600 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74 20  >pConfig;.  int 
1c610 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
1c620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1c630 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1c640 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a  hrough indexes *
1c650 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1c660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c670 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1c680 64 65 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75  de */.  u64 cksu
1c690 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  m2 = 0;         
1c6a0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
1c6b0 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e  sum based on con
1c6c0 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73  tents of indexes
1c6d0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
1c6e0 74 68 61 74 20 74 68 65 20 63 68 65 63 6b 73 75  that the checksu
1c6f0 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6d  m of the index m
1c700 61 74 63 68 65 73 20 74 68 65 20 61 72 67 75 6d  atches the argum
1c710 65 6e 74 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  ent checksum */.
1c720 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49    for(iIdx=0; iI
1c730 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
1c740 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
1c750 20 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49     Fts5MultiSegI
1c760 74 65 72 20 2a 70 49 74 65 72 3b 0a 20 20 20 20  ter *pIter;.    
1c770 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1c780 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1c790 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69 49  uctureRead(p, iI
1c7a0 64 78 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  dx);.    for(fts
1c7b0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
1c7c0 20 70 53 74 72 75 63 74 2c 20 69 49 64 78 2c 20   pStruct, iIdx, 
1c7d0 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20  0, 0, 0, -1, 0, 
1c7e0 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20  &pIter);.       
1c7f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1c800 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a  f(p, pIter)==0;.
1c810 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
1c820 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
1c830 65 72 2c 20 30 2c 20 30 29 0a 20 20 20 20 29 7b  er, 0, 0).    ){
1c840 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 49 74  .      Fts5PosIt
1c850 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20 20  er sPos;        
1c860 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
1c870 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 6f  erate through po
1c880 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
1c890 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20       int n;     
1c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
1c8c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1c8d0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1c8e0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1c8f0 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  id(pIter);.     
1c900 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72   char *z = (char
1c910 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
1c920 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
1c930 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73 35 50  .      for(fts5P
1c940 6f 73 49 74 65 72 49 6e 69 74 28 70 2c 20 70 49  osIterInit(p, pI
1c950 74 65 72 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20  ter, &sPos);.   
1c960 20 20 20 20 20 20 20 66 74 73 35 50 6f 73 49 74         fts5PosIt
1c970 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73 29 3d  erEof(p, &sPos)=
1c980 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  =0;.          ft
1c990 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28 70 2c  s5PosIterNext(p,
1c9a0 20 26 73 50 6f 73 29 0a 20 20 20 20 20 20 29 7b   &sPos).      ){
1c9b0 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32 20  .        cksum2 
1c9c0 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  ^= fts5IndexEntr
1c9d0 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 73  yCksum(iRowid, s
1c9e0 50 6f 73 2e 69 43 6f 6c 2c 20 73 50 6f 73 2e 69  Pos.iCol, sPos.i
1c9f0 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a 23 69 66 20  Pos, z, n);.#if 
1ca00 30 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  0.        fprint
1ca10 66 28 73 74 64 6f 75 74 2c 20 22 72 6f 77 69 64  f(stdout, "rowid
1ca20 3d 25 64 20 22 2c 20 28 69 6e 74 29 69 52 6f 77  =%d ", (int)iRow
1ca30 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  id);.        fpr
1ca40 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 74 65  intf(stdout, "te
1ca50 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e 2c 20 7a 29  rm=%.*s ", n, z)
1ca60 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
1ca70 66 28 73 74 64 6f 75 74 2c 20 22 63 6f 6c 3d 25  f(stdout, "col=%
1ca80 64 20 22 2c 20 73 50 6f 73 2e 69 43 6f 6c 29 3b  d ", sPos.iCol);
1ca90 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1caa0 28 73 74 64 6f 75 74 2c 20 22 6f 66 66 3d 25 64  (stdout, "off=%d
1cab0 5c 6e 22 2c 20 73 50 6f 73 2e 69 50 6f 73 29 3b  \n", sPos.iPos);
1cac0 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28  .        fflush(
1cad0 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a  stdout);.#endif.
1cae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1caf0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
1cb00 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ree(p, pIter);. 
1cb10 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1cb20 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
1cb30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 2d 3e  ;.  }.  rc = p->
1cb40 72 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  rc;.  if( rc==SQ
1cb50 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d  LITE_OK && cksum
1cb60 21 3d 63 6b 73 75 6d 32 20 29 20 72 63 20 3d 20  !=cksum2 ) rc = 
1cb70 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
1cb80 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
1cb90 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  he internal node
1cba0 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d 65 6e  s of each segmen
1cbb0 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65 61 76  t match the leav
1cbc0 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 49 64 78  es */.  for(iIdx
1cbd0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
1cbe0 4b 20 26 26 20 69 49 64 78 3c 3d 70 43 6f 6e 66  K && iIdx<=pConf
1cbf0 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64  ig->nPrefix; iId
1cc00 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74  x++){.    Fts5St
1cc10 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
1cc20 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
1cc30 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20  Read(p, iIdx);. 
1cc40 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
1cc50 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
1cc60 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 66 6f  , iSeg;.      fo
1cc70 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1cc80 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1cc90 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1cca0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
1ccb0 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
1ccc0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
1ccd0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
1cce0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
1ccf0 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
1cd00 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1cd10 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl].aSeg[iSeg];
1cd20 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 49  .          fts5I
1cd30 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
1cd40 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 69 49 64  ckSegment(p, iId
1cd50 78 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  x, pSeg);.      
1cd60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cd70 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
1cd80 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
1cd90 63 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 2d  ct);.    rc = p-
1cda0 3e 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  >rc;.  }..  retu
1cdb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2f 0a  rn rc;.}../*.*/.
1cdc0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1cdd0 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
1cde0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
1ce10 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
1ce20 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
1ce30 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f    const u8 *pBlo
1ce40 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a  b, int nBlob.){.
1ce50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1ce80 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1ce90 75 72 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  ure *p = 0;     
1cea0 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 64        /* Decoded
1ceb0 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
1cec0 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  t */..  rc = fts
1ced0 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
1cee0 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 26  (pBlob, nBlob, &
1cef0 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  p);.  if( rc!=SQ
1cf00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
1cf10 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRc = rc;.    re
1cf20 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  turn;.  }..  fts
1cf30 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
1cf40 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20  pRc, pBuf, p);. 
1cf50 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1cf60 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  lease(p);.}../*.
1cf70 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20  ** Buffer (a/n) 
1cf80 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
1cf90 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  ntain a list of 
1cfa0 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e  serialized varin
1cfb0 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68  ts. Read.** each
1cfc0 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65   varint and appe
1cfd0 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72 65  nd its string re
1cfe0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20  presentation to 
1cff0 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65 74  buffer pBuf. Ret
1d000 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74  urn.** after eit
1d010 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62 75  her the input bu
1d020 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74 65  ffer is exhauste
1d030 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69  d or a 0 value i
1d040 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
1d050 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1d060 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d070 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  bytes read from 
1d080 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
1d090 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d0a0 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
1d0b0 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
1d0c0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f  Buffer *pBuf, co
1d0d0 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e  nst u8 *a, int n
1d0e0 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
1d0f0 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66  0;.  while( iOff
1d100 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56  <n ){.    int iV
1d110 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  al;.    iOff += 
1d120 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  getVarint32(&a[i
1d130 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  Off], iVal);.   
1d140 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d150 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
1d160 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c  Rc, pBuf, " %d",
1d170 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
1d180 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
1d190 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66  .** The start of
1d1a0 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f   buffer (a/n) co
1d1b0 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74  ntains the start
1d1c0 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   of a doclist. T
1d1d0 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61  he doclist.** ma
1d1e0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e  y or may not fin
1d1f0 69 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62  ish within the b
1d200 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
1d210 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74  tion appends a t
1d220 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74  ext.** represent
1d230 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
1d240 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  t of the doclist
1d250 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
1d260 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   to buffer.** pB
1d270 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  uf. .**.** The r
1d280 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1d290 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1d2a0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
1d2b0 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
1d2c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1d2d0 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69  5DecodeDoclist(i
1d2e0 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
1d2f0 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
1d300 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
1d310 20 20 69 36 34 20 69 44 6f 63 69 64 3b 0a 20 20    i64 iDocid;.  
1d320 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
1d330 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20   if( iOff<n ){. 
1d340 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
1d350 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  e3GetVarint(&a[i
1d360 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 6f  Off], (u64*)&iDo
1d370 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  cid);.    sqlite
1d380 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1d390 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
1d3a0 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22  f, " rowid=%lld"
1d3b0 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20  , iDocid);.  }. 
1d3c0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
1d3d0 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  {.    int nPos;.
1d3e0 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56      iOff += getV
1d3f0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
1d400 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 69 4f 66  , nPos);.    iOf
1d410 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50  f += fts5DecodeP
1d420 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66  oslist(pRc, pBuf
1d430 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28  , &a[iOff], MIN(
1d440 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a  n-iOff, nPos));.
1d450 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
1d460 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  {.      i64 iDel
1d470 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ta;.      iOff +
1d480 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  = sqlite3GetVari
1d490 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
1d4a0 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
1d4b0 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
1d4c0 20 29 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a   ) return iOff;.
1d4d0 20 20 20 20 20 20 69 44 6f 63 69 64 20 2d 3d 20        iDocid -= 
1d4e0 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71  iDelta;.      sq
1d4f0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1d500 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
1d510 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64 3d 25   pBuf, " rowid=%
1d520 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20  lld", iDocid);. 
1d530 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1d540 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iOff;.}../*.*
1d550 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
1d560 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
1d570 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
1d580 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65  tion fts5_decode
1d590 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
1d5a0 69 64 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e  id fts5DecodeFun
1d5b0 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
1d5c0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
1d5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
1d5e0 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78  tion call contex
1d5f0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
1d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d610 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d620 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73   of args (always
1d630 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   2) */.  sqlite3
1d640 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
1d650 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
1d660 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
1d670 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69  /.){.  i64 iRowi
1d680 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1d690 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
1d6a0 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67  for record being
1d6b0 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e   decoded */.  in
1d6c0 74 20 69 49 64 78 2c 69 53 65 67 69 64 2c 69 48  t iIdx,iSegid,iH
1d6d0 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f 2a  eight,iPgno;  /*
1d6e0 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74   Rowid component
1d6f0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  s */.  const u8 
1d700 2a 61 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  *a; int n;      
1d710 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64         /* Record
1d720 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20   to decode */.  
1d730 46 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20  Fts5Buffer s;   
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74  /* Build up text
1d760 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20   to return here 
1d770 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1d780 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1d790 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1d7a0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
1d7b0 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d  ( nArg==2 );.  m
1d7c0 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
1d7d0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1d7e0 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  ;.  iRowid = sql
1d7f0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
1d800 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e 20  (apVal[0]);.  n 
1d810 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1d820 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b  bytes(apVal[1]);
1d830 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  a = sqlite3_v
1d840 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b  alue_blob(apVal[
1d850 31 5d 29 3b 0a 20 20 66 74 73 35 44 65 63 6f 64  1]);.  fts5Decod
1d860 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26  eRowid(iRowid, &
1d870 69 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20 26  iIdx, &iSegid, &
1d880 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
1d890 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f  ;..  fts5DebugRo
1d8a0 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f  wid(&rc, &s, iRo
1d8b0 77 69 64 29 3b 0a 20 20 69 66 28 20 69 48 65 69  wid);.  if( iHei
1d8c0 67 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e  ght==FTS5_SEGMEN
1d8d0 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 29 7b 0a  T_MAX_HEIGHT ){.
1d8e0 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
1d8f0 20 20 20 69 36 34 20 69 50 72 65 76 3b 0a 20 20     i64 iPrev;.  
1d900 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1d910 20 20 20 69 20 3d 20 67 65 74 56 61 72 69 6e 74     i = getVarint
1d920 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69  (&a[i], (u64*)&i
1d930 50 72 65 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  Prev);.      sql
1d940 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1d950 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20  pendPrintf(&rc, 
1d960 26 73 2c 20 22 20 25 6c 6c 64 22 2c 20 69 50 72  &s, " %lld", iPr
1d970 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  ev);.    }.    w
1d980 68 69 6c 65 28 20 69 3c 6e 20 29 7b 0a 20 20 20  hile( i<n ){.   
1d990 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
1d9a0 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e     i += getVarin
1d9b0 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26  t(&a[i], (u64*)&
1d9c0 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  iVal);.      if(
1d9d0 20 69 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   iVal==0 ){.    
1d9e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1d9f0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
1da00 66 28 26 72 63 2c 20 26 73 2c 20 22 20 78 22 29  f(&rc, &s, " x")
1da10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1da20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d 20 69         iPrev = i
1da30 50 72 65 76 20 2d 20 69 56 61 6c 3b 0a 20 20 20  Prev - iVal;.   
1da40 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1da50 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
1da60 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 25 6c  tf(&rc, &s, " %l
1da70 6c 64 22 2c 20 69 50 72 65 76 29 3b 0a 20 20 20  ld", iPrev);.   
1da80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 7d 65     }.    }..  }e
1da90 6c 73 65 0a 20 20 69 66 28 20 69 53 65 67 69 64  lse.  if( iSegid
1daa0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ==0 ){.    if( i
1dab0 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52  Rowid==FTS5_AVER
1dac0 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20  AGES_ROWID ){.  
1dad0 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20      /* todo */. 
1dae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1daf0 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
1db00 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ure(&rc, &s, a, 
1db10 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
1db20 65 7b 0a 0a 20 20 20 20 46 74 73 35 42 75 66 66  e{..    Fts5Buff
1db30 65 72 20 74 65 72 6d 3b 0a 20 20 20 20 6d 65 6d  er term;.    mem
1db40 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
1db50 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
1db60 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 48 65 69  );..    if( iHei
1db70 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ght==0 ){.      
1db80 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30  int iTermOff = 0
1db90 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77  ;.      int iRow
1dba0 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  idOff = 0;.     
1dbb0 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20   int iOff;.     
1dbc0 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a   int nKeep = 0;.
1dbd0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66  .      iRowidOff
1dbe0 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
1dbf0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 54 65 72  [0]);.      iTer
1dc00 6d 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  mOff = fts5GetU1
1dc10 36 28 26 61 5b 32 5d 29 3b 0a 0a 20 20 20 20 20  6(&a[2]);..     
1dc20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
1dc30 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  {.        iOff =
1dc40 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
1dc50 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72    }else if( iTer
1dc60 6d 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  mOff ){.        
1dc70 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
1dc80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1dc90 20 20 20 20 20 20 69 4f 66 66 20 3d 20 6e 3b 0a        iOff = n;.
1dca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1dcb0 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
1dcc0 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20  &rc, &s, &a[4], 
1dcd0 69 4f 66 66 2d 34 29 3b 0a 0a 0a 20 20 20 20 20  iOff-4);...     
1dce0 20 61 73 73 65 72 74 28 20 69 52 6f 77 69 64 4f   assert( iRowidO
1dcf0 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69  ff==0 || iOff==i
1dd00 52 6f 77 69 64 4f 66 66 20 29 3b 0a 20 20 20 20  RowidOff );.    
1dd10 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20    if( iRowidOff 
1dd20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
1dd30 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  += fts5DecodeDoc
1dd40 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
1dd50 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b  [iOff], n-iOff);
1dd60 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1dd70 61 73 73 65 72 74 28 20 69 54 65 72 6d 4f 66 66  assert( iTermOff
1dd80 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 54 65  ==0 || iOff==iTe
1dd90 72 6d 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 77  rmOff );.      w
1dda0 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a  hile( iOff<n ){.
1ddb0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
1ddc0 65 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e;.        iOff 
1ddd0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
1dde0 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  a[iOff], nByte);
1ddf0 0a 20 20 20 20 20 20 20 20 74 65 72 6d 2e 6e 3d  .        term.n=
1de00 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20   nKeep;.        
1de10 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1de20 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c  Blob(&rc, &term,
1de30 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d   nByte, &a[iOff]
1de40 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  );.        iOff 
1de50 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20  += nByte;..     
1de60 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1de70 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
1de80 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 72  (.            &r
1de90 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d 25 2e  c, &s, " term=%.
1dea0 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28 63 6f  *s", term.n, (co
1deb0 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d 2e 70  nst char*)term.p
1dec0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1ded0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
1dee0 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72  DecodeDoclist(&r
1def0 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
1df00 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20 20 20   n-iOff);.      
1df10 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
1df20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
1df30 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
1df40 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
1df50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1df60 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  }.      fts5Buff
1df70 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
1df80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1df90 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b  Fts5NodeIter ss;
1dfa0 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73 35 4e  .      for(fts5N
1dfb0 6f 64 65 49 74 65 72 49 6e 69 74 28 61 2c 20 6e  odeIterInit(a, n
1dfc0 2c 20 26 73 73 29 3b 20 73 73 2e 61 44 61 74 61  , &ss); ss.aData
1dfd0 3b 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65  ; fts5NodeIterNe
1dfe0 78 74 28 26 72 63 2c 20 26 73 73 29 29 7b 0a 20  xt(&rc, &ss)){. 
1dff0 20 20 20 20 20 20 20 69 66 28 20 73 73 2e 74 65         if( ss.te
1e000 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rm.n==0 ){.     
1e010 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1e020 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
1e030 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 6c 65  tf(&rc, &s, " le
1e040 66 74 3d 25 64 22 2c 20 73 73 2e 69 43 68 69 6c  ft=%d", ss.iChil
1e050 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  d);.        }els
1e060 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
1e070 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1e080 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 26  pendPrintf(&rc,&
1e090 73 2c 20 22 20 5c 22 25 2e 2a 73 5c 22 22 2c 20  s, " \"%.*s\"", 
1e0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1e0b0 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74 65 72  s.term.n, ss.ter
1e0c0 6d 2e 70 0a 20 20 20 20 20 20 20 20 20 20 29 3b  m.p.          );
1e0d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e0e0 20 20 20 69 66 28 20 73 73 2e 6e 45 6d 70 74 79     if( ss.nEmpty
1e0f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
1e100 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1e110 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
1e120 20 26 73 2c 20 22 20 65 6d 70 74 79 3d 25 64 25   &s, " empty=%d%
1e130 73 22 2c 20 73 73 2e 6e 45 6d 70 74 79 2c 0a 20  s", ss.nEmpty,. 
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 73 73 2e               ss.
1e150 62 44 6c 69 64 78 20 3f 20 22 2a 22 20 3a 20 22  bDlidx ? "*" : "
1e160 22 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ".          );. 
1e170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e180 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65 49  .      fts5NodeI
1e190 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a 20 20  terFree(&ss);.  
1e1a0 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
1e1b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e1c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
1e1d0 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
1e1e0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70  (const char*)s.p
1e1f0 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52  , s.n, SQLITE_TR
1e200 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
1e210 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  e{.    sqlite3_r
1e220 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
1e230 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a  (pCtx, rc);.  }.
1e240 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
1e250 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  (&s);.}../*.** T
1e260 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73  his is called as
1e270 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74 65   part of registe
1e280 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f  ring the FTS5 mo
1e290 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61  dule with databa
1e2a0 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
1e2b0 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65 72   db. It register
1e2c0 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64  s several user-d
1e2d0 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
1e2e0 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a  nctions useful.*
1e2f0 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a  * with FTS5..**.
1e300 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1e310 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
1e320 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
1e330 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d  rror occurs, som
1e340 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74  e other.** SQLit
1e350 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
1e360 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
1e370 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e380 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71  Fts5IndexInit(sq
1e390 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
1e3a0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  t rc = sqlite3_c
1e3b0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
1e3c0 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
1e3d0 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49  decode", 2, SQLI
1e3e0 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
1e3f0 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20  DecodeFunction, 
1e400 30 2c 20 30 0a 20 20 29 3b 0a 20 20 72 65 74 75  0, 0.  );.  retu
1e410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e420 53 65 74 20 74 68 65 20 74 61 72 67 65 74 20 70  Set the target p
1e430 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74 68 65  age size for the
1e440 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a   index object..*
1e450 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
1e460 73 35 49 6e 64 65 78 50 67 73 7a 28 46 74 73 35  s5IndexPgsz(Fts5
1e470 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 70 67  Index *p, int pg
1e480 73 7a 29 7b 0a 20 20 70 2d 3e 70 67 73 7a 20 3d  sz){.  p->pgsz =
1e490 20 70 67 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pgsz;.}../*.** 
1e4a0 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20  Iterator pMulti 
1e4b0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1e4c0 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1e4d0 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69  y (not EOF). Thi
1e4e0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
1e4f0 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66 20  pends a copy of 
1e500 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
1e510 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 70  t of the entry p
1e520 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65 6e  Multi .** curren
1e530 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f  tly points to to
1e540 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
1e550 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1e560 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1e570 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
1e580 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61 73   p->rc. It is as
1e590 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f  sumed.** no erro
1e5a0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
1e5b0 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
1e5c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e5d0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  led..*/.static v
1e5e0 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
1e5f0 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
1e600 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
1e610 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d  MultiSegIter *pM
1e620 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a 2c  ulti,.  int bSz,
1e630 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1e640 42 75 66 0a 29 7b 0a 20 20 46 74 73 35 43 68 75  Buf.){.  Fts5Chu
1e650 6e 6b 49 74 65 72 20 69 74 65 72 3b 0a 20 20 46  nkIter iter;.  F
1e660 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1e670 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67   = &pMulti->aSeg
1e680 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74  [ pMulti->aFirst
1e690 5b 31 5d 20 5d 3b 0a 20 20 61 73 73 65 72 74 28  [1] ];.  assert(
1e6a0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1e6b0 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20  f(p, pMulti)==0 
1e6c0 29 3b 0a 20 20 66 74 73 35 43 68 75 6e 6b 49 74  );.  fts5ChunkIt
1e6d0 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20  erInit(p, pSeg, 
1e6e0 26 69 74 65 72 29 3b 0a 20 20 69 66 28 20 66 74  &iter);.  if( ft
1e6f0 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70  s5ChunkIterEof(p
1e700 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20  , &iter)==0 ){. 
1e710 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20     if( bSz ){.  
1e720 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1e730 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1e740 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e 52  c, pBuf, iter.nR
1e750 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  em);.    }.    w
1e760 68 69 6c 65 28 20 66 74 73 35 43 68 75 6e 6b 49  hile( fts5ChunkI
1e770 74 65 72 45 6f 66 28 70 2c 20 26 69 74 65 72 29  terEof(p, &iter)
1e780 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
1e790 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1e7a0 62 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  b(&p->rc, pBuf, 
1e7b0 69 74 65 72 2e 6e 2c 20 69 74 65 72 2e 70 29 3b  iter.n, iter.p);
1e7c0 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b  .      fts5Chunk
1e7d0 49 74 65 72 4e 65 78 74 28 70 2c 20 26 69 74 65  IterNext(p, &ite
1e7e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1e7f0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c  fts5ChunkIterRel
1e800 65 61 73 65 28 26 69 74 65 72 29 3b 0a 7d 0a 0a  ease(&iter);.}..
1e810 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1e820 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
1e830 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
1e840 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
1e850 49 74 65 72 2d 3e 69 3c 70 49 74 65 72 2d 3e 6e  Iter->i<pIter->n
1e860 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65   ){.    if( pIte
1e870 72 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 36  r->i ){.      i6
1e880 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  4 iDelta;.      
1e890 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56  pIter->i += getV
1e8a0 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b  arint(&pIter->a[
1e8b0 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a  pIter->i], (u64*
1e8c0 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
1e8d0 20 69 66 28 20 70 49 74 65 72 2d 3e 62 41 73 63   if( pIter->bAsc
1e8e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65   ){.        pIte
1e8f0 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
1e900 6c 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lta;.      }else
1e910 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
1e920 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74  >iRowid -= iDelt
1e930 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
1e940 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1e950 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72 69 6e  r->i += getVarin
1e960 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  t(&pIter->a[pIte
1e970 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70 49  r->i], (u64*)&pI
1e980 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
1e990 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69    }.    pIter->i
1e9a0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1e9b0 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d  &pIter->a[pIter-
1e9c0 3e 69 5d 2c 20 70 49 74 65 72 2d 3e 6e 50 6f 73  >i], pIter->nPos
1e9d0 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72  list);.    pIter
1e9e0 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26 70 49  ->aPoslist = &pI
1e9f0 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d  ter->a[pIter->i]
1ea00 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b  ;.    pIter->i +
1ea10 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73  = pIter->nPoslis
1ea20 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
1ea30 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
1ea40 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 0;.  }.}..stat
1ea50 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
1ea60 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46  istIterInit(.  F
1ea70 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
1ea80 20 0a 20 20 69 6e 74 20 62 41 73 63 2c 20 0a 20   .  int bAsc, . 
1ea90 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
1eaa0 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d   *pIter.){.  mem
1eab0 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
1eac0 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
1ead0 20 70 49 74 65 72 2d 3e 61 20 3d 20 70 42 75 66   pIter->a = pBuf
1eae0 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20  ->p;.  pIter->n 
1eaf0 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 70 49 74  = pBuf->n;.  pIt
1eb00 65 72 2d 3e 62 41 73 63 20 3d 20 62 41 73 63 3b  er->bAsc = bAsc;
1eb10 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  .  fts5DoclistIt
1eb20 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 7d  erNext(pIter);.}
1eb30 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1eb40 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66   doclist to buff
1eb50 65 72 20 70 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er pBuf..*/.stat
1eb60 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
1eb70 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20  eAppendDocid(.  
1eb80 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20  int *pRc,       
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f 72  /* IN/OUT: Error
1ebb0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 62   code */.  int b
1ebc0 41 73 63 2c 0a 20 20 46 74 73 35 42 75 66 66 65  Asc,.  Fts5Buffe
1ebd0 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
1ebe0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1ebf0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1ec00 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77    i64 *piLastRow
1ec10 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
1ec20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65    /* IN/OUT: Pre
1ec30 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74  vious rowid writ
1ec40 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ten (if any) */.
1ec50 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20    i64 iRowid    
1ec60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec70 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70    /* Rowid to ap
1ec80 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  pend */.){.  if(
1ec90 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20   pBuf->n==0 ){. 
1eca0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1ecb0 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70  endVarint(pRc, p
1ecc0 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Buf, iRowid);.  
1ecd0 7d 65 6c 73 65 20 69 66 28 20 62 41 73 63 3d 3d  }else if( bAsc==
1ece0 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  0 ){.    fts5Buf
1ecf0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1ed00 70 52 63 2c 20 70 42 75 66 2c 20 2a 70 69 4c 61  pRc, pBuf, *piLa
1ed10 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77 69 64  stRowid - iRowid
1ed20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ed30 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1ed40 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66  Varint(pRc, pBuf
1ed50 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61  , iRowid - *piLa
1ed60 73 74 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20  stRowid);.  }.  
1ed70 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69  *piLastRowid = i
1ed80 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1ed90 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20 70  Buffers p1 and p
1eda0 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73  2 contain doclis
1edb0 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
1edc0 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e  n merges the con
1edd0 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74  tent.** of the t
1ede0 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65  wo doclists toge
1edf0 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62 75  ther and sets bu
1ee00 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20 72  ffer p1 to the r
1ee10 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20  esult before.** 
1ee20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1ee30 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1ee40 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
1ee50 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d  de is left in p-
1ee60 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  >rc. If an error
1ee70 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
1ee80 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
1ee90 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1eea0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1eeb0 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65 66  id fts5MergePref
1eec0 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49  ixLists(.  Fts5I
1eed0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1eee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1eef0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1ef00 74 20 2a 2f 0a 20 20 69 6e 74 20 62 41 73 63 2c  t */.  int bAsc,
1ef10 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1ef20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
1ef30 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74     /* First list
1ef40 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46   to merge */.  F
1ef50 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20  ts5Buffer *p2   
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ef70 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f  * Second list to
1ef80 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
1ef90 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20  f( p2->n ){.    
1efa0 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d  i64 iLastRowid =
1efb0 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c   0;.    Fts5Docl
1efc0 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20  istIter i1;.    
1efd0 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
1efe0 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  i2;.    Fts5Buff
1eff0 65 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73 35  er out;.    Fts5
1f000 42 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20 20  Buffer tmp;.    
1f010 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20  memset(&out, 0, 
1f020 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20  sizeof(out));.  
1f030 20 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20 30    memset(&tmp, 0
1f040 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a  , sizeof(tmp));.
1f050 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74  .    fts5Doclist
1f060 49 74 65 72 49 6e 69 74 28 70 31 2c 20 62 41 73  IterInit(p1, bAs
1f070 63 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73  c, &i1);.    fts
1f080 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
1f090 28 70 32 2c 20 62 41 73 63 2c 20 26 69 32 29 3b  (p2, bAsc, &i2);
1f0a0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 31 2e 61  .    while( i1.a
1f0b0 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32  Poslist!=0 || i2
1f0c0 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 29 7b 0a  .aPoslist!=0 ){.
1f0d0 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f        if( i2.aPo
1f0e0 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e  slist==0 || (i1.
1f0f0 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20 20 20  aPoslist && .   
1f100 20 20 20 20 20 20 20 20 28 20 28 21 62 41 73 63          ( (!bAsc
1f110 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e 69 32   && i1.iRowid>i2
1f120 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 62 41 73  .iRowid) || (bAs
1f130 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69  c && i1.iRowid<i
1f140 32 2e 69 52 6f 77 69 64 29 20 29 0a 20 20 20 20  2.iRowid) ).    
1f150 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a    )){.        /*
1f160 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
1f170 20 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i1 */.        f
1f180 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
1f190 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 41 73 63  cid(&p->rc, bAsc
1f1a0 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f  , &out, &iLastRo
1f1b0 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
1f1c0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f1d0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1f1e0 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31  &p->rc, &out, i1
1f1f0 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .nPoslist);.    
1f200 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f210 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1f220 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69   &out, i1.nPosli
1f230 73 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 29  st, i1.aPoslist)
1f240 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
1f250 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
1f260 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1f270 20 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61 50    else if( i1.aP
1f280 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e  oslist==0 || i2.
1f290 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69  iRowid!=i1.iRowi
1f2a0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
1f2b0 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
1f2c0 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i2 */.        ft
1f2d0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
1f2e0 69 64 28 26 70 2d 3e 72 63 2c 20 62 41 73 63 2c  id(&p->rc, bAsc,
1f2f0 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77   &out, &iLastRow
1f300 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a  id, i2.iRowid);.
1f310 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f320 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1f330 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e  p->rc, &out, i2.
1f340 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  nPoslist);.     
1f350 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f360 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1f370 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  &out, i2.nPoslis
1f380 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b  t, i2.aPoslist);
1f390 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
1f3a0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32  listIterNext(&i2
1f3b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f3c0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 46   else{.        F
1f3d0 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
1f3e0 20 72 31 3b 0a 20 20 20 20 20 20 20 20 46 74 73   r1;.        Fts
1f3f0 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72  5PoslistReader r
1f400 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50  2;.        Fts5P
1f410 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69  oslistWriter wri
1f420 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65  ter;..        me
1f430 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
1f440 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29   sizeof(writer))
1f450 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65  ;..        /* Me
1f460 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69  rge the two posi
1f470 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a  tion lists. */ .
1f480 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
1f490 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d  eAppendDocid(&p-
1f4a0 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f 75 74 2c  >rc, bAsc, &out,
1f4b0 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32   &iLastRowid, i2
1f4c0 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
1f4d0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
1f4e0 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20  (&tmp);.        
1f4f0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1f500 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31 2c  stReaderInit(-1,
1f510 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31   i1.aPoslist, i1
1f520 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 72 31 29 3b  .nPoslist, &r1);
1f530 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f540 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1f550 72 49 6e 69 74 28 2d 31 2c 20 69 32 2e 61 50 6f  rInit(-1, i2.aPo
1f560 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69  slist, i2.nPosli
1f570 73 74 2c 20 26 72 32 29 3b 0a 20 20 20 20 20 20  st, &r2);.      
1f580 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1f590 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 72 31  SQLITE_OK && (r1
1f5a0 2e 62 45 6f 66 3d 3d 30 20 7c 7c 20 72 32 2e 62  .bEof==0 || r2.b
1f5b0 45 6f 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Eof==0) ){.     
1f5c0 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a 20       i64 iNew;. 
1f5d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 32 2e           if( r2.
1f5e0 62 45 6f 66 20 7c 7c 20 28 72 31 2e 62 45 6f 66  bEof || (r1.bEof
1f5f0 3d 3d 30 20 26 26 20 72 31 2e 69 50 6f 73 3c 72  ==0 && r1.iPos<r
1f600 32 2e 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20  2.iPos) ){.     
1f610 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 72 31         iNew = r1
1f620 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20  .iPos;.         
1f630 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
1f640 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
1f650 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  &r1);.          
1f660 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f670 20 20 20 69 4e 65 77 20 3d 20 72 32 2e 69 50 6f     iNew = r2.iPo
1f680 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  s;.            s
1f690 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1f6a0 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 32 29  tReaderNext(&r2)
1f6b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1f6c0 28 20 72 31 2e 69 50 6f 73 3d 3d 72 32 2e 69 50  ( r1.iPos==r2.iP
1f6d0 6f 73 20 29 20 73 71 6c 69 74 65 33 46 74 73 35  os ) sqlite3Fts5
1f6e0 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
1f6f0 74 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20  t(&r1);.        
1f700 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
1f710 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
1f720 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41 70  5PoslistWriterAp
1f730 70 65 6e 64 28 26 74 6d 70 2c 20 26 77 72 69 74  pend(&tmp, &writ
1f740 65 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20 20  er, iNew);.     
1f750 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74     }..        ft
1f760 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1f770 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75  rint(&p->rc, &ou
1f780 74 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20  t, tmp.n);.     
1f790 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1f7a0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1f7b0 26 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70  &out, tmp.n, tmp
1f7c0 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .p);.        fts
1f7d0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
1f7e0 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66  (&i1);.        f
1f7f0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
1f800 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d  xt(&i2);.      }
1f810 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
1f820 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
1f830 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74  , p1, out.n, out
1f840 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .p);.    fts5Buf
1f850 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20  ferFree(&tmp);. 
1f860 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
1f870 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(&out);.  }.}..
1f880 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1f890 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42  BufferSwap(Fts5B
1f8a0 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42  uffer *p1, Fts5B
1f8b0 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74  uffer *p2){.  Ft
1f8c0 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a  s5Buffer tmp = *
1f8d0 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b  p1;.  *p1 = *p2;
1f8e0 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a  .  *p2 = tmp;.}.
1f8f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1f900 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72  5SetupPrefixIter
1f910 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1f920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f930 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
1f940 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
1f950 6e 74 20 62 41 73 63 2c 20 20 20 20 20 20 20 20  nt bAsc,        
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f970 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45  * True for "ORDE
1f980 52 20 42 59 20 72 6f 77 69 64 20 41 53 43 22 20  R BY rowid ASC" 
1f990 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
1f9a0 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
1f9b0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
1f9c0 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69 78  ontaining prefix
1f9d0 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69   to match */.  i
1f9e0 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20  nt nToken,      
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fa00 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
1fa10 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73   pToken in bytes
1fa20 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
1fa30 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
1fa40 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
1fa50 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f  e this object */
1fa60 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
1fa70 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
1fa80 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66  Fts5Buffer *aBuf
1fa90 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42  ;.  const int nB
1faa0 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66  uf = 32;..  aBuf
1fab0 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29   = (Fts5Buffer*)
1fac0 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
1fad0 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
1fae0 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74  er)*nBuf);.  pSt
1faf0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
1fb00 74 75 72 65 52 65 61 64 28 70 2c 20 30 29 3b 0a  tureRead(p, 0);.
1fb10 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70  .  if( aBuf && p
1fb20 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 46 74  Struct ){.    Ft
1fb30 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70  s5DoclistIter *p
1fb40 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74  Doclist;.    int
1fb50 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73   i;.    i64 iLas
1fb60 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20  tRowid = 0;.    
1fb70 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
1fb80 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a   *p1 = 0;     /*
1fb90 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74   Iterator used t
1fba0 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66 72  o gather data fr
1fbb0 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  om index */.    
1fbc0 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69  Fts5Buffer docli
1fbd0 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28  st;..    memset(
1fbe0 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a  &doclist, 0, siz
1fbf0 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20  eof(doclist));. 
1fc00 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69     for(fts5Multi
1fc10 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75  IterNew(p, pStru
1fc20 63 74 2c 20 30 2c 20 31 2c 20 70 54 6f 6b 65 6e  ct, 0, 1, pToken
1fc30 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c  , nToken, -1, 0,
1fc40 20 26 70 31 29 3b 0a 20 20 20 20 20 20 20 20 66   &p1);.        f
1fc50 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
1fc60 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20  p, p1)==0;.     
1fc70 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1fc80 4e 65 78 74 28 70 2c 20 70 31 2c 20 30 2c 20 30  Next(p, p1, 0, 0
1fc90 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
1fca0 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
1fcb0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
1fcc0 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  1);.      int nT
1fcd0 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  erm;.      const
1fce0 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73   u8 *pTerm = fts
1fcf0 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
1fd00 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  1, &nTerm);.    
1fd10 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
1fd20 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
1fd30 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72  MIN(nToken, nTer
1fd40 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20  m))<=0 );.      
1fd50 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e  if( nTerm<nToken
1fd60 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65   || memcmp(pToke
1fd70 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e  n, pTerm, nToken
1fd80 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  ) ) break;..    
1fd90 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3e    if( doclist.n>
1fda0 30 20 0a 20 20 20 20 20 20 20 26 26 20 28 28 21  0 .       && ((!
1fdb0 62 41 73 63 20 26 26 20 69 52 6f 77 69 64 3e 3d  bAsc && iRowid>=
1fdc0 69 4c 61 73 74 52 6f 77 69 64 29 20 7c 7c 20 28  iLastRowid) || (
1fdd0 62 41 73 63 20 26 26 20 69 52 6f 77 69 64 3c 3d  bAsc && iRowid<=
1fde0 69 4c 61 73 74 52 6f 77 69 64 29 29 0a 20 20 20  iLastRowid)).   
1fdf0 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 66     ){..        f
1fe00 6f 72 28 69 3d 30 3b 20 64 6f 63 6c 69 73 74 2e  or(i=0; doclist.
1fe10 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  n && p->rc==SQLI
1fe20 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
1fe30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
1fe40 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20  <nBuf );.       
1fe50 20 20 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e     if( aBuf[i].n
1fe60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1fe70 20 20 20 66 74 73 35 42 75 66 66 65 72 53 77 61     fts5BufferSwa
1fe80 70 28 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75  p(&doclist, &aBu
1fe90 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  f[i]);.         
1fea0 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
1feb0 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20  o(&doclist);.   
1fec0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1fed0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 4d 65            fts5Me
1fee0 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 70  rgePrefixLists(p
1fef0 2c 20 62 41 73 63 2c 20 26 64 6f 63 6c 69 73 74  , bAsc, &doclist
1ff00 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
1ff10 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1ff20 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d  ferZero(&aBuf[i]
1ff30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1ff40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ff50 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69  .      if( docli
1ff60 73 74 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  st.n==0 ){.     
1ff70 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1ff80 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1ff90 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77  , &doclist, iRow
1ffa0 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id);.      }else
1ffb0 20 69 66 28 20 62 41 73 63 3d 3d 30 20 29 7b 0a   if( bAsc==0 ){.
1ffc0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1ffd0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1ffe0 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c  p->rc, &doclist,
1fff0 20 69 4c 61 73 74 52 6f 77 69 64 20 2d 20 69 52   iLastRowid - iR
20000 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  owid);.      }el
20010 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
20020 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20030 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c  nt(&p->rc, &docl
20040 69 73 74 2c 20 69 52 6f 77 69 64 20 2d 20 69 4c  ist, iRowid - iL
20050 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  astRowid);.     
20060 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 52 6f   }.      iLastRo
20070 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
20080 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
20090 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 31 2c 20  rPoslist(p, p1, 
200a0 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  1, &doclist);.  
200b0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
200c0 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a  ; i<nBuf; i++){.
200d0 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 50        fts5MergeP
200e0 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20 62 41  refixLists(p, bA
200f0 73 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61  sc, &doclist, &a
20100 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 66  Buf[i]);.      f
20110 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61  ts5BufferFree(&a
20120 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Buf[i]);.    }. 
20130 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
20140 46 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20 20  Free(p, p1);..  
20150 20 20 70 44 6f 63 6c 69 73 74 20 3d 20 28 46 74    pDoclist = (Ft
20160 73 35 44 6f 63 6c 69 73 74 49 74 65 72 2a 29 66  s5DoclistIter*)f
20170 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
20180 73 69 7a 65 6f 66 28 46 74 73 35 44 6f 63 6c 69  sizeof(Fts5Docli
20190 73 74 49 74 65 72 29 29 3b 0a 20 20 20 20 69 66  stIter));.    if
201a0 28 20 21 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ( !pDoclist ){. 
201b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46       fts5BufferF
201c0 72 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20  ree(&doclist);. 
201d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
201e0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20  pIter->pDoclist 
201f0 3d 20 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20  = pDoclist;.    
20200 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
20210 72 49 6e 69 74 28 26 64 6f 63 6c 69 73 74 2c 20  rInit(&doclist, 
20220 62 41 73 63 2c 20 70 49 74 65 72 2d 3e 70 44 6f  bAsc, pIter->pDo
20230 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  clist);.    }.  
20240 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
20250 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
20260 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
20270 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a  ee(aBuf);.}../*.
20280 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74  ** Open a new it
20290 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74  erator to iterat
202a0 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 64 6f 63  e though all doc
202b0 69 64 73 20 74 68 61 74 20 6d 61 74 63 68 20 74  ids that match t
202c0 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  he .** specified
202d0 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20   token or token 
202e0 70 72 65 66 69 78 2e 0a 2a 2f 0a 46 74 73 35 49  prefix..*/.Fts5I
202f0 6e 64 65 78 49 74 65 72 20 2a 73 71 6c 69 74 65  ndexIter *sqlite
20300 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
20310 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
20320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20330 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
20340 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f  to query */.  co
20350 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
20360 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a  , int nToken, /*
20370 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65 66 69   Token (or prefi
20380 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  x) to query for 
20390 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203b0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
203c0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
203d0 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  X flags */.){.  
203e0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
203f0 52 65 74 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Ret;.  int iIdx 
20400 3d 20 30 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67  = 0;..  if( flag
20410 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
20420 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20  ERY_PREFIX ){.  
20430 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
20440 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
20450 69 67 3b 0a 20 20 20 20 66 6f 72 28 69 49 64 78  ig;.    for(iIdx
20460 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69  =1; iIdx<=pConfi
20470 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78  g->nPrefix; iIdx
20480 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
20490 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
204a0 69 49 64 78 2d 31 5d 3d 3d 6e 54 6f 6b 65 6e 20  iIdx-1]==nToken 
204b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
204c0 20 20 20 69 66 28 20 69 49 64 78 3e 70 43 6f 6e     if( iIdx>pCon
204d0 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a  fig->nPrefix ){.
204e0 20 20 20 20 20 20 69 49 64 78 20 3d 20 2d 31 3b        iIdx = -1;
204f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52  .    }.  }..  pR
20500 65 74 20 3d 20 28 46 74 73 35 49 6e 64 65 78 49  et = (Fts5IndexI
20510 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ter*)sqlite3_mal
20520 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73 35 49  loc(sizeof(Fts5I
20530 6e 64 65 78 49 74 65 72 29 29 3b 0a 20 20 69 66  ndexIter));.  if
20540 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 6d 65  ( pRet ){.    me
20550 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20 73 69  mset(pRet, 0, si
20560 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74  zeof(Fts5IndexIt
20570 65 72 29 29 3b 0a 0a 20 20 20 20 70 52 65 74 2d  er));..    pRet-
20580 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20  >pIndex = p;.   
20590 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 7b 0a   if( iIdx>=0 ){.
205a0 20 20 20 20 20 20 70 52 65 74 2d 3e 70 53 74 72        pRet->pStr
205b0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
205c0 75 72 65 52 65 61 64 28 70 2c 20 69 49 64 78 29  ureRead(p, iIdx)
205d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74  ;.      if( pRet
205e0 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ->pStruct ){.   
205f0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
20600 65 72 4e 65 77 28 70 2c 20 70 52 65 74 2d 3e 70  erNew(p, pRet->p
20610 53 74 72 75 63 74 2c 20 0a 20 20 20 20 20 20 20  Struct, .       
20620 20 20 20 20 20 69 49 64 78 2c 20 66 6c 61 67 73       iIdx, flags
20630 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 54 6f  , (const u8*)pTo
20640 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c  ken, nToken, -1,
20650 20 30 2c 20 26 70 52 65 74 2d 3e 70 4d 75 6c 74   0, &pRet->pMult
20660 69 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  i.        );.   
20670 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
20680 20 20 20 20 20 20 69 6e 74 20 62 41 73 63 20 3d        int bAsc =
20690 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
206a0 44 45 58 5f 51 55 45 52 59 5f 41 53 43 29 21 3d  DEX_QUERY_ASC)!=
206b0 30 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74  0;.      fts5Set
206c0 75 70 50 72 65 66 69 78 49 74 65 72 28 70 2c 20  upPrefixIter(p, 
206d0 62 41 73 63 2c 20 28 63 6f 6e 73 74 20 75 38 2a  bAsc, (const u8*
206e0 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c  )pToken, nToken,
206f0 20 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20   pRet);.    }.  
20700 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29  }..  if( p->rc )
20710 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
20720 35 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74 29  5IterClose(pRet)
20730 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  ;.    pRet = 0;.
20740 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
20750 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
20760 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
20770 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
20780 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
20790 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a  ent is at EOF..*
207a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
207b0 35 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  5IterEof(Fts5Ind
207c0 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
207d0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
207e0 63 6c 69 73 74 20 29 7b 20 0a 20 20 20 20 72 65  clist ){ .    re
207f0 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63  turn pIter->pDoc
20800 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3d 3d  list->aPoslist==
20810 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0; .  }else{.   
20820 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74   return fts5Mult
20830 69 49 74 65 72 45 6f 66 28 70 49 74 65 72 2d 3e  iIterEof(pIter->
20840 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
20850 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Multi);.  }.}../
20860 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
20870 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72   next matching r
20880 6f 77 69 64 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  owid. .*/.void s
20890 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
208a0 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  xt(Fts5IndexIter
208b0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
208c0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20  pIter->pDoclist 
208d0 29 7b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  ){.    fts5Docli
208e0 73 74 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  stIterNext(pIter
208f0 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20 7d  ->pDoclist);.  }
20900 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75  else{.    fts5Bu
20910 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
20920 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
20930 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
20940 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
20950 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 30  pIter->pMulti, 0
20960 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
20970 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e  ** Move to the n
20980 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77  ext matching row
20990 69 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  id that occurs a
209a0 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63  t or after iMatc
209b0 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69  h. The.** defini
209c0 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61  tion of "at or a
209d0 66 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e  fter" depends on
209e0 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69 74   whether this it
209f0 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a  erator iterates.
20a00 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
20a10 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f  or descending ro
20a20 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 76 6f  wid order..*/.vo
20a30 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  id sqlite3Fts5It
20a40 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49  erNextFrom(Fts5I
20a50 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
20a60 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20   i64 iMatch){.  
20a70 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
20a80 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
20a90 74 28 20 30 20 29 3b 0a 20 20 20 20 2f 2a 20 66  t( 0 );.    /* f
20aa0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
20ab0 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70 44  xtFrom(pIter->pD
20ac0 6f 63 6c 69 73 74 2c 20 69 4d 61 74 63 68 29 3b  oclist, iMatch);
20ad0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
20ae0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
20af0 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70 49  xtFrom(pIter->pI
20b00 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75  ndex, pIter->pMu
20b10 6c 74 69 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20  lti, iMatch);.  
20b20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
20b30 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  n the current ro
20b40 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  wid..*/.i64 sqli
20b50 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64  te3Fts5IterRowid
20b60 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
20b70 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
20b80 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b  ter->pDoclist ){
20b90 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65  .    return pIte
20ba0 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 69 52 6f  r->pDoclist->iRo
20bb0 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
20bc0 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c    return fts5Mul
20bd0 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65  tiIterRowid(pIte
20be0 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a  r->pMulti);.  }.
20bf0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
20c00 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
20c10 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
20c20 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  g a copy of the 
20c30 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f  position list fo
20c40 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  r.** the current
20c50 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74 20 76   entry. Output v
20c60 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73 20 73  ariable *pn is s
20c70 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
20c80 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a  f the buffer .**
20c90 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65   in bytes before
20ca0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
20cb0 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 62  * The returned b
20cc0 75 66 66 65 72 20 64 6f 65 73 20 6e 6f 74 20 69  uffer does not i
20cd0 6e 63 6c 75 64 65 20 74 68 65 20 30 78 30 30 20  nclude the 0x00 
20ce0 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
20cf0 73 74 6f 72 65 64 20 6f 6e 0a 2a 2a 20 64 69 73  stored on.** dis
20d00 6b 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 75 38 20 2a  k..*/.const u8 *
20d10 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
20d20 6f 73 6c 69 73 74 28 46 74 73 35 49 6e 64 65 78  oslist(Fts5Index
20d30 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
20d40 20 2a 70 6e 29 7b 0a 20 20 69 66 28 20 70 49 74   *pn){.  if( pIt
20d50 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a  er->pDoclist ){.
20d60 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d      *pn = pIter-
20d70 3e 70 44 6f 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c  >pDoclist->nPosl
20d80 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ist;.    return 
20d90 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d  pIter->pDoclist-
20da0 3e 61 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c  >aPoslist;.  }el
20db0 73 65 7b 0a 20 20 20 20 46 74 73 35 49 6e 64 65  se{.    Fts5Inde
20dc0 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49  x *p = pIter->pI
20dd0 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35 42 75  ndex;.    fts5Bu
20de0 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
20df0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
20e00 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c  ts5MultiIterPosl
20e10 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e 70 4d  ist(p, pIter->pM
20e20 75 6c 74 69 2c 20 30 2c 20 26 70 49 74 65 72 2d  ulti, 0, &pIter-
20e30 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 61  >poslist);.    a
20e40 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
20e50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69  LITE_OK );.    i
20e60 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
20e70 6e 20 30 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 70  n 0;.    *pn = p
20e80 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b  Iter->poslist.n;
20e90 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65  .    return pIte
20ea0 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
20eb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
20ec0 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65   an iterator ope
20ed0 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
20ee0 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
20ef0 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
20f00 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
20f10 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
20f20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
20f30 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74  Iter){.  if( pIt
20f40 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  er ){.    if( pI
20f50 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b  ter->pDoclist ){
20f60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20f70 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c  ree(pIter->pDocl
20f80 69 73 74 2d 3e 61 29 3b 0a 20 20 20 20 20 20 73  ist->a);.      s
20f90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
20fa0 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20  r->pDoclist);.  
20fb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
20fc0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
20fd0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
20fe0 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a  pIter->pMulti);.
20ff0 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
21000 75 72 65 52 65 6c 65 61 73 65 28 70 49 74 65 72  ureRelease(pIter
21010 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  ->pStruct);.    
21020 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
21030 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
21040 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
21050 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49 74  5CloseReader(pIt
21060 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 20 20 20  er->pIndex);.   
21070 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
21080 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
21090 2a 2a 20 52 65 61 64 20 74 68 65 20 22 61 76 65  ** Read the "ave
210a0 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 69 6e  rages" record in
210b0 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73 75  to the buffer su
210c0 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65  pplied as the se
210d0 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
210e0 74 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  t. Return SQLITE
210f0 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
21100 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
21110 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 66  error code.** if
21120 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21130 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21140 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65 72  Fts5IndexGetAver
21150 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ages(Fts5Index *
21160 70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  p, Fts5Buffer *p
21170 42 75 66 29 7b 0a 20 20 66 74 73 35 44 61 74 61  Buf){.  fts5Data
21180 52 65 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20  ReadOrBuffer(p, 
21190 70 42 75 66 2c 20 46 54 53 35 5f 41 56 45 52 41  pBuf, FTS5_AVERA
211a0 47 45 53 5f 52 4f 57 49 44 29 3b 0a 20 20 72 65  GES_ROWID);.  re
211b0 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f  turn p->rc;.}../
211c0 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
211d0 20 63 75 72 72 65 6e 74 20 22 61 76 65 72 61 67   current "averag
211e0 65 73 22 20 72 65 63 6f 72 64 20 77 69 74 68 20  es" record with 
211f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
21200 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73  the buffer .** s
21210 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73  upplied as the s
21220 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
21230 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
21240 73 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67  s5IndexSetAverag
21250 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  es(Fts5Index *p,
21260 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
21270 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
21280 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
21290 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52   FTS5_AVERAGES_R
212a0 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44 61  OWID, pData, nDa
212b0 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ta);.  return p-
212c0 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >rc;.}../*.** Re
212d0 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
212e0 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20  umber of blocks 
212f0 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20  this module has 
21300 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  read from the %_
21310 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69  data.** table si
21320 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74  nce it was creat
21330 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
21340 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73  e3Fts5IndexReads
21350 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
21360 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61    return p->nRea
21370 64 3b 0a 7d 0a 0a                                d;.}..