/ Hex Artifact Content
Login

Artifact ccef8703b6228a39090b0a03b83f163e69627ff2:


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 5a 65 72 6f 62 79 74  iteAppendZerobyt
15a10 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
15a20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
15a30 57 72 69 74 65 72 29 7b 0a 20 20 66 74 73 35 42  Writer){.  fts5B
15a40 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
15a50 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  t(&p->rc, &pWrit
15a60 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 62  er->aWriter[0].b
15a70 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
15a80 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
15a90 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72  cached by the wr
15aa0 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  iter object to t
15ab0 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65  he database. Fre
15ac0 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e any.** allocat
15ad0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
15ae0 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e  with the writer.
15af0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15b00 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
15b10 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
15b20 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
15b30 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
15b40 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
15b50 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
15b60 6e 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20  nHeight,        
15b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
15b80 3a 20 48 65 69 67 68 74 20 6f 66 20 74 68 65 20  : Height of the 
15b90 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
15ba0 2a 70 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20  *pnLeaf         
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
15bc0 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65  UT: Number of le
15bd0 61 66 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72  af pages in b-tr
15be0 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ee */.){.  int i
15bf0 3b 0a 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 57  ;.  *pnLeaf = pW
15c00 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
15c10 5d 2e 70 67 6e 6f 3b 0a 20 20 69 66 28 20 2a 70  ].pgno;.  if( *p
15c20 6e 4c 65 61 66 3d 3d 31 20 26 26 20 70 57 72 69  nLeaf==1 && pWri
15c30 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e  ter->aWriter[0].
15c40 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  buf.n==0 ){.    
15c50 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  *pnLeaf = 0;.   
15c60 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a   *pnHeight = 0;.
15c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
15c80 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
15c90 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
15ca0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 57   if( pWriter->nW
15cb0 72 69 74 65 72 3d 3d 31 20 26 26 20 70 57 72 69  riter==1 && pWri
15cc0 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53  ter->nEmpty>=FTS
15cd0 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45  5_MIN_DLIDX_SIZE
15ce0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72   ){.      fts5Wr
15cf0 69 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c 20  iteBtreeGrow(p, 
15d00 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a  pWriter);.    }.
15d10 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
15d20 3e 6e 57 72 69 74 65 72 3e 31 20 29 7b 0a 20 20  >nWriter>1 ){.  
15d30 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
15d40 65 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72 69  eeNEmpty(p, pWri
15d50 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
15d60 2a 70 6e 48 65 69 67 68 74 20 3d 20 70 57 72 69  *pnHeight = pWri
15d70 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 0a 0a 20  ter->nWriter;.. 
15d80 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 57     for(i=1; i<pW
15d90 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20  riter->nWriter; 
15da0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  i++){.      Fts5
15db0 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 67 20  PageWriter *pPg 
15dc0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
15dd0 74 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74  ter[i];.      ft
15de0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a  s5DataWrite(p, .
15df0 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 53            FTS5_S
15e00 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72  EGMENT_ROWID(pWr
15e10 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69  iter->iIdx, pWri
15e20 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20  ter->iSegid, i, 
15e30 70 50 67 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20 20  pPg->pgno), .   
15e40 20 20 20 20 20 20 20 70 50 67 2d 3e 62 75 66 2e         pPg->buf.
15e50 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 0a 20 20  p, pPg->buf.n.  
15e60 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
15e70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57  .  for(i=0; i<pW
15e80 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3b 20  riter->nWriter; 
15e90 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61  i++){.    Fts5Pa
15ea0 67 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20  geWriter *pPg = 
15eb0 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
15ec0 72 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 42 75  r[i];.    fts5Bu
15ed0 66 66 65 72 46 72 65 65 28 26 70 50 67 2d 3e 74  fferFree(&pPg->t
15ee0 65 72 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75  erm);.    fts5Bu
15ef0 66 66 65 72 46 72 65 65 28 26 70 50 67 2d 3e 62  fferFree(&pPg->b
15f00 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  uf);.  }.  sqlit
15f10 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d  e3_free(pWriter-
15f20 3e 61 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c  >aWriter);.  sql
15f30 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
15f40 65 65 28 26 70 57 72 69 74 65 72 2d 3e 64 6c 69  ee(&pWriter->dli
15f50 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  dx);.}..static v
15f60 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e 69  oid fts5WriteIni
15f70 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
15f80 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
15f90 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20  ter *pWriter, . 
15fa0 20 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69   int iIdx, int i
15fb0 53 65 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73 65  Segid.){.  memse
15fc0 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69  t(pWriter, 0, si
15fd0 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74  zeof(Fts5SegWrit
15fe0 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  er));.  pWriter-
15ff0 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20  >iIdx = iIdx;.  
16000 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20  pWriter->iSegid 
16010 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 70 57 72  = iSegid;..  pWr
16020 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20  iter->aWriter = 
16030 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2a  (Fts5PageWriter*
16040 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
16050 2c 73 69 7a 65 6f 66 28 46 74 73 35 50 61 67 65  ,sizeof(Fts5Page
16060 57 72 69 74 65 72 29 29 3b 0a 20 20 69 66 28 20  Writer));.  if( 
16070 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
16080 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
16090 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
160a0 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
160b0 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f  >aWriter[0].pgno
160c0 20 3d 20 31 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 1;.}..static 
160d0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e  void fts5WriteIn
160e0 69 74 46 6f 72 41 70 70 65 6e 64 28 0a 20 20 46  itForAppend(.  F
160f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16110 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
16120 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
16130 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
16140 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r,         /* Wr
16150 69 74 65 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  iter to initiali
16160 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ze */.  int iIdx
16170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16180 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16190 20 73 65 67 6d 65 6e 74 20 69 73 20 61 20 70 61   segment is a pa
161a0 72 74 20 6f 66 20 2a 2f 0a 20 20 46 74 73 35 53  rt of */.  Fts5S
161b0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
161c0 2a 70 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65  *pSeg      /* Se
161d0 67 6d 65 6e 74 20 6f 62 6a 65 63 74 20 74 6f 20  gment object to 
161e0 61 70 70 65 6e 64 20 74 6f 20 2a 2f 0a 29 7b 0a  append to */.){.
161f0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 70 53    int nByte = pS
16200 65 67 2d 3e 6e 48 65 69 67 68 74 20 2a 20 73 69  eg->nHeight * si
16210 7a 65 6f 66 28 46 74 73 35 50 61 67 65 57 72 69  zeof(Fts5PageWri
16220 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  ter);.  memset(p
16230 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Writer, 0, sizeo
16240 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
16250 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 49  );.  pWriter->iI
16260 64 78 20 3d 20 69 49 64 78 3b 0a 20 20 70 57 72  dx = iIdx;.  pWr
16270 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 70  iter->iSegid = p
16280 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 70  Seg->iSegid;.  p
16290 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20  Writer->aWriter 
162a0 3d 20 28 46 74 73 35 50 61 67 65 57 72 69 74 65  = (Fts5PageWrite
162b0 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
162c0 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 70 57  (p, nByte);.  pW
162d0 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d  riter->nWriter =
162e0 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3b 0a   pSeg->nHeight;.
162f0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
16300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
16310 6e 74 20 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20  nt pgno = 1;.   
16320 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 57 72 69   int i;.    pWri
16330 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e  ter->aWriter[0].
16340 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e  pgno = pSeg->pgn
16350 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20 66 6f 72  oLast+1;.    for
16360 28 69 3d 70 53 65 67 2d 3e 6e 48 65 69 67 68 74  (i=pSeg->nHeight
16370 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
16380 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
16390 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
163a0 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 49  OWID(pWriter->iI
163b0 64 78 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65  dx, pWriter->iSe
163c0 67 69 64 2c 20 69 2c 20 70 67 6e 6f 29 3b 0a 20  gid, i, pgno);. 
163d0 20 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69       Fts5PageWri
163e0 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69  ter *pPg = &pWri
163f0 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b  ter->aWriter[i];
16400 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f  .      pPg->pgno
16410 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 66   = pgno;.      f
16420 74 73 35 44 61 74 61 42 75 66 66 65 72 28 70 2c  ts5DataBuffer(p,
16430 20 26 70 50 67 2d 3e 62 75 66 2c 20 69 52 6f 77   &pPg->buf, iRow
16440 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
16450 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16460 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 4e  ){.        Fts5N
16470 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20  odeIter ss;.    
16480 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
16490 49 6e 69 74 28 70 50 67 2d 3e 62 75 66 2e 70 2c  Init(pPg->buf.p,
164a0 20 70 50 67 2d 3e 62 75 66 2e 6e 2c 20 26 73 73   pPg->buf.n, &ss
164b0 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
164c0 28 20 73 73 2e 61 44 61 74 61 20 29 20 66 74 73  ( ss.aData ) fts
164d0 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70  5NodeIterNext(&p
164e0 2d 3e 72 63 2c 20 26 73 73 29 3b 0a 20 20 20 20  ->rc, &ss);.    
164f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
16500 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e  t(&p->rc, &pPg->
16510 74 65 72 6d 2c 20 73 73 2e 74 65 72 6d 2e 6e 2c  term, ss.term.n,
16520 20 73 73 2e 74 65 72 6d 2e 70 29 3b 0a 20 20 20   ss.term.p);.   
16530 20 20 20 20 20 70 67 6e 6f 20 3d 20 73 73 2e 69       pgno = ss.i
16540 43 68 69 6c 64 3b 0a 20 20 20 20 20 20 20 20 66  Child;.        f
16550 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
16560 26 73 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &ss);.      }.  
16570 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 65 67    }.    if( pSeg
16580 2d 3e 6e 48 65 69 67 68 74 3d 3d 31 20 29 7b 0a  ->nHeight==1 ){.
16590 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e        pWriter->n
165a0 45 6d 70 74 79 20 3d 20 70 53 65 67 2d 3e 70 67  Empty = pSeg->pg
165b0 6e 6f 4c 61 73 74 2d 31 3b 0a 20 20 20 20 7d 0a  noLast-1;.    }.
165c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 67 6e      assert( (pgn
165d0 6f 2b 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74  o+pWriter->nEmpt
165e0 79 29 3d 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  y)==pSeg->pgnoLa
165f0 73 74 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st );.  }.}../*.
16600 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65  ** Iterator pIte
16610 72 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74  r was used to it
16620 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
16630 65 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  e input segments
16640 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63   of on an.** inc
16650 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f  remental merge o
16660 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66  peration. This f
16670 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
16680 64 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65  d if the increme
16690 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74  ntal.** merge st
166a0 65 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ep has finished 
166b0 62 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61  but the input ha
166c0 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c  s not been compl
166d0 65 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e  etely exhausted.
166e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
166f0 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
16700 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
16710 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
16720 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
16730 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
16740 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
16750 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
16760 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72  5Buffer));.  for
16770 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
16780 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Seg; i++){.    F
16790 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
167a0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
167b0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67  i];.    if( pSeg
167c0 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pSeg==0 ){.   
167d0 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
167e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
167f0 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  g->pLeaf==0 ){. 
16800 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
16810 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20  >pgnoLast = 0;. 
16820 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
16830 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a  >pgnoFirst = 0;.
16840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16850 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67   int iOff = pSeg
16860 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
16870 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  t;     /* Offset
16880 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65   on new first le
16890 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  af page */.     
168a0 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b   i64 iLeafRowid;
168b0 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20  .      Fts5Data 
168c0 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e  *pData;.      in
168d0 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53  t iId = pSeg->pS
168e0 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
168f0 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b    u8 aHdr[4] = {
16900 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
16910 2c 20 30 78 30 34 7d 3b 0a 0a 20 20 20 20 20 20  , 0x04};..      
16920 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53  iLeafRowid = FTS
16930 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
16940 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c  pSeg->iIdx, iId,
16950 20 30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c   0, pSeg->iTermL
16960 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  eafPgno);.      
16970 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
16980 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77  Read(p, iLeafRow
16990 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
169a0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
169b0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
169c0 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74  buf);.        ft
169d0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
169e0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
169f0 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61   sizeof(aHdr), a
16a00 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Hdr);.        ft
16a10 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
16a20 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
16a30 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29  f, pSeg->term.n)
16a40 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
16a50 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
16a60 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
16a70 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d  g->term.n, pSeg-
16a80 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20  >term.p);.      
16a90 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
16aa0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
16ab0 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 20 2d 20  buf, pData->n - 
16ac0 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b  iOff, &pData->p[
16ad0 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20  iOff]);.        
16ae0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
16af0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
16b00 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
16b10 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54  First = pSeg->iT
16b20 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ermLeafPgno;.   
16b30 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c       fts5DataDel
16b40 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ete(p, FTS5_SEGM
16b50 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
16b60 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 31 29  iIdx, iId, 0, 1)
16b70 2c 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20  ,iLeafRowid);.  
16b80 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72        fts5DataWr
16b90 69 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ite(p, iLeafRowi
16ba0 64 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  d, buf.p, buf.n)
16bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16bc0 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
16bd0 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f  Free(&buf);.}../
16be0 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
16bf0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65 72  oid fts5IndexMer
16c00 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35 49  geLevel(.  Fts5I
16c10 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
16c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
16c30 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
16c40 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c60 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
16c70 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20  to work on */.  
16c80 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
16c90 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20  Struct,         
16ca0 2f 2a 20 53 74 75 63 74 75 72 65 20 6f 66 20 69  /* Stucture of i
16cb0 6e 64 65 78 20 69 49 64 78 20 2a 2f 0a 20 20 69  ndex iIdx */.  i
16cc0 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20  nt iLvl,        
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16ce0 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  * Level to read 
16cf0 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20  input from */.  
16d00 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20 20  int *pnRem      
16d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 74  /* Write up to t
16d30 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74 20  his many output 
16d40 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46  leaves */.){.  F
16d50 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
16d60 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
16d70 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
16d80 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
16d90 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74 20  eLevel *pLvlOut 
16da0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
16db0 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 46 74  el[iLvl+1];.  Ft
16dc0 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
16dd0 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a  pIter = 0;    /*
16de0 20 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61   Iterator to rea
16df0 64 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a  d input data */.
16e00 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 2a 70 6e    int nRem = *pn
16e10 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rem;            
16e20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66    /* Output leaf
16e30 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77   pages left to w
16e40 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49  rite */.  int nI
16e50 6e 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  nput;           
16e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16e70 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
16e80 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53  ments */.  Fts5S
16e90 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  egWriter writer;
16ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
16eb0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
16ec0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
16ed0 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
16ee0 20 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65   /* Output segme
16ef0 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  nt */.  Fts5Buff
16f00 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62  er term;.  int b
16f10 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65  RequireDoclistTe
16f20 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44 6f  rm = 0;    /* Do
16f30 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72  clist terminator
16f40 20 28 30 78 30 30 29 20 72 65 71 75 69 72 65 64   (0x00) required
16f50 20 2a 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73   */.  int bOldes
16f60 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
16f70 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
16f80 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
16f90 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73  ent is the oldes
16fa0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
16fb0 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
16fc0 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  evel );.  assert
16fd0 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d  ( pLvl->nMerge<=
16fe0 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20  pLvl->nSeg );.. 
16ff0 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c   memset(&writer,
17000 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
17010 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65  egWriter));.  me
17020 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
17030 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
17040 29 29 3b 0a 20 20 77 72 69 74 65 72 2e 69 49 64  ));.  writer.iId
17050 78 20 3d 20 69 49 64 78 3b 0a 20 20 69 66 28 20  x = iIdx;.  if( 
17060 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
17070 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
17080 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20  Out->nSeg>0 );. 
17090 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
170a0 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 66 74  ->nMerge;.    ft
170b0 73 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70  s5WriteInitForAp
170c0 70 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c  pend(p, &writer,
170d0 20 69 49 64 78 2c 20 26 70 4c 76 6c 4f 75 74 2d   iIdx, &pLvlOut-
170e0 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
170f0 53 65 67 2d 31 5d 29 3b 0a 20 20 20 20 70 53 65  Seg-1]);.    pSe
17100 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
17110 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
17120 2d 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1];.  }else{.  
17130 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66    int iSegid = f
17140 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
17150 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
17160 20 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28    fts5WriteInit(
17170 70 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64 78  p, &writer, iIdx
17180 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
17190 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73  /* Add the new s
171a0 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75  egment to the ou
171b0 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  tput level */.  
171c0 20 20 69 66 28 20 69 4c 76 6c 2b 31 3d 3d 70 53    if( iLvl+1==pS
171d0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 20  truct->nLevel ) 
171e0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
171f0 2b 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  +;.    pSeg = &p
17200 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76  LvlOut->aSeg[pLv
17210 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20  lOut->nSeg];.   
17220 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b   pLvlOut->nSeg++
17230 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f  ;.    pSeg->pgno
17240 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70  First = 1;.    p
17250 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
17260 65 67 69 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  egid;..    /* Re
17270 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c  ad input from al
17280 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
17290 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f  e input level */
172a0 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c  .    nInput = pL
172b0 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20  vl->nSeg;.  }.  
172c0 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f  bOldest = (pLvlO
172d0 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70  ut->nSeg==1 && p
172e0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d  Struct->nLevel==
172f0 69 4c 76 6c 2b 32 29 3b 0a 0a 23 69 66 20 30 0a  iLvl+2);..#if 0.
17300 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
17310 22 6d 65 72 67 69 6e 67 20 25 64 20 73 65 67 6d  "merging %d segm
17320 65 6e 74 73 20 66 72 6f 6d 20 6c 65 76 65 6c 20  ents from level 
17330 25 64 21 22 2c 20 6e 49 6e 70 75 74 2c 20 69 4c  %d!", nInput, iL
17340 76 6c 29 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f  vl);.fflush(stdo
17350 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 66  ut);.#endif..  f
17360 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72  or(fts5MultiIter
17370 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
17380 69 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20 69  iIdx, 0, 0, 0, i
17390 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49  Lvl, nInput, &pI
173a0 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ter);.      fts5
173b0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
173c0 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  pIter)==0;.     
173d0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
173e0 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
173f0 30 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35  0).  ){.    Fts5
17400 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
17410 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
17420 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d  ter->aFirst[1] ]
17430 3b 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49  ;.    Fts5ChunkI
17440 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20  ter sPos;       
17450 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
17460 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70  terate through p
17470 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
17480 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
17490 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69  egment being wri
174a0 74 74 65 6e 20 69 73 20 74 68 65 20 6f 6c 64 65  tten is the olde
174b0 73 74 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65  st in the entire
174c0 20 69 6e 64 65 78 20 61 6e 64 0a 20 20 20 20 2a   index and.    *
174d0 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  * the position l
174e0 69 73 74 20 69 73 20 65 6d 70 74 79 20 28 69 2e  ist is empty (i.
174f0 65 2e 20 74 68 65 20 65 6e 74 72 79 20 69 73 20  e. the entry is 
17500 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 29  a delete marker)
17510 2c 20 6e 6f 0a 20 20 20 20 2a 2a 20 65 6e 74 72  , no.    ** entr
17520 79 20 6e 65 65 64 20 62 65 20 77 72 69 74 74 65  y need be writte
17530 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  n to the output.
17540 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75    */.    fts5Chu
17550 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53  nkIterInit(p, pS
17560 65 67 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20 20  eg, &sPos);.    
17570 69 66 28 20 62 4f 6c 64 65 73 74 3d 3d 30 20 7c  if( bOldest==0 |
17580 7c 20 73 50 6f 73 2e 6e 52 65 6d 3e 30 20 29 7b  | sPos.nRem>0 ){
17590 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
175a0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  ;.      const u8
175b0 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75   *pTerm = fts5Mu
175c0 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
175d0 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  r, &nTerm);.    
175e0 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72    if( nTerm!=ter
175f0 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54  m.n || memcmp(pT
17600 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65  erm, term.p, nTe
17610 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rm) ){.        i
17620 66 28 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57  f( writer.nLeafW
17630 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20  ritten>nRem ){. 
17640 20 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75           fts5Chu
17650 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 26 73  nkIterRelease(&s
17660 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pos);.          
17670 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
17680 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  ..        /* Thi
17690 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e  s is a new term.
176a0 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74   Append a term t
176b0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  o the output seg
176c0 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ment. */.       
176d0 20 69 66 28 20 62 52 65 71 75 69 72 65 44 6f 63   if( bRequireDoc
176e0 6c 69 73 74 54 65 72 6d 20 29 7b 0a 20 20 20 20  listTerm ){.    
176f0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
17700 70 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 70 2c  ppendZerobyte(p,
17710 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20   &writer);.     
17720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 74 73     }.        fts
17730 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
17740 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65  (p, &writer, nTe
17750 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
17760 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
17770 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c  t(&p->rc, &term,
17780 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
17790 20 20 20 20 20 20 20 20 62 52 65 71 75 69 72 65          bRequire
177a0 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 31 3b  DoclistTerm = 1;
177b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
177c0 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f  /* Append the ro
177d0 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  wid to the outpu
177e0 74 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57  t */.      fts5W
177f0 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
17800 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35  p, &writer, fts5
17810 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
17820 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 2f  Iter));..      /
17830 2a 20 43 6f 70 79 20 74 68 65 20 70 6f 73 69 74  * Copy the posit
17840 69 6f 6e 20 6c 69 73 74 20 66 72 6f 6d 20 69 6e  ion list from in
17850 70 75 74 20 74 6f 20 6f 75 74 70 75 74 20 2a 2f  put to output */
17860 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
17870 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74  AppendPoslistInt
17880 28 70 2c 20 26 77 72 69 74 65 72 2c 20 73 50 6f  (p, &writer, sPo
17890 73 2e 6e 52 65 6d 29 3b 0a 20 20 20 20 20 20 66  s.nRem);.      f
178a0 6f 72 28 2f 2a 20 6e 6f 6f 70 20 2a 2f 3b 20 21  or(/* noop */; !
178b0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
178c0 28 70 2c 20 26 73 50 6f 73 29 3b 20 66 74 73 35  (p, &sPos); fts5
178d0 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c  ChunkIterNext(p,
178e0 20 26 73 50 6f 73 29 29 7b 0a 20 20 20 20 20 20   &sPos)){.      
178f0 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
17900 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69          while( i
17910 4f 66 66 3c 73 50 6f 73 2e 6e 20 29 7b 0a 20 20  Off<sPos.n ){.  
17920 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
17930 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
17940 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
17950 26 73 50 6f 73 2e 70 5b 69 4f 66 66 5d 2c 20 69  &sPos.p[iOff], i
17960 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
17970 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50  fts5WriteAppendP
17980 6f 73 6c 69 73 74 49 6e 74 28 70 2c 20 26 77 72  oslistInt(p, &wr
17990 69 74 65 72 2c 20 69 56 61 6c 29 3b 0a 20 20 20  iter, iVal);.   
179a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
179b0 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 43 68     }..    fts5Ch
179c0 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 26  unkIterRelease(&
179d0 73 50 6f 73 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  sPos);.  }..  /*
179e0 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74 20   Flush the last 
179f0 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64 69 73  leaf page to dis
17a00 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  k. Set the outpu
17a10 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  t segment b-tree
17a20 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64   height.  ** and
17a30 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
17a40 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20 73 61  number at the sa
17a50 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66  me time.  */.  f
17a60 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70  ts5WriteFinish(p
17a70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53 65 67  , &writer, &pSeg
17a80 2d 3e 6e 48 65 69 67 68 74 2c 20 26 70 53 65 67  ->nHeight, &pSeg
17a90 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20  ->pgnoLast);..  
17aa0 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
17ab0 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
17ac0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  {.    int i;..  
17ad0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
17ae0 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e  redundant segmen
17af0 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  ts from the %_da
17b00 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ta table */.    
17b10 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75  for(i=0; i<nInpu
17b20 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  t; i++){.      f
17b30 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67  ts5DataRemoveSeg
17b40 6d 65 6e 74 28 70 2c 20 69 49 64 78 2c 20 70 4c  ment(p, iIdx, pL
17b50 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67  vl->aSeg[i].iSeg
17b60 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
17b70 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65  /* Remove the re
17b80 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73  dundant segments
17b90 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
17ba0 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28  level */.    if(
17bb0 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e   pLvl->nSeg!=nIn
17bc0 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  put ){.      int
17bd0 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e   nMove = (pLvl->
17be0 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a  nSeg - nInput) *
17bf0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
17c00 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
17c10 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76       memmove(pLv
17c20 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  l->aSeg, &pLvl->
17c30 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d  aSeg[nInput], nM
17c40 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ove);.    }.    
17c50 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49  pLvl->nSeg -= nI
17c60 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  nput;.    pLvl->
17c70 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20  nMerge = 0;.    
17c80 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  if( pSeg->pgnoLa
17c90 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  st==0 ){.      p
17ca0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a  LvlOut->nSeg--;.
17cb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
17cc0 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d     assert( pSeg-
17cd0 3e 6e 48 65 69 67 68 74 3e 30 20 26 26 20 70 53  >nHeight>0 && pS
17ce0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29  eg->pgnoLast>0 )
17cf0 3b 0a 20 20 20 20 66 74 73 35 54 72 69 6d 53 65  ;.    fts5TrimSe
17d00 67 6d 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29  gments(p, pIter)
17d10 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72  ;.    pLvl->nMer
17d20 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d  ge = nInput;.  }
17d30 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
17d40 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b  rFree(p, pIter);
17d50 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
17d60 65 28 26 74 65 72 6d 29 3b 0a 20 20 2a 70 6e 52  e(&term);.  *pnR
17d70 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65  em -= writer.nLe
17d80 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a  afWritten;.}../*
17d90 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e  .** A total of n
17da0 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20  Leaf leaf pages 
17db0 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74  of data has just
17dc0 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f   been flushed to
17dd0 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65   a level-0.** se
17de0 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20  gments in index 
17df0 69 49 64 78 20 77 69 74 68 20 73 74 72 75 63 74  iIdx with struct
17e00 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 69  ure pStruct. Thi
17e10 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74  s function updat
17e20 65 73 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 2d  es the.** write-
17e30 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e  counter accordin
17e40 67 6c 79 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  gly and, if nece
17e50 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d 73 20  ssary, performs 
17e60 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
17e70 65 0a 2a 2a 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a  e.** work..**.**
17e80 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
17e90 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
17ea0 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
17eb0 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
17ec0 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
17ed0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
17ee0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
17ef0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
17f00 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 57 6f  void fts5IndexWo
17f10 72 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rk(.  Fts5Index 
17f20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17f30 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
17f40 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
17f50 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f    /* Index to wo
17f80 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53  rk on */.  Fts5S
17f90 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
17fa0 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
17fb0 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
17fc0 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
17fd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20   */.  int nLeaf 
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18000 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73  of output leaves
18010 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
18020 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
18030 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
18040 70 70 53 74 72 75 63 74 3b 0a 20 20 69 36 34 20  ppStruct;.  i64 
18050 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
18060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
18070 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20  nitial value of 
18080 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  write-counter */
18090 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20  .  int nWork;   
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
180c0 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74 6f 20 70  work-quanta to p
180d0 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 69 6e 74 20  erform */.  int 
180e0 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nRem;           
180f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18100 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
18110 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74  ges left to writ
18120 65 20 2a 2f 0a 0a 20 20 2f 2a 20 55 70 64 61 74  e */..  /* Updat
18130 65 20 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e  e the write-coun
18140 74 65 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67  ter. While doing
18150 20 73 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20   so, set nWork. 
18160 2a 2f 0a 20 20 6e 57 72 69 74 65 20 3d 20 70 53  */.  nWrite = pS
18170 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75  truct->nWriteCou
18180 6e 74 65 72 3b 0a 20 20 6e 57 6f 72 6b 20 3d 20  nter;.  nWork = 
18190 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66  ((nWrite + nLeaf
181a0 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  ) / p->nWorkUnit
181b0 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d  ) - (nWrite / p-
181c0 3e 6e 57 6f 72 6b 55 6e 69 74 29 3b 0a 20 20 70  >nWorkUnit);.  p
181d0 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
181e0 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66 3b 0a  unter += nLeaf;.
181f0 20 20 6e 52 65 6d 20 3d 20 70 2d 3e 6e 57 6f 72    nRem = p->nWor
18200 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20  kUnit * nWork * 
18210 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
18220 0a 0a 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e  ..  while( nRem>
18230 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76  0 ){.    int iLv
18240 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
18250 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61       /* To itera
18260 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
18270 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 65  s */.    int iBe
18280 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20  stLvl = 0;      
18290 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66       /* Level of
182a0 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20  fering the most 
182b0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a  input segments *
182c0 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20  /.    int nBest 
182d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
182e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
182f0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e  nput segments on
18300 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a   best level */..
18310 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74      /* Set iBest
18320 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c  Lvl to the level
18330 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73   to read input s
18340 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f  egments from. */
18350 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
18360 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29  ruct->nLevel>0 )
18370 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ;.    for(iLvl=0
18380 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
18390 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
183a0 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
183b0 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
183c0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
183d0 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
183e0 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  if( pLvl->nMerge
183f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
18400 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65  pLvl->nMerge>nBe
18410 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
18420 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
18430 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65 73 74  .          nBest
18440 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b   = pLvl->nMerge;
18450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18460 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
18470 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  }.      if( pLvl
18480 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a  ->nSeg>nBest ){.
18490 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20          nBest = 
184a0 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20  pLvl->nSeg;.    
184b0 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69      iBestLvl = i
184c0 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Lvl;.      }.   
184d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42   }..    /* If nB
184e0 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20  est is still 0, 
184f0 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d  then the index m
18500 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f  ust be empty. */
18510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
18520 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69 4c 76  EBUG.    for(iLv
18530 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26  l=0; nBest==0 &&
18540 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
18550 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
18560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
18570 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
18580 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20  vl].nSeg==0 );. 
18590 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
185a0 20 69 66 28 20 6e 42 65 73 74 3c 70 2d 3e 6e 4d   if( nBest<p->nM
185b0 69 6e 4d 65 72 67 65 20 26 26 20 70 53 74 72 75  inMerge && pStru
185c0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74  ct->aLevel[iBest
185d0 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29  Lvl].nMerge==0 )
185e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
185f0 69 42 65 73 74 4c 76 6c 3d 3d 70 53 74 72 75 63  iBestLvl==pStruc
18600 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20  t->nLevel-1 ){. 
18610 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
18620 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72  reAddLevel(&p->r
18630 63 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20  c, &pStruct);.  
18640 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
18650 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
18660 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
18670 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 31 2c  , iBestLvl+1, 1,
18680 20 30 29 3b 0a 20 20 20 20 66 74 73 35 49 6e 64   0);.    fts5Ind
18690 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
186a0 69 49 64 78 2c 20 70 53 74 72 75 63 74 2c 20 69  iIdx, pStruct, i
186b0 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  BestLvl, &nRem);
186c0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
186d0 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65  rePromote(p, iBe
186e0 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74  stLvl+1, pStruct
186f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
18700 52 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 3d  Rem==0 || p->rc=
18710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
18720 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
18730 74 72 75 63 74 3b 0a 20 20 7d 0a 7d 0a 0a 74 79  truct;.  }.}..ty
18740 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
18750 35 46 6c 75 73 68 43 74 78 20 46 74 73 35 46 6c  5FlushCtx Fts5Fl
18760 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74 20 46  ushCtx;.struct F
18770 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a 20 20  ts5FlushCtx {.  
18780 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78 3b  Fts5Index *pIdx;
18790 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
187a0 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 73 74   writer; .};..st
187b0 61 74 69 63 20 69 6e 74 20 66 74 73 35 46 6c 75  atic int fts5Flu
187c0 73 68 4e 65 77 54 65 72 6d 28 76 6f 69 64 20 2a  shNewTerm(void *
187d0 70 43 74 78 2c 20 63 6f 6e 73 74 20 63 68 61 72  pCtx, const char
187e0 20 2a 7a 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *zTerm, int nTe
187f0 72 6d 29 7b 0a 20 20 46 74 73 35 46 6c 75 73 68  rm){.  Fts5Flush
18800 43 74 78 20 2a 70 20 3d 20 28 46 74 73 35 46 6c  Ctx *p = (Fts5Fl
18810 75 73 68 43 74 78 2a 29 70 43 74 78 3b 0a 20 20  ushCtx*)pCtx;.  
18820 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18830 4f 4b 3b 0a 20 20 66 74 73 35 57 72 69 74 65 41  OK;.  fts5WriteA
18840 70 70 65 6e 64 54 65 72 6d 28 70 2d 3e 70 49 64  ppendTerm(p->pId
18850 78 2c 20 26 70 2d 3e 77 72 69 74 65 72 2c 20 6e  x, &p->writer, n
18860 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a  Term, (const u8*
18870 29 7a 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72  )zTerm);.  retur
18880 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
18890 69 6e 74 20 66 74 73 35 46 6c 75 73 68 54 65 72  int fts5FlushTer
188a0 6d 44 6f 6e 65 28 76 6f 69 64 20 2a 70 43 74 78  mDone(void *pCtx
188b0 29 7b 0a 20 20 46 74 73 35 46 6c 75 73 68 43 74  ){.  Fts5FlushCt
188c0 78 20 2a 70 20 3d 20 28 46 74 73 35 46 6c 75 73  x *p = (Fts5Flus
188d0 68 43 74 78 2a 29 70 43 74 78 3b 0a 20 20 69 6e  hCtx*)pCtx;.  in
188e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
188f0 3b 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ;.  /* Write the
18900 20 64 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61   doclist termina
18910 74 6f 72 20 2a 2f 0a 20 20 66 74 73 35 57 72 69  tor */.  fts5Wri
18920 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65  teAppendZerobyte
18930 28 70 2d 3e 70 49 64 78 2c 20 26 70 2d 3e 77 72  (p->pIdx, &p->wr
18940 69 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  iter);.  return 
18950 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
18960 74 20 66 74 73 35 46 6c 75 73 68 4e 65 77 45 6e  t fts5FlushNewEn
18970 74 72 79 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  try(.  void *pCt
18980 78 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64  x, .  i64 iRowid
18990 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  , .  const u8 *a
189a0 50 6f 73 6c 69 73 74 2c 20 0a 20 20 69 6e 74 20  Poslist, .  int 
189b0 6e 50 6f 73 6c 69 73 74 0a 29 7b 0a 20 20 46 74  nPoslist.){.  Ft
189c0 73 35 46 6c 75 73 68 43 74 78 20 2a 70 20 3d 20  s5FlushCtx *p = 
189d0 28 46 74 73 35 46 6c 75 73 68 43 74 78 2a 29 70  (Fts5FlushCtx*)p
189e0 43 74 78 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Ctx;.  int rc = 
189f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
18a00 20 69 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 41 70   i = 0;..  /* Ap
18a10 70 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 69  pend the rowid i
18a20 74 73 65 6c 66 20 2a 2f 0a 20 20 66 74 73 35 57  tself */.  fts5W
18a30 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
18a40 70 2d 3e 70 49 64 78 2c 20 26 70 2d 3e 77 72 69  p->pIdx, &p->wri
18a50 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 0a 20  ter, iRowid);.. 
18a60 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 73   /* Append the s
18a70 69 7a 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74  ize of the posit
18a80 69 6f 6e 20 6c 69 73 74 20 69 6e 20 62 79 74 65  ion list in byte
18a90 73 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65  s */.  fts5Write
18aa0 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e 74  AppendPoslistInt
18ab0 28 70 2d 3e 70 49 64 78 2c 20 26 70 2d 3e 77 72  (p->pIdx, &p->wr
18ac0 69 74 65 72 2c 20 6e 50 6f 73 6c 69 73 74 29 3b  iter, nPoslist);
18ad0 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20  ..  /* Copy the 
18ae0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 6f  position list to
18af0 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
18b00 65 6e 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ent */.  while( 
18b10 69 3c 6e 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20  i<nPoslist ){.  
18b20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
18b30 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
18b40 28 26 61 50 6f 73 6c 69 73 74 5b 69 5d 2c 20 69  (&aPoslist[i], i
18b50 56 61 6c 29 3b 0a 20 20 20 20 66 74 73 35 57 72  Val);.    fts5Wr
18b60 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
18b70 49 6e 74 28 70 2d 3e 70 49 64 78 2c 20 26 70 2d  Int(p->pIdx, &p-
18b80 3e 77 72 69 74 65 72 2c 20 69 56 61 6c 29 3b 0a  >writer, iVal);.
18b90 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
18ba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
18bb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
18bc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
18bd0 74 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61  table iHash to a
18be0 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a   new level-0 .**
18bf0 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b   segment on disk
18c00 2e 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68  . Also update th
18c10 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
18c20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
18c30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
18c40 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
18c50 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
18c60 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
18c70 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
18c80 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
18c90 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
18ca0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
18cb0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
18cc0 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73  FlushOneHash(Fts
18cd0 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69  5Index *p, int i
18ce0 48 61 73 68 2c 20 69 6e 74 20 2a 70 6e 4c 65 61  Hash, int *pnLea
18cf0 66 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  f){.  Fts5Struct
18d00 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
18d10 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e  int iSegid;.  in
18d20 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20  t pgnoLast = 0; 
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d40 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67  /* Last leaf pag
18d50 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d  e number in segm
18d60 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  ent */..  /* Obt
18d70 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20  ain a reference 
18d80 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  to the index str
18d90 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63  ucture and alloc
18da0 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e  ate a new segmen
18db0 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68  t-id.  ** for th
18dc0 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65  e new level-0 se
18dd0 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74  gment.  */.  pSt
18de0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
18df0 74 75 72 65 52 65 61 64 28 70 2c 20 69 48 61 73  tureRead(p, iHas
18e00 68 29 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66  h);.  iSegid = f
18e10 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
18e20 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20  (p, pStruct);.. 
18e30 20 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20   if( iSegid ){. 
18e40 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
18e50 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
18e60 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20   /* New segment 
18e70 77 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a  within pStruct *
18e80 2f 0a 20 20 20 20 69 6e 74 20 6e 48 65 69 67 68  /.    int nHeigh
18e90 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
18ea0 20 20 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66      /* Height of
18eb0 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 62 2d 74   new segment b-t
18ec0 72 65 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ree */.    int r
18ed0 63 3b 0a 20 20 20 20 46 74 73 35 46 6c 75 73 68  c;.    Fts5Flush
18ee0 43 74 78 20 63 74 78 3b 0a 0a 20 20 20 20 66 74  Ctx ctx;..    ft
18ef0 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
18f00 63 74 78 2e 77 72 69 74 65 72 2c 20 69 48 61 73  ctx.writer, iHas
18f10 68 2c 20 69 53 65 67 69 64 29 3b 0a 20 20 20 20  h, iSegid);.    
18f20 63 74 78 2e 70 49 64 78 20 3d 20 70 3b 0a 0a 20  ctx.pIdx = p;.. 
18f30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
18f40 74 73 35 48 61 73 68 49 74 65 72 61 74 65 28 20  ts5HashIterate( 
18f50 70 2d 3e 61 70 48 61 73 68 5b 69 48 61 73 68 5d  p->apHash[iHash]
18f60 2c 20 28 76 6f 69 64 2a 29 26 63 74 78 2c 20 0a  , (void*)&ctx, .
18f70 20 20 20 20 20 20 20 20 66 74 73 35 46 6c 75 73          fts5Flus
18f80 68 4e 65 77 54 65 72 6d 2c 20 66 74 73 35 46 6c  hNewTerm, fts5Fl
18f90 75 73 68 4e 65 77 45 6e 74 72 79 2c 20 66 74 73  ushNewEntry, fts
18fa0 35 46 6c 75 73 68 54 65 72 6d 44 6f 6e 65 0a 20  5FlushTermDone. 
18fb0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d     );.    if( p-
18fc0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
18fd0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
18fe0 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
18ff0 28 70 2c 20 26 63 74 78 2e 77 72 69 74 65 72 2c  (p, &ctx.writer,
19000 20 26 6e 48 65 69 67 68 74 2c 20 26 70 67 6e 6f   &nHeight, &pgno
19010 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  Last);..    /* E
19020 64 69 74 20 74 68 65 20 46 74 73 35 53 74 72 75  dit the Fts5Stru
19030 63 74 75 72 65 20 61 6e 64 20 77 72 69 74 65 20  cture and write 
19040 69 74 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  it back to the d
19050 61 74 61 62 61 73 65 2e 20 2a 2f 0a 20 20 20 20  atabase. */.    
19060 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  if( pStruct->nLe
19070 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  vel==0 ){.      
19080 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
19090 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70  Level(&p->rc, &p
190a0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20  Struct);.    }. 
190b0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
190c0 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
190d0 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20  rc, pStruct, 0, 
190e0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
190f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19100 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20  ){.      pSeg = 
19110 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
19120 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63  [0].aSeg[ pStruc
19130 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65  t->aLevel[0].nSe
19140 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65  g++ ];.      pSe
19150 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
19160 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e  id;.      pSeg->
19170 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
19180 74 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  t;.      pSeg->p
19190 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  gnoFirst = 1;.  
191a0 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61      pSeg->pgnoLa
191b0 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20  st = pgnoLast;. 
191c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
191d0 49 6e 64 65 78 57 6f 72 6b 28 70 2c 20 69 48 61  IndexWork(p, iHa
191e0 73 68 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67  sh, &pStruct, pg
191f0 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 53  noLast);.  fts5S
19200 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
19210 20 69 48 61 73 68 2c 20 70 53 74 72 75 63 74 29   iHash, pStruct)
19220 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
19230 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
19240 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  );.}../*.** Flus
19250 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  h any data store
19260 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
19270 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74  ry hash tables t
19280 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  o the database..
19290 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
192a0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74  ts5IndexFlush(Ft
192b0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46  s5Index *p){.  F
192c0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
192d0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
192e0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
192f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19300 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
19310 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e  erate through in
19320 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  dexes */.  int n
19330 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20 20 20  Leaf = 0;       
19340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19350 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 77  mber of leaves w
19360 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20  ritten */..  /* 
19370 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
19380 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64 20  already occured 
19390 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
193a0 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70  o-op. */.  if( p
193b0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
193c0 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61  || p->nPendingDa
193d0 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ta==0 ) return;.
193e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 48    assert( p->apH
193f0 61 73 68 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c 75  ash );..  /* Flu
19400 73 68 20 74 68 65 20 74 65 72 6d 73 20 61 6e 64  sh the terms and
19410 20 65 61 63 68 20 70 72 65 66 69 78 20 69 6e 64   each prefix ind
19420 65 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  ex to disk */.  
19430 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e  for(i=0; i<=pCon
19440 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b  fig->nPrefix; i+
19450 2b 29 7b 0a 20 20 20 20 66 74 73 35 46 6c 75 73  +){.    fts5Flus
19460 68 4f 6e 65 48 61 73 68 28 70 2c 20 69 2c 20 26  hOneHash(p, i, &
19470 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a 20 20 70 2d  nLeaf);.  }.  p-
19480 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20  >nPendingData = 
19490 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69  0;.}../*.** Indi
194a0 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73 75  cate that all su
194b0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
194c0 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
194d0 65 78 57 72 69 74 65 28 29 20 70 65 72 74 61 69  exWrite() pertai
194e0 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63 75  n.** to the docu
194f0 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64 20  ment with rowid 
19500 69 52 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20  iRowid..*/.void 
19510 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
19520 42 65 67 69 6e 57 72 69 74 65 28 46 74 73 35 49  BeginWrite(Fts5I
19530 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f  ndex *p, i64 iRo
19540 77 69 64 29 7b 0a 20 20 69 66 28 20 69 52 6f 77  wid){.  if( iRow
19550 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77  id<=p->iWriteRow
19560 69 64 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  id ){.    fts5In
19570 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d  dexFlush(p);.  }
19580 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  .  p->iWriteRowi
19590 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  d = iRowid;.}../
195a0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61  *.** Commit data
195b0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
195c0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
195d0 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20  xSync(Fts5Index 
195e0 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  *p, int bCommit)
195f0 7b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  {.  fts5IndexFlu
19600 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f  sh(p);.  if( bCo
19610 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65  mmit ) fts5Close
19620 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74  Reader(p);.  ret
19630 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a  urn p->rc;.}../*
19640 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20  .** Discard any 
19650 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
19660 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
19670 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74  h tables. Do not
19680 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20   write it.** to 
19690 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
196a0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75  ditionally, assu
196b0 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  me that the cont
196c0 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61  ents of the %_da
196d0 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20  ta.** table may 
196e0 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20  have changed on 
196f0 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d  disk. So any in-
19700 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66  memory caches of
19710 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f   %_data .** reco
19720 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61  rds must be inva
19730 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  lidated..*/.int 
19740 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
19750 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64  Rollback(Fts5Ind
19760 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c  ex *p){.  fts5Cl
19770 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
19780 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
19790 44 61 74 61 28 70 29 3b 0a 20 20 72 65 74 75 72  Data(p);.  retur
197a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
197b0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
197c0 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c   Fts5Index handl
197d0 65 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74  e. If the bCreat
197e0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  e argument is tr
197f0 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e  ue, create.** an
19800 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
19810 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61   underlying %_da
19820 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
19830 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  If successful, s
19840 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20  et *pp to point 
19850 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  to the new objec
19860 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
19870 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72  ITE_OK..** Other
19880 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f  wise, set *pp to
19890 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e   NULL and return
198a0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
198b0 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   code..*/.int sq
198c0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
198d0 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  en(.  Fts5Config
198e0 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e   *pConfig, .  in
198f0 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74  t bCreate, .  Ft
19900 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20  s5Index **pp,.  
19910 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
19920 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19930 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65  E_OK;.  Fts5Inde
19940 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  x *p;           
19950 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f          /* New o
19960 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20  bject */..  *pp 
19970 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78  = p = (Fts5Index
19980 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
19990 28 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65  (sizeof(Fts5Inde
199a0 78 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20  x));.  if( !p ) 
199b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
199c0 4d 45 4d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  MEM;..  memset(p
199d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
199e0 49 6e 64 65 78 29 29 3b 0a 20 20 70 2d 3e 70 43  Index));.  p->pC
199f0 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b  onfig = pConfig;
19a00 0a 20 20 70 2d 3e 70 67 73 7a 20 3d 20 31 30 30  .  p->pgsz = 100
19a10 30 3b 0a 20 20 70 2d 3e 6e 4d 69 6e 4d 65 72 67  0;.  p->nMinMerg
19a20 65 20 3d 20 46 54 53 35 5f 4d 49 4e 5f 4d 45 52  e = FTS5_MIN_MER
19a30 47 45 3b 0a 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e  GE;.  p->nWorkUn
19a40 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55  it = FTS5_WORK_U
19a50 4e 49 54 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65  NIT;.  p->nMaxPe
19a60 6e 64 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34  ndingData = 1024
19a70 2a 31 30 32 34 3b 0a 20 20 70 2d 3e 7a 44 61 74  *1024;.  p->zDat
19a80 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aTbl = sqlite3_m
19a90 70 72 69 6e 74 66 28 22 25 73 5f 64 61 74 61 22  printf("%s_data"
19aa0 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
19ab0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 44 61 74  );.  if( p->zDat
19ac0 61 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  aTbl==0 ){.    r
19ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
19ae0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 43  ;.  }else if( bC
19af0 72 65 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74  reate ){.    int
19b00 20 69 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75   i;.    Fts5Stru
19b10 63 74 75 72 65 20 73 3b 0a 20 20 20 20 72 63 20  cture s;.    rc 
19b20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65  = sqlite3Fts5Cre
19b30 61 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20  ateTable(.      
19b40 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61    pConfig, "data
19b50 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20 50  ", "id INTEGER P
19b60 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63  RIMARY KEY, bloc
19b70 6b 20 42 4c 4f 42 22 2c 20 70 7a 45 72 72 0a 20  k BLOB", pzErr. 
19b80 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
19b90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19ba0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 2c 20       memset(&s, 
19bb0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
19bc0 72 75 63 74 75 72 65 29 29 3b 0a 20 20 20 20 20  ructure));.     
19bd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e   for(i=0; i<pCon
19be0 66 69 67 2d 3e 6e 50 72 65 66 69 78 2b 31 3b 20  fig->nPrefix+1; 
19bf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74  i++){.        ft
19c00 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
19c10 28 70 2c 20 69 2c 20 26 73 29 3b 0a 20 20 20 20  (p, i, &s);.    
19c20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
19c30 2d 3e 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->rc;.    }.    
19c40 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
19c50 53 65 74 41 76 65 72 61 67 65 73 28 70 2c 20 28  SetAverages(p, (
19c60 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29  const u8*)"", 0)
19c70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  ;.  }..  if( rc 
19c80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  ){.    sqlite3Ft
19c90 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 70 2c 20  s5IndexClose(p, 
19ca0 30 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  0);.    *pp = 0;
19cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19cc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
19cd0 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64   a handle opened
19ce0 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
19cf0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
19d00 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a 2a  s5IndexOpen()..*
19d10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
19d20 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73 35  5IndexClose(Fts5
19d30 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44  Index *p, int bD
19d40 65 73 74 72 6f 79 29 7b 0a 20 20 69 6e 74 20 72  estroy){.  int r
19d50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19d60 20 69 66 28 20 62 44 65 73 74 72 6f 79 20 29 7b   if( bDestroy ){
19d70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19d80 33 46 74 73 35 44 72 6f 70 54 61 62 6c 65 28 70  3Fts5DropTable(p
19d90 2d 3e 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61  ->pConfig, "data
19da0 22 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ");.  }.  assert
19db0 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
19dc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
19dd0 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72  alize(p->pWriter
19de0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  );.  sqlite3_fin
19df0 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65  alize(p->pDelete
19e00 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 48  r);.  if( p->apH
19e10 61 73 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ash ){.    int i
19e20 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19e30 3c 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50  <=p->pConfig->nP
19e40 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  refix; i++){.   
19e50 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
19e60 73 68 46 72 65 65 28 70 2d 3e 61 70 48 61 73 68  shFree(p->apHash
19e70 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
19e80 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
19e90 61 70 48 61 73 68 29 3b 0a 20 20 7d 0a 20 20 73  apHash);.  }.  s
19ea0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
19eb0 44 61 74 61 54 62 6c 29 3b 0a 20 20 73 71 6c 69  DataTbl);.  sqli
19ec0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
19ed0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19ee0 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70  ** Return a simp
19ef0 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75  le checksum valu
19f00 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61  e based on the a
19f10 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  rguments..*/.sta
19f20 74 69 63 20 75 36 34 20 66 74 73 35 49 6e 64 65  tic u64 fts5Inde
19f30 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69  xEntryCksum(.  i
19f40 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e  64 iRowid, .  in
19f50 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69  t iCol, .  int i
19f60 50 6f 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  Pos, .  const ch
19f70 61 72 20 2a 70 54 65 72 6d 2c 20 0a 20 20 69 6e  ar *pTerm, .  in
19f80 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74  t nTerm.){.  int
19f90 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20   i;.  u64 ret = 
19fa0 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d  iRowid;.  ret +=
19fb0 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c   (ret<<3) + iCol
19fc0 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
19fd0 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20 66 6f  <3) + iPos;.  fo
19fe0 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
19ff0 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74  i++) ret += (ret
1a000 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b  <<3) + pTerm[i];
1a010 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
1a020 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74  ../*.** Calculat
1a030 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
1a040 68 65 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20  hecksum that is 
1a050 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69  the XOR of the i
1a060 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68  ndex entry.** ch
1a070 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e  ecksum of all en
1a080 74 72 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64  tries that would
1a090 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 62 79   be generated by
1a0a0 20 74 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69   the token speci
1a0b0 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66  fied.** by the f
1a0c0 69 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73  inal 5 arguments
1a0d0 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  ..*/.u64 sqlite3
1a0e0 46 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a  Fts5IndexCksum(.
1a0f0 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
1a100 6f 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20  onfig,          
1a110 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
1a120 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  on object */.  i
1a130 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20  64 iRowid,      
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a150 2a 20 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20  * Document term 
1a160 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20  appears in */.  
1a170 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20  int iCol,       
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a190 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61  /* Column term a
1a1a0 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69  ppears in */.  i
1a1b0 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a1d0 2a 20 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20  * Position term 
1a1e0 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20  appears in */.  
1a1f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72  const char *pTer
1a200 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20  m, int nTerm    
1a210 2f 2a 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20  /* Term at iPos 
1a220 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20  */.){.  u64 ret 
1a230 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1a240 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1a250 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  n value */.  int
1a260 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   iIdx;          
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a280 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
1a290 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f  rough indexes */
1a2a0 0a 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20  ..  for(iIdx=0; 
1a2b0 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
1a2c0 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b  Prefix; iIdx++){
1a2d0 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 28 69  .    int n = ((i
1a2e0 49 64 78 3d 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx==pConfig->nP
1a2f0 72 65 66 69 78 29 20 3f 20 6e 54 65 72 6d 20 3a  refix) ? nTerm :
1a300 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69   pConfig->aPrefi
1a310 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66  x[iIdx]);.    if
1a320 28 20 6e 3c 3d 6e 54 65 72 6d 20 29 7b 0a 20 20  ( n<=nTerm ){.  
1a330 20 20 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49      ret ^= fts5I
1a340 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69  ndexEntryCksum(i
1a350 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
1a360 73 2c 20 70 54 65 72 6d 2c 20 6e 29 3b 0a 20 20  s, pTerm, n);.  
1a370 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1a380 6e 20 72 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  n ret;.}..static
1a390 20 76 6f 69 64 20 66 74 73 35 42 74 72 65 65 49   void fts5BtreeI
1a3a0 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
1a3b0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20  ndex *p, .  int 
1a3c0 69 49 64 78 2c 0a 20 20 46 74 73 35 53 74 72 75  iIdx,.  Fts5Stru
1a3d0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
1a3e0 65 67 2c 20 0a 20 20 46 74 73 35 42 74 72 65 65  eg, .  Fts5Btree
1a3f0 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20  Iter *pIter.){. 
1a400 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
1a410 74 20 69 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  t i;.  nByte = s
1a420 69 7a 65 6f 66 28 70 49 74 65 72 2d 3e 61 4c 76  izeof(pIter->aLv
1a430 6c 5b 30 5d 29 20 2a 20 28 70 53 65 67 2d 3e 6e  l[0]) * (pSeg->n
1a440 48 65 69 67 68 74 2d 31 29 3b 0a 20 20 6d 65 6d  Height-1);.  mem
1a450 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
1a460 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
1a470 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70   pIter->nLvl = p
1a480 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 0a  Seg->nHeight-1;.
1a490 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20    pIter->iIdx = 
1a4a0 69 49 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 70  iIdx;.  pIter->p
1a4b0 20 3d 20 70 3b 0a 20 20 70 49 74 65 72 2d 3e 70   = p;.  pIter->p
1a4c0 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 69 66  Seg = pSeg;.  if
1a4d0 28 20 6e 42 79 74 65 20 26 26 20 70 2d 3e 72 63  ( nByte && p->rc
1a4e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a4f0 20 20 20 70 49 74 65 72 2d 3e 61 4c 76 6c 20 3d     pIter->aLvl =
1a500 20 28 46 74 73 35 42 74 72 65 65 49 74 65 72 4c   (Fts5BtreeIterL
1a510 65 76 65 6c 2a 29 66 74 73 35 49 64 78 4d 61 6c  evel*)fts5IdxMal
1a520 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20  loc(p, nByte);. 
1a530 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d   }.  for(i=0; p-
1a540 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1a550 26 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b  & i<pIter->nLvl;
1a560 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69   i++){.    i64 i
1a570 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
1a580 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c  MENT_ROWID(iIdx,
1a590 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69   pSeg->iSegid, i
1a5a0 2b 31 2c 20 31 29 3b 0a 20 20 20 20 46 74 73 35  +1, 1);.    Fts5
1a5b0 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
1a5c0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e   pIter->aLvl[i].
1a5d0 70 44 61 74 61 20 3d 20 70 44 61 74 61 20 3d 20  pData = pData = 
1a5e0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1a5f0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28  iRowid);.    if(
1a600 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
1a610 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
1a620 28 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61  (pData->p, pData
1a630 2d 3e 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c 76  ->n, &pIter->aLv
1a640 6c 5b 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a 20  l[i].s);.    }. 
1a650 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d   }..  if( pIter-
1a660 3e 6e 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72  >nLvl==0 || p->r
1a670 63 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  c ){.    pIter->
1a680 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 49  bEof = 1;.    pI
1a690 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53 65  ter->iLeaf = pSe
1a6a0 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d  g->pgnoLast;.  }
1a6b0 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
1a6c0 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d  >nEmpty = pIter-
1a6d0 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74  >aLvl[0].s.nEmpt
1a6e0 79 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  y;.    pIter->iL
1a6f0 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  eaf = pIter->aLv
1a700 6c 5b 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20  l[0].s.iChild;. 
1a710 20 20 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78     pIter->bDlidx
1a720 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30   = pIter->aLvl[0
1a730 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a  ].s.bDlidx;.  }.
1a740 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1a750 74 73 35 42 74 72 65 65 49 74 65 72 4e 65 78 74  ts5BtreeIterNext
1a760 28 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a  (Fts5BtreeIter *
1a770 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e  pIter){.  Fts5In
1a780 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e  dex *p = pIter->
1a790 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  p;.  int i;..  a
1a7a0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45  ssert( pIter->bE
1a7b0 6f 66 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  of==0 && pIter->
1a7c0 61 4c 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61 20  aLvl[0].s.aData 
1a7d0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1a7e0 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20 70  pIter->nLvl && p
1a7f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  ->rc==SQLITE_OK;
1a800 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42   i++){.    Fts5B
1a810 74 72 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70  treeIterLevel *p
1a820 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
1a830 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e  vl[i];.    fts5N
1a840 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e  odeIterNext(&p->
1a850 72 63 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20  rc, &pLvl->s);. 
1a860 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e 61     if( pLvl->s.a
1a870 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74  Data ){.      ft
1a880 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
1a890 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
1a8a0 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e  , pLvl->s.term.n
1a8b0 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70  , pLvl->s.term.p
1a8c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a8d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a8e0 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65   fts5NodeIterFre
1a8f0 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20  e(&pLvl->s);.   
1a900 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
1a910 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b  se(pLvl->pData);
1a920 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61  .      pLvl->pDa
1a930 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ta = 0;.    }.  
1a940 7d 0a 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72  }.  if( i==pIter
1a950 2d 3e 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63 20  ->nLvl || p->rc 
1a960 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45  ){.    pIter->bE
1a970 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
1a980 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20  .    int iSegid 
1a990 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69  = pIter->pSeg->i
1a9a0 53 65 67 69 64 3b 0a 20 20 20 20 66 6f 72 28 69  Segid;.    for(i
1a9b0 2d 2d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  --; i>=0; i--){.
1a9c0 20 20 20 20 20 20 46 74 73 35 42 74 72 65 65 49        Fts5BtreeI
1a9d0 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  terLevel *pLvl =
1a9e0 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d   &pIter->aLvl[i]
1a9f0 3b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  ;.      i64 iRow
1aa00 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
1aa10 54 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69  T_ROWID(pIter->i
1aa20 49 64 78 2c 69 53 65 67 69 64 2c 69 2b 31 2c 70  Idx,iSegid,i+1,p
1aa30 4c 76 6c 5b 31 5d 2e 73 2e 69 43 68 69 6c 64 29  Lvl[1].s.iChild)
1aa40 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44  ;.      pLvl->pD
1aa50 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
1aa60 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20  ad(p, iRowid);. 
1aa70 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
1aa80 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
1aa90 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
1aaa0 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 2c  (pLvl->pData->p,
1aab0 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 6e 2c   pLvl->pData->n,
1aac0 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20   &pLvl->s);.    
1aad0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1aae0 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d   pIter->nEmpty =
1aaf0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
1ab00 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 70 49 74 65  s.nEmpty;.  pIte
1ab10 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65  r->bDlidx = pIte
1ab20 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c  r->aLvl[0].s.bDl
1ab30 69 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  idx;.  pIter->iL
1ab40 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  eaf = pIter->aLv
1ab50 6c 5b 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20  l[0].s.iChild;. 
1ab60 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1ab70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
1ab80 65 72 2d 3e 62 45 6f 66 20 29 3b 0a 7d 0a 0a 73  er->bEof );.}..s
1ab90 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 42  tatic void fts5B
1aba0 74 72 65 65 49 74 65 72 46 72 65 65 28 46 74 73  treeIterFree(Fts
1abb0 35 42 74 72 65 65 49 74 65 72 20 2a 70 49 74 65  5BtreeIter *pIte
1abc0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  r){.  int i;.  f
1abd0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
1abe0 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
1abf0 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65   Fts5BtreeIterLe
1ac00 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  vel *pLvl = &pIt
1ac10 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  er->aLvl[i];.   
1ac20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65   fts5NodeIterFre
1ac30 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20  e(&pLvl->s);.   
1ac40 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
1ac50 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61   ){.      fts5Da
1ac60 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e  taRelease(pLvl->
1ac70 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 70 4c  pData);.      pL
1ac80 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20  vl->pData = 0;. 
1ac90 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1aca0 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61  e3_free(pIter->a
1acb0 4c 76 6c 29 3b 0a 20 20 66 74 73 35 42 75 66 66  Lvl);.  fts5Buff
1acc0 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74  erFree(&pIter->t
1acd0 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  erm);.}../*.** T
1ace0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1acf0 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e  purely an intern
1ad00 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73  al test. It does
1ad10 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
1ad20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74  to .** FTS funct
1ad30 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65  ionality, or eve
1ad40 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  n the integrity-
1ad50 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61  check, in any wa
1ad60 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  y..**.** Instead
1ad70 2c 20 69 74 20 74 65 73 74 73 20 74 68 61 74 20  , it tests that 
1ad80 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20  the same set of 
1ad90 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69  pgno/rowid combi
1ada0 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20  nations are .** 
1adb0 76 69 73 69 74 65 64 20 72 65 67 61 72 64 6c 65  visited regardle
1adc0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
1add0 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  e doclist-index 
1ade0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
1adf0 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69 49 64 78  rameters.** iIdx
1ae00 2f 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73  /iSegid/iLeaf is
1ae10 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72   iterated in for
1ae20 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73 65  wards or reverse
1ae30 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 69 66 64 65   order..*/.#ifde
1ae40 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
1ae50 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
1ae60 6c 69 64 78 49 74 65 72 54 65 73 74 52 65 76 65  lidxIterTestReve
1ae70 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rse(.  Fts5Index
1ae80 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78   *p, .  int iIdx
1ae90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1aea0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1aeb0 20 74 6f 20 6c 6f 61 64 20 64 6f 63 6c 69 73 74   to load doclist
1aec0 2d 69 6e 64 65 78 20 66 72 6f 6d 20 2a 2f 0a 20  -index from */. 
1aed0 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74   /* Segment id t
1af00 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o load from */. 
1af10 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20   int iLeaf      
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af30 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74   /* Load doclist
1af40 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20  -index for this 
1af50 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  leaf */.){.  Fts
1af60 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
1af70 64 78 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 6b  dx = 0;.  i64 ck
1af80 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 69 36 34  sum1 = 13;.  i64
1af90 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20   cksum2 = 13;.. 
1afa0 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74   for(fts5DlidxIt
1afb0 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64  erInit(p, 0, iId
1afc0 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66  x, iSegid, iLeaf
1afd0 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  , &pDlidx);.    
1afe0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
1aff0 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
1b000 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
1b010 78 49 74 65 72 4e 65 78 74 28 70 44 6c 69 64 78  xIterNext(pDlidx
1b020 29 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ).  ){.    asser
1b030 74 28 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66  t( pDlidx->iLeaf
1b040 50 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20  Pgno>iLeaf );.  
1b050 20 20 63 6b 73 75 6d 31 20 3d 20 28 63 6b 73 75    cksum1 = (cksu
1b060 6d 31 20 5e 20 28 20 28 69 36 34 29 28 70 44 6c  m1 ^ ( (i64)(pDl
1b070 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20  idx->iLeafPgno) 
1b080 3c 3c 20 33 32 20 29 29 3b 0a 20 20 20 20 63 6b  << 32 ));.    ck
1b090 73 75 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e  sum1 = (cksum1 ^
1b0a0 20 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29   pDlidx->iRowid)
1b0b0 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64  ;.  }.  fts5Dlid
1b0c0 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
1b0d0 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b  );.  pDlidx = 0;
1b0e0 0a 0a 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64  ..  for(fts5Dlid
1b0f0 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20  xIterInit(p, 1, 
1b100 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c  iIdx, iSegid, iL
1b110 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20  eaf, &pDlidx);. 
1b120 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1b130 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
1b140 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44  ==0;.      fts5D
1b150 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 44 6c  lidxIterPrev(pDl
1b160 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 61 73  idx).  ){.    as
1b170 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 69 4c  sert( pDlidx->iL
1b180 65 61 66 50 67 6e 6f 3e 69 4c 65 61 66 20 29 3b  eafPgno>iLeaf );
1b190 0a 20 20 20 20 63 6b 73 75 6d 32 20 3d 20 28 63  .    cksum2 = (c
1b1a0 6b 73 75 6d 32 20 5e 20 28 20 28 69 36 34 29 28  ksum2 ^ ( (i64)(
1b1b0 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e  pDlidx->iLeafPgn
1b1c0 6f 29 20 3c 3c 20 33 32 20 29 29 3b 0a 20 20 20  o) << 32 ));.   
1b1d0 20 63 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d   cksum2 = (cksum
1b1e0 32 20 5e 20 70 44 6c 69 64 78 2d 3e 69 52 6f 77  2 ^ pDlidx->iRow
1b1f0 69 64 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44  id);.  }.  fts5D
1b200 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
1b210 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d  idx);.  pDlidx =
1b220 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
1b230 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
1b240 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20  ksum1!=cksum2 ) 
1b250 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1b260 52 55 50 54 3b 20 0a 7d 0a 23 65 6c 73 65 0a 23  RUPT; .}.#else.#
1b270 20 64 65 66 69 6e 65 20 66 74 73 35 44 6c 69 64   define fts5Dlid
1b280 78 49 74 65 72 54 65 73 74 52 65 76 65 72 73 65  xIterTestReverse
1b290 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  (w,x,y,z).#endif
1b2a0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1b2b0 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
1b2c0 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20  CheckSegment(.  
1b2d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1b300 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1b310 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
1b320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b330 6e 64 65 78 20 74 68 61 74 20 70 53 65 67 20 69  ndex that pSeg i
1b340 73 20 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20  s a part of */. 
1b350 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
1b360 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20  gment *pSeg     
1b370 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63   /* Segment to c
1b380 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f  heck internal co
1b390 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a  nsistency */.){.
1b3a0 20 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20    Fts5BtreeIter 
1b3b0 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  iter;           
1b3c0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
1b3d0 72 61 74 65 20 74 68 72 6f 75 67 68 20 62 2d 74  rate through b-t
1b3e0 72 65 65 20 68 69 65 72 61 72 63 68 79 20 2a 2f  ree hierarchy */
1b3f0 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74  ..  /* Iterate t
1b400 68 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65  hrough the b-tre
1b410 65 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f  e hierarchy.  */
1b420 0a 20 20 66 6f 72 28 66 74 73 35 42 74 72 65 65  .  for(fts5Btree
1b430 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78  IterInit(p, iIdx
1b440 2c 20 70 53 65 67 2c 20 26 69 74 65 72 29 3b 0a  , pSeg, &iter);.
1b450 20 20 20 20 20 20 69 74 65 72 2e 62 45 6f 66 3d        iter.bEof=
1b460 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 42 74  =0;.      fts5Bt
1b470 72 65 65 49 74 65 72 4e 65 78 74 28 26 69 74 65  reeIterNext(&ite
1b480 72 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  r).  ){.    i64 
1b490 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  iRow;           
1b4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
1b4b0 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  id for this leaf
1b4c0 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61   */.    Fts5Data
1b4d0 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
1b4e0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
1b4f0 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20  r this leaf */. 
1b500 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20     int iOff;    
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
1b530 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66  rst term on leaf
1b540 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20   */.    int i;  
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b560 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1b570 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1b580 20 65 6d 70 74 79 20 6c 65 61 76 65 73 20 2a 2f   empty leaves */
1b590 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
1b5a0 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e  leaf in question
1b5b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1b5c0 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74  n trimmed from t
1b5d0 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20  he segment, .   
1b5e0 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20   ** ignore this 
1b5f0 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74  b-tree entry. Ot
1b600 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74  herwise, load it
1b610 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f   into memory. */
1b620 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e 69 4c  .    if( iter.iL
1b630 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  eaf<pSeg->pgnoFi
1b640 72 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rst ) continue;.
1b650 20 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f      iRow = FTS5_
1b660 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1b670 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  dx, pSeg->iSegid
1b680 2c 20 30 2c 20 69 74 65 72 2e 69 4c 65 61 66 29  , 0, iter.iLeaf)
1b690 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74  ;.    pLeaf = ft
1b6a0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
1b6b0 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  ow);.    if( pLe
1b6c0 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a  af==0 ) break;..
1b6d0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
1b6e0 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61  t the leaf conta
1b6f0 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
1b700 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20   term, and that 
1b710 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20  it is equal.    
1b720 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20  ** to or larger 
1b730 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b  than the split-k
1b740 65 79 20 69 6e 20 69 74 65 72 2e 74 65 72 6d 2e  ey in iter.term.
1b750 20 20 2a 2f 0a 20 20 20 20 69 4f 66 66 20 3d 20    */.    iOff = 
1b760 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61  fts5GetU16(&pLea
1b770 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 69 66  f->p[2]);.    if
1b780 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  ( iOff==0 ){.   
1b790 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
1b7a0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c  CORRUPT;.    }el
1b7b0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  se{.      int nT
1b7c0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
1b7d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1b7e0 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e   term on leaf in
1b7f0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
1b800 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20 20 20  int res;        
1b810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b820 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72  omparison of ter
1b830 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20  m and split-key 
1b840 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  */.      iOff +=
1b850 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c   getVarint32(&pL
1b860 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54  eaf->p[iOff], nT
1b870 65 72 6d 29 3b 0a 20 20 20 20 20 20 72 65 73 20  erm);.      res 
1b880 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d  = memcmp(&pLeaf-
1b890 3e 70 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74  >p[iOff], iter.t
1b8a0 65 72 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d  erm.p, MIN(nTerm
1b8b0 2c 20 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b  , iter.term.n));
1b8c0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
1b8d0 30 20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20  0 ) res = nTerm 
1b8e0 2d 20 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20  - iter.term.n;. 
1b8f0 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
1b900 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
1b910 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
1b920 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b930 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1b940 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66  e(pLeaf);.    if
1b950 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
1b960 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65  ..    /* Now che
1b970 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ck that the iter
1b980 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66  .nEmpty leaves f
1b990 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72  ollowing the cur
1b9a0 72 65 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a  rent leaf.    **
1b9b0 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28   (a) exist and (
1b9c0 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  b) contain no te
1b9d0 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  rms. */.    for(
1b9e0 69 3d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=1; p->rc==SQLI
1b9f0 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72  TE_OK && i<=iter
1ba00 2e 6e 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20  .nEmpty; i++){. 
1ba10 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
1ba20 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f  5DataRead(p, iRo
1ba30 77 2b 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  w+i);.      if( 
1ba40 70 4c 65 61 66 20 26 26 20 30 21 3d 66 74 73 35  pLeaf && 0!=fts5
1ba50 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
1ba60 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [2]) ){.        
1ba70 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1ba80 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RUPT;.      }.  
1ba90 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
1baa0 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  ase(pLeaf);.    
1bab0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1bac0 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
1bad0 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61  index, check tha
1bae0 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74  t it looks right
1baf0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65  . */.    if( ite
1bb00 72 2e 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  r.bDlidx ){.    
1bb10 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
1bb20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a  *pDlidx = 0;  /*
1bb30 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   For iterating t
1bb40 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69  hrough doclist i
1bb50 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
1bb60 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 74  t iPrevLeaf = it
1bb70 65 72 2e 69 4c 65 61 66 3b 0a 20 20 20 20 20 20  er.iLeaf;.      
1bb80 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 53 65  int iSegid = pSe
1bb90 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20  g->iSegid;.     
1bba0 20 69 6e 74 20 69 50 67 3b 0a 20 20 20 20 20 20   int iPg;.      
1bbb0 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20  i64 iKey;..     
1bbc0 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74   for(fts5DlidxIt
1bbd0 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64  erInit(p, 0, iId
1bbe0 78 2c 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e  x, iSegid, iter.
1bbf0 69 4c 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b  iLeaf, &pDlidx);
1bc00 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
1bc10 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
1bc20 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
1bc30 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1bc40 65 72 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20  erNext(pDlidx). 
1bc50 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20       ){..       
1bc60 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f   /* Check any ro
1bc70 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74  wid-less pages t
1bc80 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65  hat occur before
1bc90 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1bca0 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  f. */.        fo
1bcb0 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b  r(iPg=iPrevLeaf+
1bcc0 31 3b 20 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69  1; iPg<pDlidx->i
1bcd0 4c 65 61 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29  LeafPgno; iPg++)
1bce0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 79  {.          iKey
1bcf0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1bd00 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65 67  ROWID(iIdx, iSeg
1bd10 69 64 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20  id, 0, iPg);.   
1bd20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
1bd30 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
1bd40 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1bd50 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
1bd60 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
1bd70 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
1bd80 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63  p[0])!=0 ) p->rc
1bd90 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
1bda0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1bdb0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
1bdc0 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  af);.          }
1bdd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bde0 20 20 20 69 50 72 65 76 4c 65 61 66 20 3d 20 70     iPrevLeaf = p
1bdf0 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f  Dlidx->iLeafPgno
1be00 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  ;..        /* Ch
1be10 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61  eck that the lea
1be20 66 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64  f page indicated
1be30 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72   by the iterator
1be40 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20   really does.   
1be50 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20       ** contain 
1be60 74 68 65 20 72 6f 77 69 64 20 73 75 67 67 65 73  the rowid sugges
1be70 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e  ted by the same.
1be80 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79   */.        iKey
1be90 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1bea0 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65 67  ROWID(iIdx, iSeg
1beb0 69 64 2c 20 30 2c 20 70 44 6c 69 64 78 2d 3e 69  id, 0, pDlidx->i
1bec0 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
1bed0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1bee0 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
1bef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
1bf00 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1bf10 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
1bf20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
1bf30 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  dOff = fts5GetU1
1bf40 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b  6(&pLeaf->p[0]);
1bf50 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 56 61  .          getVa
1bf60 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
1bf70 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a  RowidOff], (u64*
1bf80 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  )&iRowid);.     
1bf90 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21       if( iRowid!
1bfa0 3d 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20  =pDlidx->iRowid 
1bfb0 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
1bfc0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
1bfd0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1bfe0 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
1bff0 20 20 7d 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20    }..      }..  
1c000 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65      for(iPg=iPre
1c010 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69  vLeaf+1; iPg<=(i
1c020 74 65 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72  ter.iLeaf + iter
1c030 2e 6e 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29  .nEmpty); iPg++)
1c040 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  {.        iKey =
1c050 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1c060 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1c070 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20  , 0, iPg);.     
1c080 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1c090 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
1c0a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
1c0b0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
1c0c0 20 69 66 28 20 66 74 73 35 47 65 74 55 31 36 28   if( fts5GetU16(
1c0d0 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30  &pLeaf->p[0])!=0
1c0e0 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
1c0f0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
1c100 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
1c110 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
1c120 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1c130 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
1c140 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
1c150 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1c160 65 72 54 65 73 74 52 65 76 65 72 73 65 28 70 2c  erTestReverse(p,
1c170 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69   iIdx, iSegid, i
1c180 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20  ter.iLeaf);.    
1c190 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
1c1a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1c1b0 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65   iter.iLeaf!=pSe
1c1c0 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
1c1d0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
1c1e0 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20  CORRUPT;.  }..  
1c1f0 66 74 73 35 42 74 72 65 65 49 74 65 72 46 72 65  fts5BtreeIterFre
1c200 65 28 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  e(&iter);.}../*.
1c210 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20  ** Run internal 
1c220 63 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65  checks to ensure
1c230 20 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e   that the FTS in
1c240 64 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72  dex (a) is inter
1c250 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73  nally .** consis
1c260 74 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  tent and (b) con
1c270 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
1c280 72 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20  r which the XOR 
1c290 6f 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  of the checksums
1c2a0 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65  .** as calculate
1c2b0 64 20 62 79 20 66 74 73 35 49 6e 64 65 78 45 6e  d by fts5IndexEn
1c2c0 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b  tryCksum() is ck
1c2d0 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  sum..**.** Retur
1c2e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1c2f0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69   if any of the i
1c300 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66  nternal checks f
1c310 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a  ail, or if the.*
1c320 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20  * checksum does 
1c330 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72  not match. Retur
1c340 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
1c350 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73 20 77  ll checks pass w
1c360 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c  ithout.** error,
1c370 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53   or some other S
1c380 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1c390 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f   if another erro
1c3a0 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20  r (e.g. OOM).** 
1c3b0 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
1c3c0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49  qlite3Fts5IndexI
1c3d0 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74  ntegrityCheck(Ft
1c3e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20  s5Index *p, u64 
1c3f0 63 6b 73 75 6d 29 7b 0a 20 20 46 74 73 35 43 6f  cksum){.  Fts5Co
1c400 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
1c410 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e  p->pConfig;.  in
1c420 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20  t iIdx;         
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c440 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
1c450 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73   through indexes
1c460 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c480 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1c490 63 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20 63 6b  code */.  u64 ck
1c4a0 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20  sum2 = 0;       
1c4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
1c4c0 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63  cksum based on c
1c4d0 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78  ontents of index
1c4e0 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  es */..  /* Chec
1c4f0 6b 20 74 68 61 74 20 74 68 65 20 63 68 65 63 6b  k that the check
1c500 73 75 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78  sum of the index
1c510 20 6d 61 74 63 68 65 73 20 74 68 65 20 61 72 67   matches the arg
1c520 75 6d 65 6e 74 20 63 68 65 63 6b 73 75 6d 20 2a  ument checksum *
1c530 2f 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20  /.  for(iIdx=0; 
1c540 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
1c550 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b  Prefix; iIdx++){
1c560 0a 20 20 20 20 46 74 73 35 4d 75 6c 74 69 53 65  .    Fts5MultiSe
1c570 67 49 74 65 72 20 2a 70 49 74 65 72 3b 0a 20 20  gIter *pIter;.  
1c580 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1c590 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
1c5a0 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20  tructureRead(p, 
1c5b0 69 49 64 78 29 3b 0a 20 20 20 20 66 6f 72 28 66  iIdx);.    for(f
1c5c0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
1c5d0 70 2c 20 70 53 74 72 75 63 74 2c 20 69 49 64 78  p, pStruct, iIdx
1c5e0 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30  , 0, 0, 0, -1, 0
1c5f0 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
1c600 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1c610 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30  Eof(p, pIter)==0
1c620 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
1c630 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
1c640 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 20 20  Iter, 0, 0).    
1c650 29 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73  ){.      Fts5Pos
1c660 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20  Iter sPos;      
1c670 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1c680 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1c690 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  position list */
1c6a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20  .      int n;   
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6c0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
1c6d0 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
1c6e0 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
1c6f0 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
1c700 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
1c710 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68     char *z = (ch
1c720 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65  ar*)fts5MultiIte
1c730 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29  rTerm(pIter, &n)
1c740 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73  ;..      for(fts
1c750 35 50 6f 73 49 74 65 72 49 6e 69 74 28 70 2c 20  5PosIterInit(p, 
1c760 70 49 74 65 72 2c 20 26 73 50 6f 73 29 3b 0a 20  pIter, &sPos);. 
1c770 20 20 20 20 20 20 20 20 20 66 74 73 35 50 6f 73           fts5Pos
1c780 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f 73  IterEof(p, &sPos
1c790 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )==0;.          
1c7a0 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78 74 28  fts5PosIterNext(
1c7b0 70 2c 20 26 73 50 6f 73 29 0a 20 20 20 20 20 20  p, &sPos).      
1c7c0 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  ){.        cksum
1c7d0 32 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  2 ^= fts5IndexEn
1c7e0 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
1c7f0 20 73 50 6f 73 2e 69 43 6f 6c 2c 20 73 50 6f 73   sPos.iCol, sPos
1c800 2e 69 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a 23 69  .iPos, z, n);.#i
1c810 66 20 30 0a 20 20 20 20 20 20 20 20 66 70 72 69  f 0.        fpri
1c820 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72 6f 77  ntf(stdout, "row
1c830 69 64 3d 25 64 20 22 2c 20 28 69 6e 74 29 69 52  id=%d ", (int)iR
1c840 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
1c850 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
1c860 74 65 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e 2c 20  term=%.*s ", n, 
1c870 7a 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  z);.        fpri
1c880 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 63 6f 6c  ntf(stdout, "col
1c890 3d 25 64 20 22 2c 20 73 50 6f 73 2e 69 43 6f 6c  =%d ", sPos.iCol
1c8a0 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  );.        fprin
1c8b0 74 66 28 73 74 64 6f 75 74 2c 20 22 6f 66 66 3d  tf(stdout, "off=
1c8c0 25 64 5c 6e 22 2c 20 73 50 6f 73 2e 69 50 6f 73  %d\n", sPos.iPos
1c8d0 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
1c8e0 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69  h(stdout);.#endi
1c8f0 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  f.      }.    }.
1c900 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1c910 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b  rFree(p, pIter);
1c920 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1c930 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
1c940 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70  t);.  }.  rc = p
1c950 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ->rc;.  if( rc==
1c960 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
1c970 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 72 63 20  um!=cksum2 ) rc 
1c980 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
1c990 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1c9a0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
1c9b0 64 65 73 20 6f 66 20 65 61 63 68 20 73 65 67 6d  des of each segm
1c9c0 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20 6c 65  ent match the le
1c9d0 61 76 65 73 20 2a 2f 0a 20 20 66 6f 72 28 69 49  aves */.  for(iI
1c9e0 64 78 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  dx=0; rc==SQLITE
1c9f0 5f 4f 4b 20 26 26 20 69 49 64 78 3c 3d 70 43 6f  _OK && iIdx<=pCo
1ca00 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
1ca10 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  Idx++){.    Fts5
1ca20 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1ca30 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
1ca40 72 65 52 65 61 64 28 70 2c 20 69 49 64 78 29 3b  reRead(p, iIdx);
1ca50 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
1ca60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   ){.      int iL
1ca70 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
1ca80 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
1ca90 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1caa0 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
1cab0 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1cac0 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1cad0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1cae0 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1caf0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1cb00 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
1cb10 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1cb20 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
1cb30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ];.          fts
1cb40 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
1cb50 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 69  heckSegment(p, i
1cb60 49 64 78 2c 20 70 53 65 67 29 3b 0a 20 20 20 20  Idx, pSeg);.    
1cb70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1cb80 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
1cb90 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1cba0 72 75 63 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  ruct);.    rc = 
1cbb0 70 2d 3e 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65  p->rc;.  }..  re
1cbc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1cbd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1cbe0 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72  s5DecodeStructur
1cbf0 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc10 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1cc20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
1cc30 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1cc40 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42  ,.  const u8 *pB
1cc50 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29  lob, int nBlob.)
1cc60 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1cc90 64 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  de */.  Fts5Stru
1cca0 63 74 75 72 65 20 2a 70 20 3d 20 30 3b 20 20 20  cture *p = 0;   
1ccb0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 64          /* Decod
1ccc0 65 64 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  ed structure obj
1ccd0 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  ect */..  rc = f
1cce0 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
1ccf0 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c  de(pBlob, nBlob,
1cd00 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   &p);.  if( rc!=
1cd10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cd20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
1cd30 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
1cd40 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
1cd50 65 28 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b  e(pRc, pBuf, p);
1cd60 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
1cd70 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f  Release(p);.}../
1cd80 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e  *.** Buffer (a/n
1cd90 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ) is assumed to 
1cda0 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f  contain a list o
1cdb0 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72  f serialized var
1cdc0 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61  ints. Read.** ea
1cdd0 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70  ch varint and ap
1cde0 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20  pend its string 
1cdf0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74  representation t
1ce00 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52  o buffer pBuf. R
1ce10 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65  eturn.** after e
1ce20 69 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20  ither the input 
1ce30 62 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73  buffer is exhaus
1ce40 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65  ted or a 0 value
1ce50 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   is read..**.** 
1ce60 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1ce70 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1ce80 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
1ce90 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
1cea0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1ceb0 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c  t fts5DecodePosl
1cec0 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
1ced0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
1cee0 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
1cef0 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20   n){.  int iOff 
1cf00 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f  = 0;.  while( iO
1cf10 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
1cf20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b  iVal;.    iOff +
1cf30 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
1cf40 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20  [iOff], iVal);. 
1cf50 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1cf60 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
1cf70 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64  (pRc, pBuf, " %d
1cf80 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20  ", iVal);.  }.  
1cf90 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a  return iOff;.}..
1cfa0 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20  /*.** The start 
1cfb0 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20  of buffer (a/n) 
1cfc0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61  contains the sta
1cfd0 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e  rt of a doclist.
1cfe0 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20   The doclist.** 
1cff0 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66  may or may not f
1d000 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74 68 65  inish within the
1d010 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75   buffer. This fu
1d020 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
1d030 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65   text.** represe
1d040 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
1d050 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  art of the docli
1d060 73 74 20 74 68 61 74 20 69 73 20 70 72 65 73 65  st that is prese
1d070 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20  nt to buffer.** 
1d080 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pBuf. .**.** The
1d090 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1d0a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1d0b0 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ytes read from t
1d0c0 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e  he input buffer.
1d0d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1d0e0 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
1d0f0 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
1d100 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e  uffer *pBuf, con
1d110 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29  st u8 *a, int n)
1d120 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64 3b 0a  {.  i64 iDocid;.
1d130 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
1d140 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b  .  if( iOff<n ){
1d150 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c  .    iOff += sql
1d160 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
1d170 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
1d180 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Docid);.    sqli
1d190 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
1d1a0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
1d1b0 42 75 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c  Buf, " rowid=%ll
1d1c0 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d  d", iDocid);.  }
1d1d0 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e  .  while( iOff<n
1d1e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   ){.    int nPos
1d1f0 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65  ;.    iOff += ge
1d200 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
1d210 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 69  f], nPos);.    i
1d220 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
1d230 65 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42  ePoslist(pRc, pB
1d240 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49  uf, &a[iOff], MI
1d250 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29  N(n-iOff, nPos))
1d260 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e  ;.    if( iOff<n
1d270 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44   ){.      i64 iD
1d280 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66  elta;.      iOff
1d290 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61   += sqlite3GetVa
1d2a0 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
1d2b0 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
1d2c0 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d       if( iDelta=
1d2d0 3d 30 20 29 20 72 65 74 75 72 6e 20 69 4f 66 66  =0 ) return iOff
1d2e0 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20 2d  ;.      iDocid -
1d2f0 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
1d300 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d310 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
1d320 63 2c 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64  c, pBuf, " rowid
1d330 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b  =%lld", iDocid);
1d340 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1d350 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
1d360 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
1d370 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
1d380 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
1d390 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f  nction fts5_deco
1d3a0 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de()..*/.static 
1d3b0 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46  void fts5DecodeF
1d3c0 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
1d3d0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
1d3e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
1d3f0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
1d400 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
1d410 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1d420 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d430 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
1d440 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
1d450 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
1d460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
1d470 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
1d480 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f   */.){.  i64 iRo
1d490 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
1d4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
1d4b0 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69  d for record bei
1d4c0 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
1d4d0 69 6e 74 20 69 49 64 78 2c 69 53 65 67 69 64 2c  int iIdx,iSegid,
1d4e0 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20  iHeight,iPgno;  
1d4f0 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65  /* Rowid compone
1d500 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  nts */.  const u
1d510 38 20 2a 61 3b 20 69 6e 74 20 6e 3b 20 20 20 20  8 *a; int n;    
1d520 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f           /* Reco
1d530 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rd to decode */.
1d540 20 20 46 74 73 35 42 75 66 66 65 72 20 73 3b 20    Fts5Buffer s; 
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d560 20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74 65    /* Build up te
1d570 78 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65 72  xt to return her
1d580 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
1d590 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1d5a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1d5b0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
1d5c0 72 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20  rt( nArg==2 );. 
1d5d0 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
1d5e0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
1d5f0 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73  ));.  iRowid = s
1d600 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
1d610 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  64(apVal[0]);.  
1d620 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
1d630 65 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d  e_bytes(apVal[1]
1d640 29 3b 0a 20 20 61 20 3d 20 73 71 6c 69 74 65 33  );.  a = sqlite3
1d650 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61  _value_blob(apVa
1d660 6c 5b 31 5d 29 3b 0a 20 20 66 74 73 35 44 65 63  l[1]);.  fts5Dec
1d670 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c  odeRowid(iRowid,
1d680 20 26 69 49 64 78 2c 20 26 69 53 65 67 69 64 2c   &iIdx, &iSegid,
1d690 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e   &iHeight, &iPgn
1d6a0 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67  o);..  fts5Debug
1d6b0 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69  Rowid(&rc, &s, i
1d6c0 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 69 48  Rowid);.  if( iH
1d6d0 65 69 67 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d  eight==FTS5_SEGM
1d6e0 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48 54 20 29  ENT_MAX_HEIGHT )
1d6f0 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  {.    int i = 0;
1d700 0a 20 20 20 20 69 36 34 20 69 50 72 65 76 3b 0a  .    i64 iPrev;.
1d710 20 20 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20      if( n>0 ){. 
1d720 20 20 20 20 20 69 20 3d 20 67 65 74 56 61 72 69       i = getVari
1d730 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29  nt(&a[i], (u64*)
1d740 26 69 50 72 65 76 29 3b 0a 20 20 20 20 20 20 73  &iPrev);.      s
1d750 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d760 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
1d770 2c 20 26 73 2c 20 22 20 25 6c 6c 64 22 2c 20 69  , &s, " %lld", i
1d780 50 72 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Prev);.    }.   
1d790 20 77 68 69 6c 65 28 20 69 3c 6e 20 29 7b 0a 20   while( i<n ){. 
1d7a0 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20       i64 iVal;. 
1d7b0 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72       i += getVar
1d7c0 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a  int(&a[i], (u64*
1d7d0 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69  )&iVal);.      i
1d7e0 66 28 20 69 56 61 6c 3d 3d 30 20 29 7b 0a 20 20  f( iVal==0 ){.  
1d7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1d800 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
1d810 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 78  ntf(&rc, &s, " x
1d820 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
1d830 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 20 3d  .        iPrev =
1d840 20 69 50 72 65 76 20 2d 20 69 56 61 6c 3b 0a 20   iPrev - iVal;. 
1d850 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1d860 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
1d870 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20  intf(&rc, &s, " 
1d880 25 6c 6c 64 22 2c 20 69 50 72 65 76 29 3b 0a 20  %lld", iPrev);. 
1d890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1d8a0 7d 65 6c 73 65 0a 20 20 69 66 28 20 69 53 65 67  }else.  if( iSeg
1d8b0 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  id==0 ){.    if(
1d8c0 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56   iRowid==FTS5_AV
1d8d0 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a  ERAGES_ROWID ){.
1d8e0 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f        /* todo */
1d8f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d900 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75    fts5DecodeStru
1d910 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61  cture(&rc, &s, a
1d920 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , n);.    }.  }e
1d930 6c 73 65 7b 0a 0a 20 20 20 20 46 74 73 35 42 75  lse{..    Fts5Bu
1d940 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 20 20 6d  ffer term;.    m
1d950 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
1d960 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1d970 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 48  r));..    if( iH
1d980 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eight==0 ){.    
1d990 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d    int iTermOff =
1d9a0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52   0;.      int iR
1d9b0 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20  owidOff = 0;.   
1d9c0 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
1d9d0 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
1d9e0 3b 0a 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f  ;..      iRowidO
1d9f0 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
1da00 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 54  &a[0]);.      iT
1da10 65 72 6d 4f 66 66 20 3d 20 66 74 73 35 47 65 74  ermOff = fts5Get
1da20 55 31 36 28 26 61 5b 32 5d 29 3b 0a 0a 20 20 20  U16(&a[2]);..   
1da30 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
1da40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
1da50 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20   = iRowidOff;.  
1da60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54      }else if( iT
1da70 65 72 6d 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  ermOff ){.      
1da80 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
1da90 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  f;.      }else{.
1daa0 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 6e          iOff = n
1dab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1dac0 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
1dad0 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d  t(&rc, &s, &a[4]
1dae0 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 0a 20 20 20  , iOff-4);...   
1daf0 20 20 20 61 73 73 65 72 74 28 20 69 52 6f 77 69     assert( iRowi
1db00 64 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d  dOff==0 || iOff=
1db10 3d 69 52 6f 77 69 64 4f 66 66 20 29 3b 0a 20 20  =iRowidOff );.  
1db20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
1db30 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  f ){.        iOf
1db40 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44  f += fts5DecodeD
1db50 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
1db60 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66  &a[iOff], n-iOff
1db70 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1db80 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d 4f    assert( iTermO
1db90 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69  ff==0 || iOff==i
1dba0 54 65 72 6d 4f 66 66 20 29 3b 0a 20 20 20 20 20  TermOff );.     
1dbb0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
1dbc0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42  {.        int nB
1dbd0 79 74 65 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  yte;.        iOf
1dbe0 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
1dbf0 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  (&a[iOff], nByte
1dc00 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d 2e  );.        term.
1dc10 6e 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20  n= nKeep;.      
1dc20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1dc30 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72  ndBlob(&rc, &ter
1dc40 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66  m, nByte, &a[iOf
1dc50 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66  f]);.        iOf
1dc60 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20  f += nByte;..   
1dc70 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1dc80 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
1dc90 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
1dca0 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d  &rc, &s, " term=
1dcb0 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28  %.*s", term.n, (
1dcc0 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d  const char*)term
1dcd0 2e 70 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .p.        );.  
1dce0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
1dcf0 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28  s5DecodeDoclist(
1dd00 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
1dd10 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20  ], n-iOff);.    
1dd20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
1dd30 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  {.          iOff
1dd40 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1dd50 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  &a[iOff], nKeep)
1dd60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1dd70 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75    }.      fts5Bu
1dd80 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
1dd90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1dda0 20 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73    Fts5NodeIter s
1ddb0 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 66 74 73  s;.      for(fts
1ddc0 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 61 2c  5NodeIterInit(a,
1ddd0 20 6e 2c 20 26 73 73 29 3b 20 73 73 2e 61 44 61   n, &ss); ss.aDa
1dde0 74 61 3b 20 66 74 73 35 4e 6f 64 65 49 74 65 72  ta; fts5NodeIter
1ddf0 4e 65 78 74 28 26 72 63 2c 20 26 73 73 29 29 7b  Next(&rc, &ss)){
1de00 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 73 2e  .        if( ss.
1de10 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  term.n==0 ){.   
1de20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1de30 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
1de40 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20  intf(&rc, &s, " 
1de50 6c 65 66 74 3d 25 64 22 2c 20 73 73 2e 69 43 68  left=%d", ss.iCh
1de60 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ild);.        }e
1de70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
1de80 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1de90 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
1dea0 2c 26 73 2c 20 22 20 5c 22 25 2e 2a 73 5c 22 22  ,&s, " \"%.*s\""
1deb0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1dec0 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74   ss.term.n, ss.t
1ded0 65 72 6d 2e 70 0a 20 20 20 20 20 20 20 20 20 20  erm.p.          
1dee0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1def0 20 20 20 20 20 69 66 28 20 73 73 2e 6e 45 6d 70       if( ss.nEmp
1df00 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
1df10 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1df20 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
1df30 63 2c 20 26 73 2c 20 22 20 65 6d 70 74 79 3d 25  c, &s, " empty=%
1df40 64 25 73 22 2c 20 73 73 2e 6e 45 6d 70 74 79 2c  d%s", ss.nEmpty,
1df50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1df60 73 2e 62 44 6c 69 64 78 20 3f 20 22 2a 22 20 3a  s.bDlidx ? "*" :
1df70 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 29 3b   "".          );
1df80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1df90 20 7d 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64   }.      fts5Nod
1dfa0 65 49 74 65 72 46 72 65 65 28 26 73 73 29 3b 0a  eIterFree(&ss);.
1dfb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
1dfc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dfd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1dfe0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
1dff0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
1e000 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f  .p, s.n, SQLITE_
1e010 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
1e020 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
1e030 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
1e040 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
1e050 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
1e060 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(&s);.}../*.**
1e070 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
1e080 61 73 20 70 61 72 74 20 6f 66 20 72 65 67 69 73  as part of regis
1e090 74 65 72 69 6e 67 20 74 68 65 20 46 54 53 35 20  tering the FTS5 
1e0a0 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74 61  module with data
1e0b0 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
1e0c0 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73 74  on db. It regist
1e0d0 65 72 73 20 73 65 76 65 72 61 6c 20 75 73 65 72  ers several user
1e0e0 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
1e0f0 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c  functions useful
1e100 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a  .** with FTS5..*
1e110 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1e120 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
1e130 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1e140 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
1e150 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c  ome other.** SQL
1e160 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1e170 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
1e180 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
1e190 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28  e3Fts5IndexInit(
1e1a0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
1e1b0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
1e1c0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
1e1d0 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74 73  (.      db, "fts
1e1e0 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51  5_decode", 2, SQ
1e1f0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
1e200 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
1e210 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 72 65  , 0, 0.  );.  re
1e220 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e230 2a 20 53 65 74 20 74 68 65 20 74 61 72 67 65 74  * Set the target
1e240 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 74   page size for t
1e250 68 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 2e  he index object.
1e260 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e270 46 74 73 35 49 6e 64 65 78 50 67 73 7a 28 46 74  Fts5IndexPgsz(Ft
1e280 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
1e290 70 67 73 7a 29 7b 0a 20 20 70 2d 3e 70 67 73 7a  pgsz){.  p->pgsz
1e2a0 20 3d 20 70 67 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a   = pgsz;.}../*.*
1e2b0 2a 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74  * Iterator pMult
1e2c0 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  i currently poin
1e2d0 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ts to a valid en
1e2e0 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54  try (not EOF). T
1e2f0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
1e300 61 70 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f  appends a copy o
1e310 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  f the position-l
1e320 69 73 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79  ist of the entry
1e330 20 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72   pMulti .** curr
1e340 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
1e350 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  to buffer pBuf..
1e360 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1e370 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
1e380 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20  or code is left 
1e390 69 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20  in p->rc. It is 
1e3a0 61 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72  assumed.** no er
1e3b0 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
1e3c0 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
1e3d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1e3e0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
1e3f0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
1e400 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  terPoslist(.  Ft
1e410 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
1e420 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
1e430 70 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53  pMulti,.  int bS
1e440 7a 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  z,.  Fts5Buffer 
1e450 2a 70 42 75 66 0a 29 7b 0a 20 20 46 74 73 35 43  *pBuf.){.  Fts5C
1e460 68 75 6e 6b 49 74 65 72 20 69 74 65 72 3b 0a 20  hunkIter iter;. 
1e470 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1e480 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53  eg = &pMulti->aS
1e490 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72  eg[ pMulti->aFir
1e4a0 73 74 5b 31 5d 20 5d 3b 0a 20 20 61 73 73 65 72  st[1] ];.  asser
1e4b0 74 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  t( fts5MultiIter
1e4c0 45 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d  Eof(p, pMulti)==
1e4d0 30 20 29 3b 0a 20 20 66 74 73 35 43 68 75 6e 6b  0 );.  fts5Chunk
1e4e0 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67  IterInit(p, pSeg
1e4f0 2c 20 26 69 74 65 72 29 3b 0a 20 20 69 66 28 20  , &iter);.  if( 
1e500 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
1e510 28 70 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b  (p, &iter)==0 ){
1e520 0a 20 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a  .    if( bSz ){.
1e530 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1e540 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1e550 3e 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e  >rc, pBuf, iter.
1e560 6e 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nRem);.    }.   
1e570 20 77 68 69 6c 65 28 20 66 74 73 35 43 68 75 6e   while( fts5Chun
1e580 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 69 74 65  kIterEof(p, &ite
1e590 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  r)==0 ){.      f
1e5a0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1e5b0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  lob(&p->rc, pBuf
1e5c0 2c 20 69 74 65 72 2e 6e 2c 20 69 74 65 72 2e 70  , iter.n, iter.p
1e5d0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75  );.      fts5Chu
1e5e0 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 26 69  nkIterNext(p, &i
1e5f0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
1e600 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52    fts5ChunkIterR
1e610 65 6c 65 61 73 65 28 26 69 74 65 72 29 3b 0a 7d  elease(&iter);.}
1e620 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1e630 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1e640 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t(Fts5DoclistIte
1e650 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
1e660 20 70 49 74 65 72 2d 3e 69 3c 70 49 74 65 72 2d   pIter->i<pIter-
1e670 3e 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  >n ){.    if( pI
1e680 74 65 72 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20  ter->i ){.      
1e690 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20  i64 iDelta;.    
1e6a0 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65    pIter->i += ge
1e6b0 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e  tVarint(&pIter->
1e6c0 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36  a[pIter->i], (u6
1e6d0 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
1e6e0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 41     if( pIter->bA
1e6f0 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  sc ){.        pI
1e700 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
1e710 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c  Delta;.      }el
1e720 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  se{.        pIte
1e730 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65  r->iRowid -= iDe
1e740 6c 74 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  lta;.      }.   
1e750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1e760 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72  ter->i += getVar
1e770 69 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49  int(&pIter->a[pI
1e780 74 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26  ter->i], (u64*)&
1e790 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
1e7a0 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d      }.    pIter-
1e7b0 3e 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  >i += getVarint3
1e7c0 32 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  2(&pIter->a[pIte
1e7d0 72 2d 3e 69 5d 2c 20 70 49 74 65 72 2d 3e 6e 50  r->i], pIter->nP
1e7e0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
1e7f0 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26  er->aPoslist = &
1e800 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e  pIter->a[pIter->
1e810 69 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  i];.    pIter->i
1e820 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c   += pIter->nPosl
1e830 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ist;.  }else{.  
1e840 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73    pIter->aPoslis
1e850 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  t = 0;.  }.}..st
1e860 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f  atic void fts5Do
1e870 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20  clistIterInit(. 
1e880 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
1e890 66 2c 20 0a 20 20 69 6e 74 20 62 41 73 63 2c 20  f, .  int bAsc, 
1e8a0 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74  .  Fts5DoclistIt
1e8b0 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d  er *pIter.){.  m
1e8c0 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
1e8d0 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
1e8e0 0a 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 70 42  .  pIter->a = pB
1e8f0 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e  uf->p;.  pIter->
1e900 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 70  n = pBuf->n;.  p
1e910 49 74 65 72 2d 3e 62 41 73 63 20 3d 20 62 41 73  Iter->bAsc = bAs
1e920 63 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74  c;.  fts5Doclist
1e930 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b  IterNext(pIter);
1e940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1e950 20 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75   a doclist to bu
1e960 66 66 65 72 20 70 42 75 66 2e 0a 2a 2f 0a 73 74  ffer pBuf..*/.st
1e970 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
1e980 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a  rgeAppendDocid(.
1e990 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9b0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
1e9c0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
1e9d0 20 62 41 73 63 2c 0a 20 20 46 74 73 35 42 75 66   bAsc,.  Fts5Buf
1e9e0 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20  fer *pBuf,      
1e9f0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
1ea00 65 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  er to write to *
1ea10 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52  /.  i64 *piLastR
1ea20 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
1ea30 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50      /* IN/OUT: P
1ea40 72 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72  revious rowid wr
1ea50 69 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a  itten (if any) *
1ea60 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20  /.  i64 iRowid  
1ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea80 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20      /* Rowid to 
1ea90 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69  append */.){.  i
1eaa0 66 28 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b  f( pBuf->n==0 ){
1eab0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
1eac0 70 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c  ppendVarint(pRc,
1ead0 20 70 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a   pBuf, iRowid);.
1eae0 20 20 7d 65 6c 73 65 20 69 66 28 20 62 41 73 63    }else if( bAsc
1eaf0 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  ==0 ){.    fts5B
1eb00 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1eb10 74 28 70 52 63 2c 20 70 42 75 66 2c 20 2a 70 69  t(pRc, pBuf, *pi
1eb20 4c 61 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77  LastRowid - iRow
1eb30 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  id);.  }else{.  
1eb40 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1eb50 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42  ndVarint(pRc, pB
1eb60 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69  uf, iRowid - *pi
1eb70 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 7d 0a  LastRowid);.  }.
1eb80 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d    *piLastRowid =
1eb90 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a   iRowid;.}../*.*
1eba0 2a 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64  * Buffers p1 and
1ebb0 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c   p2 contain docl
1ebc0 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ists. This funct
1ebd0 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63  ion merges the c
1ebe0 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65  ontent.** of the
1ebf0 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f   two doclists to
1ec00 67 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20  gether and sets 
1ec10 62 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65  buffer p1 to the
1ec20 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a   result before.*
1ec30 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  * returning..**.
1ec40 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1ec50 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1ec60 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
1ec70 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  p->rc. If an err
1ec80 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64  or has.** alread
1ec90 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1eca0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1ecb0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1ecc0 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72  void fts5MergePr
1ecd0 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73  efixLists(.  Fts
1ece0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed00 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1ed10 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62 41 73  ect */.  int bAs
1ed20 63 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  c,.  Fts5Buffer 
1ed30 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  *p1,            
1ed40 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69       /* First li
1ed50 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20  st to merge */. 
1ed60 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 20   Fts5Buffer *p2 
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed80 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20   /* Second list 
1ed90 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20  to merge */.){. 
1eda0 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20   if( p2->n ){.  
1edb0 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64    i64 iLastRowid
1edc0 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f   = 0;.    Fts5Do
1edd0 63 6c 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20  clistIter i1;.  
1ede0 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65    Fts5DoclistIte
1edf0 72 20 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75  r i2;.    Fts5Bu
1ee00 66 66 65 72 20 6f 75 74 3b 0a 20 20 20 20 46 74  ffer out;.    Ft
1ee10 73 35 42 75 66 66 65 72 20 74 6d 70 3b 0a 20 20  s5Buffer tmp;.  
1ee20 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30    memset(&out, 0
1ee30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a  , sizeof(out));.
1ee40 20 20 20 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c      memset(&tmp,
1ee50 20 30 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29 29   0, sizeof(tmp))
1ee60 3b 0a 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69  ;..    fts5Docli
1ee70 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20 62  stIterInit(p1, b
1ee80 41 73 63 2c 20 26 69 31 29 3b 0a 20 20 20 20 66  Asc, &i1);.    f
1ee90 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
1eea0 69 74 28 70 32 2c 20 62 41 73 63 2c 20 26 69 32  it(p2, bAsc, &i2
1eeb0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 31  );.    while( i1
1eec0 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20  .aPoslist!=0 || 
1eed0 69 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 29  i2.aPoslist!=0 )
1eee0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e 61  {.      if( i2.a
1eef0 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69  Poslist==0 || (i
1ef00 31 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20  1.aPoslist && . 
1ef10 20 20 20 20 20 20 20 20 20 20 28 20 28 21 62 41            ( (!bA
1ef20 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e  sc && i1.iRowid>
1ef30 69 32 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 62  i2.iRowid) || (b
1ef40 41 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64  Asc && i1.iRowid
1ef50 3c 69 32 2e 69 52 6f 77 69 64 29 20 29 0a 20 20  <i2.iRowid) ).  
1ef60 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20      )){.        
1ef70 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72  /* Copy entry fr
1ef80 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20 20  om i1 */.       
1ef90 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
1efa0 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 41  Docid(&p->rc, bA
1efb0 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74  sc, &out, &iLast
1efc0 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64  Rowid, i1.iRowid
1efd0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
1efe0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1eff0 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  t(&p->rc, &out, 
1f000 69 31 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20  i1.nPoslist);.  
1f010 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1f020 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1f030 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73  c, &out, i1.nPos
1f040 6c 69 73 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73  list, i1.aPoslis
1f050 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t);.        fts5
1f060 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
1f070 26 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &i1);.      }.  
1f080 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 31 2e      else if( i1.
1f090 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69  aPoslist==0 || i
1f0a0 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f  2.iRowid!=i1.iRo
1f0b0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
1f0c0 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f  * Copy entry fro
1f0d0 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  m i2 */.        
1f0e0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
1f0f0 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 41 73  ocid(&p->rc, bAs
1f100 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52  c, &out, &iLastR
1f110 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29  owid, i2.iRowid)
1f120 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1f130 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1f140 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69  (&p->rc, &out, i
1f150 32 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  2.nPoslist);.   
1f160 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f170 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1f180 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c  , &out, i2.nPosl
1f190 69 73 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74  ist, i2.aPoslist
1f1a0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1f1b0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
1f1c0 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i2);.      }.   
1f1d0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20     else{.       
1f1e0 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
1f1f0 65 72 20 72 31 3b 0a 20 20 20 20 20 20 20 20 46  er r1;.        F
1f200 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
1f210 20 72 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73   r2;.        Fts
1f220 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77  5PoslistWriter w
1f230 72 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20  riter;..        
1f240 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20  memset(&writer, 
1f250 30 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72  0, sizeof(writer
1f260 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ));..        /* 
1f270 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f  Merge the two po
1f280 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f  sition lists. */
1f290 20 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65   .        fts5Me
1f2a0 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
1f2b0 70 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f 75  p->rc, bAsc, &ou
1f2c0 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20  t, &iLastRowid, 
1f2d0 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
1f2e0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
1f2f0 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20  ro(&tmp);.      
1f300 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
1f310 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d  listReaderInit(-
1f320 31 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20  1, i1.aPoslist, 
1f330 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 72 31  i1.nPoslist, &r1
1f340 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1f350 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
1f360 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 32 2e 61  derInit(-1, i2.a
1f370 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73  Poslist, i2.nPos
1f380 6c 69 73 74 2c 20 26 72 32 29 3b 0a 20 20 20 20  list, &r2);.    
1f390 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
1f3a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
1f3b0 72 31 2e 62 45 6f 66 3d 3d 30 20 7c 7c 20 72 32  r1.bEof==0 || r2
1f3c0 2e 62 45 6f 66 3d 3d 30 29 20 29 7b 0a 20 20 20  .bEof==0) ){.   
1f3d0 20 20 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b         i64 iNew;
1f3e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1f3f0 32 2e 62 45 6f 66 20 7c 7c 20 28 72 31 2e 62 45  2.bEof || (r1.bE
1f400 6f 66 3d 3d 30 20 26 26 20 72 31 2e 69 50 6f 73  of==0 && r1.iPos
1f410 3c 72 32 2e 69 50 6f 73 29 20 29 7b 0a 20 20 20  <r2.iPos) ){.   
1f420 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
1f430 72 31 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20  r1.iPos;.       
1f440 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1f450 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
1f460 74 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20  t(&r1);.        
1f470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f480 20 20 20 20 20 69 4e 65 77 20 3d 20 72 32 2e 69       iNew = r2.i
1f490 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pos;.           
1f4a0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1f4b0 69 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72  istReaderNext(&r
1f4c0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
1f4d0 69 66 28 20 72 31 2e 69 50 6f 73 3d 3d 72 32 2e  if( r1.iPos==r2.
1f4e0 69 50 6f 73 20 29 20 73 71 6c 69 74 65 33 46 74  iPos ) sqlite3Ft
1f4f0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e  s5PoslistReaderN
1f500 65 78 74 28 26 72 31 29 3b 0a 20 20 20 20 20 20  ext(&r1);.      
1f510 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f520 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
1f530 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72  ts5PoslistWriter
1f540 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 77 72  Append(&tmp, &wr
1f550 69 74 65 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20  iter, iNew);.   
1f560 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1f570 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1f580 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1f590 6f 75 74 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20  out, tmp.n);.   
1f5a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1f5b0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1f5c0 2c 20 26 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74  , &out, tmp.n, t
1f5d0 6d 70 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66  mp.p);.        f
1f5e0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
1f5f0 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20  xt(&i1);.       
1f600 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
1f610 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20  Next(&i2);.     
1f620 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74   }.    }..    ft
1f630 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
1f640 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f  rc, p1, out.n, o
1f650 75 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42  ut.p);.    fts5B
1f660 75 66 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b  ufferFree(&tmp);
1f670 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
1f680 72 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d  ree(&out);.  }.}
1f690 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1f6a0 73 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73  s5BufferSwap(Fts
1f6b0 35 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73  5Buffer *p1, Fts
1f6c0 35 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20  5Buffer *p2){.  
1f6d0 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d  Fts5Buffer tmp =
1f6e0 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70   *p1;.  *p1 = *p
1f6f0 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a  2;.  *p2 = tmp;.
1f700 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1f710 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
1f720 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  er(.  Fts5Index 
1f730 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1f740 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1f750 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1f760 20 69 6e 74 20 62 41 73 63 2c 20 20 20 20 20 20   int bAsc,      
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52   /* True for "OR
1f790 44 45 52 20 42 59 20 72 6f 77 69 64 20 41 53 43  DER BY rowid ASC
1f7a0 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  " */.  const u8 
1f7b0 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20  *pToken,        
1f7c0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1f7d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66   containing pref
1f7e0 69 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20  ix to match */. 
1f7f0 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20   int nToken,    
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
1f820 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74  er pToken in byt
1f830 65 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  es */.  Fts5Inde
1f840 78 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  xIter *pIter    
1f850 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c          /* Popul
1f860 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ate this object 
1f870 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75  */.){.  Fts5Stru
1f880 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
1f890 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42    Fts5Buffer *aB
1f8a0 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  uf;.  const int 
1f8b0 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42  nBuf = 32;..  aB
1f8c0 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72  uf = (Fts5Buffer
1f8d0 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
1f8e0 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  p, sizeof(Fts5Bu
1f8f0 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70  ffer)*nBuf);.  p
1f900 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1f910 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 30 29  uctureRead(p, 0)
1f920 3b 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26  ;..  if( aBuf &&
1f930 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
1f940 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
1f950 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69  *pDoclist;.    i
1f960 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c  nt i;.    i64 iL
1f970 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
1f980 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
1f990 65 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20  er *p1 = 0;     
1f9a0 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
1f9b0 20 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20   to gather data 
1f9c0 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20  from index */.  
1f9d0 20 20 46 74 73 35 42 75 66 66 65 72 20 64 6f 63    Fts5Buffer doc
1f9e0 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65  list;..    memse
1f9f0 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73  t(&doclist, 0, s
1fa00 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b  izeof(doclist));
1fa10 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c  .    for(fts5Mul
1fa20 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
1fa30 72 75 63 74 2c 20 30 2c 20 31 2c 20 70 54 6f 6b  ruct, 0, 1, pTok
1fa40 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20  en, nToken, -1, 
1fa50 30 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20 20  0, &p1);.       
1fa60 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1fa70 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20  f(p, p1)==0;.   
1fa80 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1fa90 65 72 4e 65 78 74 28 70 2c 20 70 31 2c 20 30 2c  erNext(p, p1, 0,
1faa0 20 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20   0).    ){.     
1fab0 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74   i64 iRowid = ft
1fac0 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
1fad0 28 70 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  (p1);.      int 
1fae0 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e  nTerm;.      con
1faf0 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66  st u8 *pTerm = f
1fb00 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
1fb10 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20  (p1, &nTerm);.  
1fb20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
1fb30 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
1fb40 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54  , MIN(nToken, nT
1fb50 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20  erm))<=0 );.    
1fb60 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b    if( nTerm<nTok
1fb70 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f  en || memcmp(pTo
1fb80 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b  ken, pTerm, nTok
1fb90 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  en) ) break;..  
1fba0 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e      if( doclist.
1fbb0 6e 3e 30 20 0a 20 20 20 20 20 20 20 26 26 20 28  n>0 .       && (
1fbc0 28 21 62 41 73 63 20 26 26 20 69 52 6f 77 69 64  (!bAsc && iRowid
1fbd0 3e 3d 69 4c 61 73 74 52 6f 77 69 64 29 20 7c 7c  >=iLastRowid) ||
1fbe0 20 28 62 41 73 63 20 26 26 20 69 52 6f 77 69 64   (bAsc && iRowid
1fbf0 3c 3d 69 4c 61 73 74 52 6f 77 69 64 29 29 0a 20  <=iLastRowid)). 
1fc00 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20       ){..       
1fc10 20 66 6f 72 28 69 3d 30 3b 20 64 6f 63 6c 69 73   for(i=0; doclis
1fc20 74 2e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  t.n && p->rc==SQ
1fc30 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
1fc40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1fc50 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20 20   i<nBuf );.     
1fc60 20 20 20 20 20 69 66 28 20 61 42 75 66 5b 69 5d       if( aBuf[i]
1fc70 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
1fc80 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1fc90 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26 61  wap(&doclist, &a
1fca0 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
1fcb0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
1fcc0 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20  ero(&doclist);. 
1fcd0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1fcf0 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
1fd00 28 70 2c 20 62 41 73 63 2c 20 26 64 6f 63 6c 69  (p, bAsc, &docli
1fd10 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
1fd20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1fd30 75 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b  ufferZero(&aBuf[
1fd40 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
1fd50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fd60 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63   }.      if( doc
1fd70 6c 69 73 74 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  list.n==0 ){.   
1fd80 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1fd90 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1fda0 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 52  rc, &doclist, iR
1fdb0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c  owid);.      }el
1fdc0 73 65 20 69 66 28 20 62 41 73 63 3d 3d 30 20 29  se if( bAsc==0 )
1fdd0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
1fde0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1fdf0 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73  (&p->rc, &doclis
1fe00 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 20 2d 20  t, iLastRowid - 
1fe10 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d  iRowid);.      }
1fe20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
1fe30 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1fe40 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f  rint(&p->rc, &do
1fe50 63 6c 69 73 74 2c 20 69 52 6f 77 69 64 20 2d 20  clist, iRowid - 
1fe60 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 20  iLastRowid);.   
1fe70 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74     }.      iLast
1fe80 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1fe90 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1fea0 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 31  terPoslist(p, p1
1feb0 2c 20 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a  , 1, &doclist);.
1fec0 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
1fed0 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29  =0; i<nBuf; i++)
1fee0 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72 67  {.      fts5Merg
1fef0 65 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20  ePrefixLists(p, 
1ff00 62 41 73 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20  bAsc, &doclist, 
1ff10 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
1ff20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1ff30 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d  &aBuf[i]);.    }
1ff40 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
1ff50 65 72 46 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a  erFree(p, p1);..
1ff60 20 20 20 20 70 44 6f 63 6c 69 73 74 20 3d 20 28      pDoclist = (
1ff70 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 2a  Fts5DoclistIter*
1ff80 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
1ff90 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6f 63  , sizeof(Fts5Doc
1ffa0 6c 69 73 74 49 74 65 72 29 29 3b 0a 20 20 20 20  listIter));.    
1ffb0 69 66 28 20 21 70 44 6f 63 6c 69 73 74 20 29 7b  if( !pDoclist ){
1ffc0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1ffd0 72 46 72 65 65 28 26 64 6f 63 6c 69 73 74 29 3b  rFree(&doclist);
1ffe0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fff0 20 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73    pIter->pDoclis
20000 74 20 3d 20 70 44 6f 63 6c 69 73 74 3b 0a 20 20  t = pDoclist;.  
20010 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
20020 74 65 72 49 6e 69 74 28 26 64 6f 63 6c 69 73 74  terInit(&doclist
20030 2c 20 62 41 73 63 2c 20 70 49 74 65 72 2d 3e 70  , bAsc, pIter->p
20040 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  Doclist);.    }.
20050 20 20 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63    }..  fts5Struc
20060 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
20070 75 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  uct);.  sqlite3_
20080 66 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 2f  free(aBuf);.}../
20090 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
200a0 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72  iterator to iter
200b0 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 64  ate though all d
200c0 6f 63 69 64 73 20 74 68 61 74 20 6d 61 74 63 68  ocids that match
200d0 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69   the .** specifi
200e0 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  ed token or toke
200f0 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 46 74 73  n prefix..*/.Fts
20100 35 49 6e 64 65 78 49 74 65 72 20 2a 73 71 6c 69  5IndexIter *sqli
20110 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
20120 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  y(.  Fts5Index *
20130 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
20140 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
20150 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20  x to query */.  
20160 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b  const char *pTok
20170 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  en, int nToken, 
20180 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72 65  /* Token (or pre
20190 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66 6f  fix) to query fo
201a0 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
201b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
201d0 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  f FTS5INDEX_QUER
201e0 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  Y_X flags */.){.
201f0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
20200 2a 70 52 65 74 3b 0a 20 20 69 6e 74 20 69 49 64  *pRet;.  int iId
20210 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 66 6c  x = 0;..  if( fl
20220 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
20230 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a  QUERY_PREFIX ){.
20240 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
20250 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
20260 6e 66 69 67 3b 0a 20 20 20 20 66 6f 72 28 69 49  nfig;.    for(iI
20270 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e  dx=1; iIdx<=pCon
20280 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49  fig->nPrefix; iI
20290 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  dx++){.      if(
202a0 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69   pConfig->aPrefi
202b0 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 54 6f 6b 65  x[iIdx-1]==nToke
202c0 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  n ) break;.    }
202d0 0a 20 20 20 20 69 66 28 20 69 49 64 78 3e 70 43  .    if( iIdx>pC
202e0 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 29  onfig->nPrefix )
202f0 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 2d  {.      iIdx = -
20300 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
20310 70 52 65 74 20 3d 20 28 46 74 73 35 49 6e 64 65  pRet = (Fts5Inde
20320 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 6d  xIter*)sqlite3_m
20330 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74 73  alloc(sizeof(Fts
20340 35 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 20 20  5IndexIter));.  
20350 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
20360 6d 65 6d 73 65 74 28 70 52 65 74 2c 20 30 2c 20  memset(pRet, 0, 
20370 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78  sizeof(Fts5Index
20380 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 70 52 65  Iter));..    pRe
20390 74 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20  t->pIndex = p;. 
203a0 20 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29     if( iIdx>=0 )
203b0 7b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 70 53  {.      pRet->pS
203c0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
203d0 63 74 75 72 65 52 65 61 64 28 70 2c 20 69 49 64  ctureRead(p, iId
203e0 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  x);.      if( pR
203f0 65 74 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a 20  et->pStruct ){. 
20400 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
20410 49 74 65 72 4e 65 77 28 70 2c 20 70 52 65 74 2d  IterNew(p, pRet-
20420 3e 70 53 74 72 75 63 74 2c 20 0a 20 20 20 20 20  >pStruct, .     
20430 20 20 20 20 20 20 20 69 49 64 78 2c 20 66 6c 61         iIdx, fla
20440 67 73 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  gs, (const u8*)p
20450 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d  Token, nToken, -
20460 31 2c 20 30 2c 20 26 70 52 65 74 2d 3e 70 4d 75  1, 0, &pRet->pMu
20470 6c 74 69 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  lti.        );. 
20480 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
20490 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 41 73 63  {.      int bAsc
204a0 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35   = (flags & FTS5
204b0 49 4e 44 45 58 5f 51 55 45 52 59 5f 41 53 43 29  INDEX_QUERY_ASC)
204c0 21 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 53  !=0;.      fts5S
204d0 65 74 75 70 50 72 65 66 69 78 49 74 65 72 28 70  etupPrefixIter(p
204e0 2c 20 62 41 73 63 2c 20 28 63 6f 6e 73 74 20 75  , bAsc, (const u
204f0 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  8*)pToken, nToke
20500 6e 2c 20 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a  n, pRet);.    }.
20510 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
20520 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   ){.    sqlite3F
20530 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 52 65  ts5IterClose(pRe
20540 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  t);.    pRet = 0
20550 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
20560 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
20570 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
20580 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
20590 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
205a0 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e  ument is at EOF.
205b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
205c0 74 73 35 49 74 65 72 45 6f 66 28 46 74 73 35 49  ts5IterEof(Fts5I
205d0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
205e0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  {.  if( pIter->p
205f0 44 6f 63 6c 69 73 74 20 29 7b 20 0a 20 20 20 20  Doclist ){ .    
20600 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44  return pIter->pD
20610 6f 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73 74  oclist->aPoslist
20620 3d 3d 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20  ==0; .  }else{. 
20630 20 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75     return fts5Mu
20640 6c 74 69 49 74 65 72 45 6f 66 28 70 49 74 65 72  ltiIterEof(pIter
20650 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d  ->pIndex, pIter-
20660 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a  >pMulti);.  }.}.
20670 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
20680 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
20690 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 76 6f 69 64   rowid. .*/.void
206a0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
206b0 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74  Next(Fts5IndexIt
206c0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
206d0 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  ( pIter->pDoclis
206e0 74 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f 63  t ){.    fts5Doc
206f0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49 74  listIterNext(pIt
20700 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20  er->pDoclist);. 
20710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
20720 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
20730 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
20740 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
20750 78 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  xt(pIter->pIndex
20760 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c  , pIter->pMulti,
20770 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 0);.  }.}../
20780 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
20790 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72   next matching r
207a0 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72 73  owid that occurs
207b0 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61   at or after iMa
207c0 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69  tch. The.** defi
207d0 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72  nition of "at or
207e0 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73 20   after" depends 
207f0 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73 20  on whether this 
20800 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65  iterator iterate
20810 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  s.** in ascendin
20820 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20  g or descending 
20830 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a  rowid order..*/.
20840 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
20850 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73  IterNextFrom(Fts
20860 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
20870 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a  r, i64 iMatch){.
20880 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
20890 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  clist ){.    ass
208a0 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 2f 2a  ert( 0 );.    /*
208b0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
208c0 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e  NextFrom(pIter->
208d0 70 44 6f 63 6c 69 73 74 2c 20 69 4d 61 74 63 68  pDoclist, iMatch
208e0 29 3b 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ); */.  }else{. 
208f0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
20900 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e  NextFrom(pIter->
20910 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
20920 4d 75 6c 74 69 2c 20 69 4d 61 74 63 68 29 3b 0a  Multi, iMatch);.
20930 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
20940 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
20950 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71  rowid..*/.i64 sq
20960 6c 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77  lite3Fts5IterRow
20970 69 64 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  id(Fts5IndexIter
20980 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
20990 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20  pIter->pDoclist 
209a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49  ){.    return pI
209b0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 69  ter->pDoclist->i
209c0 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rowid;.  }else{.
209d0 20 20 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d      return fts5M
209e0 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
209f0 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20  ter->pMulti);.  
20a00 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  }.}.../*.** Retu
20a10 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
20a20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
20a30 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ing a copy of th
20a40 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
20a50 66 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  for.** the curre
20a60 6e 74 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74  nt entry. Output
20a70 20 76 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73   variable *pn is
20a80 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
20a90 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a   of the buffer .
20aa0 2a 2a 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f  ** in bytes befo
20ab0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
20ac0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
20ad0 20 62 75 66 66 65 72 20 64 6f 65 73 20 6e 6f 74   buffer does not
20ae0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 30 78 30   include the 0x0
20af0 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  0 terminator byt
20b00 65 20 73 74 6f 72 65 64 20 6f 6e 0a 2a 2a 20 64  e stored on.** d
20b10 69 73 6b 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 75 38  isk..*/.const u8
20b20 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65   *sqlite3Fts5Ite
20b30 72 50 6f 73 6c 69 73 74 28 46 74 73 35 49 6e 64  rPoslist(Fts5Ind
20b40 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  exIter *pIter, i
20b50 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 66 28 20 70  nt *pn){.  if( p
20b60 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29  Iter->pDoclist )
20b70 7b 0a 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65  {.    *pn = pIte
20b80 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 6e 50 6f  r->pDoclist->nPo
20b90 73 6c 69 73 74 3b 0a 20 20 20 20 72 65 74 75 72  slist;.    retur
20ba0 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  n pIter->pDoclis
20bb0 74 2d 3e 61 50 6f 73 6c 69 73 74 3b 0a 20 20 7d  t->aPoslist;.  }
20bc0 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 49 6e  else{.    Fts5In
20bd0 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e  dex *p = pIter->
20be0 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
20bf0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
20c00 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
20c10 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f   fts5MultiIterPo
20c20 73 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2d 3e  slist(p, pIter->
20c30 70 4d 75 6c 74 69 2c 20 30 2c 20 26 70 49 74 65  pMulti, 0, &pIte
20c40 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
20c50 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
20c60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
20c70 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
20c80 75 72 6e 20 30 3b 0a 20 20 20 20 2a 70 6e 20 3d  urn 0;.    *pn =
20c90 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
20ca0 6e 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49  n;.    return pI
20cb0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
20cc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
20cd0 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f  se an iterator o
20ce0 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  pened by an earl
20cf0 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ier call to sqli
20d00 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
20d10 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  y()..*/.void sql
20d20 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
20d30 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  e(Fts5IndexIter 
20d40 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
20d50 49 74 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20  Iter ){.    if( 
20d60 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20  pIter->pDoclist 
20d70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20d80 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6f  _free(pIter->pDo
20d90 63 6c 69 73 74 2d 3e 61 29 3b 0a 20 20 20 20 20  clist->a);.     
20da0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
20db0 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a  ter->pDoclist);.
20dc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20dd0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
20de0 65 65 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  ee(pIter->pIndex
20df0 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29  , pIter->pMulti)
20e00 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  ;.      fts5Stru
20e10 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 49 74  ctureRelease(pIt
20e20 65 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20 20  er->pStruct);.  
20e30 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
20e40 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ee(&pIter->posli
20e50 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  st);.    }.    f
20e60 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
20e70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 20  Iter->pIndex);. 
20e80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20e90 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
20ea0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 22 61  *.** Read the "a
20eb0 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
20ec0 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
20ed0 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20  supplied as the 
20ee0 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d  second .** argum
20ef0 65 6e 74 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ent. Return SQLI
20f00 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
20f10 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
20f20 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
20f30 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
20f40 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
20f50 65 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76  e3Fts5IndexGetAv
20f60 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
20f70 20 2a 70 2c 20 46 74 73 35 42 75 66 66 65 72 20   *p, Fts5Buffer 
20f80 2a 70 42 75 66 29 7b 0a 20 20 66 74 73 35 44 61  *pBuf){.  fts5Da
20f90 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28 70  taReadOrBuffer(p
20fa0 2c 20 70 42 75 66 2c 20 46 54 53 35 5f 41 56 45  , pBuf, FTS5_AVE
20fb0 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a 20 20  RAGES_ROWID);.  
20fc0 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
20fd0 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
20fe0 68 65 20 63 75 72 72 65 6e 74 20 22 61 76 65 72  he current "aver
20ff0 61 67 65 73 22 20 72 65 63 6f 72 64 20 77 69 74  ages" record wit
21000 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  h the contents o
21010 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a  f the buffer .**
21020 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
21030 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
21040 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21050 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65 72  Fts5IndexSetAver
21060 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ages(Fts5Index *
21070 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  p, const u8 *pDa
21080 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a  ta, int nData){.
21090 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
210a0 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  p, FTS5_AVERAGES
210b0 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e  _ROWID, pData, n
210c0 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
210d0 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->rc;.}../*.** 
210e0 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
210f0 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b   number of block
21100 73 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61  s this module ha
21110 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
21120 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20  %_data.** table 
21130 73 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65  since it was cre
21140 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
21150 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61  ite3Fts5IndexRea
21160 64 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ds(Fts5Index *p)
21170 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52  {.  return p->nR
21180 65 61 64 3b 0a 7d 0a 0a                          ead;.}..