/ Hex Artifact Content
Login

Artifact 5cb71b3922e50a23752fd6c11028acfe2f367850:


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 57 4f 52 4b  define FTS5_WORK
0670: 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20 20  _UNIT      64   
0680: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
0690: 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69 74  af pages in unit
06a0: 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 23 64 65 66   of work */.#def
06b0: 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 4d 45 52  ine FTS5_MIN_MER
06c0: 47 45 20 20 20 20 20 20 20 34 20 20 20 20 2f 2a  GE       4    /*
06d0: 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Minimum number 
06e0: 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d  of segments to m
06f0: 65 72 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  erge */.#define 
0700: 46 54 53 35 5f 43 52 49 53 49 53 5f 4d 45 52 47  FTS5_CRISIS_MERG
0710: 45 20 20 20 31 36 20 20 20 20 2f 2a 20 4d 61 78  E   16    /* Max
0720: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
0730: 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65  egments to merge
0740: 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 54 53   */..#define FTS
0750: 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45  5_MIN_DLIDX_SIZE
0760: 20 20 34 20 20 20 20 2f 2a 20 41 64 64 20 64 6c    4    /* Add dl
0770: 69 64 78 20 69 66 20 74 68 69 73 20 6d 61 6e 79  idx if this many
0780: 20 65 6d 70 74 79 20 70 61 67 65 73 20 2a 2f 0a   empty pages */.
0790: 0a 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a  ./*.** Details:.
07a0: 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61  **.** The %_data
07b0: 20 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62   table managed b
07c0: 79 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a  y this module,.*
07d0: 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20  *.**     CREATE 
07e0: 54 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20  TABLE %_data(id 
07f0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
0800: 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29  KEY, block BLOB)
0810: 3b 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69  ;.**.** , contai
0820: 6e 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ns the following
0830: 20 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f   5 types of reco
0840: 72 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d  rds. See the com
0850: 6d 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e  ments surroundin
0860: 67 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f  g.** the FTS5_*_
0870: 52 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c  ROWID macros bel
0880: 6f 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  ow for a descrip
0890: 74 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61  tion of how %_da
08a0: 74 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a  ta rowids are .*
08b0: 2a 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61  * assigned to ea
08c0: 63 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  ch fo them..**.*
08d0: 2a 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52  * 1. Structure R
08e0: 65 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ecords:.**.**   
08f0: 54 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65  The set of segme
0900: 6e 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  nts that make up
0910: 20 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20   an index - the 
0920: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
0930: 2d 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72  - are.**   recor
0940: 64 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  ded in a single 
0950: 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68  record within th
0960: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20  e %_data table. 
0970: 54 68 65 20 72 65 63 6f 72 64 20 69 73 20 61 20  The record is a 
0980: 6c 69 73 74 0a 2a 2a 20 20 20 6f 66 20 53 51 4c  list.**   of SQL
0990: 69 74 65 20 76 61 72 69 6e 74 73 2e 20 0a 2a 2a  ite varints. .**
09a0: 0a 2a 2a 20 20 20 54 68 65 20 72 65 63 6f 72 64  .**   The record
09b0: 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 72   begins with thr
09c0: 65 65 20 76 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a  ee varints:.**.*
09d0: 2a 20 20 20 20 20 2b 20 6e 75 6d 62 65 72 20 6f  *     + number o
09e0: 66 20 6c 65 76 65 6c 73 2c 0a 2a 2a 20 20 20 20  f levels,.**    
09f0: 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20   + total number 
0a00: 6f 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61  of segments on a
0a10: 6c 6c 20 6c 65 76 65 6c 73 2c 0a 2a 2a 20 20 20  ll levels,.**   
0a20: 20 20 2b 20 76 61 6c 75 65 20 6f 66 20 77 72 69    + value of wri
0a30: 74 65 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a  te counter..**.*
0a40: 2a 20 20 20 54 68 65 6e 2c 20 66 6f 72 20 65 61  *   Then, for ea
0a50: 63 68 20 6c 65 76 65 6c 20 66 72 6f 6d 20 30 20  ch level from 0 
0a60: 74 6f 20 6e 4d 61 78 3a 0a 2a 2a 0a 2a 2a 20 20  to nMax:.**.**  
0a70: 20 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 69     + number of i
0a80: 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 69 6e  nput segments in
0a90: 20 6f 6e 67 6f 69 6e 67 20 6d 65 72 67 65 2e 0a   ongoing merge..
0aa0: 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c 20 6e  **     + total n
0ab0: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
0ac0: 73 20 69 6e 20 6c 65 76 65 6c 2e 0a 2a 2a 20 20  s in level..**  
0ad0: 20 20 20 2b 20 66 6f 72 20 65 61 63 68 20 73 65     + for each se
0ae0: 67 6d 65 6e 74 20 66 72 6f 6d 20 6f 6c 64 65 73  gment from oldes
0af0: 74 20 74 6f 20 6e 65 77 65 73 74 3a 0a 2a 2a 20  t to newest:.** 
0b00: 20 20 20 20 20 20 20 20 2b 20 73 65 67 6d 65 6e          + segmen
0b10: 74 20 69 64 20 28 61 6c 77 61 79 73 20 3e 20 30  t id (always > 0
0b20: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 62  ).**         + b
0b30: 2d 74 72 65 65 20 68 65 69 67 68 74 20 28 31 20  -tree height (1 
0b40: 2d 3e 20 72 6f 6f 74 20 69 73 20 6c 65 61 66 2c  -> root is leaf,
0b50: 20 32 20 2d 3e 20 72 6f 6f 74 20 69 73 20 70 61   2 -> root is pa
0b60: 72 65 6e 74 20 6f 66 20 6c 65 61 66 20 65 74 63  rent of leaf etc
0b70: 2e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20  .).**         + 
0b80: 66 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  first leaf page 
0b90: 6e 75 6d 62 65 72 20 28 6f 66 74 65 6e 20 31 29  number (often 1)
0ba0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69  .**         + fi
0bb0: 6e 61 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75  nal leaf page nu
0bc0: 6d 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68  mber.**.** 2. Th
0bd0: 65 20 41 76 65 72 61 67 65 73 20 52 65 63 6f 72  e Averages Recor
0be0: 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e  d:.**.**   A sin
0bf0: 67 6c 65 20 72 65 63 6f 72 64 20 77 69 74 68 69  gle record withi
0c00: 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  n the %_data tab
0c10: 6c 65 2e 20 54 68 65 20 64 61 74 61 20 69 73 20  le. The data is 
0c20: 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74  a list of varint
0c30: 73 2e 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73  s..**   The firs
0c40: 74 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  t value is the n
0c50: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
0c60: 20 74 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e   the index. Then
0c70: 2c 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  , for each colum
0c80: 6e 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74  n.**   from left
0c90: 20 74 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74   to right, the t
0ca0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74  otal number of t
0cb0: 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c  okens in the col
0cc0: 75 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a 2a 2a 20  umn for all .** 
0cd0: 20 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61    rows of the ta
0ce0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65  ble..**.** 3. Se
0cf0: 67 6d 65 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a  gment leaves:.**
0d00: 0a 2a 2a 20 20 20 54 45 52 4d 20 44 4f 43 4c 49  .**   TERM DOCLI
0d10: 53 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a  ST FORMAT:.**.**
0d20: 20 20 20 20 20 4d 6f 73 74 20 6f 66 20 65 61 63       Most of eac
0d30: 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20 69  h segment leaf i
0d40: 73 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 65  s taken up by te
0d50: 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 2e  rm/doclist data.
0d60: 20 54 68 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e   The .**     gen
0d70: 65 72 61 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74  eral format of t
0d80: 68 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20  he term/doclist 
0d90: 64 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  data is:.**.**  
0da0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20         varint : 
0db0: 73 69 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65  size of first te
0dc0: 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 6c  rm.**         bl
0dd0: 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72  ob:    first ter
0de0: 6d 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20  m data.**       
0df0: 20 20 64 6f 63 6c 69 73 74 3a 20 66 69 72 73 74    doclist: first
0e00: 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20   doclist.**     
0e10: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
0e20: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
0e30: 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20  varint:  number 
0e40: 6f 66 20 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d  of bytes in comm
0e50: 6f 6e 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  on with previous
0e60: 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20   term.**        
0e70: 20 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62     varint:  numb
0e80: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e  er of bytes of n
0e90: 65 77 20 74 65 72 6d 20 64 61 74 61 20 28 6e 4e  ew term data (nN
0ea0: 65 77 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ew).**          
0eb0: 20 62 6c 6f 62 3a 20 20 20 20 6e 4e 65 77 20 62   blob:    nNew b
0ec0: 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d  ytes of new term
0ed0: 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20   data.**        
0ee0: 20 20 20 64 6f 63 6c 69 73 74 3a 20 6e 65 78 74     doclist: next
0ef0: 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20   doclist.**     
0f00: 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20      }.**.**     
0f10: 64 6f 63 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a  doclist format:.
0f20: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61  **.**         va
0f30: 72 69 6e 74 3a 20 20 66 69 72 73 74 20 72 6f 77  rint:  first row
0f40: 69 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6f  id.**         po
0f50: 73 6c 69 73 74 3a 20 66 69 72 73 74 20 70 6f 73  slist: first pos
0f60: 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  list.**         
0f70: 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a  zero-or-more {.*
0f80: 2a 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69  *           vari
0f90: 6e 74 3a 20 20 72 6f 77 69 64 20 64 65 6c 74 61  nt:  rowid delta
0fa0: 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a   (always > 0).**
0fb0: 20 20 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69             posli
0fc0: 73 74 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73  st: first poslis
0fd0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  t.**         }.*
0fe0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 30 20 62  *         0x00 b
0ff0: 79 74 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 6f  yte.**.**     po
1000: 73 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a  slist format:.**
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72 69  .**         vari
1020: 6e 74 3a 20 73 69 7a 65 20 6f 66 20 70 6f 73 6c  nt: size of posl
1030: 69 73 74 20 69 6e 20 62 79 74 65 73 2e 20 6e 6f  ist in bytes. no
1040: 74 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 69 73  t including this
1050: 20 66 69 65 6c 64 2e 0a 2a 2a 20 20 20 20 20 20   field..**      
1060: 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c 6c     collist: coll
1070: 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 30  ist for column 0
1080: 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f  .**         zero
1090: 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20  -or-more {.**   
10a0: 20 20 20 20 20 20 20 20 30 78 30 31 20 62 79 74          0x01 byt
10b0: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76  e.**           v
10c0: 61 72 69 6e 74 3a 20 63 6f 6c 75 6d 6e 20 6e 75  arint: column nu
10d0: 6d 62 65 72 20 28 49 29 0a 2a 2a 20 20 20 20 20  mber (I).**     
10e0: 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63        collist: c
10f0: 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d  ollist for colum
1100: 6e 20 49 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  n I.**         }
1110: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 6c 6c 69  .**.**     colli
1120: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1130: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1140: 20 66 69 72 73 74 20 6f 66 66 73 65 74 20 2b 20   first offset + 
1150: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72  2.**         zer
1160: 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20  o-or-more {.**  
1170: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1180: 20 6f 66 66 73 65 74 20 64 65 6c 74 61 20 2b 20   offset delta + 
1190: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a  2.**         }.*
11a0: 2a 0a 2a 2a 20 20 20 50 41 47 49 4e 41 54 49 4f  *.**   PAGINATIO
11b0: 4e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  N.**.**     The 
11c0: 66 6f 72 6d 61 74 20 64 65 73 63 72 69 62 65 64  format described
11d0: 20 61 62 6f 76 65 20 69 73 20 6f 6e 6c 79 20 61   above is only a
11e0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
11f0: 6e 74 69 72 65 20 74 65 72 6d 2f 64 6f 63 6c 69  ntire term/docli
1200: 73 74 0a 2a 2a 20 20 20 20 20 64 61 74 61 20 66  st.**     data f
1210: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1220: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1230: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1240: 73 65 2c 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a  se, the format.*
1250: 2a 20 20 20 20 20 69 73 20 63 68 61 6e 67 65 64  *     is changed
1260: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1270: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1280: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1290: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
12a0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
12b0: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
12c0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
12d0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
12e0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
12f0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
1300: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
1310: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1320: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1330: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1340: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1350: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1360: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1370: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1380: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1390: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
13a0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
13c0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
13d0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 20 20 20 20   data.**.**     
13e0: 45 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 62  Each leaf page b
13f0: 65 67 69 6e 73 20 77 69 74 68 3a 0a 2a 2a 0a 2a  egins with:.**.*
1400: 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74 65  *       + 2-byte
1410: 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61 69   unsigned contai
1420: 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20 66  ning offset to f
1430: 69 72 73 74 20 72 6f 77 69 64 20 28 6f 72 20 30  irst rowid (or 0
1440: 29 2e 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d  )..**       + 2-
1450: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63 6f  byte unsigned co
1460: 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74 20  ntaining offset 
1470: 74 6f 20 66 69 72 73 74 20 74 65 72 6d 20 28 6f  to first term (o
1480: 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f  r 0)..**.**   Fo
1490: 6c 6c 6f 77 65 64 20 62 79 20 74 65 72 6d 2f 64  llowed by term/d
14a0: 6f 63 6c 69 73 74 20 64 61 74 61 2e 0a 2a 2a 0a  oclist data..**.
14b0: 2a 2a 20 34 2e 20 53 65 67 6d 65 6e 74 20 69 6e  ** 4. Segment in
14c0: 74 65 72 69 6f 72 20 6e 6f 64 65 73 3a 0a 2a 2a  terior nodes:.**
14d0: 0a 2a 2a 20 20 20 54 68 65 20 69 6e 74 65 72 69  .**   The interi
14e0: 6f 72 20 6e 6f 64 65 73 20 74 75 72 6e 20 74 68  or nodes turn th
14f0: 65 20 6c 69 73 74 20 6f 66 20 6c 65 61 76 65 73  e list of leaves
1500: 20 69 6e 74 6f 20 61 20 62 2b 74 72 65 65 2e 20   into a b+tree. 
1510: 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63 68 20 69 6e  .**.**   Each in
1520: 74 65 72 69 6f 72 20 6e 6f 64 65 20 62 65 67 69  terior node begi
1530: 6e 73 20 77 69 74 68 20 61 20 76 61 72 69 6e 74  ns with a varint
1540: 20 2d 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62   - the page numb
1550: 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 0a 2a  er of the left.*
1560: 2a 20 20 20 6d 6f 73 74 20 63 68 69 6c 64 20 6e  *   most child n
1570: 6f 64 65 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74  ode. Following t
1580: 68 69 73 2c 20 66 6f 72 20 65 61 63 68 20 6c 65  his, for each le
1590: 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20 74  af page except t
15a0: 68 65 20 66 69 72 73 74 2c 0a 2a 2a 20 20 20 74  he first,.**   t
15b0: 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  he interior node
15c0: 73 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a  s contain:.**.**
15d0: 20 20 20 20 20 61 29 20 49 66 20 74 68 65 20 6c       a) If the l
15e0: 65 61 66 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  eaf page contain
15f0: 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  s at least one t
1600: 65 72 6d 2c 20 74 68 65 6e 20 61 20 74 65 72 6d  erm, then a term
1610: 2d 70 72 65 66 69 78 20 74 68 61 74 0a 2a 2a 20  -prefix that.** 
1620: 20 20 20 20 20 20 20 69 73 20 67 72 65 61 74 65         is greate
1630: 72 20 74 68 61 6e 20 61 6c 6c 20 70 72 65 76 69  r than all previ
1640: 6f 75 73 20 74 65 72 6d 73 2c 20 61 6e 64 20 6c  ous terms, and l
1650: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1660: 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  l to the.**     
1670: 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e     first term on
1680: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e 0a   the leaf page..
1690: 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20 49 66 20  **.**     b) If 
16a0: 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 6f  the leaf page no
16b0: 20 74 65 72 6d 73 2c 20 61 20 72 65 63 6f 72 64   terms, a record
16c0: 20 69 6e 64 69 63 61 74 69 6e 67 20 68 6f 77 20   indicating how 
16d0: 6d 61 6e 79 20 63 6f 6e 73 65 63 75 74 69 76 65  many consecutive
16e0: 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65 61 76 65  .**        leave
16f0: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72  s contain no ter
1700: 6d 73 2c 20 61 6e 64 20 77 68 65 74 68 65 72 20  ms, and whether 
1710: 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 69 73 20  or not there is 
1720: 61 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  an associated.**
1730: 20 20 20 20 20 20 20 20 62 79 2d 72 6f 77 69 64          by-rowid
1740: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a   index record..*
1750: 2a 0a 2a 2a 20 20 20 42 79 20 64 65 66 69 6e 69  *.**   By defini
1760: 74 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20 6e  tion, there is n
1770: 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ever more than o
1780: 6e 65 20 74 79 70 65 20 28 62 29 20 72 65 63 6f  ne type (b) reco
1790: 72 64 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a 20  rd in a row..** 
17a0: 20 20 54 79 70 65 20 28 62 29 20 72 65 63 6f 72    Type (b) recor
17b0: 64 73 20 6f 6e 6c 79 20 65 76 65 72 20 61 70 70  ds only ever app
17c0: 65 61 72 20 6f 6e 20 68 65 69 67 68 74 3d 31 20  ear on height=1 
17d0: 70 61 67 65 73 20 2d 20 69 6d 6d 65 64 69 61 74  pages - immediat
17e0: 65 20 70 61 72 65 6e 74 73 0a 2a 2a 20 20 20 6f  e parents.**   o
17f0: 66 20 6c 65 61 76 65 73 2e 20 4f 6e 6c 79 20 74  f leaves. Only t
1800: 79 70 65 20 28 61 29 20 72 65 63 6f 72 64 73 20  ype (a) records 
1810: 61 72 65 20 70 75 73 68 65 64 20 74 6f 20 68 69  are pushed to hi
1820: 67 68 65 72 20 6c 65 76 65 6c 73 2e 0a 2a 2a 0a  gher levels..**.
1830: 2a 2a 20 20 20 54 65 72 6d 20 66 6f 72 6d 61 74  **   Term format
1840: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e 75  :.**.**     * Nu
1850: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1860: 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65   common with pre
1870: 76 69 6f 75 73 20 74 65 72 6d 20 70 6c 75 73 20  vious term plus 
1880: 32 2c 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a  2, as a varint..
1890: 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72 20  **     * Number 
18a0: 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20  of bytes of new 
18b0: 74 65 72 6d 20 64 61 74 61 2c 20 61 73 20 61 20  term data, as a 
18c0: 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20 2a  varint..**     *
18d0: 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2e 0a   new term data..
18e0: 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d 74 65 72 6d 20  **.**   No-term 
18f0: 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  format:.**.**   
1900: 20 20 2a 20 65 69 74 68 65 72 20 61 6e 20 30 78    * either an 0x
1910: 30 30 20 6f 72 20 30 78 30 31 20 62 79 74 65 2e  00 or 0x01 byte.
1920: 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 30 78   If the value 0x
1930: 30 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  01 is used, then
1940: 20 74 68 65 72 65 20 0a 2a 2a 20 20 20 20 20 20   there .**      
1950: 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65   is an associate
1960: 64 20 69 6e 64 65 78 2d 62 79 2d 72 6f 77 69 64  d index-by-rowid
1970: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 20 20 20 20   record..**     
1980: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
1990: 7a 65 72 6f 2d 74 65 72 6d 20 6c 65 61 76 65 73  zero-term leaves
19a0: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
19b0: 0a 2a 2a 20 35 2e 20 53 65 67 6d 65 6e 74 20 64  .** 5. Segment d
19c0: 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 3a 0a  oclist indexes:.
19d0: 2a 2a 0a 2a 2a 20 20 20 41 20 6c 69 73 74 20 6f  **.**   A list o
19e0: 66 20 76 61 72 69 6e 74 73 20 2d 20 74 68 65 20  f varints - the 
19f0: 66 69 72 73 74 20 64 6f 63 69 64 20 6f 6e 20 65  first docid on e
1a00: 61 63 68 20 70 61 67 65 20 28 73 74 61 72 74 69  ach page (starti
1a10: 6e 67 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 20  ng with the.**  
1a20: 20 66 69 72 73 74 20 74 65 72 6d 6c 65 73 73 20   first termless 
1a30: 70 61 67 65 29 20 6f 66 20 74 68 65 20 64 6f 63  page) of the doc
1a40: 6c 69 73 74 2e 20 46 69 72 73 74 20 65 6c 65 6d  list. First elem
1a50: 65 6e 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ent in the list 
1a60: 69 73 20 61 0a 2a 2a 20 20 20 6c 69 74 65 72 61  is a.**   litera
1a70: 6c 20 64 6f 63 69 64 2e 20 45 61 63 68 20 64 6f  l docid. Each do
1a80: 63 69 64 20 74 68 65 72 65 61 66 74 65 72 20 69  cid thereafter i
1a90: 73 20 61 20 28 6e 65 67 61 74 69 76 65 29 20 64  s a (negative) d
1aa0: 65 6c 74 61 2e 20 49 66 20 74 68 65 72 65 0a 2a  elta. If there.*
1ab0: 2a 20 20 20 61 72 65 20 6e 6f 20 64 6f 63 69 64  *   are no docid
1ac0: 73 20 61 74 20 61 6c 6c 20 6f 6e 20 61 20 70 61  s at all on a pa
1ad0: 67 65 2c 20 61 20 30 78 30 30 20 62 79 74 65 20  ge, a 0x00 byte 
1ae0: 74 61 6b 65 73 20 74 68 65 20 70 6c 61 63 65 20  takes the place 
1af0: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 64 65 6c 74  of the.**   delt
1b00: 61 20 76 61 6c 75 65 2e 0a 2a 2f 0a 0a 2f 2a 0a  a value..*/../*.
1b10: 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74 68  ** Rowids for th
1b20: 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20 73  e averages and s
1b30: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 73  tructure records
1b40: 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74   in the %_data t
1b50: 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  able..*/.#define
1b60: 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52   FTS5_AVERAGES_R
1b70: 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f 2a  OWID     1    /*
1b80: 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72 20   Rowid used for 
1b90: 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65 63  the averages rec
1ba0: 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46  ord */.#define F
1bb0: 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
1bc0: 57 49 44 28 69 49 64 78 29 20 28 31 30 20 2b 20  WID(iIdx) (10 + 
1bd0: 28 69 49 64 78 29 29 20 20 20 20 20 2f 2a 20 46  (iIdx))     /* F
1be0: 6f 72 20 73 74 72 75 63 74 75 72 65 20 72 65 63  or structure rec
1bf0: 6f 72 64 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  ords */../*.** M
1c00: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1c10: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1c20: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6e 6f 64  d by segment nod
1c30: 65 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 69 6e  es. All nodes in
1c40: 20 61 6c 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 73   all.** segments
1c50: 20 66 6f 72 20 61 6c 6c 20 69 6e 64 65 78 65 73   for all indexes
1c60: 20 28 74 68 65 20 72 65 67 75 6c 61 72 20 46 54   (the regular FT
1c70: 53 20 69 6e 64 65 78 20 61 6e 64 20 61 6e 79 20  S index and any 
1c80: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 29 0a  prefix indexes).
1c90: 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
1ca0: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
1cb0: 65 20 77 69 74 68 20 6c 61 72 67 65 20 70 6f 73  e with large pos
1cc0: 69 74 69 76 65 20 72 6f 77 69 64 73 2e 0a 2a 2a  itive rowids..**
1cd0: 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74  .** The %_data t
1ce0: 61 62 6c 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  able may contain
1cf0: 20 75 70 20 74 6f 20 28 31 3c 3c 46 54 53 35 5f   up to (1<<FTS5_
1d00: 53 45 47 4d 45 4e 54 5f 49 4e 44 45 58 5f 42 49  SEGMENT_INDEX_BI
1d10: 54 53 29 20 0a 2a 2a 20 69 6e 64 65 78 65 73 20  TS) .** indexes 
1d20: 2d 20 6f 6e 65 20 72 65 67 75 6c 61 72 20 74 65  - one regular te
1d30: 72 6d 20 69 6e 64 65 78 20 61 6e 64 20 7a 65 72  rm index and zer
1d40: 6f 20 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78  o or more prefix
1d50: 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a 2a 2a 20   indexes..**.** 
1d60: 45 61 63 68 20 73 65 67 6d 65 6e 74 20 69 6e 20  Each segment in 
1d70: 61 6e 20 69 6e 64 65 78 20 68 61 73 20 61 20 75  an index has a u
1d80: 6e 69 71 75 65 20 69 64 20 67 72 65 61 74 65 72  nique id greater
1d90: 20 74 68 61 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a   than zero..**.*
1da0: 2a 20 45 61 63 68 20 6e 6f 64 65 20 69 6e 20 61  * Each node in a
1db0: 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20   segment b-tree 
1dc0: 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 22 70  is assigned a "p
1dd0: 61 67 65 20 6e 75 6d 62 65 72 22 20 74 68 61 74  age number" that
1de0: 20 69 73 20 75 6e 69 71 75 65 0a 2a 2a 20 77 69   is unique.** wi
1df0: 74 68 69 6e 20 6e 6f 64 65 73 20 6f 66 20 69 74  thin nodes of it
1e00: 73 20 68 65 69 67 68 74 20 77 69 74 68 69 6e 20  s height within 
1e10: 74 68 65 20 73 65 67 6d 65 6e 74 20 28 6c 65 61  the segment (lea
1e20: 66 20 6e 6f 64 65 73 20 68 61 76 65 20 61 20 68  f nodes have a h
1e30: 65 69 67 68 74 20 0a 2a 2a 20 6f 66 20 30 2c 20  eight .** of 0, 
1e40: 70 61 72 65 6e 74 73 20 31 2c 20 65 74 63 2e 29  parents 1, etc.)
1e50: 2e 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 61  . Page numbers a
1e60: 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 65 71  re allocated seq
1e70: 75 65 6e 74 69 61 6c 6c 79 20 73 6f 20 74 68 61  uentially so tha
1e80: 74 0a 2a 2a 20 61 20 6e 6f 64 65 73 20 70 61 67  t.** a nodes pag
1e90: 65 20 6e 75 6d 62 65 72 20 69 73 20 61 6c 77 61  e number is alwa
1ea0: 79 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  ys one more than
1eb0: 20 69 74 73 20 6c 65 66 74 20 73 69 62 6c 69 6e   its left siblin
1ec0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 77  g..**.** The row
1ed0: 69 64 20 66 6f 72 20 61 20 6e 6f 64 65 20 69 73  id for a node is
1ee0: 20 74 68 65 6e 20 66 6f 75 6e 64 20 75 73 69 6e   then found usin
1ef0: 67 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d 45  g the FTS5_SEGME
1f00: 4e 54 5f 52 4f 57 49 44 28 29 20 6d 61 63 72 6f  NT_ROWID() macro
1f10: 0a 2a 2a 20 62 65 6c 6f 77 2e 20 54 68 65 20 46  .** below. The F
1f20: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 2a 5f 42 49  TS5_SEGMENT_*_BI
1f30: 54 53 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65  TS macros define
1f40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1f50: 69 74 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 65  its used.** to e
1f60: 6e 63 6f 64 65 20 74 68 65 20 74 68 72 65 65 20  ncode the three 
1f70: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
1f80: 49 44 28 29 20 61 72 67 75 6d 65 6e 74 73 2e 20  ID() arguments. 
1f90: 54 68 69 73 20 6d 6f 64 75 6c 65 20 72 65 74 75  This module retu
1fa0: 72 6e 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  rns.** SQLITE_FU
1fb0: 4c 4c 20 61 6e 64 20 66 61 69 6c 73 20 74 68 65  LL and fails the
1fc0: 20 63 75 72 72 65 6e 74 20 6f 70 65 72 61 74 69   current operati
1fd0: 6f 6e 20 69 66 20 74 68 65 79 20 65 76 65 72 20  on if they ever 
1fe0: 70 72 6f 76 65 20 74 6f 6f 20 73 6d 61 6c 6c 2e  prove too small.
1ff0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .*/.#define FTS5
2000: 5f 44 41 54 41 5f 49 44 58 5f 42 20 20 20 20 20  _DATA_IDX_B     
2010: 35 20 20 20 20 20 2f 2a 20 4d 61 78 20 6f 66 20  5     /* Max of 
2020: 33 31 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  31 prefix indexe
2030: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  s */.#define FTS
2040: 35 5f 44 41 54 41 5f 49 44 5f 42 20 20 20 20 20  5_DATA_ID_B     
2050: 31 36 20 20 20 20 20 2f 2a 20 4d 61 78 20 73 65  16     /* Max se
2060: 67 20 69 64 20 6e 75 6d 62 65 72 20 36 35 35 33  g id number 6553
2070: 35 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  5 */.#define FTS
2080: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 20  5_DATA_HEIGHT_B 
2090: 20 35 20 20 20 20 20 2f 2a 20 4d 61 78 20 62 2d   5     /* Max b-
20a0: 74 72 65 65 20 68 65 69 67 68 74 20 6f 66 20 33  tree height of 3
20b0: 32 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53  2 */.#define FTS
20c0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 20 20  5_DATA_PAGE_B   
20d0: 33 31 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 61  31     /* Max pa
20e0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 32 31 34  ge number of 214
20f0: 37 34 38 33 36 34 38 20 2a 2f 0a 0a 23 64 65 66  7483648 */..#def
2100: 69 6e 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  ine FTS5_SEGMENT
2110: 5f 52 4f 57 49 44 28 69 64 78 2c 20 73 65 67 69  _ROWID(idx, segi
2120: 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  d, height, pgno)
2130: 20 28 20 20 20 20 20 20 20 20 20 20 20 20 20 20   (              
2140: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28             \. ((
2150: 69 36 34 29 28 69 64 78 29 20 20 20 20 3c 3c 20  i64)(idx)    << 
2160: 28 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20  (FTS5_DATA_ID_B 
2170: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  + FTS5_DATA_PAGE
2180: 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 48  _B + FTS5_DATA_H
2190: 45 49 47 48 54 5f 42 29 29 20 2b 20 5c 0a 20 28  EIGHT_B)) + \. (
21a0: 28 69 36 34 29 28 73 65 67 69 64 29 20 20 3c 3c  (i64)(segid)  <<
21b0: 20 28 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45   (FTS5_DATA_PAGE
21c0: 5f 42 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 48  _B + FTS5_DATA_H
21d0: 45 49 47 48 54 5f 42 29 29 20 2b 20 20 20 20 20  EIGHT_B)) +     
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
21f0: 28 28 69 36 34 29 28 68 65 69 67 68 74 29 20 3c  ((i64)(height) <
2200: 3c 20 28 46 54 53 35 5f 44 41 54 41 5f 50 41 47  < (FTS5_DATA_PAG
2210: 45 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20  E_B)) +         
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2240: 20 28 28 69 36 34 29 28 70 67 6e 6f 29 29 20 20   ((i64)(pgno))  
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 20 20 20 20 20 20                  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2290: 0a 29 0a 0a 23 69 66 20 46 54 53 35 5f 4d 41 58  .)..#if FTS5_MAX
22a0: 5f 50 52 45 46 49 58 5f 49 4e 44 45 58 45 53 20  _PREFIX_INDEXES 
22b0: 3e 20 28 28 31 3c 3c 46 54 53 35 5f 44 41 54 41  > ((1<<FTS5_DATA
22c0: 5f 49 44 58 5f 42 29 2d 31 29 20 0a 23 20 65 72  _IDX_B)-1) .# er
22d0: 72 6f 72 20 22 46 54 53 35 5f 4d 41 58 5f 50 52  ror "FTS5_MAX_PR
22e0: 45 46 49 58 5f 49 4e 44 45 58 45 53 20 69 73 20  EFIX_INDEXES is 
22f0: 74 6f 6f 20 6c 61 72 67 65 22 0a 23 65 6e 64 69  too large".#endi
2300: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 69  f../*.** The hei
2310: 67 68 74 20 6f 66 20 73 65 67 6d 65 6e 74 20 62  ght of segment b
2320: 2d 74 72 65 65 73 20 69 73 20 61 63 74 75 61 6c  -trees is actual
2330: 6c 79 20 6c 69 6d 69 74 65 64 20 74 6f 20 6f 6e  ly limited to on
2340: 65 20 6c 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20  e less than .** 
2350: 28 31 3c 3c 48 45 49 47 48 54 5f 42 49 54 53 29  (1<<HEIGHT_BITS)
2360: 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
2370: 65 20 74 68 65 20 72 6f 77 69 64 20 61 64 64 72  e the rowid addr
2380: 65 73 73 20 73 70 61 63 65 20 66 6f 72 20 6e 6f  ess space for no
2390: 64 65 73 0a 2a 2a 20 77 69 74 68 20 73 75 63 68  des.** with such
23a0: 20 61 20 68 65 69 67 68 74 20 69 73 20 75 73 65   a height is use
23b0: 64 20 62 79 20 64 6f 63 6c 69 73 74 20 69 6e 64  d by doclist ind
23c0: 65 78 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  exes..*/.#define
23d0: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41   FTS5_SEGMENT_MA
23e0: 58 5f 48 45 49 47 48 54 20 28 28 31 20 3c 3c 20  X_HEIGHT ((1 << 
23f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2400: 5f 42 29 2d 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  _B)-1)../*.** Th
2410: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
2420: 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 61 73  doclist index as
2430: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 65  sociated with le
2440: 61 66 20 70 61 67 65 20 70 67 6e 6f 20 6f 66 20  af page pgno of 
2450: 73 65 67 6d 65 6e 74 0a 2a 2a 20 73 65 67 69 64  segment.** segid
2460: 20 69 6e 20 69 6e 64 65 78 20 69 64 78 2e 0a 2a   in index idx..*
2470: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  /.#define FTS5_D
2480: 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57 49 44  OCLIST_IDX_ROWID
2490: 28 69 64 78 2c 20 73 65 67 69 64 2c 20 70 67 6e  (idx, segid, pgn
24a0: 6f 29 20 5c 0a 20 20 20 20 20 20 20 20 46 54 53  o) \.        FTS
24b0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
24c0: 69 64 78 2c 20 73 65 67 69 64 2c 20 46 54 53 35  idx, segid, FTS5
24d0: 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49  _SEGMENT_MAX_HEI
24e0: 47 48 54 2c 20 70 67 6e 6f 29 0a 0a 23 69 66 64  GHT, pgno)..#ifd
24f0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2500: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43  static int fts5C
2510: 6f 72 72 75 70 74 28 29 20 7b 20 72 65 74 75 72  orrupt() { retur
2520: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2530: 5f 56 54 41 42 3b 20 7d 0a 23 20 64 65 66 69 6e  _VTAB; }.# defin
2540: 65 20 46 54 53 35 5f 43 4f 52 52 55 50 54 20 66  e FTS5_CORRUPT f
2550: 74 73 35 43 6f 72 72 75 70 74 28 29 0a 23 65 6c  ts5Corrupt().#el
2560: 73 65 0a 23 20 64 65 66 69 6e 65 20 46 54 53 35  se.# define FTS5
2570: 5f 43 4f 52 52 55 50 54 20 53 51 4c 49 54 45 5f  _CORRUPT SQLITE_
2580: 43 4f 52 52 55 50 54 5f 56 54 41 42 0a 23 65 6e  CORRUPT_VTAB.#en
2590: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
25a0: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
25b0: 69 6e 74 20 66 74 73 35 4d 69 73 73 69 6e 67 44  int fts5MissingD
25c0: 61 74 61 28 29 20 7b 20 72 65 74 75 72 6e 20 30  ata() { return 0
25d0: 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ; }.#else.# defi
25e0: 6e 65 20 66 74 73 35 4d 69 73 73 69 6e 67 44 61  ne fts5MissingDa
25f0: 74 61 28 29 20 0a 23 65 6e 64 69 66 0a 0a 0a 74  ta() .#endif...t
2600: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2610: 73 35 42 74 72 65 65 49 74 65 72 20 46 74 73 35  s5BtreeIter Fts5
2620: 42 74 72 65 65 49 74 65 72 3b 0a 74 79 70 65 64  BtreeIter;.typed
2630: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 42 74  ef struct Fts5Bt
2640: 72 65 65 49 74 65 72 4c 65 76 65 6c 20 46 74 73  reeIterLevel Fts
2650: 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c 3b  5BtreeIterLevel;
2660: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2670: 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 46 74  Fts5ChunkIter Ft
2680: 73 35 43 68 75 6e 6b 49 74 65 72 3b 0a 74 79 70  s5ChunkIter;.typ
2690: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
26a0: 44 61 74 61 20 46 74 73 35 44 61 74 61 3b 0a 74  Data Fts5Data;.t
26b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
26c0: 73 35 44 6c 69 64 78 49 74 65 72 20 46 74 73 35  s5DlidxIter Fts5
26d0: 44 6c 69 64 78 49 74 65 72 3b 0a 74 79 70 65 64  DlidxIter;.typed
26e0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 4d 75  ef struct Fts5Mu
26f0: 6c 74 69 53 65 67 49 74 65 72 20 46 74 73 35 4d  ltiSegIter Fts5M
2700: 75 6c 74 69 53 65 67 49 74 65 72 3b 0a 74 79 70  ultiSegIter;.typ
2710: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2720: 4e 6f 64 65 49 74 65 72 20 46 74 73 35 4e 6f 64  NodeIter Fts5Nod
2730: 65 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73  eIter;.typedef s
2740: 74 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72  truct Fts5PageWr
2750: 69 74 65 72 20 46 74 73 35 50 61 67 65 57 72 69  iter Fts5PageWri
2760: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2770: 75 63 74 20 46 74 73 35 50 6f 73 49 74 65 72 20  uct Fts5PosIter 
2780: 46 74 73 35 50 6f 73 49 74 65 72 3b 0a 74 79 70  Fts5PosIter;.typ
2790: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
27a0: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
27b0: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
27c0: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
27d0: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
27e0: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
27f0: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2800: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2810: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2820: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
2830: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
2840: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2850: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
2860: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
2870: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2880: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2890: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
28a0: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 2f 2a  tureSegment;../*
28b0: 0a 2a 2a 20 4f 6e 65 20 6f 62 6a 65 63 74 20 70  .** One object p
28c0: 65 72 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  er %_data table.
28d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 49  .*/.struct Fts5I
28e0: 6e 64 65 78 20 7b 0a 20 20 46 74 73 35 43 6f 6e  ndex {.  Fts5Con
28f0: 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b 20 20 20  fig *pConfig;   
2900: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72 74           /* Virt
2910: 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 66 69 67  ual table config
2920: 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  uration */.  cha
2930: 72 20 2a 7a 44 61 74 61 54 62 6c 3b 20 20 20 20  r *zDataTbl;    
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2950: 4e 61 6d 65 20 6f 66 20 25 5f 64 61 74 61 20 74  Name of %_data t
2960: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  able */.  int nM
2970: 69 6e 4d 65 72 67 65 3b 20 20 20 20 20 20 20 20  inMerge;        
2980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
2990: 69 6d 75 6d 20 69 6e 70 75 74 20 73 65 67 6d 65  imum input segme
29a0: 6e 74 73 20 69 6e 20 61 20 6d 65 72 67 65 20 2a  nts in a merge *
29b0: 2f 0a 20 20 69 6e 74 20 6e 43 72 69 73 69 73 4d  /.  int nCrisisM
29c0: 65 72 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  erge;           
29d0: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
29e0: 6c 6c 6f 77 65 64 20 73 65 67 6d 65 6e 74 73 20  llowed segments 
29f0: 70 65 72 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69  per level */.  i
2a00: 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b 20 20 20  nt nWorkUnit;   
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a20: 2a 20 4c 65 61 66 20 70 61 67 65 73 20 69 6e 20  * Leaf pages in 
2a30: 61 20 22 75 6e 69 74 22 20 6f 66 20 77 6f 72 6b  a "unit" of work
2a40: 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 56   */..  /*.  ** V
2a50: 61 72 69 61 62 6c 65 73 20 72 65 6c 61 74 65 64  ariables related
2a60: 20 74 6f 20 74 68 65 20 61 63 63 75 6d 75 6c 61   to the accumula
2a70: 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 73 20 61  tion of tokens a
2a80: 6e 64 20 64 6f 63 6c 69 73 74 73 20 77 69 74 68  nd doclists with
2a90: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 2d 6d  in the.  ** in-m
2aa0: 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
2ab0: 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
2ac0: 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
2ad0: 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73 35 48 61  k..  */.  Fts5Ha
2ae0: 73 68 20 2a 2a 61 70 48 61 73 68 3b 20 20 20 20  sh **apHash;    
2af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
2b00: 61 79 20 6f 66 20 68 61 73 68 20 74 61 62 6c 65  ay of hash table
2b10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50  s */.  int nMaxP
2b20: 65 6e 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20  endingData;     
2b30: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 20 70 65         /* Max pe
2b40: 6e 64 69 6e 67 20 64 61 74 61 20 62 65 66 6f 72  nding data befor
2b50: 65 20 66 6c 75 73 68 20 74 6f 20 64 69 73 6b 20  e flush to disk 
2b60: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2b70: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2b80: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2b90: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2ba0: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2bb0: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2bd0: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2be0: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2bf0: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72  n */..  /* Error
2c00: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74   state. */.  int
2c10: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c30: 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f  Current error co
2c40: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74  de */..  /* Stat
2c50: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 66 74  e used by the ft
2c60: 73 35 44 61 74 61 58 58 58 28 29 20 66 75 6e 63  s5DataXXX() func
2c70: 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tions. */.  sqli
2c80: 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65  te3_blob *pReade
2c90: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  r;          /* R
2ca0: 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e  O incr-blob open
2cb0: 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65   on %_data table
2cc0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2cd0: 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20  mt *pWriter;    
2ce0: 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54        /* "INSERT
2cf0: 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55   ... %_data VALU
2d00: 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71  ES(?,?)" */.  sq
2d10: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
2d20: 65 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  eter;         /*
2d30: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f   "DELETE FROM %_
2d40: 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41  data ... id>=? A
2d50: 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 69  ND id<=?" */.  i
2d60: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d80: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2d90: 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f  f blocks read */
2da0: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  .};..struct Fts5
2db0: 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20  DoclistIter {.  
2dc0: 69 6e 74 20 62 41 73 63 3b 0a 20 20 75 38 20 2a  int bAsc;.  u8 *
2dd0: 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  a;.  int n;.  in
2de0: 74 20 69 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  t i;..  /* Outpu
2df0: 74 20 76 61 72 69 61 62 6c 65 73 2e 20 61 50 6f  t variables. aPo
2e00: 73 6c 69 73 74 3d 3d 30 20 61 74 20 45 4f 46 20  slist==0 at EOF 
2e10: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  */.  i64 iRowid;
2e20: 0a 20 20 75 38 20 2a 61 50 6f 73 6c 69 73 74 3b  .  u8 *aPoslist;
2e30: 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b  .  int nPoslist;
2e40: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .};../*.** Each 
2e50: 69 74 65 72 61 74 6f 72 20 75 73 65 64 20 62 79  iterator used by
2e60: 20 65 78 74 65 72 6e 61 6c 20 6d 6f 64 75 6c 65   external module
2e70: 73 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  s is an instance
2e80: 20 6f 66 20 74 68 69 73 20 74 79 70 65 2e 0a 2a   of this type..*
2e90: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 49 6e 64  /.struct Fts5Ind
2ea0: 65 78 49 74 65 72 20 7b 0a 20 20 46 74 73 35 49  exIter {.  Fts5I
2eb0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
2ec0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2ed0: 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 4d 75  Struct;.  Fts5Mu
2ee0: 6c 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c  ltiSegIter *pMul
2ef0: 74 69 3b 0a 20 20 46 74 73 35 44 6f 63 6c 69 73  ti;.  Fts5Doclis
2f00: 74 49 74 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b  tIter *pDoclist;
2f10: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f  .  Fts5Buffer po
2f20: 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  slist;          
2f30: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
2f40: 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20  taining current 
2f50: 70 6f 73 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f  poslist */.};../
2f60: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 72 65  *.** A single re
2f70: 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
2f80: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
2f90: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44  .*/.struct Fts5D
2fa0: 61 74 61 20 7b 0a 20 20 75 38 20 2a 70 3b 20 20  ata {.  u8 *p;  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2fd0: 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e  er to buffer con
2fe0: 74 61 69 6e 69 6e 67 20 72 65 63 6f 72 64 20 2a  taining record *
2ff0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
3020: 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73 20 2a  ecord in bytes *
3030: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 20 20 20 20 2f 2a 20 52 65 66 20 63 6f 75 6e 74      /* Ref count
3060: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
3070: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
3080: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
3090: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
30a0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
30b0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
30c0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
30d0: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
30e0: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
30f0: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
3100: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
3110: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
3120: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
3130: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
3140: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
3150: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3170: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
3180: 20 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20    int nHeight;  
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 20 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73    /* Height of s
31b0: 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f  egment b-tree */
31c0: 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74  .  int pgnoFirst
31d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31e0: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66     /* First leaf
31f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
3200: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
3210: 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20   pgnoLast;      
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3230: 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
3240: 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
3250: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
3260: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
3270: 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b   {.  int nMerge;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
32a0: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
32b0: 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e  cr-merge */.  in
32c0: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32e0: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
32f0: 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
3300: 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  el */.  Fts5Stru
3310: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53  ctureSegment *aS
3320: 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  eg;     /* Array
3330: 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53   of segments. aS
3340: 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e  eg[0] is oldest.
3350: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
3360: 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20  s5Structure {.  
3370: 75 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65  u64 nWriteCounte
3380: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3390: 2f 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20  /* Total leaves 
33a0: 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c  written to level
33b0: 20 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 76   0 */.  int nLev
33c0: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
33d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
33e0: 72 20 6f 66 20 6c 65 76 65 6c 73 20 69 6e 20 74  r of levels in t
33f0: 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46  his index */.  F
3400: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
3410: 6c 20 61 4c 65 76 65 6c 5b 30 5d 3b 20 20 20 2f  l aLevel[0];   /
3420: 2a 20 41 72 72 61 79 20 6f 66 20 6e 4c 65 76 65  * Array of nLeve
3430: 6c 20 6c 65 76 65 6c 20 6f 62 6a 65 63 74 73 20  l level objects 
3440: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
3450: 6f 62 6a 65 63 74 20 6f 66 20 74 79 70 65 20 46  object of type F
3460: 74 73 35 53 65 67 57 72 69 74 65 72 20 69 73 20  ts5SegWriter is 
3470: 75 73 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  used to write to
3480: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74   segments..*/.st
3490: 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69  ruct Fts5PageWri
34a0: 74 65 72 20 7b 0a 20 20 69 6e 74 20 70 67 6e 6f  ter {.  int pgno
34b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
34d0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20  number for this 
34e0: 70 61 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  page */.  Fts5Bu
34f0: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
3500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3510: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
3520: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  age data */.  Ft
3530: 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20  s5Buffer term;  
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3550: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3560: 6e 67 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ng previous term
3570: 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 7d 3b 0a 73   on page */.};.s
3580: 74 72 75 63 74 20 46 74 73 35 53 65 67 57 72 69  truct Fts5SegWri
3590: 74 65 72 20 7b 0a 20 20 69 6e 74 20 69 49 64 78  ter {.  int iIdx
35a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
35c0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
35d0: 20 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20    int iSegid;   
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f0: 20 20 2f 2a 20 53 65 67 69 64 20 74 6f 20 77 72    /* Segid to wr
3600: 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
3610: 6e 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20  nWriter;        
3620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3630: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3640: 20 69 6e 20 61 57 72 69 74 65 72 20 2a 2f 0a 20   in aWriter */. 
3650: 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
3660: 2a 61 57 72 69 74 65 72 3b 20 20 20 20 20 20 20  *aWriter;       
3670: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 50 61 67   /* Array of Pag
3680: 65 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20  eWriter objects 
3690: 2a 2f 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f  */.  i64 iPrevRo
36a0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
36b0: 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
36c0: 20 64 6f 63 69 64 20 77 72 69 74 74 65 6e 20 74   docid written t
36d0: 6f 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a  o current leaf *
36e0: 2f 0a 20 20 75 38 20 62 46 69 72 73 74 52 6f 77  /.  u8 bFirstRow
36f0: 69 64 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20  idInDoclist;    
3700: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
3710: 65 78 74 20 72 6f 77 69 64 20 69 73 20 66 69 72  ext rowid is fir
3720: 73 74 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f  st in doclist */
3730: 0a 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69  .  u8 bFirstRowi
3740: 64 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  dInPage;        
3750: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
3760: 78 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73  xt rowid is firs
3770: 74 20 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 69  t in page */.  i
3780: 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b  nt nLeafWritten;
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37a0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
37b0: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 2a   pages written *
37c0: 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20  /.  int nEmpty; 
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
37f0: 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72 6d   contiguous term
3800: 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a 20  -less nodes */. 
3810: 20 46 74 73 35 42 75 66 66 65 72 20 64 6c 69 64   Fts5Buffer dlid
3820: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
3830: 20 2f 2a 20 44 6f 63 6c 69 73 74 20 69 6e 64 65   /* Doclist inde
3840: 78 20 2a 2f 0a 20 20 69 36 34 20 69 44 6c 69 64  x */.  i64 iDlid
3850: 78 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  xPrev;          
3860: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
3870: 75 73 20 72 6f 77 69 64 20 61 70 70 65 6e 64 65  us rowid appende
3880: 64 20 74 6f 20 64 6c 69 64 78 20 2a 2f 0a 20 20  d to dlidx */.  
3890: 69 6e 74 20 62 44 6c 69 64 78 50 72 65 76 56 61  int bDlidxPrevVa
38a0: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
38b0: 2f 2a 20 54 72 75 65 20 69 66 20 69 44 6c 69 64  /* True if iDlid
38c0: 78 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a  xPrev is valid *
38d0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  /.};../*.** Obje
38e0: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
38f0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72   through the mer
3900: 67 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f  ged results of o
3910: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
3920: 6e 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67  nts,.** visiting
3930: 20 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64   each term/docid
3940: 20 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72   pair in the mer
3950: 67 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ged data..**.** 
3960: 6e 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61  nSeg is always a
3970: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72   power of two gr
3980: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
3990: 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ual to the numbe
39a0: 72 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73  r of.** segments
39b0: 20 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63   that this objec
39c0: 74 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74  t is merging dat
39d0: 61 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65  a from. Both the
39e0: 20 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61   aSeg[] and.** a
39f0: 46 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61  First[] arrays a
3a00: 72 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67  re sized at nSeg
3a10: 20 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53   entries. The aS
3a20: 65 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61  eg[] array is pa
3a30: 64 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72  dded.** with zer
3a40: 6f 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68  oed objects - th
3a50: 65 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ese are handled 
3a60: 61 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20  as if they were 
3a70: 69 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64  iterators opened
3a80: 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67  .** on empty seg
3a90: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
3aa0: 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
3ab0: 61 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61  aring segments a
3ac0: 53 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b  Seg[N] and aSeg[
3ad0: 4e 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73  N+1], where N is
3ae0: 20 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62   an.** even numb
3af0: 65 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  er, is stored in
3b00: 20 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29   aFirst[(nSeg+N)
3b10: 2f 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74  /2]. The "result
3b20: 22 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d  " of the .** com
3b30: 70 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20  parison in this 
3b40: 63 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69  context is the i
3b50: 6e 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72  ndex of the iter
3b60: 61 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e  ator that curren
3b70: 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  tly.** points to
3b80: 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72   the smaller ter
3b90: 6d 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74  m/rowid combinat
3ba0: 69 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61  ion. Iterators a
3bb0: 74 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e  t EOF are.** con
3bc0: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72  sidered to be gr
3bd0: 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f  eater than all o
3be0: 74 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a  ther iterators..
3bf0: 2a 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20  **.** aFirst[1] 
3c00: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
3c10: 65 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20  ex in aSeg[] of 
3c20: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61  the iterator tha
3c30: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
3c40: 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
3c50: 6f 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b  overall. aFirst[
3c60: 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a  0] is unused. .*
3c70: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 4d 75 6c  /.struct Fts5Mul
3c80: 74 69 53 65 67 49 74 65 72 20 7b 0a 20 20 69 6e  tiSegIter {.  in
3c90: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
3ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3cb0: 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20   Size of aSeg[] 
3cc0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  array */.  int b
3cd0: 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
3ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3cf0: 75 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e  ue to iterate in
3d00: 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
3d10: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
3d20: 2a 61 53 65 67 3b 20 20 20 20 20 20 20 20 20 20  *aSeg;          
3d30: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
3d40: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
3d50: 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 46 69 72  s */.  u16 *aFir
3d60: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
3d70: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
3d80: 74 20 6d 65 72 67 65 20 73 74 61 74 65 20 28 73  t merge state (s
3d90: 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a  ee above) */.};.
3da0: 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f  ./*.** Object fo
3db0: 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
3dc0: 75 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67  ugh a single seg
3dd0: 6d 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65  ment, visiting e
3de0: 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a  ach term/docid.*
3df0: 2a 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65  * pair in the se
3e00: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65  gment..**.** pSe
3e10: 67 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d  g:.**   The segm
3e20: 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ent to iterate t
3e30: 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c  hrough..**.** iL
3e40: 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75  eafPgno:.**   Cu
3e50: 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20  rrent leaf page 
3e60: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65  number within se
3e70: 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  gment..**.** iLe
3e80: 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42  afOffset:.**   B
3e90: 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69  yte offset withi
3ea0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  n the current le
3eb0: 61 66 20 74 68 61 74 20 69 73 20 6f 6e 65 20 62  af that is one b
3ec0: 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  yte past the end
3ed0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 72 6f 77   of the.**   row
3ee0: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3ef0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3f00: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3f10: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3f20: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3f30: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3f40: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3f50: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3f60: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3f70: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3f80: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3f90: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3fa0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3fb0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3fc0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3fd0: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3fe0: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3ff0: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
4000: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
4010: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
4020: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
4030: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
4040: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
4050: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
4060: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
4070: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
4080: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
4090: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
40a0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
40b0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
40c0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
40d0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
40e0: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
40f0: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
4100: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
4110: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
4120: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
4130: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
4140: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
4150: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
4160: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
4170: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
4180: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
4190: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
41a0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
41b0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
41c0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
41d0: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
41e0: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
41f0: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
4200: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
4210: 65 20 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73  e through docids
4220: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
4230: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
4240: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
4250: 74 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64  t descending ord
4260: 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64  er..**.** iRowid
4270: 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66  Offset/nRowidOff
4280: 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74  set/aRowidOffset
4290: 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61  :.**     These a
42a0: 72 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46  re used if the F
42b0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
42c0: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
42d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 45 61 63 68 20  .**.**     Each 
42e0: 74 69 6d 65 20 61 20 6e 65 77 20 70 61 67 65 20  time a new page 
42f0: 69 73 20 6c 6f 61 64 65 64 2c 20 74 68 65 20 69  is loaded, the i
4300: 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  terator is set t
4310: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a  o point to the.*
4320: 2a 20 20 20 20 20 66 69 6e 61 6c 20 72 6f 77 69  *     final rowi
4330: 64 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  d. Additionally,
4340: 20 74 68 65 20 61 52 6f 77 69 64 4f 66 66 73 65   the aRowidOffse
4350: 74 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70  t[] array is pop
4360: 75 6c 61 74 65 64 20 0a 2a 2a 20 20 20 20 20 77  ulated .**     w
4370: 69 74 68 20 74 68 65 20 62 79 74 65 20 6f 66 66  ith the byte off
4380: 73 65 74 73 20 6f 66 20 61 6c 6c 20 72 65 6c 65  sets of all rele
4390: 76 61 6e 74 20 72 6f 77 69 64 20 66 69 65 6c 64  vant rowid field
43a0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a  s on the page. .
43b0: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  */.struct Fts5Se
43c0: 67 49 74 65 72 20 7b 0a 20 20 46 74 73 35 53 74  gIter {.  Fts5St
43d0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
43e0: 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 53 65 67  pSeg;     /* Seg
43f0: 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20  ment to iterate 
4400: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74  through */.  int
4410: 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   iIdx;          
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4430: 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68  Byte offset with
4440: 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  in current leaf 
4450: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20  */.  int flags; 
4460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4470: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
4480: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c  configuration fl
4490: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  ags */.  int iLe
44a0: 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  afPgno;         
44b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
44c0: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
44d0: 6d 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61  mber */.  Fts5Da
44e0: 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
44f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4500: 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a  rent leaf data *
4510: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66  /.  int iLeafOff
4520: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4530: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
4540: 65 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e  et within curren
4550: 74 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20  t leaf */..  /* 
4560: 54 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66  The page and off
4570: 73 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74  set from which t
4580: 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
4590: 77 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66  was read. The of
45a0: 66 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68  fset .  ** is th
45b0: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
45c0: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74  first rowid in t
45d0: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
45e0: 73 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54  st.  */.  int iT
45f0: 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69  ermLeafPgno;.  i
4600: 6e 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  nt iTermLeafOffs
4610: 65 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  et;..  /* The fo
4620: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79  llowing are only
4630: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
4640: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4650: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a  E flag is set. *
4660: 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  /.  int iRowidOf
4670: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
4680: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65      /* Current e
4690: 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66  ntry in aRowidOf
46a0: 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  fset[] */.  int 
46b0: 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  nRowidOffset;   
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
46d0: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
46e0: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
46f0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
4700: 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  aRowidOffset;   
4710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4720: 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f  ray of offset to
4730: 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f   rowid fields */
4740: 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ..  Fts5DlidxIte
4750: 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20  r *pDlidx;      
4760: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
4770: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
4780: 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69  ex */..  /* Vari
4790: 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20  ables populated 
47a0: 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74  based on current
47b0: 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73   entry. */.  Fts
47c0: 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47e0: 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  Current term */.
47f0: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
4820: 69 64 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  id */.};..#defin
4830: 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  e FTS5_SEGITER_O
4840: 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65 66  NETERM 0x01.#def
4850: 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  ine FTS5_SEGITER
4860: 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a 0a  _REVERSE 0x02...
4870: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
4880: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
4890: 67 68 20 70 61 67 69 6e 61 74 65 64 20 64 61 74  gh paginated dat
48a0: 61 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  a..*/.struct Fts
48b0: 35 43 68 75 6e 6b 49 74 65 72 20 7b 0a 20 20 46  5ChunkIter {.  F
48c0: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20  ts5Data *pLeaf; 
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
48e0: 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
48f0: 61 74 61 2e 20 4e 55 4c 4c 20 2d 3e 20 45 4f 46  ata. NULL -> EOF
4900: 2e 20 2a 2f 0a 20 20 69 36 34 20 69 4c 65 61 66  . */.  i64 iLeaf
4910: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
4920: 20 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75         /* Absolu
4930: 74 65 20 72 6f 77 69 64 20 6f 66 20 63 75 72 72  te rowid of curr
4940: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e  ent leaf */.  in
4950: 74 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20  t nRem;         
4960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4970: 20 52 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73   Remaining bytes
4980: 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65 61 64   of data to read
4990: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
49a0: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
49b0: 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20   u8 *p;         
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
49e0: 68 75 6e 6b 20 6f 66 20 64 61 74 61 20 2a 2f 0a  hunk of data */.
49f0: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a10: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
4a20: 66 65 72 20 70 20 69 6e 20 62 79 74 65 73 20 2a  fer p in bytes *
4a30: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  /.};../*.** Obje
4a40: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
4a50: 20 74 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c   through a singl
4a60: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
4a70: 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 72 75  on disk..*/.stru
4a80: 63 74 20 46 74 73 35 50 6f 73 49 74 65 72 20 7b  ct Fts5PosIter {
4a90: 0a 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72  .  Fts5ChunkIter
4aa0: 20 63 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20   chunk;         
4ab0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 63 68     /* Current ch
4ac0: 75 6e 6b 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  unk of data */. 
4ad0: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4af0: 20 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69   /* Offset withi
4b00: 6e 20 63 68 75 6e 6b 20 64 61 74 61 20 2a 2f 0a  n chunk data */.
4b10: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69  .  int iCol;.  i
4b20: 6e 74 20 69 50 6f 73 3b 0a 7d 3b 0a 0a 2f 2a 0a  nt iPos;.};../*.
4b30: 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74  ** Object for it
4b40: 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
4b50: 74 68 65 20 63 6f 6e 65 6e 74 73 20 6f 66 20 61  the conents of a
4b60: 20 73 69 6e 67 6c 65 20 69 6e 74 65 72 6e 61 6c   single internal
4b70: 20 6e 6f 64 65 20 69 6e 20 0a 2a 2a 20 6d 65 6d   node in .** mem
4b80: 6f 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ory..*/.struct F
4b90: 74 73 35 4e 6f 64 65 49 74 65 72 20 7b 0a 20 20  ts5NodeIter {.  
4ba0: 2f 2a 20 49 6e 74 65 72 6e 61 6c 2e 20 53 65 74  /* Internal. Set
4bb0: 20 61 6e 64 20 6d 61 6e 61 67 65 64 20 62 79 20   and managed by 
4bc0: 66 74 73 35 4e 6f 64 65 49 74 65 72 58 58 58 28  fts5NodeIterXXX(
4bd0: 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 45 78 63  ) functions. Exc
4be0: 65 70 74 2c 20 0a 20 20 2a 2a 20 74 68 65 20 45  ept, .  ** the E
4bf0: 4f 46 20 74 65 73 74 20 66 6f 72 20 74 68 65 20  OF test for the 
4c00: 69 74 65 72 61 74 6f 72 20 69 73 20 28 46 74 73  iterator is (Fts
4c10: 35 4e 6f 64 65 49 74 65 72 2e 61 44 61 74 61 3d  5NodeIter.aData=
4c20: 3d 30 29 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74  =0).  */.  const
4c30: 20 75 38 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e   u8 *aData;.  in
4c40: 74 20 6e 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  t nData;.  int i
4c50: 4f 66 66 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  Off;..  /* Outpu
4c60: 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20  t variables */. 
4c70: 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
4c80: 3b 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 0a  ;.  int nEmpty;.
4c90: 20 20 69 6e 74 20 69 43 68 69 6c 64 3b 0a 20 20    int iChild;.  
4ca0: 69 6e 74 20 62 44 6c 69 64 78 3b 0a 7d 3b 0a 0a  int bDlidx;.};..
4cb0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
4cc0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
4cd0: 6e 67 20 74 79 70 65 20 69 73 20 75 73 65 64 20  ng type is used 
4ce0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
4cf0: 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  gh the contents.
4d00: 2a 2a 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2d  ** of a doclist-
4d10: 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a  index record..**
4d20: 0a 2a 2a 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20  .** pData:.**   
4d30: 52 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 69 6e  Record containin
4d40: 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  g the doclist-in
4d50: 64 65 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  dex data..**.** 
4d60: 62 45 6f 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74  bEof:.**   Set t
4d70: 6f 20 74 72 75 65 20 6f 6e 63 65 20 69 74 65 72  o true once iter
4d80: 61 74 6f 72 20 68 61 73 20 72 65 61 63 68 65 64  ator has reached
4d90: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66 66   EOF..**.** iOff
4da0: 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 68  :.**   Set to th
4db0: 65 20 63 75 72 72 65 6e 74 20 6f 66 66 73 65 74  e current offset
4dc0: 20 77 69 74 68 69 6e 20 72 65 63 6f 72 64 20 70   within record p
4dd0: 44 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Data..*/.struct 
4de0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 7b 0a  Fts5DlidxIter {.
4df0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
4e00: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
4e10: 2f 2a 20 44 61 74 61 20 66 6f 72 20 64 6f 63 6c  /* Data for docl
4e20: 69 73 74 20 69 6e 64 65 78 2c 20 69 66 20 61 6e  ist index, if an
4e30: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b  y */.  int iOff;
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e50: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4e60: 6f 66 66 73 65 74 20 69 6e 74 6f 20 70 44 6c 69  offset into pDli
4e70: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66  dx */.  int bEof
4e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4e90: 20 20 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20        /* At EOF 
4ea0: 61 6c 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74  already */.  int
4eb0: 20 69 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20   iFirstOff;     
4ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
4ed0: 65 64 20 62 79 20 72 65 76 65 72 73 65 20 69 74  ed by reverse it
4ee0: 65 72 61 74 6f 72 73 20 6f 6e 6c 79 20 2a 2f 0a  erators only */.
4ef0: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
4f00: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  iables */.  int 
4f10: 69 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20  iLeafPgno;      
4f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
4f30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  e number of curr
4f40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f  ent leaf page */
4f50: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20  .  i64 iRowid;  
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f70: 20 2f 2a 20 46 69 72 73 74 20 72 6f 77 69 64 20   /* First rowid 
4f80: 6f 6e 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e  on leaf iLeafPgn
4f90: 6f 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  o */.};.../*.** 
4fa0: 41 6e 20 46 74 73 35 42 74 72 65 65 49 74 65 72  An Fts5BtreeIter
4fb0: 20 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20   object is used 
4fc0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
4fd0: 67 68 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  gh all entries i
4fe0: 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65 20  n the.** b-tree 
4ff0: 68 69 65 72 61 72 63 68 79 20 62 65 6c 6f 6e 67  hierarchy belong
5000: 69 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ing to a single 
5010: 66 74 73 35 20 73 65 67 6d 65 6e 74 2e 20 49 6e  fts5 segment. In
5020: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 0a 2a   this case the.*
5030: 2a 20 22 62 2d 74 72 65 65 20 68 69 65 72 61 72  * "b-tree hierar
5040: 63 68 79 22 20 69 73 20 61 6c 6c 20 62 2d 74 72  chy" is all b-tr
5050: 65 65 20 6e 6f 64 65 73 20 65 78 63 65 70 74 20  ee nodes except 
5060: 6c 65 61 76 65 73 2e 20 45 61 63 68 20 65 6e 74  leaves. Each ent
5070: 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74  ry in the.** b-t
5080: 72 65 65 20 68 69 65 72 61 72 63 68 79 20 63 6f  ree hierarchy co
5090: 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 66 6f  nsists of the fo
50a0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
50b0: 20 69 4c 65 61 66 3a 20 20 54 68 65 20 70 61 67   iLeaf:  The pag
50c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
50d0: 6c 65 61 66 20 70 61 67 65 20 74 68 65 20 65 6e  leaf page the en
50e0: 74 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  try points to..*
50f0: 2a 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20 20 41  *.**   term:   A
5100: 20 73 70 6c 69 74 2d 6b 65 79 20 74 68 61 74 20   split-key that 
5110: 61 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c 65 61  all terms on lea
5120: 66 20 70 61 67 65 20 24 69 4c 65 61 66 20 6d 75  f page $iLeaf mu
5130: 73 74 20 62 65 20 67 72 65 61 74 65 72 0a 2a 2a  st be greater.**
5140: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 6e 20             than 
5150: 6f 72 20 65 71 75 61 6c 20 74 6f 2e 20 54 68 65  or equal to. The
5160: 20 22 74 65 72 6d 22 20 61 73 73 6f 63 69 61 74   "term" associat
5170: 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
5180: 74 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 20  t b-tree.**     
5190: 20 20 20 20 20 20 68 69 65 72 61 72 63 68 79 20        hierarchy 
51a0: 65 6e 74 72 79 20 28 74 68 65 20 6f 6e 65 20 74  entry (the one t
51b0: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 6c 65  hat points to le
51c0: 61 66 20 70 61 67 65 20 31 29 20 69 73 20 61 6c  af page 1) is al
51d0: 77 61 79 73 20 0a 2a 2a 20 20 20 20 20 20 20 20  ways .**        
51e0: 20 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69     an empty stri
51f0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45 6d 70  ng..**.**   nEmp
5200: 74 79 3a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  ty: The number o
5210: 66 20 65 6d 70 74 79 20 28 74 65 72 6d 6c 65 73  f empty (termles
5220: 73 29 20 6c 65 61 66 20 70 61 67 65 73 20 74 68  s) leaf pages th
5230: 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  at immediately.*
5240: 2a 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c 6c  *           foll
5250: 6f 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a 2a 0a  owing iLeaf..**.
5260: 2a 2a 20 54 68 65 20 46 74 73 35 42 74 72 65 65  ** The Fts5Btree
5270: 49 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  Iter object is o
5280: 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
5290: 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
52a0: 79 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a 2a 2f  y-check code..*/
52b0: 0a 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65  .struct Fts5Btre
52c0: 65 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20 20 46  eIterLevel {.  F
52d0: 74 73 35 4e 6f 64 65 49 74 65 72 20 73 3b 20 20  ts5NodeIter s;  
52e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
52f0: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 74  * Iterator for t
5300: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
5310: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
5320: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
5330: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
5340: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64   the current nod
5350: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  e */.};.struct F
5360: 74 73 35 42 74 72 65 65 49 74 65 72 20 7b 0a 20  ts5BtreeIter {. 
5370: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20   Fts5Index *p;  
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
53a0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
53b0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
53c0: 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
53d0: 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
53e0: 74 68 69 73 20 73 65 67 6d 65 6e 74 27 73 20 62  this segment's b
53f0: 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  -tree */.  int i
5400: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
5410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
5420: 64 65 78 20 70 53 65 67 20 62 65 6c 6f 6e 67 73  dex pSeg belongs
5430: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 76   to */.  int nLv
5440: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
5450: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
5460: 20 6f 66 20 61 4c 76 6c 5b 5d 20 61 72 72 61 79   of aLvl[] array
5470: 20 2a 2f 0a 20 20 46 74 73 35 42 74 72 65 65 49   */.  Fts5BtreeI
5480: 74 65 72 4c 65 76 65 6c 20 2a 61 4c 76 6c 3b 20  terLevel *aLvl; 
5490: 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 66        /* Level f
54a0: 6f 72 20 65 61 63 68 20 74 69 65 72 20 6f 66 20  or each tier of 
54b0: 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 2f 2a 20  b-tree */..  /* 
54c0: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
54d0: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
54e0: 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20   term;          
54f0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
5500: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69   term */.  int i
5510: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
5520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
5530: 61 66 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65  af containing te
5540: 72 6d 73 20 3e 3d 20 63 75 72 72 65 6e 74 20 74  rms >= current t
5550: 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d  erm */.  int nEm
5560: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
5570: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5580: 65 72 20 6f 66 20 22 65 6d 70 74 79 22 20 6c 65  er of "empty" le
5590: 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  aves following i
55a0: 4c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 62 45  Leaf */.  int bE
55b0: 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  of;             
55c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
55d0: 20 74 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20   to true at EOF 
55e0: 2a 2f 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b  */.  int bDlidx;
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5610: 74 68 65 72 65 20 65 78 69 73 74 73 20 61 20 64  there exists a d
5620: 6c 69 64 78 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a  lidx */.};.../*.
5630: 2a 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67 6d  ** Decode a segm
5640: 65 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20 66  ent-data rowid f
5650: 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
5660: 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
5670: 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70  ion is.** the op
5680: 70 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f 20  posite of macro 
5690: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
56a0: 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ID()..*/.static 
56b0: 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 52  void fts5DecodeR
56c0: 6f 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f 77  owid(.  i64 iRow
56d0: 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
56e0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
56f0: 20 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61 62   from %_data tab
5700: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 49  le */.  int *piI
5710: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
5720: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
5730: 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a  Index */.  int *
5740: 70 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20  piSegid,        
5750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
5760: 54 3a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f  T: Segment id */
5770: 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74  .  int *piHeight
5780: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5790: 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68     /* OUT: Heigh
57a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67  t */.  int *piPg
57b0: 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  no              
57c0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
57d0: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
57e0: 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e  .  *piPgno = (in
57f0: 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
5800: 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
5810: 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b  A_PAGE_B) - 1));
5820: 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
5830: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a  S5_DATA_PAGE_B;.
5840: 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28  .  *piHeight = (
5850: 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
5860: 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
5870: 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20  ATA_HEIGHT_B) - 
5880: 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  1));.  iRowid >>
5890: 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  = FTS5_DATA_HEIG
58a0: 48 54 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69  HT_B;..  *piSegi
58b0: 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  d = (int)(iRowid
58c0: 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46   & (((i64)1 << F
58d0: 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d  TS5_DATA_ID_B) -
58e0: 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e   1));.  iRowid >
58f0: 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f  >= FTS5_DATA_ID_
5900: 42 3b 0a 0a 20 20 2a 70 69 49 64 78 20 3d 20 28  B;..  *piIdx = (
5910: 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
5920: 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
5930: 41 54 41 5f 49 44 58 5f 42 29 20 2d 20 31 29 29  ATA_IDX_B) - 1))
5940: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
5950: 20 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28   fts5DebugRowid(
5960: 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75  int *pRc, Fts5Bu
5970: 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20  ffer *pBuf, i64 
5980: 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20 69 49 64  iKey){.  int iId
5990: 78 2c 69 53 65 67 69 64 2c 69 48 65 69 67 68 74  x,iSegid,iHeight
59a0: 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f 77 69  ,iPgno;  /* Rowi
59b0: 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a  d compenents */.
59c0: 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
59d0: 64 28 69 4b 65 79 2c 20 26 69 49 64 78 2c 20 26  d(iKey, &iIdx, &
59e0: 69 53 65 67 69 64 2c 20 26 69 48 65 69 67 68 74  iSegid, &iHeight
59f0: 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66  , &iPgno);..  if
5a00: 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
5a10: 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53     if( iKey==FTS
5a20: 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
5a30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5a40: 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
5a50: 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
5a60: 66 2c 20 22 28 61 76 65 72 61 67 65 73 29 20 22  f, "(averages) "
5a70: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
5a80: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
5a90: 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
5aa0: 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20  f(pRc, pBuf, .  
5ab0: 20 20 20 20 20 20 20 20 22 7b 73 74 72 75 63 74          "{struct
5ac0: 75 72 65 20 69 64 78 3d 25 64 7d 22 2c 20 28 69  ure idx=%d}", (i
5ad0: 6e 74 29 28 69 4b 65 79 2d 31 30 29 0a 20 20 20  nt)(iKey-10).   
5ae0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
5af0: 20 20 65 6c 73 65 20 69 66 28 20 69 48 65 69 67    else if( iHeig
5b00: 68 74 3d 3d 46 54 53 35 5f 53 45 47 4d 45 4e 54  ht==FTS5_SEGMENT
5b10: 5f 4d 41 58 5f 48 45 49 47 48 54 20 29 7b 0a 20  _MAX_HEIGHT ){. 
5b20: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
5b30: 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
5b40: 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28 64 6c  (pRc, pBuf, "(dl
5b50: 69 64 78 20 69 64 78 3d 25 64 20 73 65 67 69 64  idx idx=%d segid
5b60: 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20  =%d pgno=%d)",. 
5b70: 20 20 20 20 20 20 20 69 49 64 78 2c 20 69 53 65         iIdx, iSe
5b80: 67 69 64 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29  gid, iPgno.    )
5b90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
5ba0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
5bb0: 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
5bc0: 2c 20 70 42 75 66 2c 20 22 28 69 64 78 3d 25 64  , pBuf, "(idx=%d
5bd0: 20 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70   segid=%d h=%d p
5be0: 67 6e 6f 3d 25 64 29 22 2c 0a 20 20 20 20 20 20  gno=%d)",.      
5bf0: 20 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20    iIdx, iSegid, 
5c00: 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20  iHeight, iPgno. 
5c10: 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61     );.  }.}..sta
5c20: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
5c30: 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69  ugStructure(.  i
5c40: 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
5c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5c60: 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20  * IN/OUT: error 
5c70: 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
5c80: 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74  ffer *pBuf,.  Ft
5c90: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29  s5Structure *p.)
5ca0: 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53  {.  int iLvl, iS
5cb0: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
5cc0: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
5cd0: 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73  hrough levels, s
5ce0: 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f  egments */..  fo
5cf0: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
5d00: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
5d10: 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
5d20: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
5d30: 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  = &p->aLevel[iLv
5d40: 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l];.    sqlite3F
5d50: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
5d60: 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
5d70: 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c   .        " {lvl
5d80: 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 22 2c 20  =%d nMerge=%d", 
5d90: 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72  iLvl, pLvl->nMer
5da0: 67 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f  ge.    );.    fo
5db0: 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
5dc0: 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl->nSeg; iSeg+
5dd0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
5de0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
5df0: 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53  pSeg = &pLvl->aS
5e00: 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
5e10: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
5e20: 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
5e30: 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20  c, pBuf, .      
5e40: 20 20 20 20 22 20 7b 69 64 3d 25 64 20 68 3d 25      " {id=%d h=%
5e50: 64 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d  d leaves=%d..%d}
5e60: 22 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  ", pSeg->iSegid,
5e70: 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20   pSeg->nHeight, 
5e80: 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d  .          pSeg-
5e90: 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65 67  >pgnoFirst, pSeg
5ea0: 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20  ->pgnoLast.     
5eb0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
5ec0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
5ed0: 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
5ee0: 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d   pBuf, "}");.  }
5ef0: 0a 7d 0a 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69  .}....static voi
5f00: 64 20 66 74 73 35 50 75 74 55 31 36 28 75 38 20  d fts5PutU16(u8 
5f10: 2a 61 4f 75 74 2c 20 75 31 36 20 69 56 61 6c 29  *aOut, u16 iVal)
5f20: 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d 20 28 69  {.  aOut[0] = (i
5f30: 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f 75 74 5b  Val>>8);.  aOut[
5f40: 31 5d 20 3d 20 28 69 56 61 6c 26 30 78 46 46 29  1] = (iVal&0xFF)
5f50: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 31 36 20  ;.}..static u16 
5f60: 66 74 73 35 47 65 74 55 31 36 28 63 6f 6e 73 74  fts5GetU16(const
5f70: 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20 72 65 74   u8 *aIn){.  ret
5f80: 75 72 6e 20 28 28 75 31 36 29 61 49 6e 5b 30 5d  urn ((u16)aIn[0]
5f90: 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b 31 5d 3b   << 8) + aIn[1];
5fa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
5fb0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
5fc0: 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
5fd0: 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 20 73  nByte bytes in s
5fe0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
5ff0: 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e   OOM error is en
6000: 63 6f 75 6e 74 65 72 65 64 2c 20 72 65 74 75 72  countered, retur
6010: 6e 20 4e 55 4c 4c 20 61 6e 64 20 73 65 74 20 74  n NULL and set t
6020: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  he error code in
6030: 0a 2a 2a 20 74 68 65 20 46 74 73 35 49 6e 64 65  .** the Fts5Inde
6040: 78 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  x handle passed 
6050: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
6060: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
6070: 20 76 6f 69 64 20 2a 66 74 73 35 49 64 78 4d 61   void *fts5IdxMa
6080: 6c 6c 6f 63 28 46 74 73 35 49 6e 64 65 78 20 2a  lloc(Fts5Index *
6090: 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20  p, int nByte){. 
60a0: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 61   void *pRet;.  a
60b0: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
60c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 52 65  LITE_OK );.  pRe
60d0: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
60e0: 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  oc(nByte);.  if(
60f0: 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20   pRet==0 ){.    
6100: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
6110: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
6120: 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20     memset(pRet, 
6130: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  0, nByte);.  }. 
6140: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
6150: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 46 74  .void *sqlite3Ft
6160: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 69 6e 74  s5MallocZero(int
6170: 20 2a 70 52 63 2c 20 69 6e 74 20 6e 42 79 74 65   *pRc, int nByte
6180: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 20  ){.  void *pRet 
6190: 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
61a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
61b0: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
61c0: 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
61d0: 20 20 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20      if( pRet==0 
61e0: 26 26 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20 20  && nByte>0 ){.  
61f0: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
6200: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
6210: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
6220: 28 70 52 65 74 2c 20 30 2c 20 6e 42 79 74 65 29  (pRet, 0, nByte)
6230: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
6240: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
6250: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
6260: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
6270: 70 4c 65 66 74 20 62 75 66 66 65 72 20 77 69 74  pLeft buffer wit
6280: 68 20 74 68 65 20 70 52 69 67 68 74 2f 6e 52 69  h the pRight/nRi
6290: 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20  ght blob..**.** 
62a0: 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c  Return -ve if pL
62b0: 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  eft is smaller t
62c0: 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66  han pRight, 0 if
62d0: 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20   they are equal 
62e0: 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69  or.** +ve if pRi
62f0: 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ght is smaller t
6300: 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74  han pLeft. In ot
6310: 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a  her words:.**.**
6320: 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66       res = *pLef
6330: 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73  t - *pRight.*/.s
6340: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75  tatic int fts5Bu
6350: 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28  fferCompareBlob(
6360: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
6370: 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20  Left,           
6380: 20 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20     /* Left hand 
6390: 73 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  side of comparis
63a0: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  on */.  const u8
63b0: 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52   *pRight, int nR
63c0: 69 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74  ight    /* Right
63d0: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f   hand side of co
63e0: 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20  mparison */.){. 
63f0: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
6400: 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74  pLeft->n, nRight
6410: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
6420: 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20  emcmp(pLeft->p, 
6430: 70 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20  pRight, nCmp);. 
6440: 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20   return (res==0 
6450: 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52  ? (pLeft->n - nR
6460: 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a  ight) : res);.}.
6470: 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e  .#if 0.static in
6480: 74 20 66 74 73 35 43 6f 6d 70 61 72 65 42 6c 6f  t fts5CompareBlo
6490: 62 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  b(.  const u8 *p
64a0: 4c 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c  Left, int nLeft,
64b0: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
64c0: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a  ght, int nRight.
64d0: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
64e0: 4d 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68  MIN(nLeft, nRigh
64f0: 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  t);.  int res = 
6500: 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52  memcmp(pLeft, pR
6510: 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  ight, nCmp);.  r
6520: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
6530: 28 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29  (nLeft - nRight)
6540: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
6550: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  f../*.** Compare
6560: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
6570: 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
6580: 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
6590: 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a   If one buffer.*
65a0: 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  * is a prefix of
65b0: 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74 20 69   the other, it i
65c0: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74 68 65  s considered the
65d0: 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   lesser..**.** R
65e0: 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65  eturn -ve if pLe
65f0: 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ft is smaller th
6600: 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69 66 20  an pRight, 0 if 
6610: 74 68 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f  they are equal o
6620: 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67  r.** +ve if pRig
6630: 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  ht is smaller th
6640: 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68  an pLeft. In oth
6650: 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20  er words:.**.** 
6660: 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74      res = *pLeft
6670: 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74   - *pRight.*/.st
6680: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
6690: 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73 35 42  ferCompare(Fts5B
66a0: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 46 74  uffer *pLeft, Ft
66b0: 73 35 42 75 66 66 65 72 20 2a 70 52 69 67 68 74  s5Buffer *pRight
66c0: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
66d0: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52  MIN(pLeft->n, pR
66e0: 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20  ight->n);.  int 
66f0: 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65  res = memcmp(pLe
6700: 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e 70  ft->p, pRight->p
6710: 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72  , nCmp);.  retur
6720: 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65  n (res==0 ? (pLe
6730: 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d 3e  ft->n - pRight->
6740: 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f  n) : res);.}.../
6750: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72  *.** Close the r
6760: 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61  ead-only blob ha
6770: 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f  ndle, if it is o
6780: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pen..*/.static v
6790: 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61  oid fts5CloseRea
67a0: 64 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70  der(Fts5Index *p
67b0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  ){.  if( p->pRea
67c0: 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  der ){.    sqlit
67d0: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 2d  e3_blob_close(p-
67e0: 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 70  >pReader);.    p
67f0: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
6800: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73   }.}..static Fts
6810: 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52  5Data *fts5DataR
6820: 65 61 64 4f 72 42 75 66 66 65 72 28 0a 20 20 46  eadOrBuffer(.  F
6830: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
6840: 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
6850: 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a  , .  i64 iRowid.
6860: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
6870: 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Ret = 0;.  if( p
6880: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
6890: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
68a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 20  SQLITE_OK;..#if 
68b0: 30 0a 46 74 73 35 42 75 66 66 65 72 20 62 75 66  0.Fts5Buffer buf
68c0: 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 66 74 73 35   = {0,0,0};.fts5
68d0: 44 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20  DebugRowid(&rc, 
68e0: 26 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 66  &buf, iRowid);.f
68f0: 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
6900: 72 65 61 64 3a 20 25 73 5c 6e 22 2c 20 62 75 66  read: %s\n", buf
6910: 2e 70 29 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f  .p);.fflush(stdo
6920: 75 74 29 3b 0a 73 71 6c 69 74 65 33 5f 66 72 65  ut);.sqlite3_fre
6930: 65 28 62 75 66 2e 70 29 3b 0a 23 65 6e 64 69 66  e(buf.p);.#endif
6940: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61  .    if( p->pRea
6950: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  der ){.      /* 
6960: 54 68 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65  This call may re
6970: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52  turn SQLITE_ABOR
6980: 54 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62  T if there has b
6990: 65 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a  een a savepoint.
69a0: 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
69b0: 6b 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  k since it was l
69c0: 61 73 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69  ast used. In thi
69d0: 73 20 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f  s case a new blo
69e0: 62 20 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a  b handle.      *
69f0: 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  * is required.  
6a00: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
6a10: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
6a20: 6e 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 69 52  n(p->pReader, iR
6a30: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
6a40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52   rc==SQLITE_ABOR
6a50: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  T ){.        fts
6a60: 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b  5CloseReader(p);
6a70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
6a80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
6a90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
6aa0: 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c  f the blob handl
6ab0: 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  e is not yet ope
6ac0: 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65 65 6b  n, open and seek
6ad0: 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   it. Otherwise, 
6ae0: 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  use.    ** the b
6af0: 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41 50 49  lob_reopen() API
6b00: 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65 20 65   to reseek the e
6b10: 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68 61 6e  xisting blob han
6b20: 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  dle.  */.    if(
6b30: 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29   p->pReader==0 )
6b40: 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f 6e 66  {.      Fts5Conf
6b50: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
6b60: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20  >pConfig;.      
6b70: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
6b80: 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e  b_open(pConfig->
6b90: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  db, .          p
6ba0: 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e  Config->zDb, p->
6bb0: 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b  zDataTbl, "block
6bc0: 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20 26 70  ", iRowid, 0, &p
6bd0: 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20 20 20  ->pReader.      
6be0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
6bf0: 28 20 72 63 20 29 20 66 74 73 35 4d 69 73 73 69  ( rc ) fts5Missi
6c00: 6e 67 44 61 74 61 28 29 3b 0a 0a 20 20 20 20 69  ngData();..    i
6c10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6c20: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
6c30: 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  yte = sqlite3_bl
6c40: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61  ob_bytes(p->pRea
6c50: 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  der);.      if( 
6c60: 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  pBuf ){.        
6c70: 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70  fts5BufferZero(p
6c80: 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Buf);.        ft
6c90: 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 72 63  s5BufferGrow(&rc
6ca0: 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
6cb0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
6cc0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
6cd0: 2d 3e 70 52 65 61 64 65 72 2c 20 70 42 75 66 2d  ->pReader, pBuf-
6ce0: 3e 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20  >p, nByte, 0);. 
6cf0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
6d00: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 42 75 66 2d  QLITE_OK ) pBuf-
6d10: 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  >n = nByte;.    
6d20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6d30: 20 70 52 65 74 20 3d 20 28 46 74 73 35 44 61 74   pRet = (Fts5Dat
6d40: 61 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  a*)fts5IdxMalloc
6d50: 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
6d60: 61 74 61 29 20 2b 20 6e 42 79 74 65 29 3b 0a 20  ata) + nByte);. 
6d70: 20 20 20 20 20 20 20 69 66 28 20 21 70 52 65 74         if( !pRet
6d80: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
6d90: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 20 3d 20        pRet->n = 
6da0: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 70  nByte;.        p
6db0: 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70  Ret->p = (u8*)&p
6dc0: 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Ret[1];.        
6dd0: 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pRet->nRef = 1;.
6de0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
6df0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
6e00: 2d 3e 70 52 65 61 64 65 72 2c 20 70 52 65 74 2d  ->pReader, pRet-
6e10: 3e 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20  >p, nByte, 0);. 
6e20: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
6e30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6e50: 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  ee(pRet);.      
6e60: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
6e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6e80: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20      }.    p->rc 
6e90: 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = rc;.    p->nRe
6ea0: 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ad++;.  }..  ret
6eb0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
6ec0: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72 65  ** Retrieve a re
6ed0: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  cord from the %_
6ee0: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
6ef0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6f00: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
6f10: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
6f20: 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20  ror left in the 
6f30: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62  .** Fts5Index ob
6f40: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
6f50: 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61  Fts5Data *fts5Da
6f60: 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  taRead(Fts5Index
6f70: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29   *p, i64 iRowid)
6f80: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52  {.  Fts5Data *pR
6f90: 65 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  et = fts5DataRea
6fa0: 64 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c 20  dOrBuffer(p, 0, 
6fb0: 69 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72  iRowid);.  asser
6fc0: 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70  t( (pRet==0)==(p
6fd0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc!=SQLITE_OK)
6fe0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65   );.  return pRe
6ff0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  t;.}../*.** Read
7000: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
7010: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
7020: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
7030: 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a  supplied as the.
7040: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
7050: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
7060: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
7070: 20 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69   error is left i
7080: 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  n the Fts5Index 
7090: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a  object. If an.**
70a0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
70b0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
70c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
70d0: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
70e0: 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  a .** no-op..*/.
70f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7100: 44 61 74 61 42 75 66 66 65 72 28 46 74 73 35 49  DataBuffer(Fts5I
7110: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66  ndex *p, Fts5Buf
7120: 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69  fer *pBuf, i64 i
7130: 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64 29  Rowid){.  (void)
7140: 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
7150: 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69 52  ffer(p, pBuf, iR
7160: 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  owid);.}../*.** 
7170: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
7180: 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f  nce to data reco
7190: 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  rd returned by a
71a0: 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
71b0: 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61  o.** fts5DataRea
71c0: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
71d0: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65  oid fts5DataRele
71e0: 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44  ase(Fts5Data *pD
71f0: 61 74 61 29 7b 0a 20 20 69 66 28 20 70 44 61 74  ata){.  if( pDat
7200: 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  a ){.    assert(
7210: 20 70 44 61 74 61 2d 3e 6e 52 65 66 3e 30 20 29   pData->nRef>0 )
7220: 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e 6e 52 65  ;.    pData->nRe
7230: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 61  f--;.    if( pDa
7240: 74 61 2d 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71  ta->nRef==0 ) sq
7250: 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
7260: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
7270: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
7280: 66 65 72 65 6e 63 65 28 46 74 73 35 44 61 74 61  ference(Fts5Data
7290: 20 2a 70 44 61 74 61 29 7b 0a 20 20 70 44 61 74   *pData){.  pDat
72a0: 61 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a  a->nRef++;.}../*
72b0: 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45  .** INSERT OR RE
72c0: 50 4c 41 43 45 20 61 20 72 65 63 6f 72 64 20 69  PLACE a record i
72d0: 6e 74 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74  nto the %_data t
72e0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
72f0: 76 6f 69 64 20 66 74 73 35 44 61 74 61 57 72 69  void fts5DataWri
7300: 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
7310: 20 69 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e   i64 iRowid, con
7320: 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
7330: 74 20 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20  t nData){.  if( 
7340: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
7350: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
7360: 28 20 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20  ( p->pWriter==0 
7370: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
7380: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
7390: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
73a0: 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  fig;.    char *z
73b0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
73c0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
73d0: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71  REPLACE INTO '%q
73e0: 27 2e 25 51 28 69 64 2c 20 62 6c 6f 63 6b 29 20  '.%Q(id, block) 
73f0: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 70 43  VALUES(?,?)", pC
7400: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
7410: 44 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20  DataTbl.    );. 
7420: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
7430: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
7440: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
7450: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
7460: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
7470: 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  _v2(pConfig->db,
7480: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70   zSql, -1, &p->p
7490: 57 72 69 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Writer, 0);.    
74a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
74b0: 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
74c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
74d0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  K ){.      p->rc
74e0: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
74f0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
7500: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
7510: 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c  nt64(p->pWriter,
7520: 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73   1, iRowid);.  s
7530: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
7540: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20  (p->pWriter, 2, 
7550: 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51  pData, nData, SQ
7560: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7570: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
7580: 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72  pWriter);.  p->r
7590: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
75a0: 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d  t(p->pWriter);.}
75b0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
75c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  the following SQ
75d0: 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c  L:.**.**     DEL
75e0: 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20  ETE FROM %_data 
75f0: 57 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e  WHERE id BETWEEN
7600: 20 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c   $iFirst AND $iL
7610: 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ast.*/.static vo
7620: 69 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  id fts5DataDelet
7630: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
7640: 69 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20  i64 iFirst, i64 
7650: 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d  iLast){.  if( p-
7660: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
7670: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
7680: 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29  p->pDeleter==0 )
7690: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
76a0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
76b0: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
76c0: 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  ig;.    char *zS
76d0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
76e0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 44  intf(.        "D
76f0: 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e  ELETE FROM '%q'.
7700: 25 51 20 57 48 45 52 45 20 69 64 3e 3d 3f 20 41  %Q WHERE id>=? A
7710: 4e 44 20 69 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66  ND id<=?", pConf
7720: 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74  ig->zDb, p->zDat
7730: 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20  aTbl.    );.    
7740: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
7750: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
7760: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
7770: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
7780: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
7790: 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53  (pConfig->db, zS
77a0: 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44 65 6c  ql, -1, &p->pDel
77b0: 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  eter, 0);.      
77c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
77d0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
77e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
77f0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
7800: 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
7810: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
7820: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
7830: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
7840: 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 73 71  1, iFirst);.  sq
7850: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
7860: 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 32 2c  (p->pDeleter, 2,
7870: 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c 69 74   iLast);.  sqlit
7880: 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65 6c 65  e3_step(p->pDele
7890: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
78a0: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
78b0: 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f  >pDeleter);.}../
78c0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 73  *.** Close the s
78d0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 68 61 6e 64  qlite3_blob hand
78e0: 6c 65 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  le used to read 
78f0: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
7900: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
7910: 2a 20 41 6e 64 20 64 69 73 63 61 72 64 20 61 6e  * And discard an
7920: 79 20 63 61 63 68 65 64 20 72 65 61 64 73 2e 20  y cached reads. 
7930: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
7940: 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65 20 65   called at the e
7950: 6e 64 20 6f 66 0a 2a 2a 20 61 20 72 65 61 64 20  nd of.** a read 
7960: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 77  transaction or w
7970: 68 65 6e 20 61 6e 79 20 73 75 62 2d 74 72 61 6e  hen any sub-tran
7980: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
7990: 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
79a0: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
79b0: 65 73 65 74 28 46 74 73 35 49 6e 64 65 78 20 2a  eset(Fts5Index *
79c0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65  p){.  if( p->pRe
79d0: 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  ader ){.    sqli
79e0: 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
79f0: 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20  ->pReader);.    
7a00: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
7a10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
7a20: 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73 20  ove all records 
7a30: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7a40: 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 20 69  segment iSegid i
7a50: 6e 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2f  n index iIdx..*/
7a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7a70: 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65  5DataRemoveSegme
7a80: 6e 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  nt(Fts5Index *p,
7a90: 20 69 6e 74 20 69 49 64 78 2c 20 69 6e 74 20 69   int iIdx, int i
7aa0: 53 65 67 69 64 29 7b 0a 20 20 69 36 34 20 69 46  Segid){.  i64 iF
7ab0: 69 72 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d  irst = FTS5_SEGM
7ac0: 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20  ENT_ROWID(iIdx, 
7ad0: 69 53 65 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20  iSegid, 0, 0);. 
7ae0: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
7af0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
7b00: 69 49 64 78 2c 20 69 53 65 67 69 64 2b 31 2c 20  iIdx, iSegid+1, 
7b10: 30 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44  0, 0)-1;.  fts5D
7b20: 61 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69  ataDelete(p, iFi
7b30: 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a 7d 0a 0a  rst, iLast);.}..
7b40: 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
7b50: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
7b60: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
7b70: 64 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  d currently stor
7b80: 65 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64  ed in serialized
7b90: 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20  .** form within 
7ba0: 62 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61  buffer pData/nDa
7bb0: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74  ta..**.** The Ft
7bc0: 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76  s5Structure.aLev
7bd0: 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74  el[] and each Ft
7be0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7bf0: 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a  .aSeg[] array.**
7c00: 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61   are over-alloca
7c10: 74 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e  ted by one slot.
7c20: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
7c30: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65   structure conte
7c40: 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72  nts.** to be mor
7c50: 65 20 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e  e easily edited.
7c60: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
7c70: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75  or occurs, *ppOu
7c80: 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  t is set to NULL
7c90: 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65   and an SQLite e
7ca0: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74  rror code.** ret
7cb0: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
7cc0: 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20  , *ppOut is set 
7cd0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
7ce0: 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a  new object and.*
7cf0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
7d00: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
7d10: 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72  int fts5Structur
7d20: 65 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74  eDecode(.  const
7d30: 20 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20   u8 *pData,     
7d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
7d50: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
7d60: 73 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63  serialized struc
7d70: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ture */.  int nD
7d80: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
7d90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
7da0: 65 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74  e of buffer pDat
7db0: 61 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  a in bytes */.  
7dc0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
7dd0: 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
7de0: 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72 69 61 6c  /* OUT: Deserial
7df0: 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  ized object */.)
7e00: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
7e10: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20  ITE_OK;.  int i 
7e20: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b  = 0;.  int iLvl;
7e30: 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20  .  int nLevel = 
7e40: 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  0;.  int nSegmen
7e50: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79  t = 0;.  int nBy
7e60: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
7e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
7e80: 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
7e90: 6c 6f 63 61 74 65 20 61 74 20 70 52 65 74 20 2a  locate at pRet *
7ea0: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
7eb0: 65 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  e *pRet = 0;    
7ec0: 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65      /* Structure
7ed0: 20 6f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72   object to retur
7ee0: 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  n */..  /* Read 
7ef0: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
7f00: 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20 73   of levels and s
7f10: 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
7f20: 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20 20   start of the.  
7f30: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72 65 63  ** structure rec
7f40: 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20 3d 20 67  ord.  */.  i = g
7f50: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7f60: 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20  a[i], nLevel);. 
7f70: 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   i += getVarint3
7f80: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 53 65  2(&pData[i], nSe
7f90: 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74 65 20  gment);.  nByte 
7fa0: 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  = (.      sizeof
7fb0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20  (Fts5Structure) 
7fc0: 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
7fd0: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72       /* Main str
7fe0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20  ucture */.      
7ff0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
8000: 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c  tureLevel) * (nL
8010: 65 76 65 6c 29 20 20 20 20 20 20 2f 2a 20 61 4c  evel)      /* aL
8020: 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  evel[] array */.
8030: 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46    );.  pRet = (F
8040: 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 73 71  ts5Structure*)sq
8050: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
8060: 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b  ero(&rc, nByte);
8070: 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ..  if( pRet ){.
8080: 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c      pRet->nLevel
8090: 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69   = nLevel;.    i
80a0: 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61   += sqlite3GetVa
80b0: 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20  rint(&pData[i], 
80c0: 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f 75  &pRet->nWriteCou
80d0: 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nter);..    for(
80e0: 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iLvl=0; rc==SQLI
80f0: 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e 4c  TE_OK && iLvl<nL
8100: 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
8110: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
8120: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
8130: 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  &pRet->aLevel[iL
8140: 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  vl];.      int n
8150: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69 6e 74  Total;.      int
8160: 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20 69 20   iSeg;..      i 
8170: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
8180: 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e  pData[i], pLvl->
8190: 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 69  nMerge);.      i
81a0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
81b0: 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74 61  &pData[i], nTota
81c0: 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
81d0: 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d 3e  ( nTotal>=pLvl->
81e0: 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20 20  nMerge );.      
81f0: 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74  pLvl->aSeg = (Ft
8200: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8210: 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  nt*)sqlite3Fts5M
8220: 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 0a  allocZero(&rc, .
8230: 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74 61 6c            nTotal
8240: 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
8250: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 0a  ructureSegment).
8260: 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20 20        );..      
8270: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8280: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 76  K ){.        pLv
8290: 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61 6c  l->nSeg = nTotal
82a0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53  ;.        for(iS
82b0: 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74 61  eg=0; iSeg<nTota
82c0: 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  l; iSeg++){.    
82d0: 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61        i += getVa
82e0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
82f0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
8300: 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20  g].iSegid);.    
8310: 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61        i += getVa
8320: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
8330: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
8340: 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20 20  g].nHeight);.   
8350: 20 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74 56         i += getV
8360: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
8370: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
8380: 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg].pgnoFirst);.
8390: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 67            i += g
83a0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
83b0: 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  a[i], pLvl->aSeg
83c0: 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29  [iSeg].pgnoLast)
83d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
83e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
83f0: 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a   *ppOut = pRet;.
8400: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8410: 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
8420: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
8430: 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a  reAddLevel(int *
8440: 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74 75  pRc, Fts5Structu
8450: 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a  re **ppStruct){.
8460: 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
8470: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
8480: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8490: 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
84a0: 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20  .    int nLevel 
84b0: 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  = pStruct->nLeve
84c0: 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  l;.    int nByte
84d0: 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69 7a   = (.        siz
84e0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
84f0: 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  e) +            
8500: 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74        /* Main st
8510: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20  ructure */.     
8520: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
8530: 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20  ructureLevel) * 
8540: 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61  (nLevel+1)  /* a
8550: 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f  Level[] array */
8560: 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53 74  .    );..    pSt
8570: 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 72  ruct = sqlite3_r
8580: 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c 20  ealloc(pStruct, 
8590: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
85a0: 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20  pStruct ){.     
85b0: 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63 74   memset(&pStruct
85c0: 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d  ->aLevel[nLevel]
85d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
85e0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 29  StructureLevel))
85f0: 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
8600: 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20  >nLevel++;.     
8610: 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74   *ppStruct = pSt
8620: 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ruct;.    }else{
8630: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
8640: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
8650: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  }.  }.}../*.** E
8660: 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c  xtend level iLvl
8670: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69   so that there i
8680: 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65  s room for at le
8690: 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a  ast nExtra more.
86a0: 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a  ** segments..*/.
86b0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
86c0: 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
86d0: 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63  evel(.  int *pRc
86e0: 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  , .  Fts5Structu
86f0: 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20 20  re *pStruct, .  
8700: 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74  int iLvl, .  int
8710: 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20   nExtra, .  int 
8720: 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66 28  bInsert.){.  if(
8730: 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
8740: 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
8750: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
8760: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
8770: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46  vel[iLvl];.    F
8780: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
8790: 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69  ent *aNew;.    i
87a0: 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  nt nByte;..    n
87b0: 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Byte = (pLvl->nS
87c0: 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73  eg + nExtra) * s
87d0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
87e0: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
87f0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
8800: 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53  realloc(pLvl->aS
8810: 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  eg, nByte);.    
8820: 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20  if( aNew ){.    
8830: 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d 30    if( bInsert==0
8840: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
8850: 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e  et(&aNew[pLvl->n
8860: 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Seg], 0, sizeof(
8870: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
8880: 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b  ment) * nExtra);
8890: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
88a0: 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20        int nMove 
88b0: 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73  = pLvl->nSeg * s
88c0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
88d0: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
88e0: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e       memmove(&aN
88f0: 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77  ew[nExtra], aNew
8900: 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  , nMove);.      
8910: 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30    memset(aNew, 0
8920: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
8930: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a  uctureSegment) *
8940: 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20   nExtra);.      
8950: 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53  }.      pLvl->aS
8960: 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d  eg = aNew;.    }
8970: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63  else{.      *pRc
8980: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
8990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
89a0: 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72 69  .** Read, deseri
89b0: 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e  alize and return
89c0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
89d0: 65 63 6f 72 64 20 66 6f 72 20 69 6e 64 65 78 20  ecord for index 
89e0: 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iIdx..**.** The 
89f0: 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c  Fts5Structure.aL
8a00: 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20  evel[] and each 
8a10: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
8a20: 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a  el.aSeg[] array.
8a30: 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f  ** are over-allo
8a40: 63 61 74 65 64 20 61 73 20 64 65 73 63 72 69 62  cated as describ
8a50: 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ed for function 
8a60: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
8a70: 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65 2e  ode() .** above.
8a80: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
8a90: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
8aa0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
8ab0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65  an error code le
8ac0: 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73  ft in the.** Fts
8ad0: 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49  5Index handle. I
8ae0: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
8af0: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
8b00: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
8b10: 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  on.** is called,
8b20: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
8b30: 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 53 74  */.static Fts5St
8b40: 72 75 63 74 75 72 65 20 2a 66 74 73 35 53 74 72  ructure *fts5Str
8b50: 75 63 74 75 72 65 52 65 61 64 28 46 74 73 35 49  uctureRead(Fts5I
8b60: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64  ndex *p, int iId
8b70: 78 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  x){.  Fts5Config
8b80: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
8b90: 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 53 74  Config;.  Fts5St
8ba0: 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20  ructure *pRet = 
8bb0: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a  0;        /* Obj
8bc0: 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ect to return */
8bd0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
8be0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
8bf0: 20 20 20 2f 2a 20 25 5f 64 61 74 61 20 65 6e 74     /* %_data ent
8c00: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 73 74  ry containing st
8c10: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 2a  ructure record *
8c20: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  /..  assert( iId
8c30: 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x<=pConfig->nPre
8c40: 66 69 78 20 29 3b 0a 20 20 70 44 61 74 61 20 3d  fix );.  pData =
8c50: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
8c60: 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
8c70: 52 4f 57 49 44 28 69 49 64 78 29 29 3b 0a 20 20  ROWID(iIdx));.  
8c80: 69 66 28 20 21 70 44 61 74 61 20 29 20 72 65 74  if( !pData ) ret
8c90: 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 72 63 20 3d  urn 0;.  p->rc =
8ca0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
8cb0: 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c 20 70  code(pData->p, p
8cc0: 44 61 74 61 2d 3e 6e 2c 20 26 70 52 65 74 29 3b  Data->n, &pRet);
8cd0: 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
8ce0: 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65  ase(pData);.  re
8cf0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
8d00: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
8d10: 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74  ference to an Ft
8d20: 73 35 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  s5Structure obje
8d30: 63 74 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  ct returned by a
8d40: 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61  n earlier .** ca
8d50: 6c 6c 20 74 6f 20 66 74 73 35 53 74 72 75 63 74  ll to fts5Struct
8d60: 75 72 65 52 65 61 64 28 29 20 6f 72 20 66 74 73  ureRead() or fts
8d70: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
8d80: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
8d90: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
8da0: 52 65 6c 65 61 73 65 28 46 74 73 35 53 74 72 75  Release(Fts5Stru
8db0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8dc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
8dd0: 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e  i=0; i<pStruct->
8de0: 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
8df0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
8e00: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8e10: 5d 2e 61 53 65 67 29 3b 0a 20 20 7d 0a 20 20 73  ].aSeg);.  }.  s
8e20: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72  qlite3_free(pStr
8e30: 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  uct);.}../*.** R
8e40: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
8e50: 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
8e60: 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75  ts in index stru
8e70: 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a  cture pStruct..*
8e80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
8e90: 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
8ea0: 65 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75  egments(Fts5Stru
8eb0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
8ec0: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20  .  int nSegment 
8ed0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8ee0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
8ef0: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a  er of segments *
8f00: 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20  /.  int iLvl;   
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
8f30: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
8f40: 65 76 65 6c 73 20 2a 2f 0a 0a 20 20 66 6f 72 28  evels */..  for(
8f50: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
8f60: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
8f70: 76 6c 2b 2b 29 7b 0a 20 20 20 20 6e 53 65 67 6d  vl++){.    nSegm
8f80: 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e  ent += pStruct->
8f90: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
8fa0: 67 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  g;.  }..  return
8fb0: 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a   nSegment;.}../*
8fc0: 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e  .** Serialize an
8fd0: 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72  d store the "str
8fe0: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20 66  ucture" record f
8ff0: 6f 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a  or index iIdx..*
9000: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
9010: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
9020: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20  n error code in 
9030: 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62  the Fts5Index ob
9040: 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65  ject. If an.** e
9050: 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
9060: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
9070: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
9080: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
9090: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
90a0: 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  eWrite(Fts5Index
90b0: 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46   *p, int iIdx, F
90c0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
90d0: 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53  truct){.  int nS
90e0: 65 67 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20  egment;         
90f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
9100: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  al number of seg
9110: 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 42  ments */.  Fts5B
9120: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
9130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
9140: 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a  ffer to serializ
9150: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f  e record into */
9160: 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20  .  int iLvl;    
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
9190: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
91a0: 76 65 6c 73 20 2a 2f 0a 0a 20 20 6e 53 65 67 6d  vels */..  nSegm
91b0: 65 6e 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  ent = fts5Struct
91c0: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
91d0: 28 70 53 74 72 75 63 74 29 3b 0a 20 20 6d 65 6d  (pStruct);.  mem
91e0: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
91f0: 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
9200: 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
9210: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9220: 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74  c, &buf, pStruct
9230: 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 66 74 73  ->nLevel);.  fts
9240: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
9250: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
9260: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 66  , nSegment);.  f
9270: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
9280: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
9290: 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74  uf, (i64)pStruct
92a0: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
92b0: 3b 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  ;..  for(iLvl=0;
92c0: 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
92d0: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
92e0: 20 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20      int iSeg;   
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9300: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
9310: 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67  rate through seg
9320: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 46 74 73  ments */.    Fts
9330: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9340: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
9350: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
9360: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
9370: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
9380: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
9390: 4d 65 72 67 65 29 3b 0a 20 20 20 20 66 74 73 35  Merge);.    fts5
93a0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
93b0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
93c0: 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20   pLvl->nSeg);.  
93d0: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
93e0: 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53  nMerge<=pLvl->nS
93f0: 65 67 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  eg );..    for(i
9400: 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c  Seg=0; iSeg<pLvl
9410: 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ->nSeg; iSeg++){
9420: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
9430: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9440: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
9450: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ->aSeg[iSeg].iSe
9460: 67 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35  gid);.      fts5
9470: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9480: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9490: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
94a0: 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20  ].nHeight);.    
94b0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
94c0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
94d0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
94e0: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
94f0: 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  t);.      fts5Bu
9500: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
9510: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
9520: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
9530: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 7d  pgnoLast);.    }
9540: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
9550: 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54  Write(p, FTS5_ST
9560: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69 49  RUCTURE_ROWID(iI
9570: 64 78 29 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  dx), buf.p, buf.
9580: 6e 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  n);.  fts5Buffer
9590: 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 23  Free(&buf);.}..#
95a0: 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64  if 0.static void
95b0: 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74   fts5PrintStruct
95c0: 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ure(const char *
95d0: 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74  zCaption, Fts5St
95e0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
95f0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
9600: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42  LITE_OK;.  Fts5B
9610: 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
9620: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
9630: 65 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73  eof(buf));.  fts
9640: 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
9650: 26 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75  &rc, &buf, pStru
9660: 63 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  ct);.  fprintf(s
9670: 74 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e  tdout, "%s: %s\n
9680: 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66  ", zCaption, buf
9690: 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74  .p);.  fflush(st
96a0: 64 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66  dout);.  fts5Buf
96b0: 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
96c0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
96d0: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
96e0: 72 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a  re(x,y).#endif..
96f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
9700: 65 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53  egmentSize(Fts5S
9710: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
9720: 2a 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e  *pSeg){.  return
9730: 20 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   1 + pSeg->pgnoL
9740: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
9750: 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  First;.}../*.** 
9760: 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  Return a copy of
9770: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
9780: 20 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74   pStruct. Except
9790: 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e  , promote as man
97a0: 79 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 61 73  y segments.** as
97b0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76   possible to lev
97c0: 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20  el iPromote. If 
97d0: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e  an OOM occurs, N
97e0: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
97f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9800: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9810: 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e  moteTo(.  Fts5In
9820: 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50  dex *p,.  int iP
9830: 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a  romote,.  int sz
9840: 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53  Promote,.  Fts5S
9850: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
9860: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69  t.){.  int il, i
9870: 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  s;.  Fts5Structu
9880: 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20  reLevel *pOut = 
9890: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
98a0: 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 66  [iPromote];..  f
98b0: 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31  or(il=iPromote+1
98c0: 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  ; il<pStruct->nL
98d0: 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20  evel; il++){.   
98e0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
98f0: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
9900: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d  ruct->aLevel[il]
9910: 3b 0a 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76  ;.    for(is=pLv
9920: 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30  l->nSeg-1; is>=0
9930: 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 69  ; is--){.      i
9940: 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d  nt sz = fts5Segm
9950: 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61  entSize(&pLvl->a
9960: 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20  Seg[is]);.      
9970: 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65  if( sz>szPromote
9980: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
9990: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
99a0: 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
99b0: 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d  , pStruct, iProm
99c0: 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  ote, 1, 1);.    
99d0: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
99e0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 63  turn;.      memc
99f0: 70 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26  py(pOut->aSeg, &
9a00: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20  pLvl->aSeg[is], 
9a10: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
9a20: 74 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20  tureSegment));. 
9a30: 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b       pOut->nSeg+
9a40: 2b 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e  +;.      pLvl->n
9a50: 53 65 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Seg--;.    }.  }
9a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20  .}../*.** A new 
9a70: 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74  segment has just
9a80: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
9a90: 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69   level iLvl of i
9aa0: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a  ndex structure.*
9ab0: 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20  * pStruct. This 
9ac0: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
9ad0: 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65  nes if any segme
9ae0: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72  nts should be pr
9af0: 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72  omoted.** as a r
9b00: 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20  esult. Segments 
9b10: 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20  are promoted in 
9b20: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
9b30: 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65  *.**   a) If the
9b40: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
9b50: 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72  itten is smaller
9b60: 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   than one or mor
9b70: 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20  e segments.**   
9b80: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 72     within the pr
9b90: 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64  evious populated
9ba0: 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72   level, it is pr
9bb0: 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72  omoted to the pr
9bc0: 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70  evious.**      p
9bd0: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a  opulated level..
9be0: 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68  **.**   b) If th
9bf0: 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  e segment just w
9c00: 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72  ritten is larger
9c10: 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74   than the newest
9c20: 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20   segment on.**  
9c30: 20 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70      the next pop
9c40: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68  ulated level, th
9c50: 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c  en that segment,
9c60: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61   and any other a
9c70: 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20  djacent.**      
9c80: 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72  segments that ar
9c90: 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74  e also smaller t
9ca0: 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74  han the one just
9cb0: 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a   written, are .*
9cc0: 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e  *      promoted.
9cd0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f   .**.** If one o
9ce0: 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20  r more segments 
9cf0: 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68  are promoted, th
9d00: 65 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  e structure obje
9d10: 63 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a  ct is updated.**
9d20: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73   to reflect this
9d30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9d40: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
9d50: 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64  omote(.  Fts5Ind
9d60: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
9d70: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
9d80: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
9d90: 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20  */.  int iLvl,  
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65       /* Index le
9dc0: 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64  vel just updated
9dd0: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
9de0: 75 72 65 20 2a 70 53 74 72 75 63 74 20 20 20 20  ure *pStruct    
9df0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
9e00: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
9e10: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9e20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
9e30: 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69   iTst;.    int i
9e40: 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20  Promote = -1;.  
9e50: 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 3b    int szPromote;
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e70: 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68  /* Promote anyth
9e80: 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72  ing this size or
9e90: 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
9ea0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9eb0: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
9ec0: 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   Segment just wr
9ed0: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 46 74 73  itten */.    Fts
9ee0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9ef0: 2a 70 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 73  *pTst;.    int s
9f00: 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  zSeg;           
9f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9f20: 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73 74   of segment just
9f30: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 0a 20 20   written */...  
9f40: 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
9f50: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
9f60: 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c  aSeg[pStruct->aL
9f70: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d  evel[iLvl].nSeg-
9f80: 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d 20  1];.    szSeg = 
9f90: 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  (1 + pSeg->pgnoL
9fa0: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
9fb0: 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  First);..    /* 
9fc0: 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74  Check for condit
9fd0: 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20 66  ion (a) */.    f
9fe0: 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20  or(iTst=iLvl-1; 
9ff0: 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72 75  iTst>=0 && pStru
a000: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d  ct->aLevel[iTst]
a010: 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d  .nSeg==0; iTst--
a020: 29 3b 0a 20 20 20 20 70 54 73 74 20 3d 20 26 70  );.    pTst = &p
a030: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a040: 54 73 74 5d 3b 0a 20 20 20 20 69 66 28 20 69 54  Tst];.    if( iT
a050: 73 74 3e 3d 30 20 26 26 20 70 54 73 74 2d 3e 6e  st>=0 && pTst->n
a060: 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Merge==0 ){.    
a070: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
a080: 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20  nt szMax = 0;.  
a090: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a0a0: 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  Tst->nSeg; i++){
a0b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
a0c0: 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  = pTst->aSeg[i].
a0d0: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d  pgnoLast - pTst-
a0e0: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72  >aSeg[i].pgnoFir
a0f0: 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  st + 1;.        
a100: 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73  if( sz>szMax ) s
a110: 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20  zMax = sz;.     
a120: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
a130: 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20  ax>=szSeg ){.   
a140: 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
a150: 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50  n (a) is true. P
a160: 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73  romote the newes
a170: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76  t segment on lev
a180: 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  el .        ** i
a190: 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73  Lvl to level iTs
a1a0: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  t.  */.        i
a1b0: 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a  Promote = iTst;.
a1c0: 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74          szPromot
a1d0: 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20  e = szMax;.     
a1e0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
a1f0: 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69   Check for condi
a200: 74 69 6f 6e 20 28 62 29 20 2a 2f 0a 20 20 20 20  tion (b) */.    
a210: 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29  if( iPromote<0 )
a220: 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
a230: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74  ctureLevel *pTst
a240: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 73 74  ;.      for(iTst
a250: 3d 69 4c 76 6c 2b 31 3b 20 69 54 73 74 3c 70 53  =iLvl+1; iTst<pS
a260: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
a270: 54 73 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Tst++){.        
a280: 70 54 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d  pTst = &pStruct-
a290: 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20  >aLevel[iTst];. 
a2a0: 20 20 20 20 20 20 20 69 66 28 20 70 54 73 74 2d         if( pTst-
a2b0: 3e 6e 53 65 67 20 29 20 62 72 65 61 6b 3b 0a 20  >nSeg ) break;. 
a2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a2d0: 20 69 54 73 74 3c 70 53 74 72 75 63 74 2d 3e 6e   iTst<pStruct->n
a2e0: 4c 65 76 65 6c 20 26 26 20 70 54 73 74 2d 3e 6e  Level && pTst->n
a2f0: 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Merge==0 ){.    
a300: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
a310: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 32 20  eSegment *pSeg2 
a320: 3d 20 26 70 54 73 74 2d 3e 61 53 65 67 5b 70 54  = &pTst->aSeg[pT
a330: 73 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20  st->nSeg-1];.   
a340: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 53       int sz = pS
a350: 65 67 32 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  eg2->pgnoLast - 
a360: 70 53 65 67 32 2d 3e 70 67 6e 6f 46 69 72 73 74  pSeg2->pgnoFirst
a370: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   + 1;.        if
a380: 28 20 73 7a 3c 3d 73 7a 53 65 67 20 29 7b 0a 20  ( sz<=szSeg ){. 
a390: 20 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74           iPromot
a3a0: 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20  e = iLvl;.      
a3b0: 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20      szPromote = 
a3c0: 73 7a 53 65 67 3b 0a 20 20 20 20 20 20 20 20 7d  szSeg;.        }
a3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
a3e0: 20 20 20 20 2f 2a 20 49 66 20 69 50 72 6f 6d 6f      /* If iPromo
a3f0: 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  te is greater th
a400: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
a410: 65 72 6f 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ero at this poin
a420: 74 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a  t, then it.    *
a430: 2a 20 69 73 20 74 68 65 20 6c 65 76 65 6c 20 6e  * is the level n
a440: 75 6d 62 65 72 20 6f 66 20 61 20 6c 65 76 65 6c  umber of a level
a450: 20 74 6f 20 77 68 69 63 68 20 73 65 67 6d 65 6e   to which segmen
a460: 74 73 20 74 68 61 74 20 63 6f 6e 73 69 73 74 20  ts that consist 
a470: 6f 66 0a 20 20 20 20 2a 2a 20 73 7a 50 72 6f 6d  of.    ** szProm
a480: 6f 74 65 20 6f 72 20 66 65 77 65 72 20 70 61 67  ote or fewer pag
a490: 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f  es should be pro
a4a0: 6d 6f 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69  moted. */ .    i
a4b0: 66 28 20 69 50 72 6f 6d 6f 74 65 3e 3d 30 20 29  f( iPromote>=0 )
a4c0: 7b 0a 20 20 20 20 20 20 66 74 73 35 50 72 69 6e  {.      fts5Prin
a4d0: 74 53 74 72 75 63 74 75 72 65 28 22 42 45 46 4f  tStructure("BEFO
a4e0: 52 45 22 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  RE", pStruct);. 
a4f0: 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
a500: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69  rePromoteTo(p, i
a510: 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f  Promote, szPromo
a520: 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  te, pStruct);.  
a530: 20 20 20 20 66 74 73 35 50 72 69 6e 74 53 74 72      fts5PrintStr
a540: 75 63 74 75 72 65 28 22 41 46 54 45 52 22 2c 20  ucture("AFTER", 
a550: 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
a560: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66    }.}.../*.** If
a570: 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f 66 66   the pIter->iOff
a580: 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c   offset currentl
a590: 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  y points to an e
a5a0: 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e 67 20  ntry indicating 
a5b0: 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 74  one.** or more t
a5c0: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 2c 20  erm-less nodes, 
a5d0: 61 64 76 61 6e 63 65 20 70 61 73 74 20 69 74 20  advance past it 
a5e0: 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d 3e 6e  and set pIter->n
a5f0: 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68 65 20  Empty to.** the 
a600: 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20  number of empty 
a610: 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f 0a  child nodes..*/.
a620: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
a630: 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e 45  NodeIterGobbleNE
a640: 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49 74 65  mpty(Fts5NodeIte
a650: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
a660: 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 49 74   pIter->iOff<pIt
a670: 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30 3d 3d  er->nData && 0==
a680: 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49  (pIter->aData[pI
a690: 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78 66  ter->iOff] & 0xf
a6a0: 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  e) ){.    pIter-
a6b0: 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
a6c0: 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f  >aData[pIter->iO
a6d0: 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20 20 20  ff] & 0x01;.    
a6e0: 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20  pIter->iOff++;. 
a6f0: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
a700: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
a710: 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65  Iter->aData[pIte
a720: 72 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72 2d  r->iOff], pIter-
a730: 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c 73  >nEmpty);.  }els
a740: 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 45  e{.    pIter->nE
a750: 6d 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 49  mpty = 0;.    pI
a760: 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30 3b  ter->bDlidx = 0;
a770: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
a780: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
a790: 74 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20 74  t entry within t
a7a0: 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  he node..*/.stat
a7b0: 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65  ic void fts5Node
a7c0: 49 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70 52  IterNext(int *pR
a7d0: 63 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20  c, Fts5NodeIter 
a7e0: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
a7f0: 49 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65  Iter->iOff>=pIte
a800: 72 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  r->nData ){.    
a810: 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30  pIter->aData = 0
a820: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68  ;.    pIter->iCh
a830: 69 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 45  ild += pIter->nE
a840: 6d 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mpty;.  }else{. 
a850: 20 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e 65     int nPre, nNe
a860: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f  w;.    pIter->iO
a870: 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ff += getVarint3
a880: 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  2(&pIter->aData[
a890: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 50  pIter->iOff], nP
a8a0: 72 65 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  re);.    pIter->
a8b0: 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
a8c0: 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74  t32(&pIter->aDat
a8d0: 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20  a[pIter->iOff], 
a8e0: 6e 4e 65 77 29 3b 0a 20 20 20 20 70 49 74 65 72  nNew);.    pIter
a8f0: 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d  ->term.n = nPre-
a900: 32 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  2;.    fts5Buffe
a910: 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c  rAppendBlob(pRc,
a920: 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
a930: 4e 65 77 2c 20 70 49 74 65 72 2d 3e 61 44 61 74  New, pIter->aDat
a940: 61 2b 70 49 74 65 72 2d 3e 69 4f 66 66 29 3b 0a  a+pIter->iOff);.
a950: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
a960: 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74  += nNew;.    pIt
a970: 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 28 31  er->iChild += (1
a980: 20 2b 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79   + pIter->nEmpty
a990: 29 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49  );.    fts5NodeI
a9a0: 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28  terGobbleNEmpty(
a9b0: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
a9c0: 2a 70 52 63 20 29 20 70 49 74 65 72 2d 3e 61 44  *pRc ) pIter->aD
a9d0: 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ata = 0;.  }.}..
a9e0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
a9f0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
aa00: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
aa10: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
aa20: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73  he internal.** s
aa30: 65 67 6d 65 6e 74 20 6e 6f 64 65 20 69 6e 20 70  egment node in p
aa40: 44 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Data..*/.static 
aa50: 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65  void fts5NodeIte
aa60: 72 49 6e 69 74 28 63 6f 6e 73 74 20 75 38 20 2a  rInit(const u8 *
aa70: 61 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  aData, int nData
aa80: 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a  , Fts5NodeIter *
aa90: 70 49 74 65 72 29 7b 0a 20 20 6d 65 6d 73 65 74  pIter){.  memset
aaa0: 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
aab0: 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
aac0: 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 61 44 61  ter->aData = aDa
aad0: 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 44 61  ta;.  pIter->nDa
aae0: 74 61 20 3d 20 6e 44 61 74 61 3b 0a 20 20 70 49  ta = nData;.  pI
aaf0: 74 65 72 2d 3e 69 4f 66 66 20 3d 20 67 65 74 56  ter->iOff = getV
ab00: 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c 20 70  arint32(aData, p
ab10: 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b 0a 20  Iter->iChild);. 
ab20: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62   fts5NodeIterGob
ab30: 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29  bleNEmpty(pIter)
ab40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
ab50: 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  any memory alloc
ab60: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
ab70: 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ator object..*/.
ab80: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ab90: 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46 74 73  NodeIterFree(Fts
aba0: 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72  5NodeIter *pIter
abb0: 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  ){.  fts5BufferF
abc0: 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  ree(&pIter->term
abd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
abe0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
abf0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
ac00: 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f  ument has the fo
ac10: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73  llowing fields s
ac20: 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  et.** as follows
ac30: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
ac40: 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73 74  sets up the rest
ac50: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
ac60: 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70   so that it.** p
ac70: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
ac80: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
ac90: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
aca0: 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 20 70 6f  *.**   pData: po
acb0: 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
acc0: 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a  -index record, .
acd0: 2a 2a 20 20 20 69 4c 65 61 66 50 67 6e 6f 3a 20  **   iLeafPgno: 
ace0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
acf0: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2d 69 6e   this doclist-in
ad00: 64 65 78 20 69 73 20 61 73 73 6f 63 69 61 74 65  dex is associate
ad10: 64 20 77 69 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  d with..*/.stati
ad20: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
ad30: 74 65 72 46 69 72 73 74 28 46 74 73 35 44 6c 69  terFirst(Fts5Dli
ad40: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
ad50: 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
ad60: 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61 74 61  a = pIter->pData
ad70: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
ad80: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 61  sert( pIter->pDa
ad90: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
ada0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
adb0: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  >0 );..  /* Coun
adc0: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
add0: 6c 65 61 64 69 6e 67 20 30 78 30 30 20 62 79 74  leading 0x00 byt
ade0: 65 73 2e 20 54 68 65 6e 20 73 65 74 20 69 4c 65  es. Then set iLe
adf0: 61 66 50 67 6e 6f 2e 20 2a 2f 0a 20 20 66 6f 72  afPgno. */.  for
ae00: 28 69 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e  (i=0; i<pData->n
ae10: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 66 28  ; i++){ .    if(
ae20: 20 70 44 61 74 61 2d 3e 70 5b 69 5d 20 29 20 62   pData->p[i] ) b
ae30: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 49 74 65  reak;.  }.  pIte
ae40: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20  r->iLeafPgno += 
ae50: 28 69 2b 31 29 3b 0a 20 20 70 49 74 65 72 2d 3e  (i+1);.  pIter->
ae60: 69 4f 66 66 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20  iOff = i;..  /* 
ae70: 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 61 6c  Unless we are al
ae80: 72 65 61 64 79 20 61 74 20 74 68 65 20 65 6e 64  ready at the end
ae90: 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2d   of the doclist-
aea0: 69 6e 64 65 78 2c 20 6c 6f 61 64 20 74 68 65 20  index, load the 
aeb0: 66 69 72 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64  first.  ** rowid
aec0: 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66   value.  */.  if
aed0: 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 44  ( pIter->iOff<pD
aee0: 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49  ata->n ){.    pI
aef0: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74  ter->iOff += get
af00: 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
af10: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 28  [pIter->iOff], (
af20: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
af30: 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  wid);.  }else{. 
af40: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
af50: 20 31 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d   1;.  }.  pIter-
af60: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 49 74  >iFirstOff = pIt
af70: 65 72 2d 3e 69 4f 66 66 3b 0a 20 20 72 65 74 75  er->iOff;.  retu
af80: 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a  rn pIter->bEof;.
af90: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
afa0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
afb0: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
afc0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
afd0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
afe0: 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 44  dxIterNext(Fts5D
aff0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b000: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  {.  Fts5Data *pD
b010: 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61  ata = pIter->pDa
b020: 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ta;.  int iOff;.
b030: 0a 20 20 66 6f 72 28 69 4f 66 66 3d 70 49 74 65  .  for(iOff=pIte
b040: 72 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  r->iOff; iOff<pD
b050: 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b  ata->n; iOff++){
b060: 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
b070: 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b  p[iOff] ) break;
b080: 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66   .  }..  if( iOf
b090: 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20  f<pData->n ){.  
b0a0: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
b0b0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
b0c0: 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 49 74 65   += (iOff - pIte
b0d0: 72 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20  r->iOff) + 1;.  
b0e0: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
b0f0: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
b100: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
b110: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
b120: 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20  owid -= iVal;.  
b130: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20    pIter->iOff = 
b140: 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iOff;.  }else{. 
b150: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
b160: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
b170: 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d  n pIter->bEof;.}
b180: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
b190: 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74  5DlidxIterEof(Ft
b1a0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
b1b0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b1c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  ){.  return (p->
b1d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
b1e0: 20 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d   pIter->bEof);.}
b1f0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
b200: 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28  s5DlidxIterLast(
b210: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b220: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 66 74 73  Iter){.  if( fts
b230: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
b240: 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  pIter)==0 ){.   
b250: 20 77 68 69 6c 65 28 20 30 3d 3d 66 74 73 35 44   while( 0==fts5D
b260: 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 49 74  lidxIterNext(pIt
b270: 65 72 29 20 29 3b 0a 20 20 20 20 70 49 74 65 72  er) );.    pIter
b280: 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 7d 0a  ->bEof = 0;.  }.
b290: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
b2a0: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
b2b0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b2c0: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 4f 66  Iter){.  int iOf
b2d0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4f 66 66 3b  f = pIter->iOff;
b2e0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
b2f0: 72 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  r->bEof==0 );.  
b300: 69 66 28 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d  if( iOff<=pIter-
b310: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
b320: 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
b330: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b340: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
b350: 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34  Data->p;.    i64
b360: 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69   iVal;.    int i
b370: 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 43  Limit;..    /* C
b380: 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f  urrently iOff po
b390: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
b3a0: 74 20 62 79 74 65 20 6f 66 20 61 20 76 61 72 69  t byte of a vari
b3b0: 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a  nt. This block .
b3c0: 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74      ** decrement
b3d0: 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74 20  s iOff until it 
b3e0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
b3f0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
b400: 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a  previous .    **
b410: 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20   varint. Taking 
b420: 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64  care not to read
b430: 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61   any memory loca
b440: 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72  tions that occur
b450: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  .    ** before t
b460: 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d  he buffer in mem
b470: 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69  ory.  */.    iLi
b480: 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20  mit = (iOff>9 ? 
b490: 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20  iOff-9 : 0);.   
b4a0: 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66   for(iOff--; iOf
b4b0: 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d  f>iLimit; iOff--
b4c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 5b  ){.      if( (a[
b4d0: 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29 3d  iOff-1] & 0x80)=
b4e0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
b4f0: 7d 0a 0a 20 20 20 20 67 65 74 56 61 72 69 6e 74  }..    getVarint
b500: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
b510: 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 49 74  )&iVal);.    pIt
b520: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56  er->iRowid += iV
b530: 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  al;.    pIter->i
b540: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20  LeafPgno--;..   
b550: 20 77 68 69 6c 65 28 20 69 4f 66 66 3e 70 49 74   while( iOff>pIt
b560: 65 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 0a 20  er->iFirstOff . 
b570: 20 20 20 20 20 20 20 26 26 20 61 5b 69 4f 66 66         && a[iOff
b580: 2d 31 5d 3d 3d 30 78 30 30 20 26 26 20 28 61 5b  -1]==0x00 && (a[
b590: 69 4f 66 66 2d 32 5d 20 26 20 30 78 38 30 29 3d  iOff-2] & 0x80)=
b5a0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
b5b0: 20 69 4f 66 66 2d 2d 3b 0a 20 20 20 20 20 20 70   iOff--;.      p
b5c0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
b5d0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  -;.    }.    pIt
b5e0: 65 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b  er->iOff = iOff;
b5f0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
b600: 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73  Iter->bEof;.}..s
b610: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
b620: 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20  lidxIterInit(.  
b630: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20  /* Fts5 Backend 
b660: 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
b670: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  n */.  int bRev,
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b690: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
b6a0: 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20  or ORDER BY ASC 
b6b0: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 69  */.  int iIdx, i
b6c0: 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20  nt iSegid,      
b6d0: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
b6e0: 69 53 65 67 69 64 20 77 69 74 68 69 6e 20 69 6e  iSegid within in
b6f0: 64 65 78 20 69 49 64 78 20 2a 2f 0a 20 20 69 6e  dex iIdx */.  in
b700: 74 20 69 4c 65 61 66 50 67 6e 6f 2c 20 20 20 20  t iLeafPgno,    
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b720: 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   Leaf page numbe
b730: 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20  r to load dlidx 
b740: 66 6f 72 20 2a 2f 0a 20 20 46 74 73 35 44 6c 69  for */.  Fts5Dli
b750: 64 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20  dxIter **ppIter 
b760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
b770: 20 50 6f 70 75 6c 61 74 65 64 20 69 74 65 72 61   Populated itera
b780: 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  tor */.){.  Fts5
b790: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b7a0: 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 46 74   = *ppIter;.  Ft
b7b0: 73 35 44 61 74 61 20 2a 70 44 6c 69 64 78 3b 0a  s5Data *pDlidx;.
b7c0: 0a 20 20 70 44 6c 69 64 78 20 3d 20 66 74 73 35  .  pDlidx = fts5
b7d0: 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
b7e0: 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57  _DOCLIST_IDX_ROW
b7f0: 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c  ID(iIdx, iSegid,
b800: 20 69 4c 65 61 66 50 67 6e 6f 29 29 3b 0a 20 20   iLeafPgno));.  
b810: 69 66 28 20 70 44 6c 69 64 78 3d 3d 30 20 29 20  if( pDlidx==0 ) 
b820: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 49  return;.  if( pI
b830: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ter==0 ){.    *p
b840: 70 49 74 65 72 20 3d 20 70 49 74 65 72 20 3d 20  pIter = pIter = 
b850: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29  (Fts5DlidxIter*)
b860: 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
b870: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
b880: 78 49 74 65 72 29 29 3b 0a 20 20 20 20 69 66 28  xIter));.    if(
b890: 20 70 49 74 65 72 3d 3d 30 20 29 7b 20 0a 20 20   pIter==0 ){ .  
b8a0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
b8b0: 61 73 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  ase(pDlidx);.   
b8c0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
b8d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
b8e0: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
b8f0: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49  izeof(Fts5DlidxI
b900: 74 65 72 29 29 3b 0a 20 20 7d 0a 0a 20 20 70 49  ter));.  }..  pI
b910: 74 65 72 2d 3e 70 44 61 74 61 20 3d 20 70 44 6c  ter->pData = pDl
b920: 69 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  idx;.  pIter->iL
b930: 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
b940: 67 6e 6f 3b 0a 20 20 69 66 28 20 62 52 65 76 3d  gno;.  if( bRev=
b950: 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6c  =0 ){.    fts5Dl
b960: 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74  idxIterFirst(pIt
b970: 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
b980: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c    fts5DlidxIterL
b990: 61 73 74 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ast(pIter);.  }.
b9a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
b9b0: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 74  doclist-index it
b9c0: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c  erator object al
b9d0: 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35 44  located by fts5D
b9e0: 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e 0a  lidxIterInit()..
b9f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
ba00: 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
ba10: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
ba20: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
ba30: 74 65 72 20 29 7b 0a 20 20 20 20 66 74 73 35 44  ter ){.    fts5D
ba40: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
ba50: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73 71  ->pData);.    sq
ba60: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
ba70: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
ba80: 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65  Load the next le
ba90: 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  af page into the
baa0: 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
bab0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
bac0: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
bad0: 74 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64  tPage(.  Fts5Ind
bae0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
baf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
bb00: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
bb10: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
bb20: 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
bb30: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
bb40: 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e   to advance to n
bb50: 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  ext page */.){. 
bb60: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
bb70: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
bb80: 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 69 66 28  ter->pSeg;.  if(
bb90: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 20   pIter->pLeaf ) 
bba0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
bbb0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
bbc0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
bbd0: 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72  o++;.  if( pIter
bbe0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65  ->iLeafPgno<=pSe
bbf0: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
bc00: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
bc10: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
bc20: 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f  , .        FTS5_
bc30: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 49  SEGMENT_ROWID(pI
bc40: 74 65 72 2d 3e 69 49 64 78 2c 20 70 53 65 67 2d  ter->iIdx, pSeg-
bc50: 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65  >iSegid, 0, pIte
bc60: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  r->iLeafPgno).  
bc70: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
bc80: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
bc90: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
bca0: 20 4c 65 61 76 65 20 70 49 74 65 72 2d 3e 69 4c   Leave pIter->iL
bcb0: 65 61 66 4f 66 66 73 65 74 20 61 73 20 74 68 65  eafOffset as the
bcc0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
bcd0: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
bce0: 20 66 69 72 73 74 0a 2a 2a 20 70 6f 73 69 74 69   first.** positi
bcf0: 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73  on list. The pos
bd00: 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e  ition list belon
bd10: 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74  ging to document
bd20: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 2e 0a   pIter->iRowid..
bd30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
bd40: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
bd50: 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  rm(Fts5Index *p,
bd60: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
bd70: 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b  ter, int nKeep){
bd80: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
bd90: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20  ->pLeaf->p;     
bda0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
bdb0: 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a  read data from *
bdc0: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70  /.  int iOff = p
bdd0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
bde0: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
bdf0: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e   read at */.  in
be00: 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be20: 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   Bytes of new da
be30: 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d  ta */..  iOff +=
be40: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b   getVarint32(&a[
be50: 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
be60: 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20  pIter->term.n = 
be70: 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42 75 66  nKeep;.  fts5Buf
be80: 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
be90: 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
bea0: 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66  rm, nNew, &a[iOf
beb0: 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e  f]);.  iOff += n
bec0: 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54  New;.  pIter->iT
bed0: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ermLeafOffset = 
bee0: 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69  iOff;.  pIter->i
bef0: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70  TermLeafPgno = p
bf00: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
bf10: 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74  .  if( iOff>=pIt
bf20: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a  er->pLeaf->n ){.
bf30: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
bf40: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
bf50: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
bf60: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
bf70: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
bf80: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
bf90: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
bfa0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
bfb0: 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20     }.    iOff = 
bfc0: 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72  4;.    a = pIter
bfd0: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a  ->pLeaf->p;.  }.
bfe0: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
bff0: 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  3GetVarint(&a[iO
c000: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
c010: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70 49  r->iRowid);.  pI
c020: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c030: 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   = iOff;.}../*.*
c040: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
c050: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
c060: 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74   pIter to iterat
c070: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e  e through the en
c080: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d  tries in.** segm
c090: 65 6e 74 20 70 53 65 67 20 77 69 74 68 69 6e 20  ent pSeg within 
c0a0: 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68 65 20  index iIdx. The 
c0b0: 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
c0c0: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
c0d0: 20 0a 2a 2a 20 66 69 72 73 74 20 65 6e 74 72 79   .** first entry
c0e0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c0f0: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ion returns..**.
c100: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
c110: 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78  ccurs, Fts5Index
c120: 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  .rc is set to an
c130: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
c140: 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20  or code. If .** 
c150: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
c160: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
c170: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
c180: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
c190: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
c1a0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
c1b0: 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  gIterInit(.  Fts
c1c0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
c1d0: 20 20 20 20 0a 20 20 69 6e 74 20 69 49 64 78 2c      .  int iIdx,
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
c200: 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f  .aHash[] index o
c210: 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20  f FTS index */. 
c220: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
c230: 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20  gment *pSeg,    
c240: 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
c250: 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  of segment */.  
c260: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
c270: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
c280: 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
c290: 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  ulate */.){.  if
c2a0: 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ( pSeg->pgnoFirs
c2b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  t==0 ){.    /* T
c2c0: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 74  his happens if t
c2d0: 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 62 65  he segment is be
c2e0: 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e 20 69  ing used as an i
c2f0: 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63 72 65  nput to an incre
c300: 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65  mental.    ** me
c310: 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61 74 61  rge and all data
c320: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
c330: 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53 65 65  n "trimmed". See
c340: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a   function.    **
c350: 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
c360: 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  s() for details.
c370: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65   In this case le
c380: 61 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ave the iterator
c390: 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54   empty..    ** T
c3a0: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73  he caller will s
c3b0: 65 65 20 74 68 65 20 28 70 49 74 65 72 2d 3e 70  ee the (pIter->p
c3c0: 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61 73 73  Leaf==0) and ass
c3d0: 75 6d 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ume the iterator
c3e0: 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f   is.    ** at EO
c3f0: 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20  F already. */.  
c400: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
c410: 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  >pLeaf==0 );.   
c420: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
c430: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
c440: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73  E_OK ){.    mems
c450: 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
c460: 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
c470: 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
c480: 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d  pSeg;.    pIter-
c490: 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20  >iIdx = iIdx;.  
c4a0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
c4b0: 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  no = pSeg->pgnoF
c4c0: 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35  irst-1;.    fts5
c4d0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
c4e0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a  p, pIter);.  }..
c4f0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
c500: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38  ITE_OK ){.    u8
c510: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
c520: 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74 65 72  af->p;.    pIter
c530: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
c540: 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d  fts5GetU16(&a[2]
c550: 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  );.    fts5SegIt
c560: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
c570: 74 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  ter, 0);.  }.}..
c580: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c590: 4c 65 61 66 48 65 61 64 65 72 28 46 74 73 35 44  LeafHeader(Fts5D
c5a0: 61 74 61 20 2a 70 4c 65 61 66 2c 20 69 6e 74 20  ata *pLeaf, int 
c5b0: 2a 70 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70  *piRowid, int *p
c5c0: 69 54 65 72 6d 29 7b 0a 20 20 2a 70 69 52 6f 77  iTerm){.  *piRow
c5d0: 69 64 20 3d 20 28 69 6e 74 29 66 74 73 35 47 65  id = (int)fts5Ge
c5e0: 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30  tU16(&pLeaf->p[0
c5f0: 5d 29 3b 0a 20 20 2a 70 69 54 65 72 6d 20 3d 20  ]);.  *piTerm = 
c600: 28 69 6e 74 29 66 74 73 35 47 65 74 55 31 36 28  (int)fts5GetU16(
c610: 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d  &pLeaf->p[2]);.}
c620: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c630: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76  ction is only ev
c640: 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65  er called on ite
c650: 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62  rators created b
c660: 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74  y calls to.** Ft
c670: 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77  s5IndexQuery() w
c680: 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45  ith the FTS5INDE
c690: 58 5f 51 55 45 52 59 5f 41 53 43 20 66 6c 61 67  X_QUERY_ASC flag
c6a0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e   set..**.** When
c6b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
c6c0: 73 20 63 61 6c 6c 65 64 2c 20 69 74 65 72 61 74  s called, iterat
c6d0: 6f 72 20 70 49 74 65 72 20 70 6f 69 6e 74 73 20  or pIter points 
c6e0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
c6f0: 69 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72  id.** on the cur
c700: 72 65 6e 74 20 6c 65 61 66 20 61 73 73 6f 63 69  rent leaf associ
c710: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 65  ated with the te
c720: 72 6d 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  rm being queried
c730: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
c740: 2a 2a 20 61 64 76 61 6e 63 65 73 20 69 74 20 74  ** advances it t
c750: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6c  o point to the l
c760: 61 73 74 20 73 75 63 68 20 72 6f 77 69 64 20 61  ast such rowid a
c770: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
c780: 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 0a 2a 2a  , initializes.**
c790: 20 74 68 65 20 61 52 6f 77 69 64 4f 66 66 73 65   the aRowidOffse
c7a0: 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66  t[] and iRowidOf
c7b0: 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e 0a  fset variables..
c7c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
c7d0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
c7e0: 65 49 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e  eInitPage(Fts5In
c7f0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
c800: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
c810: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
c820: 65 61 66 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20  eaf->n;.  int i 
c830: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
c840: 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20  fset;.  u8 *a = 
c850: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
c860: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
c870: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  set = 0;..  whil
c880: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
c890: 5f 4f 4b 20 26 26 20 69 3c 6e 20 29 7b 0a 20 20  _OK && i<n ){.  
c8a0: 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30    i64 iDelta = 0
c8b0: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  ;.    int nPos;.
c8c0: 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72  .    i += getVar
c8d0: 69 6e 74 33 32 28 26 61 5b 69 5d 2c 20 6e 50 6f  int32(&a[i], nPo
c8e0: 73 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50 6f  s);.    i += nPo
c8f0: 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20  s;.    if( i>=n 
c900: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b  ) break;.    i +
c910: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69  = getVarint(&a[i
c920: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
c930: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c 74  );.    if( iDelt
c940: 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  a==0 ) break;.  
c950: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
c960: 2d 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  -= iDelta;..    
c970: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74  if( iRowidOffset
c980: 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  >=pIter->nRowidO
c990: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
c9a0: 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d  nt nNew = pIter-
c9b0: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20  >nRowidOffset + 
c9c0: 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e  8;.      int *aN
c9d0: 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ew = (int*)sqlit
c9e0: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72  e3_realloc(pIter
c9f0: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20  ->aRowidOffset, 
ca00: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29  nNew*sizeof(int)
ca10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
ca20: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
ca30: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
ca40: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72  OMEM;.        br
ca50: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
ca60: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
ca70: 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20  Offset = aNew;. 
ca80: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77       pIter->nRow
ca90: 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b  idOffset = nNew;
caa0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65  .    }..    pIte
cab0: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
cac0: 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20  iRowidOffset++] 
cad0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
cae0: 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  fset;.    pIter-
caf0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
cb00: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69  ;.  }.  pIter->i
cb10: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52  RowidOffset = iR
cb20: 6f 77 69 64 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  owidOffset;.}../
cb30: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
cb40: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
cb50: 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74  everseNewPage(Ft
cb60: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
cb70: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
cb80: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
cb90: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
cba0: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29  EGITER_REVERSE )
cbb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
cbc0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
cbd0: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
cbe0: 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65  );..  fts5DataRe
cbf0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
cc00: 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c  af);.  pIter->pL
cc10: 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  eaf = 0;.  while
cc20: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
cc30: 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65  OK && pIter->iLe
cc40: 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54  afPgno>pIter->iT
cc50: 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ermLeafPgno ){. 
cc60: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65     Fts5Data *pNe
cc70: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  w;.    pIter->iL
cc80: 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70  eafPgno--;.    p
cc90: 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65  New = fts5DataRe
cca0: 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
ccb0: 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20  NT_ROWID(.      
ccc0: 20 20 20 20 70 49 74 65 72 2d 3e 69 49 64 78 2c      pIter->iIdx,
ccd0: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
cce0: 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e  egid, 0, pIter->
ccf0: 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29  iLeafPgno.    ))
cd00: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
cd10: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
cd20: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49  r->iLeafPgno==pI
cd30: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
cd40: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  no ){.        if
cd50: 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ( pIter->iTermLe
cd60: 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 6e  afOffset<pNew->n
cd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
cd80: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65  ter->pLeaf = pNe
cd90: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  w;.          pIt
cda0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
cdb0: 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  = pIter->iTermLe
cdc0: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  afOffset;.      
cdd0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
cde0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
cdf0: 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a 20  widOff, dummy;. 
ce00: 20 20 20 20 20 20 20 66 74 73 35 4c 65 61 66 48         fts5LeafH
ce10: 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52 6f  eader(pNew, &iRo
ce20: 77 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b  widOff, &dummy);
ce30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f  .        if( iRo
ce40: 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  widOff ){.      
ce50: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
ce60: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
ce70: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
ce80: 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66  ffset = iRowidOf
ce90: 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  f;.        }.   
cea0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
ceb0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
cec0: 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20          u8 *a = 
ced0: 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
cee0: 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66  [pIter->iLeafOff
cef0: 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  set];.        pI
cf00: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
cf10: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 61 2c   += getVarint(a,
cf20: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
cf30: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
cf40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
cf50: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
cf60: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
cf70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
cf80: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
cf90: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
cfa0: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
cfb0: 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
cfc0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
cfd0: 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61  ** Advance itera
cfe0: 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65  tor pIter to the
cff0: 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a   next entry. .**
d000: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d010: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
d020: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
d030: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
d040: 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a  ror code. It .**
d050: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
d060: 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
d070: 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
d080: 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65  hes EOF. If an e
d090: 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
d0a0: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
d0b0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
d0c0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
d0d0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
d0e0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
d0f0: 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  gIterNext(.  Fts
d100: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d120: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
d130: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
d140: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
d150: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
d160: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
d170: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
d180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d190: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66      if( pIter->f
d1a0: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
d1b0: 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20  TER_REVERSE ){. 
d1c0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
d1d0: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
d1e0: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20  {.        u8 *a 
d1f0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d200: 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  p;.        int i
d210: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Off;.        int
d220: 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69   nPos;.        i
d230: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
d240: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
d250: 4f 66 66 73 65 74 2d 2d 3b 0a 0a 20 20 20 20 20  Offset--;..     
d260: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
d270: 66 66 73 65 74 20 3d 20 69 4f 66 66 20 3d 20 70  ffset = iOff = p
d280: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
d290: 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  et[pIter->iRowid
d2a0: 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20  Offset];.       
d2b0: 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69   iOff += getVari
d2c0: 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
d2d0: 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  Pos);.        iO
d2e0: 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  ff += nPos;.    
d2f0: 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 26 61      getVarint(&a
d300: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
d310: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
d320: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
d330: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d   iDelta;.      }
d340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
d350: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
d360: 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72  NewPage(p, pIter
d370: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d380: 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35  else{.      Fts5
d390: 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
d3a0: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20  ter->pLeaf;.    
d3b0: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
d3c0: 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
d3d0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b   0;.      int nK
d3e0: 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  eep = 0;..      
d3f0: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
d400: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  e end of the pos
d410: 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69  ition list withi
d420: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
d430: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ge. */.      u8 
d440: 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20  *a = pLeaf->p;. 
d450: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65       int n = pLe
d460: 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f  af->n;..      iO
d470: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
d480: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  fOffset;.      i
d490: 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
d4a0: 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73       int nPoslis
d4b0: 74 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  t;.        iOff 
d4c0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
d4d0: 61 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73  a[iOff], nPoslis
d4e0: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  t);.        iOff
d4f0: 20 2b 3d 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20   += nPoslist;.  
d500: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
d510: 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
d520: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65     /* The next e
d530: 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63  ntry is on the c
d540: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
d550: 20 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74         u64 iDelt
d560: 61 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  a;.        iOff 
d570: 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
d580: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69  int(&a[iOff], &i
d590: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
d5a0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
d5b0: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
d5c0: 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
d5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e   ){.          bN
d5e0: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
d5f0: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
d600: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
d610: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d620: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
d630: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
d640: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d650: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   4;.          }e
d660: 6c 73 65 20 69 66 28 20 69 4f 66 66 21 3d 66 74  lse if( iOff!=ft
d670: 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 20  s5GetU16(&a[2]) 
d680: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
d690: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d6a0: 74 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  t += getVarint32
d6b0: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
d6c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
d6d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d6e0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
d6f0: 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b  Rowid -= iDelta;
d700: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d710: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
d720: 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  iOff = 0;.      
d730: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
d740: 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
d750: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
d760: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66        while( iOf
d770: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
d780: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
d790: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
d7a0: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61 66  .          pLeaf
d7b0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
d7c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
d7d0: 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
d7e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
d7f0: 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  iOff = fts5GetU1
d800: 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29  6(&pLeaf->p[0]))
d810: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d820: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
d830: 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
d840: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
d850: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
d860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
d870: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d880: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
d890: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c    }.          el
d8a0: 73 65 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66  se if( (iOff = f
d8b0: 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
d8c0: 2d 3e 70 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  ->p[2])) ){.    
d8d0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
d8e0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
d8f0: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  f;.            b
d900: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
d910: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d920: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
d930: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
d940: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f  e iterator is no
d950: 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c  w at EOF. If so,
d960: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
d970: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  /.      if( pIte
d980: 72 2d 3e 70 4c 65 61 66 20 26 26 20 62 4e 65 77  r->pLeaf && bNew
d990: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
d9a0: 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  if( pIter->flags
d9b0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
d9c0: 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20  ONETERM ){.     
d9d0: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
d9e0: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
d9f0: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  f);.          pI
da00: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
da10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
da20: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
da30: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20  IterLoadTerm(p, 
da40: 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20  pIter, nKeep);. 
da50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
da60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
da70: 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
da80: 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
da90: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
daa0: 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c   rowid in a docl
dab0: 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ist. This.** fun
dac0: 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69  ction sets the i
dad0: 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68  terator up so th
dae0: 61 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72  at iterates in r
daf0: 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72  everse order thr
db00: 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c  ough.** the docl
db10: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
db20: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
db30: 65 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78  everse(Fts5Index
db40: 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46   *p, int iIdx, F
db50: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
db60: 72 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  r){.  Fts5Data *
db70: 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
db80: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
db90: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20   leaf data */.  
dba0: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
dbb0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ->iLeafOffset;  
dbc0: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 77  /* Byte offset w
dbd0: 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65  ithin current le
dbe0: 61 66 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  af */.  Fts5Data
dbf0: 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69   *pLast = 0;.  i
dc00: 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
dc10: 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 6f 20 74  ..  /* Move to t
dc20: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
dc30: 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 20 72  tains the last r
dc40: 6f 77 69 64 20 69 6e 20 74 68 69 73 20 64 6f 63  owid in this doc
dc50: 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 4c 65 61 66  list. */.  pLeaf
dc60: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
dc70: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ..  if( pIter->p
dc80: 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74  Dlidx ){.    int
dc90: 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d   iSegid = pIter-
dca0: 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
dcb0: 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 49     pgnoLast = pI
dcc0: 74 65 72 2d 3e 70 44 6c 69 64 78 2d 3e 69 4c 65  ter->pDlidx->iLe
dcd0: 61 66 50 67 6e 6f 3b 0a 20 20 20 20 70 4c 61 73  afPgno;.    pLas
dce0: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
dcf0: 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
dd00: 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65  _ROWID(iIdx, iSe
dd10: 67 69 64 2c 20 30 2c 20 70 67 6e 6f 4c 61 73 74  gid, 0, pgnoLast
dd20: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
dd30: 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65   while( iOff<pLe
dd40: 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69  af->n ){.      i
dd50: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69  nt nPos;.      i
dd60: 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  64 iDelta;..    
dd70: 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69    /* Position li
dd80: 73 74 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  st size in bytes
dd90: 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b   */.      iOff +
dda0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
ddb0: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
ddc0: 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  Pos);.      iOff
ddd0: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20   += nPos;.      
dde0: 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d  if( iOff>=pLeaf-
ddf0: 3e 6e 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  >n ) break;..   
de00: 20 20 20 2f 2a 20 52 6f 77 69 64 20 64 65 6c 74     /* Rowid delt
de10: 61 2e 20 4f 72 2c 20 69 66 20 30 78 30 30 2c 20  a. Or, if 0x00, 
de20: 74 68 65 20 65 6e 64 20 6f 66 20 64 6f 63 6c 69  the end of docli
de30: 73 74 20 6d 61 72 6b 65 72 2e 20 2a 2f 0a 20 20  st marker. */.  
de40: 20 20 20 20 6e 50 6f 73 20 3d 20 67 65 74 56 61      nPos = getVa
de50: 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
de60: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
de70: 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lta);.      if( 
de80: 69 44 65 6c 74 61 3d 3d 30 20 29 20 62 72 65 61  iDelta==0 ) brea
de90: 6b 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  k;.      iOff +=
dea0: 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 0a 20 20   nPos;.    }..  
deb0: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61    if( iOff>=pLea
dec0: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 46 74  f->n ){.      Ft
ded0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
dee0: 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72  nt *pSeg = pIter
def0: 2d 3e 70 53 65 67 3b 0a 20 20 20 20 20 20 69 36  ->pSeg;.      i6
df00: 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45  4 iAbs = FTS5_SE
df10: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
df20: 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
df30: 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  0, pIter->iLeafP
df40: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 36 34 20  gno);.      i64 
df50: 69 4c 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47  iLast = FTS5_SEG
df60: 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c  MENT_ROWID(iIdx,
df70: 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30   pSeg->iSegid, 0
df80: 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  , pSeg->pgnoLast
df90: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
dfa0: 20 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74   last rowid in t
dfb0: 68 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e  he doclist may n
dfc0: 6f 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72  ot be on the cur
dfd0: 72 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63  rent page. Searc
dfe0: 68 0a 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 77  h.       ** forw
dff0: 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ard to find the 
e000: 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  page containing 
e010: 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20  the last rowid. 
e020: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 41   */.      for(iA
e030: 62 73 2b 2b 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  bs++; p->rc==SQL
e040: 49 54 45 5f 4f 4b 20 26 26 20 69 41 62 73 3c 3d  ITE_OK && iAbs<=
e050: 69 4c 61 73 74 3b 20 69 41 62 73 2b 2b 29 7b 0a  iLast; iAbs++){.
e060: 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61          Fts5Data
e070: 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74   *pNew = fts5Dat
e080: 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a  aRead(p, iAbs);.
e090: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
e0a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
e0b0: 74 20 69 52 6f 77 69 64 2c 20 69 54 65 72 6d 3b  t iRowid, iTerm;
e0c0: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 4c  .          fts5L
e0d0: 65 61 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20  eafHeader(pNew, 
e0e0: 26 69 52 6f 77 69 64 2c 20 26 69 54 65 72 6d 29  &iRowid, &iTerm)
e0f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e100: 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
e110: 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
e120: 70 54 6d 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20  pTmp = pLast;.  
e130: 20 20 20 20 20 20 20 20 20 20 70 4c 61 73 74 20            pLast 
e140: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
e150: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 6d 70 3b      pNew = pTmp;
e160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e  .            pgn
e170: 6f 4c 61 73 74 20 3d 20 69 41 62 73 20 26 20 28  oLast = iAbs & (
e180: 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
e190: 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31  DATA_PAGE_B) - 1
e1a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
e1b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65           if( iTe
e1c0: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rm ){.          
e1d0: 20 20 69 41 62 73 20 3d 20 69 4c 61 73 74 3b 0a    iAbs = iLast;.
e1e0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e1f0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
e200: 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
e210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e220: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
e230: 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20  f pLast is NULL 
e240: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
e250: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77  hen the last row
e260: 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c  id for this docl
e270: 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e  ist.  ** lies on
e280: 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e   the page curren
e290: 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79  tly indicated by
e2a0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49   the iterator. I
e2b0: 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a  n this case .  *
e2c0: 2a 20 69 4c 61 73 74 4f 66 66 20 69 73 20 73 65  * iLastOff is se
e2d0: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
e2e0: 68 61 74 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  hat pIter->iLeaf
e2f0: 4f 66 66 73 65 74 20 77 69 6c 6c 20 74 61 6b 65  Offset will take
e300: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 69   when.  ** the i
e310: 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
e320: 6f 20 74 68 61 74 20 72 6f 77 69 64 2e 0a 20 20  o that rowid..  
e330: 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70  **.  ** Or, if p
e340: 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  Last is non-NULL
e350: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
e360: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
e370: 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a  ins the last.  *
e380: 2a 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20  * rowid..  */.  
e390: 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20  if( pLast ){.   
e3a0: 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20   int dummy;.    
e3b0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
e3c0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
e3d0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
e3e0: 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74  = pLast;.    pIt
e3f0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
e400: 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 66 74  pgnoLast;.    ft
e410: 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4c 61  s5LeafHeader(pLa
e420: 73 74 2c 20 26 69 4f 66 66 2c 20 26 64 75 6d 6d  st, &iOff, &dumm
e430: 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  y);.    iOff += 
e440: 67 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74  getVarint(&pLast
e450: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
e460: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
e470: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
e480: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
e490: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
e4a0: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
e4b0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  ge(p, pIter);.}.
e4c0: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
e4d0: 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
e4e0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
e4f0: 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64  rst rowid of a d
e500: 6f 63 6c 69 73 74 20 77 69 74 68 69 6e 0a 2a 2a  oclist within.**
e510: 20 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68 65   index iIdx. The
e520: 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
e530: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
e540: 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20   with the final 
e550: 74 65 72 6d 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  term on.** the c
e560: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 49 66 20  urrent page. If 
e570: 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
e580: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65 72   is the last ter
e590: 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 0a  m on the page, .
e5a0: 2a 2a 20 6c 6f 61 64 20 74 68 65 20 64 6f 63 6c  ** load the docl
e5b0: 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64  ist-index from d
e5c0: 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  isk and initiali
e5d0: 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61  ze an iterator a
e5e0: 74 20 0a 2a 2a 20 28 70 49 74 65 72 2d 3e 70 44  t .** (pIter->pD
e5f0: 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lidx)..*/.static
e600: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
e610: 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49  rLoadDlidx(Fts5I
e620: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64  ndex *p, int iId
e630: 78 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  x, Fts5SegIter *
e640: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53  pIter){.  int iS
e650: 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53  egid = pIter->pS
e660: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e  eg->iSegid;.  in
e670: 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d  t bRev = (pIter-
e680: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e690: 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a  GITER_REVERSE);.
e6a0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
e6b0: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
e6c0: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61  ; /* Current lea
e6d0: 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  f data */.  int 
e6e0: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
e6f0: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 42  eafOffset;  /* B
e700: 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69  yte offset withi
e710: 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a  n current leaf *
e720: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  /..  assert( pIt
e730: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
e740: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
e750: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
e760: 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29  ter->pDlidx==0 )
e770: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
e780: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
e790: 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69  list ends on thi
e7a0: 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f  s page. If it do
e7b0: 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  es, return.  ** 
e7c0: 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f  early without lo
e7d0: 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73  ading the doclis
e7e0: 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62  t-index (as it b
e7f0: 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66  elongs to a diff
e800: 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e  erent.  ** term.
e810: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 4f 66   */.  while( iOf
e820: 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20  f<pLeaf->n ){.  
e830: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
e840: 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a    int nPoslist;.
e850: 0a 20 20 20 20 2f 2a 20 69 4f 66 66 20 69 73 20  .    /* iOff is 
e860: 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f 66  currently the of
e870: 66 73 65 74 20 6f 66 20 74 68 65 20 73 69 7a 65  fset of the size
e880: 20 66 69 65 6c 64 20 6f 66 20 61 20 70 6f 73 69   field of a posi
e890: 74 69 6f 6e 20 6c 69 73 74 2e 20 2a 2f 0a 20 20  tion list. */.  
e8a0: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
e8b0: 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
e8c0: 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73 74 29  iOff], nPoslist)
e8d0: 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50  ;.    iOff += nP
e8e0: 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28  oslist;..    if(
e8f0: 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29   iOff<pLeaf->n )
e900: 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  {.      iOff += 
e910: 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  getVarint(&pLeaf
e920: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
e930: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
e940: 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
e950: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
e960: 20 7d 0a 0a 20 20 66 74 73 35 44 6c 69 64 78 49   }..  fts5DlidxI
e970: 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c  terInit(p, bRev,
e980: 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 70   iIdx, iSegid, p
e990: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2c  Iter->iLeafPgno,
e9a0: 20 26 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29   &pIter->pDlidx)
e9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
e9c0: 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
e9d0: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
e9e0: 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
e9f0: 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65  erm within segme
ea00: 6e 74 0a 2a 2a 20 70 53 65 67 2c 20 69 6e 64 65  nt.** pSeg, inde
ea10: 78 20 69 49 64 78 2e 20 49 66 20 74 68 65 72 65  x iIdx. If there
ea20: 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d   is no such term
ea30: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74   in the index, t
ea40: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69  he iterator.** i
ea50: 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a  s set to EOF..**
ea60: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
ea70: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
ea80: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
ea90: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
eaa0: 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
eab0: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
eac0: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
ead0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
eae0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
eaf0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
eb00: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
eb10: 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 0a  egIterSeekInit(.
eb20: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
eb50: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  d */.  int iIdx,
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
eb80: 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f  .aHash[] index o
eb90: 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20  f FTS index */. 
eba0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
ebb0: 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20  , int nTerm,    
ebc0: 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b   /* Term to seek
ebd0: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   to */.  int fla
ebe0: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
ebf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
ec00: 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58   of FTS5INDEX_XX
ec10: 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
ec20: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
ec30: 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20  t *pSeg,     /* 
ec40: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73  Description of s
ec50: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
ec60: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
ec80: 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
ec90: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50  e */.){.  int iP
eca0: 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 68 3b 0a  g = 1;.  int h;.
ecb0: 20 20 69 6e 74 20 62 47 65 20 3d 20 28 28 66 6c    int bGe = ((fl
ecc0: 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
ecd0: 51 55 45 52 59 5f 50 52 45 46 49 58 29 20 26 26  QUERY_PREFIX) &&
ece0: 20 69 49 64 78 3d 3d 30 29 3b 0a 20 20 69 6e 74   iIdx==0);.  int
ecf0: 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20   bDlidx = 0;    
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ed10: 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
ed20: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
ed30: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62   */..  assert( b
ed40: 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  Ge==0 || (flags 
ed50: 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
ed60: 59 5f 41 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61  Y_ASC)==0 );.  a
ed70: 73 73 65 72 74 28 20 70 54 65 72 6d 20 26 26 20  ssert( pTerm && 
ed80: 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65  nTerm );.  memse
ed90: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
eda0: 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
edb0: 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
edc0: 67 3b 0a 20 20 70 49 74 65 72 2d 3e 69 49 64 78  g;.  pIter->iIdx
edd0: 20 3d 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 54   = iIdx;..  /* T
ede0: 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73  his block sets s
edf0: 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50  tack variable iP
ee00: 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61  g to the leaf pa
ee10: 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d  ge number that m
ee20: 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20  ay.  ** contain 
ee30: 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72  term (pTerm/nTer
ee40: 6d 29 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  m), if it is pre
ee50: 73 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d  sent in the segm
ee60: 65 6e 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 68 3d  ent. */.  for(h=
ee70: 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b  pSeg->nHeight-1;
ee80: 20 68 3e 30 3b 20 68 2d 2d 29 7b 0a 20 20 20 20   h>0; h--){.    
ee90: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 6e 6f 64  Fts5NodeIter nod
eea0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
eeb0: 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
eec0: 20 74 68 72 6f 75 67 68 20 69 6e 74 65 72 6e 61   through interna
eed0: 6c 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 20 20 69  l nodes */.    i
eee0: 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
eef0: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
ef00: 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  Idx, pSeg->iSegi
ef10: 64 2c 20 68 2c 20 69 50 67 29 3b 0a 20 20 20 20  d, h, iPg);.    
ef20: 46 74 73 35 44 61 74 61 20 2a 70 4e 6f 64 65 20  Fts5Data *pNode 
ef30: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
ef40: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69  , iRowid);.    i
ef50: 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72  f( pNode==0 ) br
ef60: 65 61 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f  eak;..    fts5No
ef70: 64 65 49 74 65 72 49 6e 69 74 28 70 4e 6f 64 65  deIterInit(pNode
ef80: 2d 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26  ->p, pNode->n, &
ef90: 6e 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65 72  node);.    asser
efa0: 74 28 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d  t( node.term.n==
efb0: 30 20 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20  0 );..    iPg = 
efc0: 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20  node.iChild;.   
efd0: 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62   bDlidx = node.b
efe0: 44 6c 69 64 78 3b 0a 20 20 20 20 66 6f 72 28 66  Dlidx;.    for(f
eff0: 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
f000: 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a  &p->rc, &node);.
f010: 20 20 20 20 20 20 20 20 6e 6f 64 65 2e 61 44 61          node.aDa
f020: 74 61 20 26 26 20 66 74 73 35 42 75 66 66 65 72  ta && fts5Buffer
f030: 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64  CompareBlob(&nod
f040: 65 2e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  e.term, pTerm, n
f050: 54 65 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20  Term)<=0;.      
f060: 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65    fts5NodeIterNe
f070: 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65  xt(&p->rc, &node
f080: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
f090: 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64  Pg = node.iChild
f0a0: 3b 0a 20 20 20 20 20 20 62 44 6c 69 64 78 20 3d  ;.      bDlidx =
f0b0: 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20   node.bDlidx;.  
f0c0: 20 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64 65    }.    fts5Node
f0d0: 49 74 65 72 46 72 65 65 28 26 6e 6f 64 65 29 3b  IterFree(&node);
f0e0: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
f0f0: 65 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d  ease(pNode);.  }
f100: 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67  ..  if( iPg<pSeg
f110: 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20  ->pgnoFirst ){. 
f120: 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70     iPg = pSeg->p
f130: 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44  gnoFirst;.    bD
f140: 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lidx = 0;.  }.. 
f150: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
f160: 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66  o = iPg - 1;.  f
f170: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
f180: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  ge(p, pIter);.. 
f190: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
f1a0: 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  f ){.    int res
f1b0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
f1c0: 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
f1d0: 65 74 55 31 36 28 26 70 49 74 65 72 2d 3e 70 4c  etU16(&pIter->pL
f1e0: 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20  eaf->p[2]);.    
f1f0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
f200: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29  erm(p, pIter, 0)
f210: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
f220: 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65   res = fts5Buffe
f230: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49  rCompareBlob(&pI
f240: 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d  ter->term, pTerm
f250: 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , nTerm);.      
f260: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62 72 65  if( res>=0 ) bre
f270: 61 6b 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  ak;.      fts5Se
f280: 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  gIterNext(p, pIt
f290: 65 72 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  er);.    }while(
f2a0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b   pIter->pLeaf );
f2b0: 0a 0a 20 20 20 20 69 66 28 20 62 47 65 3d 3d 30  ..    if( bGe==0
f2c0: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 20   && res ){.     
f2d0: 20 2f 2a 20 53 65 74 20 69 74 65 72 61 74 6f 72   /* Set iterator
f2e0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f 46   to point to EOF
f2f0: 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61   */.      fts5Da
f300: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
f310: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70  >pLeaf);.      p
f320: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
f330: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
f340: 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ( bGe==0 ){.    
f350: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
f360: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
f370: 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49  TERM;.    if( pI
f380: 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
f390: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
f3a0: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
f3b0: 41 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ASC ){.        p
f3c0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
f3d0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
f3e0: 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RSE;.      }.   
f3f0: 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b     if( bDlidx ){
f400: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
f410: 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c  IterLoadDlidx(p,
f420: 20 69 49 64 78 2c 20 70 49 74 65 72 29 3b 0a 20   iIdx, pIter);. 
f430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f440: 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
f450: 45 58 5f 51 55 45 52 59 5f 41 53 43 20 29 7b 0a  EX_QUERY_ASC ){.
f460: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
f470: 74 65 72 52 65 76 65 72 73 65 28 70 2c 20 69 49  terReverse(p, iI
f480: 64 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  dx, pIter);.    
f490: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
f4a0: 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20  ./*.** Zero the 
f4b0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
f4c0: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
f4d0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
f4e0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
f4f0: 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74 65  Clear(Fts5SegIte
f500: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73  r *pIter){.  fts
f510: 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
f520: 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73  er->term);.  fts
f530: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
f540: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74  er->pLeaf);.  ft
f550: 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
f560: 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a  pIter->pDlidx);.
f570: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f580: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
f590: 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  et);.  memset(pI
f5a0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
f5b0: 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a  ts5SegIter));.}.
f5c0: 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f  ./*.** Do the co
f5d0: 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61  mparison necessa
f5e0: 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70  ry to populate p
f5f0: 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
f600: 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  t]..**.** If the
f610: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
f620: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
f630: 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65  n it is the inde
f640: 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  x of an entry.**
f650: 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
f660: 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74  Seg[] array that
f670: 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45   is (a) not at E
f680: 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e  OF, and (b) poin
f690: 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79  ting.** to a key
f6a0: 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69   that is a dupli
f6b0: 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c  cate of another,
f6c0: 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79   higher priority
f6d0: 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74  , .** segment-it
f6e0: 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53  erator in the pS
f6f0: 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  eg->aSeg[] array
f700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f710: 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
f720: 6f 6d 70 61 72 65 28 46 74 73 35 4d 75 6c 74 69  ompare(Fts5Multi
f730: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
f740: 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74  int iOut){.  int
f750: 20 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   i1;            
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f770: 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61  Index of left-ha
f780: 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
f790: 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20  /.  int i2;     
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
f7c0: 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53  right-hand Fts5S
f7d0: 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
f7e0: 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49  iRes;.  Fts5SegI
f7f0: 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20  ter *p1;        
f800: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
f810: 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
f820: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
f830: 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20  r *p2;          
f840: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68        /* Right-h
f850: 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
f860: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f  */..  assert( iO
f870: 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26  ut<pIter->nSeg &
f880: 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73  & iOut>0 );.  as
f890: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65  sert( pIter->bRe
f8a0: 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62  v==0 || pIter->b
f8b0: 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28  Rev==1 );..  if(
f8c0: 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e   iOut>=(pIter->n
f8d0: 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31  Seg/2) ){.    i1
f8e0: 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72   = (iOut - pIter
f8f0: 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20  ->nSeg/2) * 2;. 
f900: 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a     i2 = i1 + 1;.
f910: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20    }else{.    i1 
f920: 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
f930: 69 4f 75 74 2a 32 5d 3b 0a 20 20 20 20 69 32 20  iOut*2];.    i2 
f940: 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
f950: 69 4f 75 74 2a 32 2b 31 5d 3b 0a 20 20 7d 0a 20  iOut*2+1];.  }. 
f960: 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   p1 = &pIter->aS
f970: 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26  eg[i1];.  p2 = &
f980: 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b  pIter->aSeg[i2];
f990: 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61  ..  if( p1->pLea
f9a0: 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  f==0 ){         
f9b0: 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74    /* If p1 is at
f9c0: 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73   EOF */.    iRes
f9d0: 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69   = i2;.  }else i
f9e0: 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p2->pLeaf==0 
f9f0: 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20  ){     /* If p2 
fa00: 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20  is at EOF */.   
fa10: 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65   iRes = i1;.  }e
fa20: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  lse{.    int res
fa30: 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d   = fts5BufferCom
fa40: 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20  pare(&p1->term, 
fa50: 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20  &p2->term);.    
fa60: 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
fa70: 20 20 20 20 61 73 73 65 72 74 28 20 69 32 3e 69      assert( i2>i
fa80: 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
fa90: 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20  t( i2!=0 );.    
faa0: 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64    if( p1->iRowid
fab0: 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 20 72  ==p2->iRowid ) r
fac0: 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20  eturn i2;.      
fad0: 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
fae0: 69 64 20 3c 20 70 32 2d 3e 69 52 6f 77 69 64 29  id < p2->iRowid)
faf0: 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
fb00: 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a   -1 : +1;.    }.
fb10: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21      assert( res!
fb20: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  =0 );.    if( re
fb30: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65  s<0 ){.      iRe
fb40: 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73  s = i1;.    }els
fb50: 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  e{.      iRes = 
fb60: 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i2;.    }.  }.. 
fb70: 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
fb80: 4f 75 74 5d 20 3d 20 69 52 65 73 3b 0a 20 20 72  Out] = iRes;.  r
fb90: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
fba0: 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72 61  * Free the itera
fbb0: 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
fbc0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
fbd0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
fbe0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
fbf0: 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35 49  tiIterFree(Fts5I
fc00: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c  ndex *p, Fts5Mul
fc10: 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
fc20: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
fc30: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
fc40: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
fc50: 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  r->nSeg; i++){. 
fc60: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
fc70: 43 6c 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53  Clear(&pIter->aS
fc80: 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eg[i]);.    }.  
fc90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
fca0: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
fcb0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
fcc0: 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
fcd0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcf0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
fd00: 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
fd10: 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 4d 75  thin */.  Fts5Mu
fd20: 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
fd30: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65  r,        /* Ite
fd40: 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20  rator to update 
fd50: 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66  aFirst[] array f
fd60: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61  or */.  int iCha
fd70: 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  nged,           
fd80: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
fd90: 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72   of sub-iterator
fda0: 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a   just advanced *
fdb0: 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65 74 20  /.  int iMinset 
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65      /* Minimum e
fde0: 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74 5b 5d  ntry in aFirst[]
fdf0: 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20   to set */.){.  
fe00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28  int i;.  for(i=(
fe10: 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61  pIter->nSeg+iCha
fe20: 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e  nged)/2; i>=iMin
fe30: 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  set && p->rc==SQ
fe40: 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b  LITE_OK; i=i/2){
fe50: 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20  .    int iEq;.  
fe60: 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73    if( (iEq = fts
fe70: 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
fe80: 61 72 65 28 70 49 74 65 72 2c 20 69 29 29 20 29  are(pIter, i)) )
fe90: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
fea0: 74 65 72 4e 65 78 74 28 70 2c 20 26 70 49 74 65  terNext(p, &pIte
feb0: 72 2d 3e 61 53 65 67 5b 69 45 71 5d 29 3b 0a 20  r->aSeg[iEq]);. 
fec0: 20 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e       i = pIter->
fed0: 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20  nSeg + iEq;.    
fee0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  }.  }.}../*.** M
fef0: 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65 72  ove the seg-iter
ff00: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
ff10: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
ff20: 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c  rowid on page iL
ff30: 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69  eafPgno..** It i
ff40: 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65  s an error if le
ff50: 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 63 6f 6e  af iLeafPgno con
ff60: 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 2e 0a  tains no rowid..
ff70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
ff80: 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
ff90: 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
ffa0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ffb0: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
ffc0: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
ffd0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
ffe0: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
fff0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
10000 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
10010 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20  t iLeafPgno.){. 
10020 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67   assert( iLeafPg
10030 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no>pIter->iLeafP
10040 67 6e 6f 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  gno );.  if( p->
10050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10060 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
10070 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
10080 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  o-1;.    fts5Seg
10090 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
100a0 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  pIter);.    asse
100b0 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
100c0 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69  E_OK || pIter->i
100d0 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50  LeafPgno==iLeafP
100e0 67 6e 6f 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  gno );.  }..  if
100f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10100 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  OK ){.    int iO
10110 66 66 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20  ff;.    u8 *a = 
10120 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
10130 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74  .    int n = pIt
10140 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20  er->pLeaf->n;.. 
10150 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65     iOff = fts5Ge
10160 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20  tU16(&a[0]);.   
10170 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69   if( iOff<4 || i
10180 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Off>=n ){.      
10190 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
101a0 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RUPT;.    }else{
101b0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
101c0 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
101d0 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
101e0 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
101f0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10200 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d  et = iOff;.    }
10210 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
10220 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
10230 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
10240 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
10250 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20   until it is at 
10260 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69  or .** past rowi
10270 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c  d iFrom. Regardl
10280 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
10290 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69   of iFrom, the i
102a0 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c  terator is.** al
102b0 77 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74  ways advanced at
102c0 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a   least once..*/.
102d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
102e0 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
102f0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
10300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10310 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
10320 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
10330 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
10340 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
10350 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
10360 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69  vance */.  i64 i
10370 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20  Match           
10380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
10390 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61  vance iterator a
103a0 74 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72  t least this far
103b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65   */.){.  int bRe
103c0 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  v = (pIter->flag
103d0 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
103e0 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73  _REVERSE);.  Fts
103f0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
10400 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69  dx = pIter->pDli
10410 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50  dx;.  int iLeafP
10420 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
10430 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d  afPgno;.  int bM
10440 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  ove = 1;..  asse
10450 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
10460 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
10470 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
10480 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
10490 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dx );.  assert( 
104a0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a  pIter->pLeaf );.
104b0 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29  .  if( bRev==0 )
104c0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73  {.    while( fts
104d0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
104e0 20 70 44 6c 69 64 78 29 3d 3d 30 20 26 26 20 69   pDlidx)==0 && i
104f0 4d 61 74 63 68 3c 70 44 6c 69 64 78 2d 3e 69 52  Match<pDlidx->iR
10500 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  owid ){.      iL
10510 65 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64 78  eafPgno = pDlidx
10520 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ->iLeafPgno;.   
10530 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
10540 4e 65 78 74 28 70 44 6c 69 64 78 29 3b 0a 20 20  Next(pDlidx);.  
10550 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
10560 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72  iLeafPgno>=pIter
10570 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70  ->iLeafPgno || p
10580 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20  ->rc );.    if( 
10590 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
105a0 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
105b0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 47      fts5SegIterG
105c0 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65 72  otoPage(p, pIter
105d0 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  , iLeafPgno);.  
105e0 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20      bMove = 0;. 
105f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
10600 20 20 61 73 73 65 72 74 28 20 69 4d 61 74 63 68    assert( iMatch
10610 3e 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 29  >pIter->iRowid )
10620 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73  ;.    while( fts
10630 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
10640 20 70 44 6c 69 64 78 29 3d 3d 30 20 26 26 20 69   pDlidx)==0 && i
10650 4d 61 74 63 68 3e 70 44 6c 69 64 78 2d 3e 69 52  Match>pDlidx->iR
10660 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 66 74  owid ){.      ft
10670 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
10680 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20  pDlidx);.    }. 
10690 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70     iLeafPgno = p
106a0 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f  Dlidx->iLeafPgno
106b0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  ;..    assert( f
106c0 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
106d0 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c  p, pDlidx) || iL
106e0 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e  eafPgno<=pIter->
106f0 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
10700 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c    if( iLeafPgno<
10710 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
10720 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
10730 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
10740 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20  afPgno+1;.      
10750 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
10760 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
10770 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  er);.      bMove
10780 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
10790 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
107a0 20 20 20 69 66 28 20 62 4d 6f 76 65 20 29 20 66     if( bMove ) f
107b0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
107c0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  , pIter);.    if
107d0 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
107e0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
107f0 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49  f( bRev==0 && pI
10800 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61  ter->iRowid<=iMa
10810 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
10820 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26 20   if( bRev!=0 && 
10830 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69  pIter->iRowid>=i
10840 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
10850 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20     bMove = 1;.  
10860 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  }.}../*.** Move 
10870 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
10880 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
10890 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
108a0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
108b0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
108c0 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
108d0 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  . It is not .** 
108e0 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
108f0 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61  ror if the itera
10900 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c  tor reaches EOF,
10910 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72   or if it is alr
10920 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20  eady at .** EOF 
10930 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
10940 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
10950 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
10960 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a  5MultiIterNext(.
10970 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
10980 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
10990 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e  ter *pIter,.  in
109a0 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t bFrom,        
109b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
109c0 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e   True if argumen
109d0 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64  t iFrom is valid
109e0 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20   */.  i64 iFrom 
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a00 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
10a10 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72   at least as far
10a20 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20   as this */.){. 
10a30 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
10a40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
10a50 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
10a60 3e 61 46 69 72 73 74 5b 31 5d 3b 0a 20 20 20 20  >aFirst[1];.    
10a70 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
10a80 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
10a90 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 69 66  [iFirst];.    if
10aa0 28 20 62 46 72 6f 6d 20 26 26 20 70 53 65 67 2d  ( bFrom && pSeg-
10ab0 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  >pDlidx ){.     
10ac0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
10ad0 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46  From(p, pSeg, iF
10ae0 72 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rom);.    }else{
10af0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
10b00 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 29 3b  erNext(p, pSeg);
10b10 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
10b20 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
10b30 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73  (p, pIter, iFirs
10b40 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, 1);.  }.}../*
10b50 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
10b60 65 77 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  ew Fts5MultiSegI
10b70 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ter object..**.*
10b80 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
10b90 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
10ba0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
10bb0 20 64 61 74 61 20 69 6e 20 73 74 72 75 63 74 75   data in structu
10bc0 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49  re pStruct..** I
10bd0 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c  f iLevel is -ve,
10be0 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   then all data i
10bf0 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  n all segments i
10c00 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66  s merged. Or, if
10c10 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65   iLevel.** is ze
10c20 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64  ro or greater, d
10c30 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72  ata from the fir
10c40 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d  st nSegment segm
10c50 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c  ents on level iL
10c60 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65  evel.** is merge
10c70 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65  d..**.** The ite
10c80 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20  rator initially 
10c90 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
10ca0 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65  rst term/rowid e
10cb0 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20  ntry in the .** 
10cc0 69 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a  iterated data..*
10cd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10ce0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a  s5MultiIterNew(.
10cf0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
10d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d10 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
10d20 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
10d30 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  hin */.  Fts5Str
10d40 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c  ucture *pStruct,
10d50 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75           /* Stru
10d60 63 74 75 72 65 20 6f 66 20 73 70 65 63 69 66 69  cture of specifi
10d70 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  c index */.  int
10d80 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20   iIdx,          
10d90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10da0 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69  Config.aHash[] i
10db0 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65  ndex of FTS inde
10dc0 78 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  x */.  int flags
10dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10de0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
10df0 6f 72 20 3e 3d 20 2a 2f 0a 20 20 63 6f 6e 73 74  or >= */.  const
10e00 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
10e10 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
10e20 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
10e30 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
10e40 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e60 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
10e70 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
10e80 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
10e90 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
10ea0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10eb0 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
10ec0 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
10ed0 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  */.  Fts5MultiSe
10ee0 67 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  gIter **ppOut   
10ef0 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
10f00 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
10f10 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
10f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10f30 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
10f40 20 6d 65 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74   merged */.  int
10f50 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
10f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f70 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20  Power of two >= 
10f80 6e 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nSeg */.  int iI
10f90 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ter = 0;        
10fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a            /* */.
10fb0 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
10fe0 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67  rate through seg
10ff0 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53  ments */.  Fts5S
11000 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
11010 4c 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69  Lvl;.  Fts5Multi
11020 53 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  SegIter *pNew;..
11030 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
11040 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
11050 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
11060 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
11070 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
11080 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
11090 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c  tor. */.  if( iL
110a0 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 6e 53  evel<0 ){.    nS
110b0 65 67 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  eg = fts5Structu
110c0 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
110d0 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 65 6c 73  pStruct);.  }els
110e0 65 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 4d 49  e{.    nSeg = MI
110f0 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  N(pStruct->aLeve
11100 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20  l[iLevel].nSeg, 
11110 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20  nSegment);.  }. 
11120 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53   for(nSlot=2; nS
11130 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d  lot<nSeg; nSlot=
11140 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 2a 70 70 4f  nSlot*2);.  *ppO
11150 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73 35  ut = pNew = fts5
11160 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20  IdxMalloc(p, .  
11170 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 4d      sizeof(Fts5M
11180 75 6c 74 69 53 65 67 49 74 65 72 29 20 2b 20 20  ultiSegIter) +  
11190 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20          /* pNew 
111a0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
111b0 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 6e  Fts5SegIter) * n
111c0 53 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a 20  Slot +       /* 
111d0 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a  pNew->aSeg[] */.
111e0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 31 36        sizeof(u16
111f0 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20  ) * nSlot       
11200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
11210 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20  w->aFirst[] */. 
11220 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
11230 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e  0 ) return;.  pN
11240 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74  ew->nSeg = nSlot
11250 3b 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67 20 3d  ;.  pNew->aSeg =
11260 20 28 46 74 73 35 53 65 67 49 74 65 72 2a 29 26   (Fts5SegIter*)&
11270 70 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77 2d  pNew[1];.  pNew-
11280 3e 61 46 69 72 73 74 20 3d 20 28 75 31 36 2a 29  >aFirst = (u16*)
11290 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f  &pNew->aSeg[nSlo
112a0 74 5d 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76  t];.  pNew->bRev
112b0 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20   = (0!=(flags & 
112c0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
112d0 41 53 43 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  ASC));..  /* Ini
112e0 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20  tialize each of 
112f0 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65  the component se
11300 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e  gment iterators.
11310 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c   */.  if( iLevel
11320 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  <0 ){.    Fts5St
11330 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45  ructureLevel *pE
11340 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  nd = &pStruct->a
11350 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
11360 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28  Level];.    for(
11370 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61  pLvl=&pStruct->a
11380 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70  Level[0]; pLvl<p
11390 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20  End; pLvl++){.  
113a0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76      for(iSeg=pLv
113b0 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e  l->nSeg-1; iSeg>
113c0 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20  =0; iSeg--){.   
113d0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
113e0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
113f0 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
11400 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73  eg];.        Fts
11410 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
11420 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
11430 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  ter++];.        
11440 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a  if( pTerm==0 ){.
11450 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
11460 67 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64  gIterInit(p, iId
11470 78 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  x, pSeg, pIter);
11480 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
11490 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
114a0 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c  gIterSeekInit(p,
114b0 20 69 49 64 78 2c 20 70 54 65 72 6d 2c 20 6e 54   iIdx, pTerm, nT
114c0 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67  erm, flags, pSeg
114d0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
114e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
114f0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
11500 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
11510 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a  aLevel[iLevel];.
11520 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65      for(iSeg=nSe
11530 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
11540 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73  eg--){.      fts
11550 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
11560 69 49 64 78 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  iIdx, &pLvl->aSe
11570 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e  g[iSeg], &pNew->
11580 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a  aSeg[iIter++]);.
11590 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
115a0 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20  rt( iIter==nSeg 
115b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
115c0 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73  above was succes
115d0 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f  sful, each compo
115e0 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e  nent iterators n
115f0 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20  ow points .  ** 
11600 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
11610 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e  ry in its segmen
11620 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
11630 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a  initialize the .
11640 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72    ** aFirst[] ar
11650 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ray. Or, if an e
11660 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
11670 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72  d, free the iter
11680 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  ator.  ** object
11690 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74   and set the out
116a0 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
116b0 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
116c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
116d0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65   ){.    for(iIte
116e0 72 3d 6e 53 6c 6f 74 2d 31 3b 20 69 49 74 65 72  r=nSlot-1; iIter
116f0 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20  >0; iIter--){.  
11700 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20      int iEq;.   
11710 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
11720 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
11730 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72  pare(pNew, iIter
11740 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  )) ){.        ft
11750 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
11760 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71   &pNew->aSeg[iEq
11770 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ]);.        fts5
11780 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
11790 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20  d(p, pNew, iEq, 
117a0 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  iIter);.      }.
117b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
117c0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
117d0 46 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20  Free(p, pNew);. 
117e0 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20     *ppOut = 0;. 
117f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
11800 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
11810 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
11820 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  F or if an error
11830 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
11840 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  ** False otherwi
11850 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
11860 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  t fts5MultiIterE
11870 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
11880 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
11890 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
118a0 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49  urn (p->rc || pI
118b0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
118c0 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e 70 4c  ->aFirst[1] ].pL
118d0 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eaf==0);.}../*.*
118e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77  * Return the row
118f0 69 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20  id of the entry 
11900 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
11910 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
11920 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65  ts.** to. If the
11930 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73   iterator points
11940 20 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69   to EOF when thi
11950 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
11960 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75  lled the.** resu
11970 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65  lts are undefine
11980 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  d..*/.static i64
11990 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
119a0 77 69 64 28 46 74 73 35 4d 75 6c 74 69 53 65 67  wid(Fts5MultiSeg
119b0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
119c0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61  assert( pIter->a
119d0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
119e0 73 74 5b 31 5d 20 5d 2e 70 4c 65 61 66 20 29 3b  st[1] ].pLeaf );
119f0 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
11a00 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
11a10 69 72 73 74 5b 31 5d 20 5d 2e 69 52 6f 77 69 64  irst[1] ].iRowid
11a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
11a30 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
11a40 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61  the next entry a
11a50 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  t or following i
11a60 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  Match..*/.static
11a70 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
11a80 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
11a90 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
11aa0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
11ab0 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20   *pIter, .  i64 
11ac0 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c  iMatch.){.  whil
11ad0 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20  e( 1 ){.    i64 
11ae0 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35  iRowid;.    fts5
11af0 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
11b00 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63   pIter, 1, iMatc
11b10 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35  h);.    if( fts5
11b20 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
11b30 70 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a  pIter) ) break;.
11b40 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73      iRowid = fts
11b50 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
11b60 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
11b70 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26  pIter->bRev==0 &
11b80 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68  & iRowid<=iMatch
11b90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
11ba0 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30  ( pIter->bRev!=0
11bb0 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74   && iRowid>=iMat
11bc0 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ch ) break;.  }.
11bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11be0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
11bf0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
11c00 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69   the term associ
11c10 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a  ated with the .*
11c20 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  * entry that the
11c30 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
11c40 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
11c50 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
11c60 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72  8 *fts5MultiIter
11c70 54 65 72 6d 28 46 74 73 35 4d 75 6c 74 69 53 65  Term(Fts5MultiSe
11c80 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  gIter *pIter, in
11c90 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65  t *pn){.  Fts5Se
11ca0 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65  gIter *p = &pIte
11cb0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
11cc0 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20 2a  aFirst[1] ];.  *
11cd0 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a  pn = p->term.n;.
11ce0 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d    return p->term
11cf0 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  .p;.}../*.** Ret
11d00 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
11d10 63 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20 70  chunk iterator p
11d20 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
11d30 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  ond argument is.
11d40 2a 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66  ** at EOF. Or if
11d50 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
11d60 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20  ready occurred. 
11d70 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
11d80 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74  n false..*/.stat
11d90 69 63 20 69 6e 74 20 66 74 73 35 43 68 75 6e 6b  ic int fts5Chunk
11da0 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
11db0 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b 49  x *p, Fts5ChunkI
11dc0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
11dd0 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20  eturn (p->rc || 
11de0 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
11df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
11e00 63 65 20 74 68 65 20 63 68 75 6e 6b 2d 69 74 65  ce the chunk-ite
11e10 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  rator to the nex
11e20 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61 20  t chunk of data 
11e30 74 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74  to read..*/.stat
11e40 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e  ic void fts5Chun
11e50 6b 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  kIterNext(Fts5In
11e60 64 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e  dex *p, Fts5Chun
11e70 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  kIter *pIter){. 
11e80 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
11e90 6e 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20 29  nRem>=pIter->n )
11ea0 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20  ;.  pIter->nRem 
11eb0 2d 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20 20 66  -= pIter->n;.  f
11ec0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
11ed0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
11ee0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
11ef0 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 30  ;.  pIter->p = 0
11f00 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e  ;.  if( pIter->n
11f10 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46 74 73  Rem>0 ){.    Fts
11f20 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20  5Data *pLeaf;.  
11f30 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f    pIter->iLeafRo
11f40 77 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66  wid++;.    pLeaf
11f50 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20   = pIter->pLeaf 
11f60 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
11f70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f  , pIter->iLeafRo
11f80 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  wid);.    if( pL
11f90 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 49 74  eaf ){.      pIt
11fa0 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49 74 65  er->n = MIN(pIte
11fb0 72 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66 2d 3e  r->nRem, pLeaf->
11fc0 6e 2d 34 29 3b 0a 20 20 20 20 20 20 70 49 74 65  n-4);.      pIte
11fd0 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70 2b  r->p = pLeaf->p+
11fe0 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
11ff0 2f 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a 65 20  /*.** Intialize 
12000 74 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61 74  the chunk iterat
12010 6f 72 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  or to read the p
12020 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
12030 61 20 66 6f 72 20 77 68 69 63 68 20 0a 2a 2a 20  a for which .** 
12040 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 69  the size field i
12050 73 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66 66  s at offset iOff
12060 20 6f 66 20 6c 65 61 66 20 70 4c 65 61 66 2e 20   of leaf pLeaf. 
12070 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12080 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69  fts5ChunkIterIni
12090 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
120a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
120b0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
120c0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
120d0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
120e0 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eg,             
120f0 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74 65 72   /* Segment iter
12100 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73  ator to read pos
12110 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 46  list from */.  F
12120 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49  ts5ChunkIter *pI
12130 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  ter            /
12140 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
12150 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  s object */.){. 
12160 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d   int iId = pSeg-
12170 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
12180 20 69 36 34 20 72 6f 77 69 64 20 3d 20 46 54 53   i64 rowid = FTS
12190 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
121a0 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c  pSeg->iIdx, iId,
121b0 20 30 2c 20 70 53 65 67 2d 3e 69 4c 65 61 66 50   0, pSeg->iLeafP
121c0 67 6e 6f 29 3b 0a 20 20 46 74 73 35 44 61 74 61  gno);.  Fts5Data
121d0 20 2a 70 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e   *pLeaf = pSeg->
121e0 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f 66  pLeaf;.  int iOf
121f0 66 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  f = pSeg->iLeafO
12200 66 66 73 65 74 3b 0a 0a 20 20 6d 65 6d 73 65 74  ffset;..  memset
12210 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
12220 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
12230 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 20  ter->iLeafRowid 
12240 3d 20 72 6f 77 69 64 3b 0a 20 20 69 66 28 20 69  = rowid;.  if( i
12250 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a  Off<pLeaf->n ){.
12260 20 20 20 20 66 74 73 35 44 61 74 61 52 65 66 65      fts5DataRefe
12270 72 65 6e 63 65 28 70 4c 65 61 66 29 3b 0a 20 20  rence(pLeaf);.  
12280 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
12290 20 70 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b   pLeaf;.  }else{
122a0 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d  .    pIter->nRem
122b0 20 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 43 68   = 1;.    fts5Ch
122c0 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70  unkIterNext(p, p
122d0 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
122e0 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
122f0 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20     iOff = 4;.   
12300 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e   pLeaf = pIter->
12310 70 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 69 4f  pLeaf;.  }..  iO
12320 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ff += getVarint3
12330 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
12340 5d 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b  ], pIter->nRem);
12350 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d 49  .  pIter->n = MI
12360 4e 28 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f 66  N(pLeaf->n - iOf
12370 66 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b  f, pIter->nRem);
12380 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 4c  .  pIter->p = pL
12390 65 61 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a 0a  eaf->p + iOff;..
123a0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 3d 3d    if( pIter->n==
123b0 30 20 29 7b 0a 20 20 20 20 66 74 73 35 43 68 75  0 ){.    fts5Chu
123c0 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  nkIterNext(p, pI
123d0 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
123e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
123f0 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 46 74  nkIterRelease(Ft
12400 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74  s5ChunkIter *pIt
12410 65 72 29 7b 0a 20 20 66 74 73 35 44 61 74 61 52  er){.  fts5DataR
12420 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
12430 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
12440 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Leaf = 0;.}../*.
12450 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74 75  ** Read and retu
12460 72 6e 20 74 68 65 20 6e 65 78 74 20 33 32 2d 62  rn the next 32-b
12470 69 74 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 74  it varint from t
12480 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
12490 20 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70 61   iterator .** pa
124a0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
124b0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
124c0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
124d0 63 63 75 72 73 2c 20 7a 65 72 6f 20 69 73 20 72  ccurs, zero is r
124e0 65 74 75 72 6e 65 64 20 61 6e 20 61 6e 20 65 72  eturned an an er
124f0 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e  ror code left in
12500 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 2e 72   .** Fts5Index.r
12510 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  c. If an error h
12520 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
12530 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
12540 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
12550 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
12560 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
12570 74 20 66 74 73 35 50 6f 73 49 74 65 72 52 65 61  t fts5PosIterRea
12580 64 56 61 72 69 6e 74 28 46 74 73 35 49 6e 64 65  dVarint(Fts5Inde
12590 78 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74 65  x *p, Fts5PosIte
125a0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
125b0 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28   iVal = 0;.  if(
125c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
125d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  K ){.    if( pIt
125e0 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72 2d  er->iOff>=pIter-
125f0 3e 63 68 75 6e 6b 2e 6e 20 29 7b 0a 20 20 20 20  >chunk.n ){.    
12600 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e    fts5ChunkIterN
12610 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 63  ext(p, &pIter->c
12620 68 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  hunk);.      if(
12630 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f   fts5ChunkIterEo
12640 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75  f(p, &pIter->chu
12650 6e 6b 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nk) ) return 0;.
12660 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66        pIter->iOf
12670 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  f = 0;.    }.   
12680 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20   pIter->iOff += 
12690 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  getVarint32(&pIt
126a0 65 72 2d 3e 63 68 75 6e 6b 2e 70 5b 70 49 74 65  er->chunk.p[pIte
126b0 72 2d 3e 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b  r->iOff], iVal);
126c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 56  .  }.  return iV
126d0 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  al;.}../*.** Adv
126e0 61 6e 63 65 20 74 68 65 20 70 6f 73 69 74 69 6f  ance the positio
126f0 6e 20 6c 69 73 74 20 69 74 65 72 61 74 6f 72 20  n list iterator 
12700 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
12710 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
12720 64 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78  d fts5PosIterNex
12730 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
12740 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74  Fts5PosIter *pIt
12750 65 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 3b  er){.  int iVal;
12760 0a 20 20 61 73 73 65 72 74 28 20 66 74 73 35 43  .  assert( fts5C
12770 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
12780 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30  pIter->chunk)==0
12790 20 29 3b 0a 20 20 69 56 61 6c 20 3d 20 66 74 73   );.  iVal = fts
127a0 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69  5PosIterReadVari
127b0 6e 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  nt(p, pIter);.  
127c0 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65  if( fts5ChunkIte
127d0 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e  rEof(p, &pIter->
127e0 63 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  chunk)==0 ){.   
127f0 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a   if( iVal==1 ){.
12800 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 43 6f        pIter->iCo
12810 6c 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52  l = fts5PosIterR
12820 65 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74  eadVarint(p, pIt
12830 65 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  er);.      pIter
12840 2d 3e 69 50 6f 73 20 3d 20 66 74 73 35 50 6f 73  ->iPos = fts5Pos
12850 49 74 65 72 52 65 61 64 56 61 72 69 6e 74 28 70  IterReadVarint(p
12860 2c 20 70 49 74 65 72 29 20 2d 20 32 3b 0a 20 20  , pIter) - 2;.  
12870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
12880 49 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28 69  Iter->iPos += (i
12890 56 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 7d 0a  Val - 2);.    }.
128a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
128b0 74 69 61 6c 69 7a 65 20 74 68 65 20 46 74 73 35  tialize the Fts5
128c0 50 6f 73 49 74 65 72 20 6f 62 6a 65 63 74 20 70  PosIter object p
128d0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 6e  assed as the fin
128e0 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69  al argument to i
128f0 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
12900 68 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  h the position-l
12910 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ist associated w
12920 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 65 6e  ith the index en
12930 74 72 79 20 74 68 61 74 20 69 74 65 72 61 74 6f  try that iterato
12940 72 20 0a 2a 2a 20 70 4d 75 6c 74 69 20 63 75 72  r .** pMulti cur
12950 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
12960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12970 20 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69 74   fts5PosIterInit
12980 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
12990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
129a0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
129b0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
129c0 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
129d0 20 2a 70 4d 75 6c 74 69 2c 20 20 20 20 20 20 20   *pMulti,       
129e0 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 20 69 74 65  /* Multi-seg ite
129f0 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f  rator to read po
12a00 73 2d 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20  s-list from */. 
12a10 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49   Fts5PosIter *pI
12a20 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
12a30 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
12a40 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
12a50 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
12a60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
12a70 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
12a80 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67   = &pMulti->aSeg
12a90 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74  [ pMulti->aFirst
12aa0 5b 31 5d 20 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  [1] ];.    memse
12ab0 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
12ac0 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20  of(*pIter));.   
12ad0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e   fts5ChunkIterIn
12ae0 69 74 28 70 2c 20 70 53 65 67 2c 20 26 70 49 74  it(p, pSeg, &pIt
12af0 65 72 2d 3e 63 68 75 6e 6b 29 3b 0a 20 20 20 20  er->chunk);.    
12b00 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65  if( fts5ChunkIte
12b10 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e  rEof(p, &pIter->
12b20 63 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  chunk)==0 ){.   
12b30 20 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65     fts5PosIterNe
12b40 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  xt(p, pIter);.  
12b50 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12b60 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
12b70 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 65  the position ite
12b80 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
12b90 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12ba0 65 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45 4f 46  ent is.** at EOF
12bb0 2e 20 4f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  . Or if an error
12bc0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
12bd0 75 72 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urred. Otherwise
12be0 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a  , return false..
12bf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
12c00 73 35 50 6f 73 49 74 65 72 45 6f 66 28 46 74 73  s5PosIterEof(Fts
12c10 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 50  5Index *p, Fts5P
12c20 6f 73 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  osIter *pIter){.
12c30 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20    return (p->rc 
12c40 7c 7c 20 70 49 74 65 72 2d 3e 63 68 75 6e 6b 2e  || pIter->chunk.
12c50 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  pLeaf==0);.}../*
12c60 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79  .** Add an entry
12c70 20 66 6f 72 20 28 69 52 6f 77 69 64 2f 69 43 6f   for (iRowid/iCo
12c80 6c 2f 69 50 6f 73 29 20 74 6f 20 74 68 65 20 64  l/iPos) to the d
12c90 6f 63 6c 69 73 74 20 66 6f 72 20 28 70 54 6f 6b  oclist for (pTok
12ca0 65 6e 2f 6e 54 6f 6b 65 6e 29 0a 2a 2a 20 69 6e  en/nToken).** in
12cb0 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
12cc0 69 6e 64 65 78 20 69 49 64 78 2e 20 49 66 20 69  index iIdx. If i
12cd0 49 64 78 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  Idx is zero, thi
12ce0 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 74 65  s is the main te
12cf0 72 6d 73 20 0a 2a 2a 20 69 6e 64 65 78 2e 20 56  rms .** index. V
12d00 61 6c 75 65 73 20 6f 66 20 31 20 61 6e 64 20 67  alues of 1 and g
12d10 72 65 61 74 65 72 20 66 6f 72 20 69 49 64 78 20  reater for iIdx 
12d20 61 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  are prefix index
12d30 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  es..**.** If an 
12d40 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
12d50 6f 75 6e 74 65 72 65 64 2c 20 73 65 74 20 74 68  ountered, set th
12d60 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
12d70 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 61 63  rror code .** ac
12d80 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74  cordingly..*/.st
12d90 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 64  atic void fts5Ad
12da0 64 54 65 72 6d 54 6f 48 61 73 68 28 0a 20 20 46  dTermToHash(.  F
12db0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12dd0 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  * Index object t
12de0 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
12df0 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e10 2f 2a 20 45 6e 74 72 79 20 69 6e 20 70 2d 3e 61  /* Entry in p->a
12e20 48 61 73 68 5b 5d 20 74 6f 20 75 70 64 61 74 65  Hash[] to update
12e30 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
12e60 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e  token appears in
12e70 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29   (-ve -> delete)
12e80 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
12e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ea0 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
12eb0 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  n of token withi
12ec0 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  n column */.  co
12ed0 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
12ee0 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
12ef0 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
12f00 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
12f10 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  om index */.){. 
12f20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
12f30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
12f40 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
12f50 48 61 73 68 57 72 69 74 65 28 0a 20 20 20 20 20  HashWrite(.     
12f60 20 20 20 70 2d 3e 61 70 48 61 73 68 5b 69 49 64     p->apHash[iId
12f70 78 5d 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  x], p->iWriteRow
12f80 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
12f90 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20  pToken, nToken. 
12fa0 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a     );.  }.}../*.
12fb0 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d  ** Insert or rem
12fc0 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66  ove data to or f
12fd0 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45  rom the index. E
12fe0 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d  ach time a docum
12ff0 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64  ent is .** added
13000 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66   to or removed f
13010 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74  rom the index, t
13020 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13030 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  called one or mo
13040 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a  re.** times..**.
13050 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74  ** For an insert
13060 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
13070 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
13080 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e  h token in the n
13090 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20  ew document..** 
130a0 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
130b0 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74   is a delete, it
130c0 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
130d0 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20  (at least) once 
130e0 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71  for each.** uniq
130f0 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ue token in the 
13100 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  document with an
13110 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73   iCol value less
13120 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20   than zero. The 
13130 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iPos.** argument
13140 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
13150 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  a delete..*/.voi
13160 64 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  d sqlite3Fts5Ind
13170 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
13180 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
13190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
131a0 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
131b0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131d0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
131e0 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
131f0 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
13200 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13220 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
13230 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
13240 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
13250 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
13260 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
13270 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
13280 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
13290 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  m index */.){.  
132a0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
132d0 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
132e0 65 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  es */.  Fts5Conf
132f0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
13300 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 2f 2a 20  >pConfig;..  /* 
13310 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
13320 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64 20  already occured 
13330 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
13340 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70  o-op. */.  if( p
13350 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
13360 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
13370 41 6c 6c 6f 63 61 74 65 20 68 61 73 68 20 74 61  Allocate hash ta
13380 62 6c 65 73 20 69 66 20 74 68 65 79 20 68 61 76  bles if they hav
13390 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65  e not already be
133a0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  en allocated */.
133b0 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 3d    if( p->apHash=
133c0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 48  =0 ){.    int nH
133d0 61 73 68 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 6e  ash = pConfig->n
133e0 50 72 65 66 69 78 20 2b 20 31 3b 0a 20 20 20 20  Prefix + 1;.    
133f0 70 2d 3e 61 70 48 61 73 68 20 3d 20 28 46 74 73  p->apHash = (Fts
13400 35 48 61 73 68 2a 2a 29 66 74 73 35 49 64 78 4d  5Hash**)fts5IdxM
13410 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
13420 46 74 73 35 48 61 73 68 2a 29 20 2a 20 6e 48 61  Fts5Hash*) * nHa
13430 73 68 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  sh);.    for(i=0
13440 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
13450 4f 4b 20 26 26 20 69 3c 6e 48 61 73 68 3b 20 69  OK && i<nHash; i
13460 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  ++){.      p->rc
13470 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
13480 73 68 4e 65 77 28 26 70 2d 3e 61 70 48 61 73 68  shNew(&p->apHash
13490 5b 69 5d 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e  [i], &p->nPendin
134a0 67 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  gData);.    }.  
134b0 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
134c0 6e 65 77 20 74 6f 6b 65 6e 20 74 6f 20 74 68 65  new token to the
134d0 20 6d 61 69 6e 20 74 65 72 6d 73 20 68 61 73 68   main terms hash
134e0 20 74 61 62 6c 65 2e 20 41 6e 64 20 74 6f 20 65   table. And to e
134f0 61 63 68 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ach of the.  ** 
13500 70 72 65 66 69 78 20 68 61 73 68 20 74 61 62 6c  prefix hash tabl
13510 65 73 20 74 68 61 74 20 69 74 20 69 73 20 6c 61  es that it is la
13520 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 2e 20  rge enough for. 
13530 2a 2f 0a 20 20 66 74 73 35 41 64 64 54 65 72 6d  */.  fts5AddTerm
13540 54 6f 48 61 73 68 28 70 2c 20 30 2c 20 69 43 6f  ToHash(p, 0, iCo
13550 6c 2c 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c  l, iPos, pToken,
13560 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 66 6f 72 28   nToken);.  for(
13570 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e  i=0; i<pConfig->
13580 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20  nPrefix; i++){. 
13590 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 3e 3d 70     if( nToken>=p
135a0 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
135b0 69 5d 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i] ){.      fts5
135c0 41 64 64 54 65 72 6d 54 6f 48 61 73 68 28 70 2c  AddTermToHash(p,
135d0 20 69 2b 31 2c 20 69 43 6f 6c 2c 20 69 50 6f 73   i+1, iCol, iPos
135e0 2c 20 70 54 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69  , pToken, pConfi
135f0 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 29 3b 0a  g->aPrefix[i]);.
13600 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
13610 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
13620 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72  w segment-id for
13630 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
13640 53 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  Struct..**.** If
13650 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
13660 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
13670 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
13680 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a   a no-op. 0 is .
13690 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74  ** returned in t
136a0 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
136b0 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f  tic int fts5Allo
136c0 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49 6e  cateSegid(Fts5In
136d0 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75  dex *p, Fts5Stru
136e0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
136f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
13700 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
13710 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
13720 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20  for(i=0; i<100; 
13730 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  i++){.    int iS
13740 65 67 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  egid;.    sqlite
13750 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
13760 65 6f 66 28 69 6e 74 29 2c 20 28 76 6f 69 64 2a  eof(int), (void*
13770 29 26 69 53 65 67 69 64 29 3b 0a 20 20 20 20 69  )&iSegid);.    i
13780 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 20 26  Segid = iSegid &
13790 20 28 28 31 20 3c 3c 20 46 54 53 35 5f 44 41 54   ((1 << FTS5_DAT
137a0 41 5f 49 44 5f 42 29 2d 31 29 3b 0a 20 20 20 20  A_ID_B)-1);.    
137b0 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20  if( iSegid ){.  
137c0 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
137d0 65 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c  eg;.      for(iL
137e0 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
137f0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
13800 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
13810 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
13820 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
13830 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
13840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13850 20 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74   iSegid==pStruct
13860 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
13870 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
13880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13890 69 53 65 67 69 64 20 3d 20 30 3b 0a 20 20 20 20  iSegid = 0;.    
138a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
138b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
138c0 20 20 20 20 69 66 28 20 69 53 65 67 69 64 20 29      if( iSegid )
138d0 20 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a   return iSegid;.
138e0 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 53    }..  p->rc = S
138f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72  QLITE_ERROR;.  r
13900 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
13910 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61  * Discard all da
13920 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  ta currently cac
13930 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d  hed in the hash-
13940 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
13950 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
13960 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73 35  DiscardData(Fts5
13970 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  Index *p){.  ass
13980 65 72 74 28 20 70 2d 3e 61 70 48 61 73 68 20 7c  ert( p->apHash |
13990 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  | p->nPendingDat
139a0 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  a==0 );.  if( p-
139b0 3e 61 70 48 61 73 68 20 29 7b 0a 20 20 20 20 46  >apHash ){.    F
139c0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
139d0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
139e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
139f0 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e  for(i=0; i<=pCon
13a00 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b  fig->nPrefix; i+
13a10 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
13a20 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70  3Fts5HashClear(p
13a30 2d 3e 61 70 48 61 73 68 5b 69 5d 29 3b 0a 20 20  ->apHash[i]);.  
13a40 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64    }.    p->nPend
13a50 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d  ingData = 0;.  }
13a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
13a70 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
13a80 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65   prefix, in byte
13a90 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 28  s, that buffer (
13aa0 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72 65  nNew/pNew) share
13ab0 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65 72  s.** with buffer
13ac0 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f   (nOld/pOld)..*/
13ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
13ae0 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a  PrefixCompress(.
13af0 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73    int nOld, cons
13b00 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e  t u8 *pOld,.  in
13b10 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75 38  t nNew, const u8
13b20 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20   *pNew.){.  int 
13b30 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
13b40 6e 4e 65 77 20 26 26 20 69 3c 6e 4f 6c 64 3b 20  nNew && i<nOld; 
13b50 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  i++){.    if( pO
13b60 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29  ld[i]!=pNew[i] )
13b70 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
13b80 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
13b90 20 49 66 20 61 6e 20 22 6e 45 6d 70 74 79 22 20   If an "nEmpty" 
13ba0 72 65 63 6f 72 64 20 6d 75 73 74 20 62 65 20 77  record must be w
13bb0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 2d  ritten to the b-
13bc0 74 72 65 65 20 62 65 66 6f 72 65 20 74 68 65 20  tree before the 
13bd0 6e 65 78 74 0a 2a 2a 20 74 65 72 6d 2c 20 77 72  next.** term, wr
13be0 69 74 65 20 69 74 20 6e 6f 77 2e 0a 2a 2f 0a 73  ite it now..*/.s
13bf0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
13c00 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28  riteBtreeNEmpty(
13c10 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
13c20 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
13c30 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72  iter){.  if( pWr
13c40 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a  iter->nEmpty ){.
13c50 20 20 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20      int bFlag = 
13c60 30 3b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57  0;.    Fts5PageW
13c70 72 69 74 65 72 20 2a 70 50 67 3b 0a 20 20 20 20  riter *pPg;.    
13c80 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  pPg = &pWriter->
13c90 61 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 20 20  aWriter[1];.    
13ca0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  if( pWriter->nEm
13cb0 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c  pty>=FTS5_MIN_DL
13cc0 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  IDX_SIZE ){.    
13cd0 20 20 69 36 34 20 69 4b 65 79 20 3d 20 46 54 53    i64 iKey = FTS
13ce0 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f  5_DOCLIST_IDX_RO
13cf0 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
13d00 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
13d10 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 0a  riter->iSegid, .
13d20 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65            pWrite
13d30 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67  r->aWriter[0].pg
13d40 6e 6f 20 2d 20 31 20 2d 20 70 57 72 69 74 65 72  no - 1 - pWriter
13d50 2d 3e 6e 45 6d 70 74 79 0a 20 20 20 20 20 20 29  ->nEmpty.      )
13d60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13d70 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2e 6e  pWriter->dlidx.n
13d80 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  >0 );.      fts5
13d90 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4b 65  DataWrite(p, iKe
13da0 79 2c 20 70 57 72 69 74 65 72 2d 3e 64 6c 69 64  y, pWriter->dlid
13db0 78 2e 70 2c 20 70 57 72 69 74 65 72 2d 3e 64 6c  x.p, pWriter->dl
13dc0 69 64 78 2e 6e 29 3b 0a 20 20 20 20 20 20 62 46  idx.n);.      bF
13dd0 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  lag = 1;.    }. 
13de0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
13df0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
13e00 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 62 46 6c  , &pPg->buf, bFl
13e10 61 67 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ag);.    fts5Buf
13e20 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
13e30 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62 75  &p->rc, &pPg->bu
13e40 66 2c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  f, pWriter->nEmp
13e50 74 79 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72  ty);.    pWriter
13e60 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20  ->nEmpty = 0;.  
13e70 7d 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20  }..  /* Whether 
13e80 6f 72 20 6e 6f 74 20 69 74 20 77 61 73 20 77 72  or not it was wr
13e90 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2c 20 7a  itten to disk, z
13ea0 65 72 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20  ero the doclist 
13eb0 69 6e 64 65 78 20 61 74 20 74 68 69 73 0a 20 20  index at this.  
13ec0 2a 2a 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 73 71  ** point */.  sq
13ed0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
13ee0 65 72 6f 28 26 70 57 72 69 74 65 72 2d 3e 64 6c  ero(&pWriter->dl
13ef0 69 64 78 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  idx);.  pWriter-
13f00 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64  >bDlidxPrevValid
13f10 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 0;.}..static 
13f20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
13f30 72 65 65 47 72 6f 77 28 46 74 73 35 49 6e 64 65  reeGrow(Fts5Inde
13f40 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
13f50 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
13f60 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
13f70 2a 61 4e 65 77 3b 0a 20 20 46 74 73 35 50 61 67  *aNew;.  Fts5Pag
13f80 65 57 72 69 74 65 72 20 2a 70 4e 65 77 3b 0a 20  eWriter *pNew;. 
13f90 20 69 6e 74 20 6e 4e 65 77 20 3d 20 73 69 7a 65   int nNew = size
13fa0 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65  of(Fts5PageWrite
13fb0 72 29 20 2a 20 28 70 57 72 69 74 65 72 2d 3e 6e  r) * (pWriter->n
13fc0 57 72 69 74 65 72 2b 31 29 3b 0a 0a 20 20 61 4e  Writer+1);..  aN
13fd0 65 77 20 3d 20 28 46 74 73 35 50 61 67 65 57 72  ew = (Fts5PageWr
13fe0 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65  iter*)sqlite3_re
13ff0 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 61  alloc(pWriter->a
14000 57 72 69 74 65 72 2c 20 6e 4e 65 77 29 3b 0a 20  Writer, nNew);. 
14010 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
14020 65 74 75 72 6e 3b 0a 0a 20 20 70 4e 65 77 20 3d  eturn;..  pNew =
14030 20 26 61 4e 65 77 5b 70 57 72 69 74 65 72 2d 3e   &aNew[pWriter->
14040 6e 57 72 69 74 65 72 5d 3b 0a 20 20 6d 65 6d 73  nWriter];.  mems
14050 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
14060 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65  of(Fts5PageWrite
14070 72 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 67 6e  r));.  pNew->pgn
14080 6f 20 3d 20 31 3b 0a 20 20 66 74 73 35 42 75 66  o = 1;.  fts5Buf
14090 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
140a0 26 70 2d 3e 72 63 2c 20 26 70 4e 65 77 2d 3e 62  &p->rc, &pNew->b
140b0 75 66 2c 20 31 29 3b 0a 0a 20 20 70 57 72 69 74  uf, 1);..  pWrit
140c0 65 72 2d 3e 6e 57 72 69 74 65 72 2b 2b 3b 0a 20  er->nWriter++;. 
140d0 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
140e0 72 20 3d 20 61 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  r = aNew;.}../*.
140f0 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
14100 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
14110 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74  leaf page except
14120 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20   the first that 
14130 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c  contains.** at l
14140 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41  east one term. A
14150 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70  rgument (nTerm/p
14160 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c  Term) is the spl
14170 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20  it-key - a term 
14180 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65  that.** is large
14190 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73  r than all terms
141a0 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c   written to earl
141b0 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20  ier leaves, and 
141c0 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73  equal to or.** s
141d0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
141e0 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  first term on th
141f0 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a  e new leaf..**.*
14200 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
14210 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
14220 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
14230 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20  ts5Index.rc. If 
14240 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20  an error.** has 
14250 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
14260 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
14270 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
14280 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
14290 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
142a0 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
142b0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142d0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
142e0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
142f0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
14300 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
14310 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
14320 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
14330 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
14340 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65       /* First te
14350 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a  rm on new page *
14360 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65 69 67  /.){.  int iHeig
14370 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69 67 68  ht;.  for(iHeigh
14380 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68 74 2b  t=1; 1; iHeight+
14390 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65  +){.    Fts5Page
143a0 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b 0a 0a  Writer *pPage;..
143b0 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3e      if( iHeight>
143c0 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65  =pWriter->nWrite
143d0 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  r ){.      fts5W
143e0 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c  riteBtreeGrow(p,
143f0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
14400 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
14410 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
14420 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
14430 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67 68 74  >aWriter[iHeight
14440 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
14450 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c 20  eBtreeNEmpty(p, 
14460 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20 20 69  pWriter);..    i
14470 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
14480 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
14490 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  z ){.      /* pP
144a0 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69 74  age will be writ
144b0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ten to disk. The
144c0 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77 72   term will be wr
144d0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 20  itten into the. 
144e0 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6f       ** parent o
144f0 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20 20  f pPage.  */.   
14500 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
14510 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
14520 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 57  ID(.          pW
14530 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
14540 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 48  iter->iSegid, iH
14550 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70 67  eight, pPage->pg
14560 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  no.      );.    
14570 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
14580 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
14590 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
145a0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  buf.n);.      ft
145b0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
145c0 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20  age->buf);.     
145d0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
145e0 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a 20  &pPage->term);. 
145f0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
14600 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
14610 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
14620 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29   pPage[-1].pgno)
14630 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
14640 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  gno++;.    }else
14650 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65  {.      int nPre
14660 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
14670 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72  press(pPage->ter
14680 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  m.n, pPage->term
14690 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  .p, nTerm, pTerm
146a0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
146b0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
146c0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
146d0 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20 20  buf, nPre+2);.  
146e0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
146f0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
14700 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
14710 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20 20  nTerm-nPre);.   
14720 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
14730 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
14740 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
14750 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b 6e  rm-nPre, pTerm+n
14760 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  Pre);.      fts5
14770 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
14780 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
14790 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
147a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
147b0 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
147c0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
147d0 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73  reeNoTerm(.  Fts
147e0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14800 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
14810 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
14820 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
14830 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
14840 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
14850 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
14860 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
14870 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72 6f   ){.    /* No ro
14880 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67  wids on this pag
14890 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30 78 30  e. Append an 0x0
148a0 30 20 62 79 74 65 20 74 6f 20 74 68 65 20 63 75  0 byte to the cu
148b0 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64 6f  rrent .    ** do
148c0 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20  clist-index */. 
148d0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
148e0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
148f0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
14900 72 2d 3e 64 6c 69 64 78 2c 20 30 29 3b 0a 20 20  r->dlidx, 0);.  
14910 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  }.  pWriter->nEm
14920 70 74 79 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pty++;.}../*.** 
14930 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73  Rowid iRowid has
14940 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e   just been appen
14950 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
14960 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 41 73  nt leaf page. As
14970 20 69 74 20 69 73 0a 2a 2a 20 74 68 65 20 66 69   it is.** the fi
14980 72 73 74 20 6f 6e 20 69 74 73 20 70 61 67 65 2c  rst on its page,
14990 20 61 70 70 65 6e 64 20 61 6e 20 65 6e 74 72 79   append an entry
149a0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
149b0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
149c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
149d0 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
149e0 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nd(.  Fts5Index 
149f0 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
14a00 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
14a10 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a    i64 iRowid.){.
14a20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 69 66    i64 iVal;.  if
14a30 28 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64  ( pWriter->bDlid
14a40 78 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20  xPrevValid ){.  
14a50 20 20 69 56 61 6c 20 3d 20 70 57 72 69 74 65 72    iVal = pWriter
14a60 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 2d 20 69  ->iDlidxPrev - i
14a70 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rowid;.  }else{.
14a80 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69      iVal = iRowi
14a90 64 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  d;.  }.  sqlite3
14aa0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
14ab0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
14ac0 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2c 20  pWriter->dlidx, 
14ad0 69 56 61 6c 29 3b 0a 20 20 70 57 72 69 74 65 72  iVal);.  pWriter
14ae0 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69  ->bDlidxPrevVali
14af0 64 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  d = 1;.  pWriter
14b00 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 3d 20 69  ->iDlidxPrev = i
14b10 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61 74 69 63  Rowid;.}..static
14b20 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
14b30 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64  lushLeaf(Fts5Ind
14b40 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
14b50 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
14b60 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
14b70 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30  8 zero[] = { 0x0
14b80 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
14b90 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67  x00 };.  Fts5Pag
14ba0 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
14bb0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
14bc0 65 72 5b 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f  er[0];.  i64 iRo
14bd0 77 69 64 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  wid;..  if( pPag
14be0 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a  e->term.n==0 ){.
14bf0 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77      /* No term w
14c00 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  as written to th
14c10 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  is page. */.    
14c20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47  assert( 0==fts5G
14c30 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  etU16(&pPage->bu
14c40 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66  f.p[2]) );.    f
14c50 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
14c60 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
14c70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
14c80 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
14c90 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a  e to the db. */.
14ca0 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
14cb0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
14cc0 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
14cd0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c  iter->iSegid, 0,
14ce0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
14cf0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
14d00 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d  , iRowid, pPage-
14d10 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
14d20 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  uf.n);..  /* Ini
14d30 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74  tialize the next
14d40 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
14d50 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
14d60 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  e->buf);.  fts5B
14d70 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65  ufferZero(&pPage
14d80 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  ->term);.  fts5B
14d90 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
14da0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
14db0 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20  buf, 4, zero);. 
14dc0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a   pPage->pgno++;.
14dd0 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74  .  /* Increase t
14de0 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  he leaves writte
14df0 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70  n counter */.  p
14e00 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69  Writer->nLeafWri
14e10 74 74 65 6e 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tten++;.}../*.**
14e20 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
14e30 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
14e40 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
14e50 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
14e60 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
14e70 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14e80 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
14e90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
14ea0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
14eb0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
14ec0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
14ed0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
14ee0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
14ef0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
14f00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14f10 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
14f20 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
14f30 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
14f40 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
14f50 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
14f60 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
14f70 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
14fa0 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
14fb0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
14fc0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
14fd0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
14fe0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20  ->aWriter[0];.. 
14ff0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
15000 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61 67  buf.n==0 || pPag
15010 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20 20  e->buf.n>4 );.  
15020 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
15030 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65  ==0 ){.    /* Ze
15040 72 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ro the first ter
15050 6d 20 61 6e 64 20 66 69 72 73 74 20 64 6f 63 69  m and first doci
15060 64 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20 20  d fields */.    
15070 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
15080 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c  zero[] = { 0x00,
15090 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
150a0 30 20 7d 3b 0a 20 20 20 20 66 74 73 35 42 75 66  0 };.    fts5Buf
150b0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
150c0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
150d0 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 20  f, 4, zero);.   
150e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
150f0 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 7d  term.n==0 );.  }
15100 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
15110 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28 20  eturn;.  .  if( 
15120 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30  pPage->term.n==0
15130 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   ){.    /* Updat
15140 65 20 74 68 65 20 22 66 69 72 73 74 20 74 65 72  e the "first ter
15150 6d 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  m" field of the 
15160 70 61 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  page header. */.
15170 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15180 65 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26  e->buf.p[2]==0 &
15190 26 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33  & pPage->buf.p[3
151a0 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  ]==0 );.    fts5
151b0 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  PutU16(&pPage->b
151c0 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e  uf.p[2], pPage->
151d0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65  buf.n);.    nPre
151e0 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
151f0 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
15200 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a  r[0].pgno!=1 ){.
15210 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42        fts5WriteB
15220 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69  treeTerm(p, pWri
15230 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
15240 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  m);.      pPage 
15250 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
15260 74 65 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20  ter[0];.    }.  
15270 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66  }else{.    nPref
15280 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  ix = fts5PrefixC
15290 6f 6d 70 72 65 73 73 28 0a 20 20 20 20 20 20 20  ompress(.       
152a0 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20   pPage->term.n, 
152b0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e  pPage->term.p, n
152c0 54 65 72 6d 2c 20 70 54 65 72 6d 0a 20 20 20 20  Term, pTerm.    
152d0 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
152e0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
152f0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
15300 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d  f, nPrefix);.  }
15310 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
15320 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
15330 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74  s of new data, t
15340 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74  hen the term dat
15350 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f  a itself.  ** to
15360 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
15370 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
15380 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
15390 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
153a0 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  m - nPrefix);.  
153b0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
153c0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
153d0 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
153e0 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72  - nPrefix, &pTer
153f0 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20  m[nPrefix]);..  
15400 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
15410 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65 72  s5PageWriter.ter
15420 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74  m field. */.  ft
15430 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
15440 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d  rc, &pPage->term
15450 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
15460 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ..  pWriter->bFi
15470 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
15480 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   0;.  pWriter->b
15490 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
154a0 69 73 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ist = 1;..  /* I
154b0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  f the current le
154c0 61 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c  af page is full,
154d0 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
154e0 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  k. */.  if( pPag
154f0 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f  e->buf.n>=p->pCo
15500 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
15510 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
15520 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
15530 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
15540 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
15550 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
15560 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63 69  ** Append a doci
15570 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 72 73  d to the writers
15580 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61   output. .*/.sta
15590 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
155a0 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20  teAppendRowid(. 
155b0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
155c0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
155d0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20  *pWriter,.  i64 
155e0 69 52 6f 77 69 64 0a 29 7b 0a 20 20 46 74 73 35  iRowid.){.  Fts5
155f0 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
15600 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  e = &pWriter->aW
15610 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 2f 2a 20  riter[0];..  /* 
15620 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65  If this is to be
15630 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64   the first docid
15640 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
15650 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20  page, set the . 
15660 20 2a 2a 20 64 6f 63 69 64 2d 70 6f 69 6e 74 65   ** docid-pointe
15670 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65  r in the page-he
15680 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e  ader. Also appen
15690 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65  d a value to the
156a0 20 64 6c 69 64 78 0a 20 20 2a 2a 20 62 75 66 66   dlidx.  ** buff
156b0 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f  er, in case a do
156c0 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72  clist-index is r
156d0 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 69  equired.  */.  i
156e0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
156f0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b  stRowidInPage ){
15700 0a 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28  .    fts5PutU16(
15710 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50  pPage->buf.p, pP
15720 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20  age->buf.n);.   
15730 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41   fts5WriteDlidxA
15740 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72  ppend(p, pWriter
15750 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 0a  , iRowid);.  }..
15760 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64    /* Write the d
15770 6f 63 69 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ocid. */.  if( p
15780 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
15790 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20  widInDoclist || 
157a0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
157b0 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20  owidInPage ){.  
157c0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
157d0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
157e0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52   &pPage->buf, iR
157f0 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
15800 20 20 20 20 61 73 73 65 72 74 28 20 69 52 6f 77      assert( iRow
15810 69 64 3c 70 57 72 69 74 65 72 2d 3e 69 50 72 65  id<pWriter->iPre
15820 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 66 74  vRowid );.    ft
15830 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
15840 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
15850 61 67 65 2d 3e 62 75 66 2c 20 70 57 72 69 74 65  age->buf, pWrite
15860 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 2d 20  r->iPrevRowid - 
15870 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 70  iRowid);.  }.  p
15880 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
15890 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70  id = iRowid;.  p
158a0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
158b0 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30  widInDoclist = 0
158c0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
158d0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
158e0 20 30 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   0;..  if( pPage
158f0 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e  ->buf.n>=p->pCon
15900 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
15910 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
15920 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
15930 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46  .    pWriter->bF
15940 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
15950 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 1;.  }.}..stat
15960 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
15970 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e  eAppendPoslistIn
15980 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
15990 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
159a0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
159b0 69 6e 74 20 69 56 61 6c 0a 29 7b 0a 20 20 46 74  int iVal.){.  Ft
159c0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
159d0 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
159e0 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 66 74  aWriter[0];.  ft
159f0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
15a00 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
15a10 61 67 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b  age->buf, iVal);
15a20 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75  .  if( pPage->bu
15a30 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  f.n>=p->pConfig-
15a40 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66 74 73  >pgsz ){.    fts
15a50 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
15a60 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
15a70 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
15a80 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
15a90 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
15aa0 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
15ab0 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a  endPoslistData(.
15ac0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
15ad0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
15ae0 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f   *pWriter, .  co
15af0 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a  nst u8 *aData, .
15b00 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20    int nData.){. 
15b10 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
15b20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
15b30 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20  r->aWriter[0];. 
15b40 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61   const u8 *a = a
15b50 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Data;.  int n = 
15b60 6e 44 61 74 61 3b 0a 20 20 0a 20 20 77 68 69 6c  nData;.  .  whil
15b70 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
15b80 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 2d 3e 62  _OK && (pPage->b
15b90 75 66 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43  uf.n + n)>=p->pC
15ba0 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
15bb0 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d     int nReq = p-
15bc0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d  >pConfig->pgsz -
15bd0 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 20   pPage->buf.n;. 
15be0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30     int nCopy = 0
15bf0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f  ;.    while( nCo
15c00 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20  py<nReq ){.     
15c10 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20   i64 dummy;.    
15c20 20 20 6e 43 6f 70 79 20 2b 3d 20 67 65 74 56 61    nCopy += getVa
15c30 72 69 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20  rint(&a[nCopy], 
15c40 28 75 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20  (u64*)&dummy);. 
15c50 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66     }.    fts5Buf
15c60 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
15c70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
15c80 66 2c 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20  f, nCopy, a);.  
15c90 20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20    a += nCopy;.  
15ca0 20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20    n -= nCopy;.  
15cb0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
15cc0 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
15cd0 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
15ce0 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
15cf0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
15d00 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  n>0 ){.    fts5B
15d10 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
15d20 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
15d30 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a  buf, n, a);.  }.
15d40 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
15d50 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65  ts5WriteAppendZe
15d60 72 6f 62 79 74 65 28 46 74 73 35 49 6e 64 65 78  robyte(Fts5Index
15d70 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
15d80 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
15d90 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
15da0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
15db0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
15dc0 5b 30 5d 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a  [0].buf, 0);.}..
15dd0 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
15de0 64 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74  data cached by t
15df0 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74  he writer object
15e00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15e10 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c  . Free any.** al
15e20 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
15e30 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72  ated with the wr
15e40 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iter..*/.static 
15e50 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69  void fts5WriteFi
15e60 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  nish(.  Fts5Inde
15e70 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
15e80 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
15e90 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
15ea0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
15eb0 6e 74 20 2a 70 6e 48 65 69 67 68 74 2c 20 20 20  nt *pnHeight,   
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ed0 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 6f 66  * OUT: Height of
15ee0 20 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 20   the b-tree */. 
15ef0 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20   int *pnLeaf    
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
15f20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e  of leaf pages in
15f30 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20   b-tree */.){.  
15f40 69 6e 74 20 69 3b 0a 20 20 2a 70 6e 4c 65 61 66  int i;.  *pnLeaf
15f50 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69   = pWriter->aWri
15f60 74 65 72 5b 30 5d 2e 70 67 6e 6f 3b 0a 20 20 69  ter[0].pgno;.  i
15f70 66 28 20 2a 70 6e 4c 65 61 66 3d 3d 31 20 26 26  f( *pnLeaf==1 &&
15f80 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
15f90 72 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b  r[0].buf.n==0 ){
15fa0 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 30  .    *pnLeaf = 0
15fb0 3b 0a 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20  ;.    *pnHeight 
15fc0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
15fd0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
15fe0 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
15ff0 3b 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  ;.    if( pWrite
16000 72 2d 3e 6e 57 72 69 74 65 72 3d 3d 31 20 26 26  r->nWriter==1 &&
16010 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
16020 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58  >=FTS5_MIN_DLIDX
16030 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 66  _SIZE ){.      f
16040 74 73 35 57 72 69 74 65 42 74 72 65 65 47 72 6f  ts5WriteBtreeGro
16050 77 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  w(p, pWriter);. 
16060 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 57 72     }.    if( pWr
16070 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3e 31 20  iter->nWriter>1 
16080 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
16090 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c  teBtreeNEmpty(p,
160a0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d   pWriter);.    }
160b0 0a 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d  .    *pnHeight =
160c0 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65   pWriter->nWrite
160d0 72 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  r;..    for(i=1;
160e0 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72 69   i<pWriter->nWri
160f0 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ter; i++){.     
16100 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
16110 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d  *pPg = &pWriter-
16120 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20  >aWriter[i];.   
16130 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
16140 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
16150 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
16160 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c  D(pWriter->iIdx,
16170 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
16180 2c 20 69 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 2c  , i, pPg->pgno),
16190 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d   .          pPg-
161a0 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66  >buf.p, pPg->buf
161b0 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .n.      );.    
161c0 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
161d0 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72 69   i<pWriter->nWri
161e0 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  ter; i++){.    F
161f0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
16200 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  Pg = &pWriter->a
16210 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 66  Writer[i];.    f
16220 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
16230 50 67 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 66  Pg->term);.    f
16240 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
16250 50 67 2d 3e 62 75 66 29 3b 0a 20 20 7d 0a 20 20  Pg->buf);.  }.  
16260 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
16270 69 74 65 72 2d 3e 61 57 72 69 74 65 72 29 3b 0a  iter->aWriter);.
16280 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
16290 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72  ferFree(&pWriter
162a0 2d 3e 64 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61  ->dlidx);.}..sta
162b0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
162c0 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  teInit(.  Fts5In
162d0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
162e0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
162f0 72 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20  r, .  int iIdx, 
16300 69 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20  int iSegid.){.  
16310 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
16320 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
16330 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72  gWriter));.  pWr
16340 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64  iter->iIdx = iId
16350 78 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53  x;.  pWriter->iS
16360 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a  egid = iSegid;..
16370 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74    pWriter->aWrit
16380 65 72 20 3d 20 28 46 74 73 35 50 61 67 65 57 72  er = (Fts5PageWr
16390 69 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c  iter*)fts5IdxMal
163a0 6c 6f 63 28 70 2c 73 69 7a 65 6f 66 28 46 74 73  loc(p,sizeof(Fts
163b0 35 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20  5PageWriter));. 
163c0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 61 57   if( pWriter->aW
163d0 72 69 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  riter==0 ) retur
163e0 6e 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57  n;.  pWriter->nW
163f0 72 69 74 65 72 20 3d 20 31 3b 0a 20 20 70 57 72  riter = 1;.  pWr
16400 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
16410 2e 70 67 6e 6f 20 3d 20 31 3b 0a 7d 0a 0a 73 74  .pgno = 1;.}..st
16420 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
16430 69 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64  iteInitForAppend
16440 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16460 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
16470 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
16480 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
16490 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
164a0 2f 2a 20 57 72 69 74 65 72 20 74 6f 20 69 6e 69  /* Writer to ini
164b0 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  tialize */.  int
164c0 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20   iIdx,          
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
164e0 49 6e 64 65 78 20 73 65 67 6d 65 6e 74 20 69 73  Index segment is
164f0 20 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20   a part of */.  
16500 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
16510 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20  ment *pSeg      
16520 2f 2a 20 53 65 67 6d 65 6e 74 20 6f 62 6a 65 63  /* Segment objec
16530 74 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a  t to append to *
16540 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  /.){.  int nByte
16550 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74   = pSeg->nHeight
16560 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61   * sizeof(Fts5Pa
16570 67 65 57 72 69 74 65 72 29 3b 0a 20 20 6d 65 6d  geWriter);.  mem
16580 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20  set(pWriter, 0, 
16590 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72  sizeof(Fts5SegWr
165a0 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65  iter));.  pWrite
165b0 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
165c0 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69    pWriter->iSegi
165d0 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64  d = pSeg->iSegid
165e0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72  ;.  pWriter->aWr
165f0 69 74 65 72 20 3d 20 28 46 74 73 35 50 61 67 65  iter = (Fts5Page
16600 57 72 69 74 65 72 2a 29 66 74 73 35 49 64 78 4d  Writer*)fts5IdxM
16610 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b  alloc(p, nByte);
16620 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69  .  pWriter->nWri
16630 74 65 72 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69  ter = pSeg->nHei
16640 67 68 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  ght;..  if( p->r
16650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16660 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 31      int pgno = 1
16670 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
16680 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
16690 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 53 65 67  r[0].pgno = pSeg
166a0 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20  ->pgnoLast+1;.  
166b0 20 20 66 6f 72 28 69 3d 70 53 65 67 2d 3e 6e 48    for(i=pSeg->nH
166c0 65 69 67 68 74 2d 31 3b 20 69 3e 30 3b 20 69 2d  eight-1; i>0; i-
166d0 2d 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52  -){.      i64 iR
166e0 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
166f0 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65  ENT_ROWID(pWrite
16700 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72  r->iIdx, pWriter
16710 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 67 6e  ->iSegid, i, pgn
16720 6f 29 3b 0a 20 20 20 20 20 20 46 74 73 35 50 61  o);.      Fts5Pa
16730 67 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20  geWriter *pPg = 
16740 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
16750 72 5b 69 5d 3b 0a 20 20 20 20 20 20 70 50 67 2d  r[i];.      pPg-
16760 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
16770 20 20 20 20 66 74 73 35 44 61 74 61 42 75 66 66      fts5DataBuff
16780 65 72 28 70 2c 20 26 70 50 67 2d 3e 62 75 66 2c  er(p, &pPg->buf,
16790 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
167a0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
167b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
167c0 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b  Fts5NodeIter ss;
167d0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64  .        fts5Nod
167e0 65 49 74 65 72 49 6e 69 74 28 70 50 67 2d 3e 62  eIterInit(pPg->b
167f0 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e  uf.p, pPg->buf.n
16800 2c 20 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20  , &ss);.        
16810 77 68 69 6c 65 28 20 73 73 2e 61 44 61 74 61 20  while( ss.aData 
16820 29 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65  ) fts5NodeIterNe
16830 78 74 28 26 70 2d 3e 72 63 2c 20 26 73 73 29 3b  xt(&p->rc, &ss);
16840 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
16850 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
16860 70 50 67 2d 3e 74 65 72 6d 2c 20 73 73 2e 74 65  pPg->term, ss.te
16870 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 29  rm.n, ss.term.p)
16880 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d  ;.        pgno =
16890 20 73 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20   ss.iChild;.    
168a0 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
168b0 46 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 20  Free(&ss);.     
168c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
168d0 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3d 3d   pSeg->nHeight==
168e0 31 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74  1 ){.      pWrit
168f0 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 53 65  er->nEmpty = pSe
16900 67 2d 3e 70 67 6e 6f 4c 61 73 74 2d 31 3b 0a 20  g->pgnoLast-1;. 
16910 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
16920 20 28 70 67 6e 6f 2b 70 57 72 69 74 65 72 2d 3e   (pgno+pWriter->
16930 6e 45 6d 70 74 79 29 3d 3d 70 53 65 67 2d 3e 70  nEmpty)==pSeg->p
16940 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 7d 0a 7d  gnoLast );.  }.}
16950 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
16960 20 70 49 74 65 72 20 77 61 73 20 75 73 65 64 20   pIter was used 
16970 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
16980 67 68 20 74 68 65 20 69 6e 70 75 74 20 73 65 67  gh the input seg
16990 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a  ments of on an.*
169a0 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * incremental me
169b0 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  rge operation. T
169c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
169d0 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e  called if the in
169e0 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72  cremental.** mer
169f0 67 65 20 73 74 65 70 20 68 61 73 20 66 69 6e 69  ge step has fini
16a00 73 68 65 64 20 62 75 74 20 74 68 65 20 69 6e 70  shed but the inp
16a10 75 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ut has not been 
16a20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75  completely exhau
16a30 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
16a40 76 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65 67  void fts5TrimSeg
16a50 6d 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20  ments(Fts5Index 
16a60 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
16a70 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
16a80 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42 75 66  int i;.  Fts5Buf
16a90 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65  fer buf;.  memse
16aa0 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
16ab0 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
16ac0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
16ad0 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  er->nSeg; i++){.
16ae0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
16af0 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
16b00 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28  aSeg[i];.    if(
16b10 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29   pSeg->pSeg==0 )
16b20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  {.      /* no-op
16b30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
16b40 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
16b50 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   ){.      pSeg->
16b60 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
16b70 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   0;.      pSeg->
16b80 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
16b90 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
16ba0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
16bb0 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
16bc0 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f  Offset;     /* O
16bd0 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72  ffset on new fir
16be0 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  st leaf page */.
16bf0 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52        i64 iLeafR
16c00 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35  owid;.      Fts5
16c10 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
16c20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65     int iId = pSe
16c30 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  g->pSeg->iSegid;
16c40 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34  .      u8 aHdr[4
16c50 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c  ] = {0x00, 0x00,
16c60 20 30 78 30 30 2c 20 30 78 30 34 7d 3b 0a 0a 20   0x00, 0x04};.. 
16c70 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20       iLeafRowid 
16c80 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
16c90 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c  OWID(pSeg->iIdx,
16ca0 20 69 49 64 2c 20 30 2c 20 70 53 65 67 2d 3e 69   iId, 0, pSeg->i
16cb0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  TermLeafPgno);. 
16cc0 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73       pData = fts
16cd0 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c 65  5DataRead(p, iLe
16ce0 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  afRowid);.      
16cf0 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
16d00 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
16d10 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20  ero(&buf);.     
16d20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
16d30 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
16d40 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48 64  &buf, sizeof(aHd
16d50 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20 20  r), aHdr);.     
16d60 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
16d70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
16d80 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
16d90 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66  rm.n);.        f
16da0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
16db0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
16dc0 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20  , pSeg->term.n, 
16dd0 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20  pSeg->term.p);. 
16de0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
16df0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
16e00 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
16e10 3e 6e 20 2d 20 69 4f 66 66 2c 20 26 70 44 61 74  >n - iOff, &pDat
16e20 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  a->p[iOff]);.   
16e30 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
16e40 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
16e50 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
16e60 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 70 53 65  >pgnoFirst = pSe
16e70 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
16e80 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
16e90 74 61 44 65 6c 65 74 65 28 70 2c 20 46 54 53 35  taDelete(p, FTS5
16ea0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
16eb0 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20  Seg->iIdx, iId, 
16ec0 30 2c 20 31 29 2c 69 4c 65 61 66 52 6f 77 69 64  0, 1),iLeafRowid
16ed0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
16ee0 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61  ataWrite(p, iLea
16ef0 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62  fRowid, buf.p, b
16f00 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uf.n);.      }. 
16f10 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42     }.  }.  fts5B
16f20 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
16f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61  .}../*.**.*/.sta
16f40 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
16f50 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20  exMergeLevel(.  
16f60 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
16f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f80 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
16f90 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
16fa0 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16fc0 6e 64 65 78 20 74 6f 20 77 6f 72 6b 20 6f 6e 20  ndex to work on 
16fd0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
16fe0 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
16ff0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
17000 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  Stucture of inde
17010 78 20 69 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  x iIdx */.  int 
17020 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iLvl,           
17030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
17040 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70  evel to read inp
17050 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ut from */.  int
17060 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20   *pnRem         
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17080 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69 73  Write up to this
17090 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61   many output lea
170a0 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ves */.){.  Fts5
170b0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
170c0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
170d0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
170e0 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
170f0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
17100 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63  vl];.  Fts5Struc
17110 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f  tureLevel *pLvlO
17120 75 74 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53  ut;.  Fts5MultiS
17130 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  egIter *pIter = 
17140 30 3b 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f  0;    /* Iterato
17150 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  r to read input 
17160 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  data */.  int nR
17170 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e  em = pnRem ? *pn
17180 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74  Rem : 0;  /* Out
17190 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c  put leaf pages l
171a0 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
171b0 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20    int nInput;   
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
171e0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
171f0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
17200 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20   writer;        
17210 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
17220 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
17230 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
17240 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70  Seg;     /* Outp
17250 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
17260 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
17270 0a 20 20 69 6e 74 20 62 52 65 71 75 69 72 65 44  .  int bRequireD
17280 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 30 3b 20  oclistTerm = 0; 
17290 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 65     /* Doclist te
172a0 72 6d 69 6e 61 74 6f 72 20 28 30 78 30 30 29 20  rminator (0x00) 
172b0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
172c0 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20 20  t bOldest;      
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
172e0 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   True if the out
172f0 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20 74  put segment is t
17300 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 0a 20 20  he oldest */..  
17310 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53 74  assert( iLvl<pSt
17320 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a  ruct->nLevel );.
17330 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
17340 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53  nMerge<=pLvl->nS
17350 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  eg );..  memset(
17360 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  &writer, 0, size
17370 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
17380 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 65  ));.  memset(&te
17390 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  rm, 0, sizeof(Ft
173a0 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 77 72  s5Buffer));.  wr
173b0 69 74 65 72 2e 69 49 64 78 20 3d 20 69 49 64 78  iter.iIdx = iIdx
173c0 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d  ;.  if( pLvl->nM
173d0 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c  erge ){.    pLvl
173e0 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Out = &pStruct->
173f0 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a  aLevel[iLvl+1];.
17400 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
17410 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20  Out->nSeg>0 );. 
17420 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
17430 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 66 74  ->nMerge;.    ft
17440 73 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70  s5WriteInitForAp
17450 70 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c  pend(p, &writer,
17460 20 69 49 64 78 2c 20 26 70 4c 76 6c 4f 75 74 2d   iIdx, &pLvlOut-
17470 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
17480 53 65 67 2d 31 5d 29 3b 0a 20 20 20 20 70 53 65  Seg-1]);.    pSe
17490 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
174a0 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
174b0 2d 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1];.  }else{.  
174c0 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66    int iSegid = f
174d0 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
174e0 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20  (p, pStruct);.. 
174f0 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65     /* Extend the
17500 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
17510 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72 65  bject as require
17520 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  d to ensure the 
17530 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65  output.    ** se
17540 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f  gment exists. */
17550 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70  .    if( iLvl==p
17560 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31  Struct->nLevel-1
17570 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
17580 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28  ructureAddLevel(
17590 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74  &p->rc, ppStruct
175a0 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
175b0 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
175c0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
175d0 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
175e0 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
175f0 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b  , iLvl+1, 1, 0);
17600 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74  .    pLvl = &pSt
17610 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
17620 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20  l];.    pLvlOut 
17630 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
17640 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20  el[iLvl+1];..   
17650 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
17660 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c  , &writer, iIdx,
17670 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f   iSegid);..    /
17680 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65  * Add the new se
17690 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  gment to the out
176a0 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
176b0 20 69 66 28 20 69 4c 76 6c 2b 31 3d 3d 70 53 74   if( iLvl+1==pSt
176c0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 20 70  ruct->nLevel ) p
176d0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b  Struct->nLevel++
176e0 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c  ;.    pSeg = &pL
176f0 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
17700 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20  Out->nSeg];.    
17710 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b  pLvlOut->nSeg++;
17720 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46  .    pSeg->pgnoF
17730 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53  irst = 1;.    pS
17740 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  eg->iSegid = iSe
17750 67 69 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  gid;..    /* Rea
17760 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c  d input from all
17770 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
17780 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
17790 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
177a0 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62  l->nSeg;.  }.  b
177b0 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75  Oldest = (pLvlOu
177c0 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53  t->nSeg==1 && pS
177d0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69  truct->nLevel==i
177e0 4c 76 6c 2b 32 29 3b 0a 0a 23 69 66 20 30 0a 66  Lvl+2);..#if 0.f
177f0 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
17800 6d 65 72 67 69 6e 67 20 25 64 20 73 65 67 6d 65  merging %d segme
17810 6e 74 73 20 66 72 6f 6d 20 6c 65 76 65 6c 20 25  nts from level %
17820 64 21 22 2c 20 6e 49 6e 70 75 74 2c 20 69 4c 76  d!", nInput, iLv
17830 6c 29 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f 75  l);.fflush(stdou
17840 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f  t);.#endif..  fo
17850 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
17860 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 69  ew(p, pStruct, i
17870 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c  Idx, 0, 0, 0, iL
17880 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74  vl, nInput, &pIt
17890 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  er);.      fts5M
178a0 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
178b0 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  Iter)==0;.      
178c0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
178d0 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
178e0 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53  ).  ){.    Fts5S
178f0 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
17900 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
17910 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b  er->aFirst[1] ];
17920 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49 74  .    Fts5ChunkIt
17930 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20 20  er sPos;        
17940 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
17950 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 6f  erate through po
17960 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a  sition list */..
17970 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
17980 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
17990 74 65 6e 20 69 73 20 74 68 65 20 6f 6c 64 65 73  ten is the oldes
179a0 74 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  t in the entire 
179b0 69 6e 64 65 78 20 61 6e 64 0a 20 20 20 20 2a 2a  index and.    **
179c0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
179d0 73 74 20 69 73 20 65 6d 70 74 79 20 28 69 2e 65  st is empty (i.e
179e0 2e 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 61  . the entry is a
179f0 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 29 2c   delete marker),
17a00 20 6e 6f 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79   no.    ** entry
17a10 20 6e 65 65 64 20 62 65 20 77 72 69 74 74 65 6e   need be written
17a20 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20   to the output. 
17a30 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e   */.    fts5Chun
17a40 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  kIterInit(p, pSe
17a50 67 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20 20 69  g, &sPos);.    i
17a60 66 28 20 62 4f 6c 64 65 73 74 3d 3d 30 20 7c 7c  f( bOldest==0 ||
17a70 20 73 50 6f 73 2e 6e 52 65 6d 3e 30 20 29 7b 0a   sPos.nRem>0 ){.
17a80 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
17a90 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
17aa0 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c  *pTerm = fts5Mul
17ab0 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
17ac0 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  , &nTerm);.     
17ad0 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d   if( nTerm!=term
17ae0 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65  .n || memcmp(pTe
17af0 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72  rm, term.p, nTer
17b00 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m) ){.        if
17b10 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65  ( pnRem && write
17b20 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e  r.nLeafWritten>n
17b30 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rem ){.         
17b40 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65   fts5ChunkIterRe
17b50 6c 65 61 73 65 28 26 73 50 6f 73 29 3b 0a 20 20  lease(&sPos);.  
17b60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
17b70 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
17b80 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
17b90 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20  ew term. Append 
17ba0 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75  a term to the ou
17bb0 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f  tput segment. */
17bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65  .        if( bRe
17bd0 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d  quireDoclistTerm
17be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
17bf0 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72  s5WriteAppendZer
17c00 6f 62 79 74 65 28 70 2c 20 26 77 72 69 74 65 72  obyte(p, &writer
17c10 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17c20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
17c30 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
17c40 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
17c50 6d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  m);.        fts5
17c60 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
17c70 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , &term, nTerm, 
17c80 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
17c90 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54  bRequireDoclistT
17ca0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  erm = 1;.      }
17cb0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  ..      /* Appen
17cc0 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74  d the rowid to t
17cd0 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
17ce0 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
17cf0 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74  ndRowid(p, &writ
17d00 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  er, fts5MultiIte
17d10 72 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b 0a  rRowid(pIter));.
17d20 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  .      /* Copy t
17d30 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
17d40 20 66 72 6f 6d 20 69 6e 70 75 74 20 74 6f 20 6f   from input to o
17d50 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 66  utput */.      f
17d60 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
17d70 73 6c 69 73 74 49 6e 74 28 70 2c 20 26 77 72 69  slistInt(p, &wri
17d80 74 65 72 2c 20 73 50 6f 73 2e 6e 52 65 6d 29 3b  ter, sPos.nRem);
17d90 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f  .      for(/* no
17da0 6f 70 20 2a 2f 3b 20 21 66 74 73 35 43 68 75 6e  op */; !fts5Chun
17db0 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f  kIterEof(p, &sPo
17dc0 73 29 3b 20 66 74 73 35 43 68 75 6e 6b 49 74 65  s); fts5ChunkIte
17dd0 72 4e 65 78 74 28 70 2c 20 26 73 50 6f 73 29 29  rNext(p, &sPos))
17de0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72  {.        fts5Wr
17df0 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
17e00 44 61 74 61 28 70 2c 20 26 77 72 69 74 65 72 2c  Data(p, &writer,
17e10 20 73 50 6f 73 2e 70 2c 20 73 50 6f 73 2e 6e 29   sPos.p, sPos.n)
17e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17e30 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74  .    fts5ChunkIt
17e40 65 72 52 65 6c 65 61 73 65 28 26 73 50 6f 73 29  erRelease(&sPos)
17e50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  ;.  }..  /* Flus
17e60 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20  h the last leaf 
17e70 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65  page to disk. Se
17e80 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  t the output seg
17e90 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67  ment b-tree heig
17ea0 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74  ht.  ** and last
17eb0 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
17ec0 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
17ed0 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72  me.  */.  fts5Wr
17ee0 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
17ef0 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65  iter, &pSeg->nHe
17f00 69 67 68 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e  ight, &pSeg->pgn
17f10 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66  oLast);..  if( f
17f20 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
17f30 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
17f40 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
17f50 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
17f60 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
17f70 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
17f80 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ble */.    for(i
17f90 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b  =0; i<nInput; i+
17fa0 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
17fb0 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
17fc0 70 2c 20 69 49 64 78 2c 20 70 4c 76 6c 2d 3e 61  p, iIdx, pLvl->a
17fd0 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a  Seg[i].iSegid);.
17fe0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
17ff0 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
18000 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nt segments from
18010 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
18020 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c   */.    if( pLvl
18030 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29  ->nSeg!=nInput )
18040 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76  {.      int nMov
18050 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20  e = (pLvl->nSeg 
18060 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65  - nInput) * size
18070 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
18080 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Segment);.      
18090 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53  memmove(pLvl->aS
180a0 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  eg, &pLvl->aSeg[
180b0 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b  nInput], nMove);
180c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d  .    }.    pLvl-
180d0 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b  >nSeg -= nInput;
180e0 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  .    pLvl->nMerg
180f0 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
18100 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30  Seg->pgnoLast==0
18110 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75   ){.      pLvlOu
18120 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 7d  t->nSeg--;.    }
18130 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
18140 73 65 72 74 28 20 70 53 65 67 2d 3e 6e 48 65 69  sert( pSeg->nHei
18150 67 68 74 3e 30 20 26 26 20 70 53 65 67 2d 3e 70  ght>0 && pSeg->p
18160 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20  gnoLast>0 );.   
18170 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
18180 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
18190 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
181a0 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66  nInput;.  }..  f
181b0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
181c0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74  (p, pIter);.  ft
181d0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
181e0 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
181f0 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
18200 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
18210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74  ;.}../*.** A tot
18220 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66  al of nLeaf leaf
18230 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20 68   pages of data h
18240 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75  as just been flu
18250 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d  shed to a level-
18260 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69 6e  0.** segments in
18270 20 69 6e 64 65 78 20 69 49 64 78 20 77 69 74 68   index iIdx with
18280 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
18290 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ct. This functio
182a0 6e 20 75 70 64 61 74 65 73 20 74 68 65 0a 2a 2a  n updates the.**
182b0 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61   write-counter a
182c0 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20  ccordingly and, 
182d0 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65  if necessary, pe
182e0 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74  rforms increment
182f0 61 6c 20 6d 65 72 67 65 0a 2a 2a 20 77 6f 72 6b  al merge.** work
18300 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
18310 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
18320 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
18330 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
18340 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
18350 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
18360 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
18370 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
18380 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
18390 49 6e 64 65 78 57 6f 72 6b 28 0a 20 20 46 74 73  IndexWork(.  Fts
183a0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
183c0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
183d0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ect */.  int iId
183e0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
183f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18400 78 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a  x to work on */.
18410 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
18420 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
18430 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
18440 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
18450 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
18460 20 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   nLeaf          
18470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18480 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
18490 20 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69   leaves just wri
184a0 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  tten */.){.  Fts
184b0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
184c0 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
184d0 0a 20 20 69 36 34 20 6e 57 72 69 74 65 3b 20 20  .  i64 nWrite;  
184e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184f0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
18500 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75  lue of write-cou
18510 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 57  nter */.  int nW
18520 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ork;            
18530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
18540 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e  ber of work-quan
18550 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f  ta to perform */
18560 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20  .  int nRem;    
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18580 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18590 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20  leaf pages left 
185a0 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 2f  to write */..  /
185b0 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69  * Update the wri
185c0 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c  te-counter. Whil
185d0 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20  e doing so, set 
185e0 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 6e 57 72 69  nWork. */.  nWri
185f0 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  te = pStruct->nW
18600 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 6e  riteCounter;.  n
18610 57 6f 72 6b 20 3d 20 28 28 6e 57 72 69 74 65 20  Work = ((nWrite 
18620 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57  + nLeaf) / p->nW
18630 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69  orkUnit) - (nWri
18640 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  te / p->nWorkUni
18650 74 29 3b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e  t);.  pStruct->n
18660 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20  WriteCounter += 
18670 6e 4c 65 61 66 3b 0a 20 20 6e 52 65 6d 20 3d 20  nLeaf;.  nRem = 
18680 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e  p->nWorkUnit * n
18690 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e  Work * pStruct->
186a0 6e 4c 65 76 65 6c 3b 0a 0a 20 20 77 68 69 6c 65  nLevel;..  while
186b0 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
186c0 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
186d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
186e0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
186f0 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20  h levels */.    
18700 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30  int iBestLvl = 0
18710 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
18720 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68  evel offering th
18730 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67  e most input seg
18740 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
18750 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20   nBest = 0;     
18760 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18770 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
18780 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76  ents on best lev
18790 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  el */..    /* Se
187a0 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68  t iBestLvl to th
187b0 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  e level to read 
187c0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66  input segments f
187d0 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  rom. */.    asse
187e0 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  rt( pStruct->nLe
187f0 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72  vel>0 );.    for
18800 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
18810 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
18820 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
18830 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
18840 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
18850 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
18860 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
18870 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  >nMerge ){.     
18880 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
18890 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  rge>nBest ){.   
188a0 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20         iBestLvl 
188b0 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20  = iLvl;.        
188c0 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e    nBest = pLvl->
188d0 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20  nMerge;.        
188e0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
188f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18900 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42  f( pLvl->nSeg>nB
18910 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  est ){.        n
18920 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  Best = pLvl->nSe
18930 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74  g;.        iBest
18940 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
18950 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
18960 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74  * If nBest is st
18970 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20  ill 0, then the 
18980 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d  index must be em
18990 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  pty. */.#ifdef S
189a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
189b0 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73  for(iLvl=0; nBes
189c0 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74  t==0 && iLvl<pSt
189d0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
189e0 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  vl++){.      ass
189f0 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c  ert( pStruct->aL
18a00 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d  evel[iLvl].nSeg=
18a10 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  =0 );.    }.#end
18a20 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73  if..    if( nBes
18a30 74 3c 70 2d 3e 6e 4d 69 6e 4d 65 72 67 65 20 26  t<p->nMinMerge &
18a40 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
18a50 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72  l[iBestLvl].nMer
18a60 67 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ge==0 ) break;. 
18a70 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
18a80 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78 2c 20  eLevel(p, iIdx, 
18a90 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c  &pStruct, iBestL
18aa0 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
18ab0 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
18ac0 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c 76 6c  mote(p, iBestLvl
18ad0 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  +1, pStruct);.  
18ae0 20 20 61 73 73 65 72 74 28 20 6e 52 65 6d 3d 3d    assert( nRem==
18af0 30 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  0 || p->rc==SQLI
18b00 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 2a 70 70  TE_OK );.    *pp
18b10 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
18b20 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
18b30 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 43 72  void fts5IndexCr
18b40 69 73 69 73 4d 65 72 67 65 28 0a 20 20 46 74 73  isisMerge(.  Fts
18b50 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18b70 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
18b80 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ect */.  int iId
18b90 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
18ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
18bb0 78 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a  x to work on */.
18bc0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
18bd0 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20 20  **ppStruct      
18be0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
18bf0 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
18c00 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  f index */.){.  
18c10 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
18c20 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
18c30 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d  ct;.  int iLvl =
18c40 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   0;.  while( p->
18c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
18c60 20 20 20 20 20 26 26 20 69 4c 76 6c 3c 70 53 74       && iLvl<pSt
18c70 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 0a 20 20 20  ruct->nLevel.   
18c80 20 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61     && pStruct->a
18c90 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
18ca0 3e 3d 70 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67  >=p->nCrisisMerg
18cb0 65 20 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35  e .  ){.    fts5
18cc0 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
18cd0 70 2c 20 69 49 64 78 2c 20 26 70 53 74 72 75 63  p, iIdx, &pStruc
18ce0 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20  t, iLvl, 0);.   
18cf0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
18d00 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c  omote(p, iLvl+1,
18d10 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69   pStruct);.    i
18d20 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Lvl++;.  }.  *pp
18d30 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
18d40 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
18d50 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
18d60 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73   Fts5FlushCtx;.s
18d70 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
18d80 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  tx {.  Fts5Index
18d90 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65   *pIdx;.  Fts5Se
18da0 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
18db0 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .};..static int 
18dc0 66 74 73 35 46 6c 75 73 68 4e 65 77 54 65 72 6d  fts5FlushNewTerm
18dd0 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e  (void *pCtx, con
18de0 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20  st char *zTerm, 
18df0 69 6e 74 20 6e 54 65 72 6d 29 7b 0a 20 20 46 74  int nTerm){.  Ft
18e00 73 35 46 6c 75 73 68 43 74 78 20 2a 70 20 3d 20  s5FlushCtx *p = 
18e10 28 46 74 73 35 46 6c 75 73 68 43 74 78 2a 29 70  (Fts5FlushCtx*)p
18e20 43 74 78 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Ctx;.  int rc = 
18e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 74 73  SQLITE_OK;.  fts
18e40 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
18e50 28 70 2d 3e 70 49 64 78 2c 20 26 70 2d 3e 77 72  (p->pIdx, &p->wr
18e60 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 28 63 6f  iter, nTerm, (co
18e70 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a  nst u8*)zTerm);.
18e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18e90 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 46  static int fts5F
18ea0 6c 75 73 68 54 65 72 6d 44 6f 6e 65 28 76 6f 69  lushTermDone(voi
18eb0 64 20 2a 70 43 74 78 29 7b 0a 20 20 46 74 73 35  d *pCtx){.  Fts5
18ec0 46 6c 75 73 68 43 74 78 20 2a 70 20 3d 20 28 46  FlushCtx *p = (F
18ed0 74 73 35 46 6c 75 73 68 43 74 78 2a 29 70 43 74  ts5FlushCtx*)pCt
18ee0 78 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  x;.  int rc = SQ
18ef0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 2f 2a 20 57 72  LITE_OK;.  /* Wr
18f00 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74 20  ite the doclist 
18f10 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20  terminator */.  
18f20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a  fts5WriteAppendZ
18f30 65 72 6f 62 79 74 65 28 70 2d 3e 70 49 64 78 2c  erobyte(p->pIdx,
18f40 20 26 70 2d 3e 77 72 69 74 65 72 29 3b 0a 20 20   &p->writer);.  
18f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
18f60 61 74 69 63 20 69 6e 74 20 66 74 73 35 46 6c 75  atic int fts5Flu
18f70 73 68 4e 65 77 45 6e 74 72 79 28 0a 20 20 76 6f  shNewEntry(.  vo
18f80 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 36 34  id *pCtx, .  i64
18f90 20 69 52 6f 77 69 64 2c 20 0a 20 20 63 6f 6e 73   iRowid, .  cons
18fa0 74 20 75 38 20 2a 61 50 6f 73 6c 69 73 74 2c 20  t u8 *aPoslist, 
18fb0 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 0a  .  int nPoslist.
18fc0 29 7b 0a 20 20 46 74 73 35 46 6c 75 73 68 43 74  ){.  Fts5FlushCt
18fd0 78 20 2a 70 20 3d 20 28 46 74 73 35 46 6c 75 73  x *p = (Fts5Flus
18fe0 68 43 74 78 2a 29 70 43 74 78 3b 0a 20 20 69 6e  hCtx*)pCtx;.  in
18ff0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19000 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  ;..  /* Append t
19010 68 65 20 72 6f 77 69 64 20 69 74 73 65 6c 66 20  he rowid itself 
19020 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 41 70  */.  fts5WriteAp
19030 70 65 6e 64 52 6f 77 69 64 28 70 2d 3e 70 49 64  pendRowid(p->pId
19040 78 2c 20 26 70 2d 3e 77 72 69 74 65 72 2c 20 69  x, &p->writer, i
19050 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 41 70  Rowid);..  /* Ap
19060 70 65 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66  pend the size of
19070 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
19080 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  st in bytes */. 
19090 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
190a0 50 6f 73 6c 69 73 74 49 6e 74 28 70 2d 3e 70 49  PoslistInt(p->pI
190b0 64 78 2c 20 26 70 2d 3e 77 72 69 74 65 72 2c 20  dx, &p->writer, 
190c0 6e 50 6f 73 6c 69 73 74 29 3b 0a 0a 20 20 2f 2a  nPoslist);..  /*
190d0 20 41 6e 64 20 74 68 65 20 70 6f 73 6c 69 73 74   And the poslist
190e0 20 64 61 74 61 20 2a 2f 0a 20 20 66 74 73 35 57   data */.  fts5W
190f0 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
19100 74 44 61 74 61 28 70 2d 3e 70 49 64 78 2c 20 26  tData(p->pIdx, &
19110 70 2d 3e 77 72 69 74 65 72 2c 20 61 50 6f 73 6c  p->writer, aPosl
19120 69 73 74 2c 20 6e 50 6f 73 6c 69 73 74 29 3b 0a  ist, nPoslist);.
19130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19140 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  /*.** Flush the 
19150 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d  contents of in-m
19160 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
19170 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20   iHash to a new 
19180 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d  level-0 .** segm
19190 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73  ent on disk. Als
191a0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 72  o update the cor
191b0 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63  responding struc
191c0 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
191d0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
191e0 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
191f0 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
19200 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
19210 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
19220 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
19230 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
19240 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
19250 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68  c void fts5Flush
19260 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64 65  OneHash(Fts5Inde
19270 78 20 2a 70 2c 20 69 6e 74 20 69 48 61 73 68 2c  x *p, int iHash,
19280 20 69 6e 74 20 2a 70 6e 4c 65 61 66 29 7b 0a 20   int *pnLeaf){. 
19290 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
192a0 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69  pStruct;.  int i
192b0 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e  Segid;.  int pgn
192c0 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20  oLast = 0;      
192d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
192e0 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
192f0 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
19300 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
19310 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
19320 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
19330 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61  e and allocate a
19340 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a   new segment-id.
19350 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
19360 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74   level-0 segment
19370 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20  .  */.  pStruct 
19380 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
19390 65 61 64 28 70 2c 20 69 48 61 73 68 29 3b 0a 20  ead(p, iHash);. 
193a0 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c   iSegid = fts5Al
193b0 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70  locateSegid(p, p
193c0 53 74 72 75 63 74 29 3b 0a 0a 20 20 69 66 28 20  Struct);..  if( 
193d0 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 46 74  iSegid ){.    Ft
193e0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
193f0 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20 4e  nt *pSeg;   /* N
19400 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68 69  ew segment withi
19410 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20 20  n pStruct */.   
19420 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20   int nHeight;   
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19440 2a 20 48 65 69 67 68 74 20 6f 66 20 6e 65 77 20  * Height of new 
19450 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a  segment b-tree *
19460 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  /.    int rc;.  
19470 20 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 63    Fts5FlushCtx c
19480 74 78 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69  tx;..    fts5Wri
19490 74 65 49 6e 69 74 28 70 2c 20 26 63 74 78 2e 77  teInit(p, &ctx.w
194a0 72 69 74 65 72 2c 20 69 48 61 73 68 2c 20 69 53  riter, iHash, iS
194b0 65 67 69 64 29 3b 0a 20 20 20 20 63 74 78 2e 70  egid);.    ctx.p
194c0 49 64 78 20 3d 20 70 3b 0a 0a 20 20 20 20 72 63  Idx = p;..    rc
194d0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
194e0 73 68 49 74 65 72 61 74 65 28 20 70 2d 3e 61 70  shIterate( p->ap
194f0 48 61 73 68 5b 69 48 61 73 68 5d 2c 20 28 76 6f  Hash[iHash], (vo
19500 69 64 2a 29 26 63 74 78 2c 20 0a 20 20 20 20 20  id*)&ctx, .     
19510 20 20 20 66 74 73 35 46 6c 75 73 68 4e 65 77 54     fts5FlushNewT
19520 65 72 6d 2c 20 66 74 73 35 46 6c 75 73 68 4e 65  erm, fts5FlushNe
19530 77 45 6e 74 72 79 2c 20 66 74 73 35 46 6c 75 73  wEntry, fts5Flus
19540 68 54 65 72 6d 44 6f 6e 65 0a 20 20 20 20 29 3b  hTermDone.    );
19550 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
19560 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72  SQLITE_OK ) p->r
19570 63 20 3d 20 72 63 3b 0a 20 20 20 20 66 74 73 35  c = rc;.    fts5
19580 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
19590 63 74 78 2e 77 72 69 74 65 72 2c 20 26 6e 48 65  ctx.writer, &nHe
195a0 69 67 68 74 2c 20 26 70 67 6e 6f 4c 61 73 74 29  ight, &pgnoLast)
195b0 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
195c0 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75   the Fts5Structu
195d0 72 65 2e 20 49 74 20 69 73 20 77 72 69 74 74 65  re. It is writte
195e0 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61  n back to the da
195f0 74 61 62 61 73 65 20 62 79 20 74 68 65 0a 20 20  tabase by the.  
19600 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75    ** fts5Structu
19610 72 65 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c  reRelease() call
19620 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
19630 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  if( pStruct->nLe
19640 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  vel==0 ){.      
19650 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
19660 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70  Level(&p->rc, &p
19670 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20  Struct);.    }. 
19680 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
19690 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
196a0 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20  rc, pStruct, 0, 
196b0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
196c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
196d0 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20  ){.      pSeg = 
196e0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
196f0 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63  [0].aSeg[ pStruc
19700 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65  t->aLevel[0].nSe
19710 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65  g++ ];.      pSe
19720 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
19730 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e  id;.      pSeg->
19740 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69 67 68  nHeight = nHeigh
19750 74 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  t;.      pSeg->p
19760 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  gnoFirst = 1;.  
19770 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61      pSeg->pgnoLa
19780 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20  st = pgnoLast;. 
19790 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
197a0 70 2d 3e 6e 4d 69 6e 4d 65 72 67 65 3e 30 20 29  p->nMinMerge>0 )
197b0 20 66 74 73 35 49 6e 64 65 78 57 6f 72 6b 28 70   fts5IndexWork(p
197c0 2c 20 69 48 61 73 68 2c 20 26 70 53 74 72 75 63  , iHash, &pStruc
197d0 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  t, pgnoLast);.  
197e0 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 4d  fts5IndexCrisisM
197f0 65 72 67 65 28 70 2c 20 69 48 61 73 68 2c 20 26  erge(p, iHash, &
19800 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
19810 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
19820 2c 20 69 48 61 73 68 2c 20 70 53 74 72 75 63 74  , iHash, pStruct
19830 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
19840 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
19850 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  t);.}../*.** Flu
19860 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72  sh any data stor
19870 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ed in the in-mem
19880 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
19890 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
198a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
198b0 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46  fts5IndexFlush(F
198c0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
198d0 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
198e0 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  fig = p->pConfig
198f0 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
19900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19910 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
19920 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 69  terate through i
19930 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndexes */.  int 
19940 6e 4c 65 61 66 20 3d 20 30 3b 20 20 20 20 20 20  nLeaf = 0;      
19950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19960 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
19970 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a  written */..  /*
19980 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
19990 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 65 64   already occured
199a0 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
199b0 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
199c0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
199d0 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44   || p->nPendingD
199e0 61 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ata==0 ) return;
199f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  .  assert( p->ap
19a00 48 61 73 68 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c  Hash );..  /* Fl
19a10 75 73 68 20 74 68 65 20 74 65 72 6d 73 20 61 6e  ush the terms an
19a20 64 20 65 61 63 68 20 70 72 65 66 69 78 20 69 6e  d each prefix in
19a30 64 65 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  dex to disk */. 
19a40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f   for(i=0; i<=pCo
19a50 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
19a60 2b 2b 29 7b 0a 20 20 20 20 66 74 73 35 46 6c 75  ++){.    fts5Flu
19a70 73 68 4f 6e 65 48 61 73 68 28 70 2c 20 69 2c 20  shOneHash(p, i, 
19a80 26 6e 4c 65 61 66 29 3b 0a 20 20 7d 0a 20 20 70  &nLeaf);.  }.  p
19a90 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
19aa0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64   0;.}../*.** Ind
19ab0 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20 73  icate that all s
19ac0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
19ad0 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  to sqlite3Fts5In
19ae0 64 65 78 57 72 69 74 65 28 29 20 70 65 72 74 61  dexWrite() perta
19af0 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f 63  in.** to the doc
19b00 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69 64  ument with rowid
19b10 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64   iRowid..*/.void
19b20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
19b30 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73 35  xBeginWrite(Fts5
19b40 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52  Index *p, i64 iR
19b50 6f 77 69 64 29 7b 0a 20 20 69 66 28 20 69 52 6f  owid){.  if( iRo
19b60 77 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65 52 6f  wid<=p->iWriteRo
19b70 77 69 64 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64  wid || (p->nPend
19b80 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e 4d 61  ingData > p->nMa
19b90 78 50 65 6e 64 69 6e 67 44 61 74 61 29 20 29 7b  xPendingData) ){
19ba0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c  .    fts5IndexFl
19bb0 75 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20 70 2d  ush(p);.  }.  p-
19bc0 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69  >iWriteRowid = i
19bd0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
19be0 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64  Commit data to d
19bf0 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  isk..*/.int sqli
19c00 74 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63  te3Fts5IndexSync
19c10 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
19c20 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 66  nt bCommit){.  f
19c30 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
19c40 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 20  ;.  if( bCommit 
19c50 29 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65  ) fts5CloseReade
19c60 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  r(p);.  return p
19c70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ->rc;.}../*.** D
19c80 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61 20  iscard any data 
19c90 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e  stored in the in
19ca0 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
19cb0 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  les. Do not writ
19cc0 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64  e it.** to the d
19cd0 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
19ce0 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68  nally, assume th
19cf0 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
19d00 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  of the %_data.**
19d10 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20   table may have 
19d20 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e  changed on disk.
19d30 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72   So any in-memor
19d40 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61  y caches of %_da
19d50 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d  ta .** records m
19d60 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ust be invalidat
19d70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
19d80 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62  e3Fts5IndexRollb
19d90 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ack(Fts5Index *p
19da0 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65  ){.  fts5CloseRe
19db0 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35 49  ader(p);.  fts5I
19dc0 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61 28  ndexDiscardData(
19dd0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
19de0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19df0 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35   Open a new Fts5
19e00 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66  Index handle. If
19e10 20 74 68 65 20 62 43 72 65 61 74 65 20 61 72 67   the bCreate arg
19e20 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63  ument is true, c
19e30 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69  reate.** and ini
19e40 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  tialize the unde
19e50 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61  rlying %_data ta
19e60 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ble..**.** If su
19e70 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
19e80 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  p to point to th
19e90 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64  e new object and
19ea0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19eb0 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  K..** Otherwise,
19ec0 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
19ed0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
19ee0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
19ef0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19f00 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20  Fts5IndexOpen(. 
19f10 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
19f20 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72  nfig, .  int bCr
19f30 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64  eate, .  Fts5Ind
19f40 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20  ex **pp,.  char 
19f50 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74  **pzErr.){.  int
19f60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19f70 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b  .  Fts5Index *p;
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
19fa0 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d   */..  *pp = p =
19fb0 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c   (Fts5Index*)sql
19fc0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
19fd0 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a  of(Fts5Index));.
19fe0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
19ff0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1a000 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1a010 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78  sizeof(Fts5Index
1a020 29 29 3b 0a 20 20 70 2d 3e 70 43 6f 6e 66 69 67  ));.  p->pConfig
1a030 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 70 2d   = pConfig;.  p-
1a040 3e 6e 4d 69 6e 4d 65 72 67 65 20 3d 20 46 54 53  >nMinMerge = FTS
1a050 35 5f 4d 49 4e 5f 4d 45 52 47 45 3b 0a 20 20 70  5_MIN_MERGE;.  p
1a060 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 20 3d  ->nCrisisMerge =
1a070 20 46 54 53 35 5f 43 52 49 53 49 53 5f 4d 45 52   FTS5_CRISIS_MER
1a080 47 45 3b 0a 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e  GE;.  p->nWorkUn
1a090 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55  it = FTS5_WORK_U
1a0a0 4e 49 54 3b 0a 20 20 70 2d 3e 6e 4d 61 78 50 65  NIT;.  p->nMaxPe
1a0b0 6e 64 69 6e 67 44 61 74 61 20 3d 20 31 30 32 34  ndingData = 1024
1a0c0 2a 31 30 32 34 3b 0a 20 20 70 2d 3e 7a 44 61 74  *1024;.  p->zDat
1a0d0 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aTbl = sqlite3_m
1a0e0 70 72 69 6e 74 66 28 22 25 73 5f 64 61 74 61 22  printf("%s_data"
1a0f0 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
1a100 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 44 61 74  );.  if( p->zDat
1a110 61 54 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  aTbl==0 ){.    r
1a120 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1a130 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 43  ;.  }else if( bC
1a140 72 65 61 74 65 20 29 7b 0a 20 20 20 20 69 6e 74  reate ){.    int
1a150 20 69 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75   i;.    Fts5Stru
1a160 63 74 75 72 65 20 73 3b 0a 20 20 20 20 72 63 20  cture s;.    rc 
1a170 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65  = sqlite3Fts5Cre
1a180 61 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20  ateTable(.      
1a190 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61    pConfig, "data
1a1a0 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20 50  ", "id INTEGER P
1a1b0 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63  RIMARY KEY, bloc
1a1c0 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72  k BLOB", 0, pzEr
1a1d0 72 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  r.    );.    if(
1a1e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a1f0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  {.      memset(&
1a200 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  s, 0, sizeof(Fts
1a210 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20 20  5Structure));.  
1a220 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1a230 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 2b  Config->nPrefix+
1a240 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  1; i++){.       
1a250 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1a260 69 74 65 28 70 2c 20 69 2c 20 26 73 29 3b 0a 20  ite(p, i, &s);. 
1a270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1a280 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 7d 0a 20  = p->rc;.    }. 
1a290 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e     sqlite3Fts5In
1a2a0 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28 70  dexSetAverages(p
1a2b0 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c  , (const u8*)"",
1a2c0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
1a2d0 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
1a2e0 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
1a2f0 70 2c 20 30 29 3b 0a 20 20 20 20 2a 70 70 20 3d  p, 0);.    *pp =
1a300 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1a310 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
1a320 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65  ose a handle ope
1a330 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
1a340 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
1a350 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29  3Fts5IndexOpen()
1a360 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a370 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46  Fts5IndexClose(F
1a380 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
1a390 20 62 44 65 73 74 72 6f 79 29 7b 0a 20 20 69 6e   bDestroy){.  in
1a3a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a3b0 3b 0a 20 20 69 66 28 20 62 44 65 73 74 72 6f 79  ;.  if( bDestroy
1a3c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a3d0 69 74 65 33 46 74 73 35 44 72 6f 70 54 61 62 6c  ite3Fts5DropTabl
1a3e0 65 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 22 64  e(p->pConfig, "d
1a3f0 61 74 61 22 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ata");.  }.  ass
1a400 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d  ert( p->pReader=
1a410 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
1a420 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69  finalize(p->pWri
1a430 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ter);.  sqlite3_
1a440 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c  finalize(p->pDel
1a450 65 74 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e  eter);.  if( p->
1a460 61 70 48 61 73 68 20 29 7b 0a 20 20 20 20 69 6e  apHash ){.    in
1a470 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
1a480 3b 20 69 3c 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  ; i<=p->pConfig-
1a490 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a  >nPrefix; i++){.
1a4a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1a4b0 35 48 61 73 68 46 72 65 65 28 70 2d 3e 61 70 48  5HashFree(p->apH
1a4c0 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  ash[i]);.    }. 
1a4d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1a4e0 70 2d 3e 61 70 48 61 73 68 29 3b 0a 20 20 7d 0a  p->apHash);.  }.
1a4f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1a500 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 73  ->zDataTbl);.  s
1a510 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1a520 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a530 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
1a540 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76  imple checksum v
1a550 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68  alue based on th
1a560 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  e arguments..*/.
1a570 73 74 61 74 69 63 20 75 36 34 20 66 74 73 35 49  static u64 fts5I
1a580 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a  ndexEntryCksum(.
1a590 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20    i64 iRowid, . 
1a5a0 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e   int iCol, .  in
1a5b0 74 20 69 50 6f 73 2c 20 0a 20 20 63 6f 6e 73 74  t iPos, .  const
1a5c0 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 0a 20   char *pTerm, . 
1a5d0 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20   int nTerm.){.  
1a5e0 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74  int i;.  u64 ret
1a5f0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74   = iRowid;.  ret
1a600 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69   += (ret<<3) + i
1a610 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  Col;.  ret += (r
1a620 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20  et<<3) + iPos;. 
1a630 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
1a640 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28  m; i++) ret += (
1a650 72 65 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b  ret<<3) + pTerm[
1a660 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74  i];.  return ret
1a670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75  ;.}../*.** Calcu
1a680 6c 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  late and return 
1a690 61 20 63 68 65 63 6b 73 75 6d 20 74 68 61 74 20  a checksum that 
1a6a0 69 73 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68  is the XOR of th
1a6b0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
1a6c0 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c 6c   checksum of all
1a6d0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77 6f   entries that wo
1a6e0 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65 64  uld be generated
1a6f0 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 20 73 70   by the token sp
1a700 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74 68  ecified.** by th
1a710 65 20 66 69 6e 61 6c 20 35 20 61 72 67 75 6d 65  e final 5 argume
1a720 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69  nts..*/.u64 sqli
1a730 74 65 33 46 74 73 35 49 6e 64 65 78 43 6b 73 75  te3Fts5IndexCksu
1a740 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  m(.  Fts5Config 
1a750 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20 20  *pConfig,       
1a760 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72       /* Configur
1a770 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a  ation object */.
1a780 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20    i64 iRowid,   
1a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7a0 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20 74 65    /* Document te
1a7b0 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f  rm appears in */
1a7c0 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65 72     /* Column ter
1a7f0 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a  m appears in */.
1a800 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20    int iPos,     
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 74 65    /* Position te
1a830 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f  rm appears in */
1a840 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
1a850 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20  Term, int nTerm 
1a860 20 20 20 2f 2a 20 54 65 72 6d 20 61 74 20 69 50     /* Term at iP
1a870 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 72  os */.){.  u64 r
1a880 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
1a890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1a8a0 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
1a8b0 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
1a8e0 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73   through indexes
1a8f0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 49 64 78 3d   */..  for(iIdx=
1a900 30 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  0; iIdx<=pConfig
1a910 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
1a920 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  +){.    int n = 
1a930 28 28 69 49 64 78 3d 3d 70 43 6f 6e 66 69 67 2d  ((iIdx==pConfig-
1a940 3e 6e 50 72 65 66 69 78 29 20 3f 20 6e 54 65 72  >nPrefix) ? nTer
1a950 6d 20 3a 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  m : pConfig->aPr
1a960 65 66 69 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20  efix[iIdx]);.   
1a970 20 69 66 28 20 6e 3c 3d 6e 54 65 72 6d 20 29 7b   if( n<=nTerm ){
1a980 0a 20 20 20 20 20 20 72 65 74 20 5e 3d 20 66 74  .      ret ^= ft
1a990 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
1a9a0 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  m(iRowid, iCol, 
1a9b0 69 50 6f 73 2c 20 70 54 65 72 6d 2c 20 6e 29 3b  iPos, pTerm, n);
1a9c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1a9d0 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 73 74 61  turn ret;.}..sta
1a9e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72  tic void fts5Btr
1a9f0 65 65 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  eeIterInit(.  Ft
1aa00 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69  s5Index *p, .  i
1aa10 6e 74 20 69 49 64 78 2c 0a 20 20 46 74 73 35 53  nt iIdx,.  Fts5S
1aa20 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
1aa30 2a 70 53 65 67 2c 20 0a 20 20 46 74 73 35 42 74  *pSeg, .  Fts5Bt
1aa40 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 0a 29  reeIter *pIter.)
1aa50 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
1aa60 20 69 6e 74 20 69 3b 0a 20 20 6e 42 79 74 65 20   int i;.  nByte 
1aa70 3d 20 73 69 7a 65 6f 66 28 70 49 74 65 72 2d 3e  = sizeof(pIter->
1aa80 61 4c 76 6c 5b 30 5d 29 20 2a 20 28 70 53 65 67  aLvl[0]) * (pSeg
1aa90 2d 3e 6e 48 65 69 67 68 74 2d 31 29 3b 0a 20 20  ->nHeight-1);.  
1aaa0 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
1aab0 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
1aac0 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  ;.  pIter->nLvl 
1aad0 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d  = pSeg->nHeight-
1aae0 31 3b 0a 20 20 70 49 74 65 72 2d 3e 69 49 64 78  1;.  pIter->iIdx
1aaf0 20 3d 20 69 49 64 78 3b 0a 20 20 70 49 74 65 72   = iIdx;.  pIter
1ab00 2d 3e 70 20 3d 20 70 3b 0a 20 20 70 49 74 65 72  ->p = p;.  pIter
1ab10 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20  ->pSeg = pSeg;. 
1ab20 20 69 66 28 20 6e 42 79 74 65 20 26 26 20 70 2d   if( nByte && p-
1ab30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1ab40 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 4c 76  {.    pIter->aLv
1ab50 6c 20 3d 20 28 46 74 73 35 42 74 72 65 65 49 74  l = (Fts5BtreeIt
1ab60 65 72 4c 65 76 65 6c 2a 29 66 74 73 35 49 64 78  erLevel*)fts5Idx
1ab70 4d 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29  Malloc(p, nByte)
1ab80 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1ab90 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1aba0 4b 20 26 26 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  K && i<pIter->nL
1abb0 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36  vl; i++){.    i6
1abc0 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  4 iRowid = FTS5_
1abd0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1abe0 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  dx, pSeg->iSegid
1abf0 2c 20 69 2b 31 2c 20 31 29 3b 0a 20 20 20 20 46  , i+1, 1);.    F
1ac00 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
1ac10 20 20 20 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b      pIter->aLvl[
1ac20 69 5d 2e 70 44 61 74 61 20 3d 20 70 44 61 74 61  i].pData = pData
1ac30 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
1ac40 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  p, iRowid);.    
1ac50 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
1ac60 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49     fts5NodeIterI
1ac70 6e 69 74 28 70 44 61 74 61 2d 3e 70 2c 20 70 44  nit(pData->p, pD
1ac80 61 74 61 2d 3e 6e 2c 20 26 70 49 74 65 72 2d 3e  ata->n, &pIter->
1ac90 61 4c 76 6c 5b 69 5d 2e 73 29 3b 0a 20 20 20 20  aLvl[i].s);.    
1aca0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74  }.  }..  if( pIt
1acb0 65 72 2d 3e 6e 4c 76 6c 3d 3d 30 20 7c 7c 20 70  er->nLvl==0 || p
1acc0 2d 3e 72 63 20 29 7b 0a 20 20 20 20 70 49 74 65  ->rc ){.    pIte
1acd0 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  r->bEof = 1;.   
1ace0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 20 3d 20   pIter->iLeaf = 
1acf0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a  pSeg->pgnoLast;.
1ad00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
1ad10 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 49 74  er->nEmpty = pIt
1ad20 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 6e 45  er->aLvl[0].s.nE
1ad30 6d 70 74 79 3b 0a 20 20 20 20 70 49 74 65 72 2d  mpty;.    pIter-
1ad40 3e 69 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  >iLeaf = pIter->
1ad50 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68 69 6c 64  aLvl[0].s.iChild
1ad60 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44 6c  ;.    pIter->bDl
1ad70 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76  idx = pIter->aLv
1ad80 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64 78 3b 0a 20  l[0].s.bDlidx;. 
1ad90 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1ada0 64 20 66 74 73 35 42 74 72 65 65 49 74 65 72 4e  d fts5BtreeIterN
1adb0 65 78 74 28 46 74 73 35 42 74 72 65 65 49 74 65  ext(Fts5BtreeIte
1adc0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
1add0 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65  5Index *p = pIte
1ade0 72 2d 3e 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  r->p;.  int i;..
1adf0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
1ae00 3e 62 45 6f 66 3d 3d 30 20 26 26 20 70 49 74 65  >bEof==0 && pIte
1ae10 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 61 44 61  r->aLvl[0].s.aDa
1ae20 74 61 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ta );.  for(i=0;
1ae30 20 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 26   i<pIter->nLvl &
1ae40 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
1ae50 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  OK; i++){.    Ft
1ae60 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
1ae70 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
1ae80 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66 74  >aLvl[i];.    ft
1ae90 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26  s5NodeIterNext(&
1aea0 70 2d 3e 72 63 2c 20 26 70 4c 76 6c 2d 3e 73 29  p->rc, &pLvl->s)
1aeb0 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  ;.    if( pLvl->
1aec0 73 2e 61 44 61 74 61 20 29 7b 0a 20 20 20 20 20  s.aData ){.     
1aed0 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
1aee0 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
1aef0 65 72 6d 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72  erm, pLvl->s.ter
1af00 6d 2e 6e 2c 20 70 4c 76 6c 2d 3e 73 2e 74 65 72  m.n, pLvl->s.ter
1af10 6d 2e 70 29 3b 0a 20 20 20 20 20 20 62 72 65 61  m.p);.      brea
1af20 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
1af30 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
1af40 46 72 65 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a  Free(&pLvl->s);.
1af50 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
1af60 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
1af70 61 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  a);.      pLvl->
1af80 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d  pData = 0;.    }
1af90 0a 20 20 7d 0a 20 20 69 66 28 20 69 3d 3d 70 49  .  }.  if( i==pI
1afa0 74 65 72 2d 3e 6e 4c 76 6c 20 7c 7c 20 70 2d 3e  ter->nLvl || p->
1afb0 72 63 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  rc ){.    pIter-
1afc0 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >bEof = 1;.  }el
1afd0 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  se{.    int iSeg
1afe0 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  id = pIter->pSeg
1aff0 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 66 6f  ->iSegid;.    fo
1b000 72 28 69 2d 2d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  r(i--; i>=0; i--
1b010 29 7b 0a 20 20 20 20 20 20 46 74 73 35 42 74 72  ){.      Fts5Btr
1b020 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76  eeIterLevel *pLv
1b030 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
1b040 5b 69 5d 3b 0a 20 20 20 20 20 20 69 36 34 20 69  [i];.      i64 i
1b050 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
1b060 4d 45 4e 54 5f 52 4f 57 49 44 28 70 49 74 65 72  MENT_ROWID(pIter
1b070 2d 3e 69 49 64 78 2c 69 53 65 67 69 64 2c 69 2b  ->iIdx,iSegid,i+
1b080 31 2c 70 4c 76 6c 5b 31 5d 2e 73 2e 69 43 68 69  1,pLvl[1].s.iChi
1b090 6c 64 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  ld);.      pLvl-
1b0a0 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
1b0b0 61 52 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29  aRead(p, iRowid)
1b0c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
1b0d0 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ->pData ){.     
1b0e0 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 49     fts5NodeIterI
1b0f0 6e 69 74 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d  nit(pLvl->pData-
1b100 3e 70 2c 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d  >p, pLvl->pData-
1b110 3e 6e 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20  >n, &pLvl->s);. 
1b120 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b130 0a 0a 20 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74  ..  pIter->nEmpt
1b140 79 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  y = pIter->aLvl[
1b150 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b 0a 20 20 70  0].s.nEmpty;.  p
1b160 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70  Iter->bDlidx = p
1b170 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
1b180 62 44 6c 69 64 78 3b 0a 20 20 70 49 74 65 72 2d  bDlidx;.  pIter-
1b190 3e 69 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  >iLeaf = pIter->
1b1a0 61 4c 76 6c 5b 30 5d 2e 73 2e 69 43 68 69 6c 64  aLvl[0].s.iChild
1b1b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
1b1c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1b1d0 70 49 74 65 72 2d 3e 62 45 6f 66 20 29 3b 0a 7d  pIter->bEof );.}
1b1e0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1b1f0 73 35 42 74 72 65 65 49 74 65 72 46 72 65 65 28  s5BtreeIterFree(
1b200 46 74 73 35 42 74 72 65 65 49 74 65 72 20 2a 70  Fts5BtreeIter *p
1b210 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Iter){.  int i;.
1b220 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
1b230 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a  er->nLvl; i++){.
1b240 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74 65      Fts5BtreeIte
1b250 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  rLevel *pLvl = &
1b260 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  pIter->aLvl[i];.
1b270 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
1b280 46 72 65 65 28 26 70 4c 76 6c 2d 3e 73 29 3b 0a  Free(&pLvl->s);.
1b290 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44      if( pLvl->pD
1b2a0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ata ){.      fts
1b2b0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
1b2c0 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
1b2d0 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 30   pLvl->pData = 0
1b2e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1b2f0 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
1b300 2d 3e 61 4c 76 6c 29 3b 0a 20 20 66 74 73 35 42  ->aLvl);.  fts5B
1b310 75 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72  ufferFree(&pIter
1b320 2d 3e 74 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->term);.}../*.*
1b330 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1b340 69 73 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74  is purely an int
1b350 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64  ernal test. It d
1b360 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75  oes not contribu
1b370 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75  te to .** FTS fu
1b380 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20  nctionality, or 
1b390 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69  even the integri
1b3a0 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79  ty-check, in any
1b3b0 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74   way..**.** Inst
1b3c0 65 61 64 2c 20 69 74 20 74 65 73 74 73 20 74 68  ead, it tests th
1b3d0 61 74 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  at the same set 
1b3e0 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20 63 6f  of pgno/rowid co
1b3f0 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 0a  mbinations are .
1b400 2a 2a 20 76 69 73 69 74 65 64 20 72 65 67 61 72  ** visited regar
1b410 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
1b420 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
1b430 65 78 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ex identified by
1b440 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20 69   parameters.** i
1b450 49 64 78 2f 69 53 65 67 69 64 2f 69 4c 65 61 66  Idx/iSegid/iLeaf
1b460 20 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20   is iterated in 
1b470 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65  forwards or reve
1b480 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 69  rse order..*/.#i
1b490 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1b4a0 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  G.static void ft
1b4b0 73 35 44 6c 69 64 78 49 74 65 72 54 65 73 74 52  s5DlidxIterTestR
1b4c0 65 76 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e  everse(.  Fts5In
1b4d0 64 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69  dex *p, .  int i
1b4e0 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
1b4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1b500 64 65 78 20 74 6f 20 6c 6f 61 64 20 64 6f 63 6c  dex to load docl
1b510 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 2a  ist-index from *
1b520 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20  /.  int iSegid, 
1b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b540 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
1b550 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a  d to load from *
1b560 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20  /.  int iLeaf   
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b580 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c      /* Load docl
1b590 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68  ist-index for th
1b5a0 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20  is leaf */.){.  
1b5b0 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
1b5c0 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 69 36 34  Dlidx = 0;.  i64
1b5d0 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20   cksum1 = 13;.  
1b5e0 69 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b  i64 cksum2 = 13;
1b5f0 0a 0a 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64  ..  for(fts5Dlid
1b600 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20  xIterInit(p, 0, 
1b610 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c  iIdx, iSegid, iL
1b620 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20  eaf, &pDlidx);. 
1b630 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
1b640 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
1b650 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44  ==0;.      fts5D
1b660 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 44 6c  lidxIterNext(pDl
1b670 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 61 73  idx).  ){.    as
1b680 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 69 4c  sert( pDlidx->iL
1b690 65 61 66 50 67 6e 6f 3e 69 4c 65 61 66 20 29 3b  eafPgno>iLeaf );
1b6a0 0a 20 20 20 20 63 6b 73 75 6d 31 20 3d 20 28 63  .    cksum1 = (c
1b6b0 6b 73 75 6d 31 20 5e 20 28 20 28 69 36 34 29 28  ksum1 ^ ( (i64)(
1b6c0 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e  pDlidx->iLeafPgn
1b6d0 6f 29 20 3c 3c 20 33 32 20 29 29 3b 0a 20 20 20  o) << 32 ));.   
1b6e0 20 63 6b 73 75 6d 31 20 3d 20 28 63 6b 73 75 6d   cksum1 = (cksum
1b6f0 31 20 5e 20 70 44 6c 69 64 78 2d 3e 69 52 6f 77  1 ^ pDlidx->iRow
1b700 69 64 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44  id);.  }.  fts5D
1b710 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c  lidxIterFree(pDl
1b720 69 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d  idx);.  pDlidx =
1b730 20 30 3b 0a 0a 20 20 66 6f 72 28 66 74 73 35 44   0;..  for(fts5D
1b740 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20  lidxIterInit(p, 
1b750 31 2c 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c  1, iIdx, iSegid,
1b760 20 69 4c 65 61 66 2c 20 26 70 44 6c 69 64 78 29   iLeaf, &pDlidx)
1b770 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
1b780 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
1b790 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  dx)==0;.      ft
1b7a0 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
1b7b0 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20  pDlidx).  ){.   
1b7c0 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
1b7d0 3e 69 4c 65 61 66 50 67 6e 6f 3e 69 4c 65 61 66  >iLeafPgno>iLeaf
1b7e0 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 3d   );.    cksum2 =
1b7f0 20 28 63 6b 73 75 6d 32 20 5e 20 28 20 28 69 36   (cksum2 ^ ( (i6
1b800 34 29 28 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66  4)(pDlidx->iLeaf
1b810 50 67 6e 6f 29 20 3c 3c 20 33 32 20 29 29 3b 0a  Pgno) << 32 ));.
1b820 20 20 20 20 63 6b 73 75 6d 32 20 3d 20 28 63 6b      cksum2 = (ck
1b830 73 75 6d 32 20 5e 20 70 44 6c 69 64 78 2d 3e 69  sum2 ^ pDlidx->i
1b840 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 66 74  Rowid);.  }.  ft
1b850 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
1b860 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69 64  pDlidx);.  pDlid
1b870 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  x = 0;..  if( p-
1b880 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1b890 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73 75 6d 32  & cksum1!=cksum2
1b8a0 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
1b8b0 43 4f 52 52 55 50 54 3b 20 0a 7d 0a 23 65 6c 73  CORRUPT; .}.#els
1b8c0 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 44  e.# define fts5D
1b8d0 6c 69 64 78 49 74 65 72 54 65 73 74 52 65 76 65  lidxIterTestReve
1b8e0 72 73 65 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  rse(w,x,y,z).#en
1b8f0 64 69 66 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  dif..static void
1b900 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
1b910 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28  ityCheckSegment(
1b920 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b940 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1b950 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
1b960 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20 20  nt iIdx,        
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b980 2a 20 49 6e 64 65 78 20 74 68 61 74 20 70 53 65  * Index that pSe
1b990 67 20 69 73 20 61 20 70 61 72 74 20 6f 66 20 2a  g is a part of *
1b9a0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
1b9b0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20  eSegment *pSeg  
1b9c0 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
1b9d0 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c  o check internal
1b9e0 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a   consistency */.
1b9f0 29 7b 0a 20 20 46 74 73 35 42 74 72 65 65 49 74  ){.  Fts5BtreeIt
1ba00 65 72 20 69 74 65 72 3b 20 20 20 20 20 20 20 20  er iter;        
1ba10 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
1ba20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1ba30 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
1ba40 20 2a 2f 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74   */..  /* Iterat
1ba50 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 62 2d  e through the b-
1ba60 74 72 65 65 20 68 69 65 72 61 72 63 68 79 2e 20  tree hierarchy. 
1ba70 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73 35 42 74   */.  for(fts5Bt
1ba80 72 65 65 49 74 65 72 49 6e 69 74 28 70 2c 20 69  reeIterInit(p, i
1ba90 49 64 78 2c 20 70 53 65 67 2c 20 26 69 74 65 72  Idx, pSeg, &iter
1baa0 29 3b 0a 20 20 20 20 20 20 69 74 65 72 2e 62 45  );.      iter.bE
1bab0 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  of==0;.      fts
1bac0 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28 26  5BtreeIterNext(&
1bad0 69 74 65 72 29 0a 20 20 29 7b 0a 20 20 20 20 69  iter).  ){.    i
1bae0 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20  64 iRow;        
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb00 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c  Rowid for this l
1bb10 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  eaf */.    Fts5D
1bb20 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
1bb30 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1bb40 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
1bb50 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20  /.    int iOff; 
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
1bb80 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6c   first term on l
1bb90 65 61 66 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  eaf */.    int i
1bba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bbb0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1bbc0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1bbd0 75 67 68 20 65 6d 70 74 79 20 6c 65 61 76 65 73  ugh empty leaves
1bbe0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   */..    /* If t
1bbf0 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74  he leaf in quest
1bc00 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1bc10 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f  been trimmed fro
1bc20 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a  m the segment, .
1bc30 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68      ** ignore th
1bc40 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e  is b-tree entry.
1bc50 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64   Otherwise, load
1bc60 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e   it into memory.
1bc70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72   */.    if( iter
1bc80 2e 69 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e  .iLeaf<pSeg->pgn
1bc90 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e 75  oFirst ) continu
1bca0 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46 54  e;.    iRow = FT
1bcb0 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
1bcc0 28 69 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65  (iIdx, pSeg->iSe
1bcd0 67 69 64 2c 20 30 2c 20 69 74 65 72 2e 69 4c 65  gid, 0, iter.iLe
1bce0 61 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d  af);.    pLeaf =
1bcf0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
1bd00 20 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20   iRow);.    if( 
1bd10 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
1bd20 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1bd30 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f  that the leaf co
1bd40 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
1bd50 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68  one term, and th
1bd60 61 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20  at it is equal. 
1bd70 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67     ** to or larg
1bd80 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69  er than the spli
1bd90 74 2d 6b 65 79 20 69 6e 20 69 74 65 72 2e 74 65  t-key in iter.te
1bda0 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69 4f 66 66  rm.  */.    iOff
1bdb0 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
1bdc0 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20  Leaf->p[2]);.   
1bdd0 20 69 66 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a   if( iOff==0 ){.
1bde0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
1bdf0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
1be00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1be10 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
1be20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1be30 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66   of term on leaf
1be40 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
1be50 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20     int res;     
1be60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1be70 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  * Comparison of 
1be80 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b  term and split-k
1be90 65 79 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66  ey */.      iOff
1bea0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1beb0 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
1bec0 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 72   nTerm);.      r
1bed0 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 70 4c 65  es = memcmp(&pLe
1bee0 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 69 74 65  af->p[iOff], ite
1bef0 72 2e 74 65 72 6d 2e 70 2c 20 4d 49 4e 28 6e 54  r.term.p, MIN(nT
1bf00 65 72 6d 2c 20 69 74 65 72 2e 74 65 72 6d 2e 6e  erm, iter.term.n
1bf10 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  ));.      if( re
1bf20 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54 65  s==0 ) res = nTe
1bf30 72 6d 20 2d 20 69 74 65 72 2e 74 65 72 6d 2e 6e  rm - iter.term.n
1bf40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c  ;.      if( res<
1bf50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
1bf60 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1bf70 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
1bf80 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
1bf90 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ease(pLeaf);.   
1bfa0 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65   if( p->rc ) bre
1bfb0 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  ak;..    /* Now 
1bfc0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  check that the i
1bfd0 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65  ter.nEmpty leave
1bfe0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
1bff0 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 20  current leaf.   
1c000 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e   ** (a) exist an
1c010 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f  d (b) contain no
1c020 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66   terms. */.    f
1c030 6f 72 28 69 3d 31 3b 20 70 2d 3e 72 63 3d 3d 53  or(i=1; p->rc==S
1c040 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d 69  QLITE_OK && i<=i
1c050 74 65 72 2e 6e 45 6d 70 74 79 3b 20 69 2b 2b 29  ter.nEmpty; i++)
1c060 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20  {.      pLeaf = 
1c070 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1c080 69 52 6f 77 2b 69 29 3b 0a 20 20 20 20 20 20 69  iRow+i);.      i
1c090 66 28 20 70 4c 65 61 66 20 26 26 20 30 21 3d 66  f( pLeaf && 0!=f
1c0a0 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
1c0b0 2d 3e 70 5b 32 5d 29 20 29 7b 0a 20 20 20 20 20  ->p[2]) ){.     
1c0c0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
1c0d0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
1c0e0 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
1c0f0 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
1c100 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c110 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69  there is a docli
1c120 73 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20  st-index, check 
1c130 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69  that it looks ri
1c140 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ght. */.    if( 
1c150 69 74 65 72 2e 62 44 6c 69 64 78 20 29 7b 0a 20  iter.bDlidx ){. 
1c160 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74       Fts5DlidxIt
1c170 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20  er *pDlidx = 0; 
1c180 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e   /* For iteratin
1c190 67 20 74 68 72 6f 75 67 68 20 64 6f 63 6c 69 73  g through doclis
1c1a0 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  t index */.     
1c1b0 20 69 6e 74 20 69 50 72 65 76 4c 65 61 66 20 3d   int iPrevLeaf =
1c1c0 20 69 74 65 72 2e 69 4c 65 61 66 3b 0a 20 20 20   iter.iLeaf;.   
1c1d0 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
1c1e0 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20  pSeg->iSegid;.  
1c1f0 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 20 20 20      int iPg;.   
1c200 20 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20     i64 iKey;..  
1c210 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64      for(fts5Dlid
1c220 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20  xIterInit(p, 0, 
1c230 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 74  iIdx, iSegid, it
1c240 65 72 2e 69 4c 65 61 66 2c 20 26 70 44 6c 69 64  er.iLeaf, &pDlid
1c250 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  x);.          ft
1c260 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
1c270 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
1c280 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
1c290 78 49 74 65 72 4e 65 78 74 28 70 44 6c 69 64 78  xIterNext(pDlidx
1c2a0 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20  ).      ){..    
1c2b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79      /* Check any
1c2c0 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65   rowid-less page
1c2d0 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66  s that occur bef
1c2e0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
1c2f0 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20  leaf. */.       
1c300 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65   for(iPg=iPrevLe
1c310 61 66 2b 31 3b 20 69 50 67 3c 70 44 6c 69 64 78  af+1; iPg<pDlidx
1c320 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 20 69 50 67  ->iLeafPgno; iPg
1c330 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1c340 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Key = FTS5_SEGME
1c350 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69  NT_ROWID(iIdx, i
1c360 53 65 67 69 64 2c 20 30 2c 20 69 50 67 29 3b 0a  Segid, 0, iPg);.
1c370 20 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20            pLeaf 
1c380 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
1c390 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , iKey);.       
1c3a0 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a     if( pLeaf ){.
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1c3c0 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61  fts5GetU16(&pLea
1c3d0 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29 20 70 2d  f->p[0])!=0 ) p-
1c3e0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1c3f0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
1c400 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1c410 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
1c420 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1c430 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66 20        iPrevLeaf 
1c440 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50  = pDlidx->iLeafP
1c450 67 6e 6f 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  gno;..        /*
1c460 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
1c470 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69 63 61  leaf page indica
1c480 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61  ted by the itera
1c490 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a  tor really does.
1c4a0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
1c4b0 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75 67  in the rowid sug
1c4c0 67 65 73 74 65 64 20 62 79 20 74 68 65 20 73 61  gested by the sa
1c4d0 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  me. */.        i
1c4e0 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Key = FTS5_SEGME
1c4f0 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69  NT_ROWID(iIdx, i
1c500 53 65 67 69 64 2c 20 30 2c 20 70 44 6c 69 64 78  Segid, 0, pDlidx
1c510 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  ->iLeafPgno);.  
1c520 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
1c530 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
1c540 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
1c550 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
1c560 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
1c570 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 52            int iR
1c580 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65  owidOff = fts5Ge
1c590 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30  tU16(&pLeaf->p[0
1c5a0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 65  ]);.          ge
1c5b0 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e  tVarint(&pLeaf->
1c5c0 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75  p[iRowidOff], (u
1c5d0 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20  64*)&iRowid);.  
1c5e0 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
1c5f0 69 64 21 3d 70 44 6c 69 64 78 2d 3e 69 52 6f 77  id!=pDlidx->iRow
1c600 69 64 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  id ) p->rc = FTS
1c610 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
1c620 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
1c630 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20  ease(pLeaf);.   
1c640 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7d 0a       }..      }.
1c650 0a 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69  .      for(iPg=i
1c660 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c  PrevLeaf+1; iPg<
1c670 3d 28 69 74 65 72 2e 69 4c 65 61 66 20 2b 20 69  =(iter.iLeaf + i
1c680 74 65 72 2e 6e 45 6d 70 74 79 29 3b 20 69 50 67  ter.nEmpty); iPg
1c690 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65  ++){.        iKe
1c6a0 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  y = FTS5_SEGMENT
1c6b0 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65  _ROWID(iIdx, iSe
1c6c0 67 69 64 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20  gid, 0, iPg);.  
1c6d0 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74        pLeaf = ft
1c6e0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b  s5DataRead(p, iK
1c6f0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
1c700 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20   pLeaf ){.      
1c710 20 20 20 20 69 66 28 20 66 74 73 35 47 65 74 55      if( fts5GetU
1c720 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29  16(&pLeaf->p[0])
1c730 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  !=0 ) p->rc = FT
1c740 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
1c750 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
1c760 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
1c770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c780 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
1c790 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
1c7a0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
1c7b0 78 49 74 65 72 54 65 73 74 52 65 76 65 72 73 65  xIterTestReverse
1c7c0 28 70 2c 20 69 49 64 78 2c 20 69 53 65 67 69 64  (p, iIdx, iSegid
1c7d0 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a 20  , iter.iLeaf);. 
1c7e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1c7f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1c800 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d   && iter.iLeaf!=
1c810 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
1c820 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54  {.    p->rc = FT
1c830 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a  S5_CORRUPT;.  }.
1c840 0a 20 20 66 74 73 35 42 74 72 65 65 49 74 65 72  .  fts5BtreeIter
1c850 46 72 65 65 28 26 69 74 65 72 29 3b 0a 7d 0a 0a  Free(&iter);.}..
1c860 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e  /*.** Run intern
1c870 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e 73  al checks to ens
1c880 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54 53  ure that the FTS
1c890 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69 6e   index (a) is in
1c8a0 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e  ternally .** con
1c8b0 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29 20  sistent and (b) 
1c8c0 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73  contains entries
1c8d0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 58   for which the X
1c8e0 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73  OR of the checks
1c8f0 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c  ums.** as calcul
1c900 61 74 65 64 20 62 79 20 66 74 73 35 49 6e 64 65  ated by fts5Inde
1c910 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73  xEntryCksum() is
1c920 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65   cksum..**.** Re
1c930 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1c940 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68  UPT if any of th
1c950 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  e internal check
1c960 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68  s fail, or if th
1c970 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f  e.** checksum do
1c980 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65  es not match. Re
1c990 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1c9a0 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73  f all checks pas
1c9b0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72  s without.** err
1c9c0 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  or, or some othe
1c9d0 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  r SQLite error c
1c9e0 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65  ode if another e
1c9f0 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a  rror (e.g. OOM).
1ca00 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
1ca10 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
1ca20 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
1ca30 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75  (Fts5Index *p, u
1ca40 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 46 74 73  64 cksum){.  Fts
1ca50 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1ca60 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
1ca70 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20   int iIdx;      
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
1caa0 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
1cab0 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  xes */.  int rc;
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1cae0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 36 34  rn code */.  u64
1caf0 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20   cksum2 = 0;    
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cb10 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f  Checksum based o
1cb20 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  n contents of in
1cb30 64 65 78 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  dexes */..  /* C
1cb40 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 68  heck that the ch
1cb50 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 69 6e  ecksum of the in
1cb60 64 65 78 20 6d 61 74 63 68 65 73 20 74 68 65 20  dex matches the 
1cb70 61 72 67 75 6d 65 6e 74 20 63 68 65 63 6b 73 75  argument checksu
1cb80 6d 20 2a 2f 0a 20 20 66 6f 72 28 69 49 64 78 3d  m */.  for(iIdx=
1cb90 30 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67  0; iIdx<=pConfig
1cba0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b  ->nPrefix; iIdx+
1cbb0 2b 29 7b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74  +){.    Fts5Mult
1cbc0 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 3b  iSegIter *pIter;
1cbd0 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1cbe0 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74  re *pStruct = ft
1cbf0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
1cc00 70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 66 6f  p, iIdx);.    fo
1cc10 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
1cc20 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 69  ew(p, pStruct, i
1cc30 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31  Idx, 0, 0, 0, -1
1cc40 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  , 0, &pIter);.  
1cc50 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1cc60 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1cc70 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ==0;.        fts
1cc80 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
1cc90 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20  , pIter, 0, 0). 
1cca0 20 20 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35     ){.      Fts5
1ccb0 50 6f 73 49 74 65 72 20 73 50 6f 73 3b 20 20 20  PosIter sPos;   
1ccc0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
1ccd0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1cce0 67 68 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  gh position list
1ccf0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b   */.      int n;
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1cd20 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a   term in bytes *
1cd30 2f 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77  /.      i64 iRow
1cd40 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  id = fts5MultiIt
1cd50 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
1cd60 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
1cd70 28 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69  (char*)fts5Multi
1cd80 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20  IterTerm(pIter, 
1cd90 26 6e 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  &n);..      for(
1cda0 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69 74 28  fts5PosIterInit(
1cdb0 70 2c 20 70 49 74 65 72 2c 20 26 73 50 6f 73 29  p, pIter, &sPos)
1cdc0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1cdd0 50 6f 73 49 74 65 72 45 6f 66 28 70 2c 20 26 73  PosIterEof(p, &s
1cde0 50 6f 73 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  Pos)==0;.       
1cdf0 20 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65     fts5PosIterNe
1ce00 78 74 28 70 2c 20 26 73 50 6f 73 29 0a 20 20 20  xt(p, &sPos).   
1ce10 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6b     ){.        ck
1ce20 73 75 6d 32 20 5e 3d 20 66 74 73 35 49 6e 64 65  sum2 ^= fts5Inde
1ce30 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77  xEntryCksum(iRow
1ce40 69 64 2c 20 73 50 6f 73 2e 69 43 6f 6c 2c 20 73  id, sPos.iCol, s
1ce50 50 6f 73 2e 69 50 6f 73 2c 20 7a 2c 20 6e 29 3b  Pos.iPos, z, n);
1ce60 0a 23 69 66 20 30 0a 20 20 20 20 20 20 20 20 66  .#if 0.        f
1ce70 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
1ce80 72 6f 77 69 64 3d 25 64 20 22 2c 20 28 69 6e 74  rowid=%d ", (int
1ce90 29 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  )iRowid);.      
1cea0 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74    fprintf(stdout
1ceb0 2c 20 22 74 65 72 6d 3d 25 2e 2a 73 20 22 2c 20  , "term=%.*s ", 
1cec0 6e 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 66  n, z);.        f
1ced0 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
1cee0 63 6f 6c 3d 25 64 20 22 2c 20 73 50 6f 73 2e 69  col=%d ", sPos.i
1cef0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 66 70  Col);.        fp
1cf00 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 6f  rintf(stdout, "o
1cf10 66 66 3d 25 64 5c 6e 22 2c 20 73 50 6f 73 2e 69  ff=%d\n", sPos.i
1cf20 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 66 66  Pos);.        ff
1cf30 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 23 65  lush(stdout);.#e
1cf40 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
1cf50 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69   }.    fts5Multi
1cf60 49 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65  IterFree(p, pIte
1cf70 72 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75  r);.    fts5Stru
1cf80 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1cf90 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ruct);.  }.  rc 
1cfa0 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72  = p->rc;.  if( r
1cfb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1cfc0 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20  cksum!=cksum2 ) 
1cfd0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1cfe0 54 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  T;..  /* Check t
1cff0 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
1d000 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73   nodes of each s
1d010 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65  egment match the
1d020 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 66 6f 72   leaves */.  for
1d030 28 69 49 64 78 3d 30 3b 20 72 63 3d 3d 53 51 4c  (iIdx=0; rc==SQL
1d040 49 54 45 5f 4f 4b 20 26 26 20 69 49 64 78 3c 3d  ITE_OK && iIdx<=
1d050 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
1d060 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46  ; iIdx++){.    F
1d070 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1d080 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
1d090 63 74 75 72 65 52 65 61 64 28 70 2c 20 69 49 64  ctureRead(p, iId
1d0a0 78 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  x);.    if( pStr
1d0b0 75 63 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  uct ){.      int
1d0c0 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
1d0d0 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
1d0e0 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
1d0f0 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
1d100 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
1d110 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
1d120 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
1d130 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
1d140 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
1d150 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
1d160 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1d170 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
1d180 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Seg];.          
1d190 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
1d1a0 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70  tyCheckSegment(p
1d1b0 2c 20 69 49 64 78 2c 20 70 53 65 67 29 3b 0a 20  , iIdx, pSeg);. 
1d1c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d1d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
1d1e0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
1d1f0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 72 63  pStruct);.    rc
1d200 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 7d 0a 0a 20   = p->rc;.  }.. 
1d210 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d220 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
1d230 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63   fts5DecodeStruc
1d240 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ture(.  int *pRc
1d250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d260 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
1d270 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: error code */
1d280 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1d290 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20  Buf,.  const u8 
1d2a0 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
1d2b0 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  b.){.  int rc;  
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2d0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1d2e0 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 53   code */.  Fts5S
1d2f0 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20 30 3b  tructure *p = 0;
1d300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1d310 63 6f 64 65 64 20 73 74 72 75 63 74 75 72 65 20  coded structure 
1d320 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20  object */..  rc 
1d330 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  = fts5StructureD
1d340 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c  ecode(pBlob, nBl
1d350 6f 62 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72  ob, &p);.  if( r
1d360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d370 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
1d380 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
1d390 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63    fts5DebugStruc
1d3a0 74 75 72 65 28 70 52 63 2c 20 70 42 75 66 2c 20  ture(pRc, pBuf, 
1d3b0 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  p);.  fts5Struct
1d3c0 75 72 65 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d  ureRelease(p);.}
1d3d0 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28  ../*.** Buffer (
1d3e0 61 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20  a/n) is assumed 
1d3f0 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73  to contain a lis
1d400 74 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20  t of serialized 
1d410 76 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a  varints. Read.**
1d420 20 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64   each varint and
1d430 20 61 70 70 65 6e 64 20 69 74 73 20 73 74 72 69   append its stri
1d440 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
1d450 6e 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  n to buffer pBuf
1d460 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65  . Return.** afte
1d470 72 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 70  r either the inp
1d480 75 74 20 62 75 66 66 65 72 20 69 73 20 65 78 68  ut buffer is exh
1d490 61 75 73 74 65 64 20 6f 72 20 61 20 30 20 76 61  austed or a 0 va
1d4a0 6c 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  lue is read..**.
1d4b0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1d4c0 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
1d4d0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20  r of bytes read 
1d4e0 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
1d4f0 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
1d500 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50   int fts5DecodeP
1d510 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c  oslist(int *pRc,
1d520 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
1d530 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  f, const u8 *a, 
1d540 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f  int n){.  int iO
1d550 66 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  ff = 0;.  while(
1d560 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69   iOff<n ){.    i
1d570 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66  nt iVal;.    iOf
1d580 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  f += getVarint32
1d590 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29  (&a[iOff], iVal)
1d5a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
1d5b0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
1d5c0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
1d5d0 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d   %d", iVal);.  }
1d5e0 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
1d5f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61  }../*.** The sta
1d600 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f  rt of buffer (a/
1d610 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  n) contains the 
1d620 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69  start of a docli
1d630 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a  st. The doclist.
1d640 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ** may or may no
1d650 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20  t finish within 
1d660 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73  the buffer. This
1d670 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
1d680 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72  s a text.** repr
1d690 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1d6a0 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f  e part of the do
1d6b0 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72  clist that is pr
1d6c0 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a  esent to buffer.
1d6d0 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20  ** pBuf. .**.** 
1d6e0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1d6f0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1d700 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
1d710 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
1d720 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1d730 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  t fts5DecodeDocl
1d740 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
1d750 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
1d760 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
1d770 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69   n){.  i64 iDoci
1d780 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  d;.  int iOff = 
1d790 30 3b 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e  0;..  if( iOff<n
1d7a0 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20   ){.    iOff += 
1d7b0 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
1d7c0 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
1d7d0 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73  )&iDocid);.    s
1d7e0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1d7f0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
1d800 2c 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64 3d  , pBuf, " rowid=
1d810 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a  %lld", iDocid);.
1d820 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f 66    }.  while( iOf
1d830 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  f<n ){.    int n
1d840 50 6f 73 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  Pos;.    iOff +=
1d850 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b   getVarint32(&a[
1d860 69 4f 66 66 5d 2c 20 6e 50 6f 73 29 3b 0a 20 20  iOff], nPos);.  
1d870 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65    iOff += fts5De
1d880 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c  codePoslist(pRc,
1d890 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c   pBuf, &a[iOff],
1d8a0 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f   MIN(n-iOff, nPo
1d8b0 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66  s));.    if( iOf
1d8c0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34  f<n ){.      i64
1d8d0 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
1d8e0 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65  Off += sqlite3Ge
1d8f0 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
1d900 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
1d910 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 65 6c  ;.      if( iDel
1d920 74 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  ta==0 ) return i
1d930 4f 66 66 3b 0a 20 20 20 20 20 20 69 44 6f 63 69  Off;.      iDoci
1d940 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d -= iDelta;.   
1d950 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d960 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
1d970 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 72 6f  (pRc, pBuf, " ro
1d980 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69  wid=%lld", iDoci
1d990 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
1d9a0 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a   return iOff;.}.
1d9b0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
1d9c0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65  mentation of use
1d9d0 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
1d9e0 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64   function fts5_d
1d9f0 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ecode()..*/.stat
1da00 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
1da10 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  deFunction(.  sq
1da20 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
1da30 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
1da40 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
1da50 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
1da60 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
1da70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1da80 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61  umber of args (a
1da90 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71  lways 2) */.  sq
1daa0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
1dab0 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
1dac0 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
1dad0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  nts */.){.  i64 
1dae0 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1db00 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64 20  owid for record 
1db10 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f  being decoded */
1db20 0a 20 20 69 6e 74 20 69 49 64 78 2c 69 53 65 67  .  int iIdx,iSeg
1db30 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f  id,iHeight,iPgno
1db40 3b 20 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70  ;  /* Rowid comp
1db50 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  onents */.  cons
1db60 74 20 75 38 20 2a 61 3b 20 69 6e 74 20 6e 3b 20  t u8 *a; int n; 
1db70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1db80 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65 20  ecord to decode 
1db90 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
1dba0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1dbb0 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70       /* Build up
1dbc0 20 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20   text to return 
1dbd0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
1dbe0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1dbf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1dc00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
1dc10 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20 29  ssert( nArg==2 )
1dc20 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
1dc30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1dc40 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  fer));.  iRowid 
1dc50 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
1dc60 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d 29 3b  int64(apVal[0]);
1dc70 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
1dc80 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c  alue_bytes(apVal
1dc90 5b 31 5d 29 3b 0a 20 20 61 20 3d 20 73 71 6c 69  [1]);.  a = sqli
1dca0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
1dcb0 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 66 74 73 35  pVal[1]);.  fts5
1dcc0 44 65 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77  DecodeRowid(iRow
1dcd0 69 64 2c 20 26 69 49 64 78 2c 20 26 69 53 65 67  id, &iIdx, &iSeg
1dce0 69 64 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69  id, &iHeight, &i
1dcf0 50 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65  Pgno);..  fts5De
1dd00 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73  bugRowid(&rc, &s
1dd10 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28  , iRowid);.  if(
1dd20 20 69 48 65 69 67 68 74 3d 3d 46 54 53 35 5f 53   iHeight==FTS5_S
1dd30 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48  EGMENT_MAX_HEIGH
1dd40 54 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  T ){.    int i =
1dd50 20 30 3b 0a 20 20 20 20 69 36 34 20 69 50 72 65   0;.    i64 iPre
1dd60 76 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29  v;.    if( n>0 )
1dd70 7b 0a 20 20 20 20 20 20 69 20 3d 20 67 65 74 56  {.      i = getV
1dd80 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36  arint(&a[i], (u6
1dd90 34 2a 29 26 69 50 72 65 76 29 3b 0a 20 20 20 20  4*)&iPrev);.    
1dda0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1ddb0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
1ddc0 26 72 63 2c 20 26 73 2c 20 22 20 25 6c 6c 64 22  &rc, &s, " %lld"
1ddd0 2c 20 69 50 72 65 76 29 3b 0a 20 20 20 20 7d 0a  , iPrev);.    }.
1dde0 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 20 29      while( i<n )
1ddf0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56 61 6c  {.      i64 iVal
1de00 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 67 65 74  ;.      i += get
1de10 56 61 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75  Varint(&a[i], (u
1de20 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20  64*)&iVal);.    
1de30 20 20 69 66 28 20 69 56 61 6c 3d 3d 30 20 29 7b    if( iVal==0 ){
1de40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1de50 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1de60 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20  Printf(&rc, &s, 
1de70 22 20 78 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  " x");.      }el
1de80 73 65 7b 0a 20 20 20 20 20 20 20 20 69 50 72 65  se{.        iPre
1de90 76 20 3d 20 69 50 72 65 76 20 2d 20 69 56 61 6c  v = iPrev - iVal
1dea0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1deb0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1dec0 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
1ded0 20 22 20 25 6c 6c 64 22 2c 20 69 50 72 65 76 29   " %lld", iPrev)
1dee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1def0 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 69  .  }else.  if( i
1df00 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
1df10 69 66 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35  if( iRowid==FTS5
1df20 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
1df30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f  ){.      /* todo
1df40 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1df50 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 53       fts5DecodeS
1df60 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 73  tructure(&rc, &s
1df70 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20  , a, n);.    }. 
1df80 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 46 74 73   }else{..    Fts
1df90 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20  5Buffer term;.  
1dfa0 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
1dfb0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
1dfc0 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  ffer));..    if(
1dfd0 20 69 48 65 69 67 68 74 3d 3d 30 20 29 7b 0a 20   iHeight==0 ){. 
1dfe0 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66       int iTermOf
1dff0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  f = 0;.      int
1e000 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a   iRowidOff = 0;.
1e010 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
1e020 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 20        int nKeep 
1e030 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 52 6f 77  = 0;..      iRow
1e040 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  idOff = fts5GetU
1e050 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20  16(&a[0]);.     
1e060 20 69 54 65 72 6d 4f 66 66 20 3d 20 66 74 73 35   iTermOff = fts5
1e070 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 0a  GetU16(&a[2]);..
1e080 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
1e090 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Off ){.        i
1e0a0 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b  Off = iRowidOff;
1e0b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1e0c0 20 69 54 65 72 6d 4f 66 66 20 29 7b 0a 20 20 20   iTermOff ){.   
1e0d0 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72       iOff = iTer
1e0e0 6d 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73  mOff;.      }els
1e0f0 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
1e100 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
1e110 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73     fts5DecodePos
1e120 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
1e130 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 0a  [4], iOff-4);...
1e140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 52        assert( iR
1e150 6f 77 69 64 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f  owidOff==0 || iO
1e160 66 66 3d 3d 69 52 6f 77 69 64 4f 66 66 20 29 3b  ff==iRowidOff );
1e170 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69  .      if( iRowi
1e180 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  dOff ){.        
1e190 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
1e1a0 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
1e1b0 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69  s, &a[iOff], n-i
1e1c0 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Off);.      }.. 
1e1d0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65       assert( iTe
1e1e0 72 6d 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66  rmOff==0 || iOff
1e1f0 3d 3d 69 54 65 72 6d 4f 66 66 20 29 3b 0a 20 20  ==iTermOff );.  
1e200 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c      while( iOff<
1e210 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  n ){.        int
1e220 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
1e230 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
1e240 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42  t32(&a[iOff], nB
1e250 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65  yte);.        te
1e260 72 6d 2e 6e 3d 20 6e 4b 65 65 70 3b 0a 20 20 20  rm.n= nKeep;.   
1e270 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1e280 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26  ppendBlob(&rc, &
1e290 74 65 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b  term, nByte, &a[
1e2a0 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20  iOff]);.        
1e2b0 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a  iOff += nByte;..
1e2c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1e2d0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
1e2e0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
1e2f0 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65     &rc, &s, " te
1e300 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e  rm=%.*s", term.n
1e310 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74  , (const char*)t
1e320 65 72 6d 2e 70 0a 20 20 20 20 20 20 20 20 29 3b  erm.p.        );
1e330 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
1e340 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69   fts5DecodeDocli
1e350 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69  st(&rc, &s, &a[i
1e360 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20  Off], n-iOff);. 
1e370 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c         if( iOff<
1e380 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
1e390 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
1e3a0 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65  32(&a[iOff], nKe
1e3b0 65 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ep);.        }. 
1e3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
1e3d0 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
1e3e0 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  m);.    }else{. 
1e3f0 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74 65       Fts5NodeIte
1e400 72 20 73 73 3b 0a 20 20 20 20 20 20 66 6f 72 28  r ss;.      for(
1e410 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
1e420 28 61 2c 20 6e 2c 20 26 73 73 29 3b 20 73 73 2e  (a, n, &ss); ss.
1e430 61 44 61 74 61 3b 20 66 74 73 35 4e 6f 64 65 49  aData; fts5NodeI
1e440 74 65 72 4e 65 78 74 28 26 72 63 2c 20 26 73 73  terNext(&rc, &ss
1e450 29 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  )){.        if( 
1e460 73 73 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a  ss.term.n==0 ){.
1e470 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e480 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1e490 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c  dPrintf(&rc, &s,
1e4a0 20 22 20 6c 65 66 74 3d 25 64 22 2c 20 73 73 2e   " left=%d", ss.
1e4b0 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20  iChild);.       
1e4c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e4d0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1e4e0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
1e4f0 26 72 63 2c 26 73 2c 20 22 20 5c 22 25 2e 2a 73  &rc,&s, " \"%.*s
1e500 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \"", .          
1e510 20 20 20 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73      ss.term.n, s
1e520 73 2e 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 20  s.term.p.       
1e530 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
1e540 20 20 20 20 20 20 20 20 69 66 28 20 73 73 2e 6e          if( ss.n
1e550 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20 20 20  Empty ){.       
1e560 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1e570 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
1e580 28 26 72 63 2c 20 26 73 2c 20 22 20 65 6d 70 74  (&rc, &s, " empt
1e590 79 3d 25 64 25 73 22 2c 20 73 73 2e 6e 45 6d 70  y=%d%s", ss.nEmp
1e5a0 74 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty,.            
1e5b0 20 20 73 73 2e 62 44 6c 69 64 78 20 3f 20 22 2a    ss.bDlidx ? "*
1e5c0 22 20 3a 20 22 22 0a 20 20 20 20 20 20 20 20 20  " : "".         
1e5d0 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
1e5e0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
1e5f0 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26 73 73  NodeIterFree(&ss
1e600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
1e610 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e620 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
1e630 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
1e640 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  Ctx, (const char
1e650 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49  *)s.p, s.n, SQLI
1e660 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
1e670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
1e680 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1e690 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63 29 3b  _code(pCtx, rc);
1e6a0 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
1e6b0 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a  rFree(&s);.}../*
1e6c0 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
1e6d0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 72 65  ed as part of re
1e6e0 67 69 73 74 65 72 69 6e 67 20 74 68 65 20 46 54  gistering the FT
1e6f0 53 35 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64  S5 module with d
1e700 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1e710 63 74 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67  ction db. It reg
1e720 69 73 74 65 72 73 20 73 65 76 65 72 61 6c 20 75  isters several u
1e730 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
1e740 61 72 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65  ar functions use
1e750 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35  ful.** with FTS5
1e760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1e770 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
1e780 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1e790 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e7a0 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  , some other.** 
1e7b0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1e7c0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  e is returned in
1e7d0 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stead..*/.int sq
1e7e0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
1e7f0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
1e800 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
1e810 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1e820 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ion(.      db, "
1e830 66 74 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c  fts5_decode", 2,
1e840 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1e850 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
1e860 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20  ion, 0, 0.  );. 
1e870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e880 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 69 6e  *.** Set the min
1e890 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73  imum number of s
1e8a0 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 6e 20  egments that an 
1e8b0 61 75 74 6f 2d 6d 65 72 67 65 20 6f 70 65 72 61  auto-merge opera
1e8c0 74 69 6f 6e 20 73 68 6f 75 6c 64 0a 2a 2a 20 61  tion should.** a
1e8d0 74 74 65 6d 70 74 20 74 6f 20 6d 65 72 67 65 20  ttempt to merge 
1e8e0 74 6f 67 65 74 68 65 72 2e 20 41 20 76 61 6c 75  together. A valu
1e8f0 65 20 6f 66 20 31 20 73 65 74 73 20 74 68 65 20  e of 1 sets the 
1e900 6f 62 6a 65 63 74 20 74 6f 20 75 73 65 20 74 68  object to use th
1e910 65 20 0a 2a 2a 20 63 6f 6d 70 69 6c 65 20 74 69  e .** compile ti
1e920 6d 65 20 64 65 66 61 75 6c 74 2e 20 5a 65 72 6f  me default. Zero
1e930 20 6f 72 20 6c 65 73 73 20 64 69 73 61 62 6c 65   or less disable
1e940 73 20 61 75 74 6f 2d 6d 65 72 67 65 20 61 6c 74  s auto-merge alt
1e950 6f 67 65 74 68 65 72 2e 0a 2a 2f 0a 76 6f 69 64  ogether..*/.void
1e960 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
1e970 78 41 75 74 6f 6d 65 72 67 65 28 46 74 73 35 49  xAutomerge(Fts5I
1e980 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 69  ndex *p, int nMi
1e990 6e 4d 65 72 67 65 29 7b 0a 20 20 69 66 28 20 6e  nMerge){.  if( n
1e9a0 4d 69 6e 4d 65 72 67 65 3d 3d 31 20 29 7b 0a 20  MinMerge==1 ){. 
1e9b0 20 20 20 70 2d 3e 6e 4d 69 6e 4d 65 72 67 65 20     p->nMinMerge 
1e9c0 3d 20 46 54 53 35 5f 4d 49 4e 5f 4d 45 52 47 45  = FTS5_MIN_MERGE
1e9d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1e9e0 2d 3e 6e 4d 69 6e 4d 65 72 67 65 20 3d 20 6e 4d  ->nMinMerge = nM
1e9f0 69 6e 4d 65 72 67 65 3b 0a 20 20 7d 0a 7d 0a 0a  inMerge;.  }.}..
1ea00 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
1ea10 4d 75 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20  Multi currently 
1ea20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69  points to a vali
1ea30 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46  d entry (not EOF
1ea40 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
1ea50 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 63 6f  ion appends a co
1ea60 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  py of the positi
1ea70 6f 6e 2d 6c 69 73 74 20 6f 66 20 74 68 65 20 65  on-list of the e
1ea80 6e 74 72 79 20 70 4d 75 6c 74 69 20 0a 2a 2a 20  ntry pMulti .** 
1ea90 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1eaa0 20 74 6f 20 74 6f 20 62 75 66 66 65 72 20 70 42   to to buffer pB
1eab0 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  uf..**.** If an 
1eac0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1ead0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
1eae0 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 74  eft in p->rc. It
1eaf0 20 69 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20 6e   is assumed.** n
1eb00 6f 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  o error has alre
1eb10 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
1eb20 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1eb30 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
1eb40 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
1eb50 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28 0a  ltiIterPoslist(.
1eb60 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
1eb70 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74    Fts5MultiSegIt
1eb80 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 69 6e  er *pMulti,.  in
1eb90 74 20 62 53 7a 2c 0a 20 20 46 74 73 35 42 75 66  t bSz,.  Fts5Buf
1eba0 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 46  fer *pBuf.){.  F
1ebb0 74 73 35 43 68 75 6e 6b 49 74 65 72 20 69 74 65  ts5ChunkIter ite
1ebc0 72 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  r;.  Fts5SegIter
1ebd0 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74 69   *pSeg = &pMulti
1ebe0 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e  ->aSeg[ pMulti->
1ebf0 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20 61  aFirst[1] ];.  a
1ec00 73 73 65 72 74 28 20 66 74 73 35 4d 75 6c 74 69  ssert( fts5Multi
1ec10 49 74 65 72 45 6f 66 28 70 2c 20 70 4d 75 6c 74  IterEof(p, pMult
1ec20 69 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 43  i)==0 );.  fts5C
1ec30 68 75 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c 20  hunkIterInit(p, 
1ec40 70 53 65 67 2c 20 26 69 74 65 72 29 3b 0a 20 20  pSeg, &iter);.  
1ec50 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65  if( fts5ChunkIte
1ec60 72 45 6f 66 28 70 2c 20 26 69 74 65 72 29 3d 3d  rEof(p, &iter)==
1ec70 30 20 29 7b 0a 20 20 20 20 69 66 28 20 62 53 7a  0 ){.    if( bSz
1ec80 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
1ec90 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1eca0 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69  (&p->rc, pBuf, i
1ecb0 74 65 72 2e 6e 52 65 6d 29 3b 0a 20 20 20 20 7d  ter.nRem);.    }
1ecc0 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
1ecd0 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20  ChunkIterEof(p, 
1ece0 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  &iter)==0 ){.   
1ecf0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1ed00 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1ed10 70 42 75 66 2c 20 69 74 65 72 2e 6e 2c 20 69 74  pBuf, iter.n, it
1ed20 65 72 2e 70 29 3b 0a 20 20 20 20 20 20 66 74 73  er.p);.      fts
1ed30 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70  5ChunkIterNext(p
1ed40 2c 20 26 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a  , &iter);.    }.
1ed50 20 20 7d 0a 20 20 66 74 73 35 43 68 75 6e 6b 49    }.  fts5ChunkI
1ed60 74 65 72 52 65 6c 65 61 73 65 28 26 69 74 65 72  terRelease(&iter
1ed70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
1ed80 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65  d fts5DoclistIte
1ed90 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69 73  rNext(Fts5Doclis
1eda0 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  tIter *pIter){. 
1edb0 20 69 66 28 20 70 49 74 65 72 2d 3e 69 3c 70 49   if( pIter->i<pI
1edc0 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 66  ter->n ){.    if
1edd0 28 20 70 49 74 65 72 2d 3e 69 20 29 7b 0a 20 20  ( pIter->i ){.  
1ede0 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a      i64 iDelta;.
1edf0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b        pIter->i +
1ee00 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 49 74  = getVarint(&pIt
1ee10 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c  er->a[pIter->i],
1ee20 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
1ee30 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
1ee40 2d 3e 62 41 73 63 20 29 7b 0a 20 20 20 20 20 20  ->bAsc ){.      
1ee50 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
1ee60 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
1ee70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ee80 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d  pIter->iRowid -=
1ee90 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d   iDelta;.      }
1eea0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1eeb0 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65    pIter->i += ge
1eec0 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e  tVarint(&pIter->
1eed0 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36  a[pIter->i], (u6
1eee0 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
1eef0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  d);.    }.    pI
1ef00 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72  ter->i += getVar
1ef10 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 5b  int32(&pIter->a[
1ef20 70 49 74 65 72 2d 3e 69 5d 2c 20 70 49 74 65 72  pIter->i], pIter
1ef30 2d 3e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  ->nPoslist);.   
1ef40 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
1ef50 20 3d 20 26 70 49 74 65 72 2d 3e 61 5b 70 49 74   = &pIter->a[pIt
1ef60 65 72 2d 3e 69 5d 3b 0a 20 20 20 20 70 49 74 65  er->i];.    pIte
1ef70 72 2d 3e 69 20 2b 3d 20 70 49 74 65 72 2d 3e 6e  r->i += pIter->n
1ef80 50 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65  Poslist;.  }else
1ef90 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f  {.    pIter->aPo
1efa0 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d  slist = 0;.  }.}
1efb0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1efc0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
1efd0 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t(.  Fts5Buffer 
1efe0 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 62 41  *pBuf, .  int bA
1eff0 73 63 2c 20 0a 20 20 46 74 73 35 44 6f 63 6c 69  sc, .  Fts5Docli
1f000 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a 29 7b  stIter *pIter.){
1f010 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
1f020 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
1f030 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 61 20  r));.  pIter->a 
1f040 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74  = pBuf->p;.  pIt
1f050 65 72 2d 3e 6e 20 3d 20 70 42 75 66 2d 3e 6e 3b  er->n = pBuf->n;
1f060 0a 20 20 70 49 74 65 72 2d 3e 62 41 73 63 20 3d  .  pIter->bAsc =
1f070 20 62 41 73 63 3b 0a 20 20 66 74 73 35 44 6f 63   bAsc;.  fts5Doc
1f080 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49 74  listIterNext(pIt
1f090 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  er);.}../*.** Ap
1f0a0 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74  pend a doclist t
1f0b0 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  o buffer pBuf..*
1f0c0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1f0d0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
1f0e0 69 64 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  id(.  int *pRc, 
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1f110 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
1f120 20 69 6e 74 20 62 41 73 63 2c 0a 20 20 46 74 73   int bAsc,.  Fts
1f130 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20  5Buffer *pBuf,  
1f140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f150 42 75 66 66 65 72 20 74 6f 20 77 72 69 74 65 20  Buffer to write 
1f160 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c  to */.  i64 *piL
1f170 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20  astRowid,       
1f180 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
1f190 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  T: Previous rowi
1f1a0 64 20 77 72 69 74 74 65 6e 20 28 69 66 20 61 6e  d written (if an
1f1b0 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  y) */.  i64 iRow
1f1c0 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
1f1d0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1f1e0 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b   to append */.){
1f1f0 0a 20 20 69 66 28 20 70 42 75 66 2d 3e 6e 3d 3d  .  if( pBuf->n==
1f200 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  0 ){.    fts5Buf
1f210 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1f220 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69  pRc, pBuf, iRowi
1f230 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  d);.  }else if( 
1f240 62 41 73 63 3d 3d 30 20 29 7b 0a 20 20 20 20 66  bAsc==0 ){.    f
1f250 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1f260 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c  arint(pRc, pBuf,
1f270 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 2d 20   *piLastRowid - 
1f280 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65  iRowid);.  }else
1f290 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
1f2a0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63  AppendVarint(pRc
1f2b0 2c 20 70 42 75 66 2c 20 69 52 6f 77 69 64 20 2d  , pBuf, iRowid -
1f2c0 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a   *piLastRowid);.
1f2d0 20 20 7d 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77    }.  *piLastRow
1f2e0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a  id = iRowid;.}..
1f2f0 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70 31  /*.** Buffers p1
1f300 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e 20   and p2 contain 
1f310 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20 66  doclists. This f
1f320 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20 74  unction merges t
1f330 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66  he content.** of
1f340 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73 74   the two doclist
1f350 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20 73  s together and s
1f360 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74 6f  ets buffer p1 to
1f370 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66 6f   the result befo
1f380 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
1f390 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1f3a0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
1f3b0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
1f3c0 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e   in p->rc. If an
1f3d0 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c   error has.** al
1f3e0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
1f3f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1f400 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1f410 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
1f420 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a 20  gePrefixLists(. 
1f430 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1f460 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1f470 20 62 41 73 63 2c 0a 20 20 46 74 73 35 42 75 66   bAsc,.  Fts5Buf
1f480 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20  fer *p1,        
1f490 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1f4a0 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  t list to merge 
1f4b0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
1f4c0 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  *p2             
1f4d0 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c       /* Second l
1f4e0 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
1f4f0 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29  ){.  if( p2->n )
1f500 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  {.    i64 iLastR
1f510 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
1f520 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31  s5DoclistIter i1
1f530 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73  ;.    Fts5Doclis
1f540 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74  tIter i2;.    Ft
1f550 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20  s5Buffer out;.  
1f560 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70    Fts5Buffer tmp
1f570 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 75  ;.    memset(&ou
1f580 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74  t, 0, sizeof(out
1f590 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ));.    memset(&
1f5a0 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74  tmp, 0, sizeof(t
1f5b0 6d 70 29 29 3b 0a 0a 20 20 20 20 66 74 73 35 44  mp));..    fts5D
1f5c0 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70  oclistIterInit(p
1f5d0 31 2c 20 62 41 73 63 2c 20 26 69 31 29 3b 0a 20  1, bAsc, &i1);. 
1f5e0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
1f5f0 65 72 49 6e 69 74 28 70 32 2c 20 62 41 73 63 2c  erInit(p2, bAsc,
1f600 20 26 69 32 29 3b 0a 20 20 20 20 77 68 69 6c 65   &i2);.    while
1f610 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 21 3d 30  ( i1.aPoslist!=0
1f620 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74 21   || i2.aPoslist!
1f630 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1f640 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c  i2.aPoslist==0 |
1f650 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 20 26  | (i1.aPoslist &
1f660 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 28 20  & .           ( 
1f670 28 21 62 41 73 63 20 26 26 20 69 31 2e 69 52 6f  (!bAsc && i1.iRo
1f680 77 69 64 3e 69 32 2e 69 52 6f 77 69 64 29 20 7c  wid>i2.iRowid) |
1f690 7c 20 28 62 41 73 63 20 26 26 20 69 31 2e 69 52  | (bAsc && i1.iR
1f6a0 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 29 20  owid<i2.iRowid) 
1f6b0 29 0a 20 20 20 20 20 20 29 29 7b 0a 20 20 20 20  ).      )){.    
1f6c0 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72      /* Copy entr
1f6d0 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20  y from i1 */.   
1f6e0 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
1f6f0 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63  pendDocid(&p->rc
1f700 2c 20 62 41 73 63 2c 20 26 6f 75 74 2c 20 26 69  , bAsc, &out, &i
1f710 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52  LastRowid, i1.iR
1f720 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
1f730 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1f740 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f  arint(&p->rc, &o
1f750 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 29  ut, i1.nPoslist)
1f760 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1f770 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1f780 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e  p->rc, &out, i1.
1f790 6e 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 50 6f  nPoslist, i1.aPo
1f7a0 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  slist);.        
1f7b0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
1f7c0 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20  ext(&i1);.      
1f7d0 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
1f7e0 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20   i1.aPoslist==0 
1f7f0 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31  || i2.iRowid!=i1
1f800 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  .iRowid ){.     
1f810 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79     /* Copy entry
1f820 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20   from i2 */.    
1f830 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
1f840 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c  endDocid(&p->rc,
1f850 20 62 41 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c   bAsc, &out, &iL
1f860 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
1f870 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
1f880 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1f890 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75  rint(&p->rc, &ou
1f8a0 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 29 3b  t, i2.nPoslist);
1f8b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f8c0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1f8d0 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e 6e  ->rc, &out, i2.n
1f8e0 50 6f 73 6c 69 73 74 2c 20 69 32 2e 61 50 6f 73  Poslist, i2.aPos
1f8f0 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66  list);.        f
1f900 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
1f910 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d  xt(&i2);.      }
1f920 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  .      else{.   
1f930 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
1f940 52 65 61 64 65 72 20 72 31 3b 0a 20 20 20 20 20  Reader r1;.     
1f950 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65     Fts5PoslistRe
1f960 61 64 65 72 20 72 32 3b 0a 20 20 20 20 20 20 20  ader r2;.       
1f970 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74   Fts5PoslistWrit
1f980 65 72 20 77 72 69 74 65 72 3b 0a 0a 20 20 20 20  er writer;..    
1f990 20 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74      memset(&writ
1f9a0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 72  er, 0, sizeof(wr
1f9b0 69 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20 20  iter));..       
1f9c0 20 2f 2a 20 4d 65 72 67 65 20 74 68 65 20 74 77   /* Merge the tw
1f9d0 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73  o position lists
1f9e0 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 66 74  . */ .        ft
1f9f0 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
1fa00 69 64 28 26 70 2d 3e 72 63 2c 20 62 41 73 63 2c  id(&p->rc, bAsc,
1fa10 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77   &out, &iLastRow
1fa20 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a  id, i2.iRowid);.
1fa30 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fa40 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20  erZero(&tmp);.  
1fa50 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
1fa60 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
1fa70 69 74 28 2d 31 2c 20 69 31 2e 61 50 6f 73 6c 69  it(-1, i1.aPosli
1fa80 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  st, i1.nPoslist,
1fa90 20 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73   &r1);.        s
1faa0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
1fab0 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31 2c 20  tReaderInit(-1, 
1fac0 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e  i2.aPoslist, i2.
1fad0 6e 50 6f 73 6c 69 73 74 2c 20 26 72 32 29 3b 0a  nPoslist, &r2);.
1fae0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
1faf0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1fb00 26 26 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 7c  && (r1.bEof==0 |
1fb10 7c 20 72 32 2e 62 45 6f 66 3d 3d 30 29 20 29 7b  | r2.bEof==0) ){
1fb20 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
1fb30 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  New;.          i
1fb40 66 28 20 72 32 2e 62 45 6f 66 20 7c 7c 20 28 72  f( r2.bEof || (r
1fb50 31 2e 62 45 6f 66 3d 3d 30 20 26 26 20 72 31 2e  1.bEof==0 && r1.
1fb60 69 50 6f 73 3c 72 32 2e 69 50 6f 73 29 20 29 7b  iPos<r2.iPos) ){
1fb70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e 65  .            iNe
1fb80 77 20 3d 20 72 31 2e 69 50 6f 73 3b 0a 20 20 20  w = r1.iPos;.   
1fb90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fba0 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1fbb0 72 4e 65 78 74 28 26 72 31 29 3b 0a 20 20 20 20  rNext(&r1);.    
1fbc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fbd0 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
1fbe0 72 32 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20  r2.iPos;.       
1fbf0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
1fc00 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
1fc10 74 28 26 72 32 29 3b 0a 20 20 20 20 20 20 20 20  t(&r2);.        
1fc20 20 20 20 20 69 66 28 20 72 31 2e 69 50 6f 73 3d      if( r1.iPos=
1fc30 3d 72 32 2e 69 50 6f 73 20 29 20 73 71 6c 69 74  =r2.iPos ) sqlit
1fc40 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
1fc50 64 65 72 4e 65 78 74 28 26 72 31 29 3b 0a 20 20  derNext(&r1);.  
1fc60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fc70 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1fc80 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72  te3Fts5PoslistWr
1fc90 69 74 65 72 41 70 70 65 6e 64 28 26 74 6d 70 2c  iterAppend(&tmp,
1fca0 20 26 77 72 69 74 65 72 2c 20 69 4e 65 77 29 3b   &writer, iNew);
1fcb0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1fcc0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1fcd0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1fce0 63 2c 20 26 6f 75 74 2c 20 74 6d 70 2e 6e 29 3b  c, &out, tmp.n);
1fcf0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1fd00 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1fd10 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70 2e  ->rc, &out, tmp.
1fd20 6e 2c 20 74 6d 70 2e 70 29 3b 0a 20 20 20 20 20  n, tmp.p);.     
1fd30 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
1fd40 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
1fd50 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
1fd60 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
1fd70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1fd80 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
1fd90 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e  &p->rc, p1, out.
1fda0 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66  n, out.p);.    f
1fdb0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
1fdc0 6d 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  mp);.    fts5Buf
1fdd0 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 20  ferFree(&out);. 
1fde0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1fdf0 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70  d fts5BufferSwap
1fe00 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c  (Fts5Buffer *p1,
1fe10 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 29   Fts5Buffer *p2)
1fe20 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  {.  Fts5Buffer t
1fe30 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31 20  mp = *p1;.  *p1 
1fe40 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20 74  = *p2;.  *p2 = t
1fe50 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  mp;.}..static vo
1fe60 69 64 20 66 74 73 35 53 65 74 75 70 50 72 65 66  id fts5SetupPref
1fe70 69 78 49 74 65 72 28 0a 20 20 46 74 73 35 49 6e  ixIter(.  Fts5In
1fe80 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1fe90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1fea0 65 78 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ex to read from 
1feb0 2a 2f 0a 20 20 69 6e 74 20 62 41 73 63 2c 20 20  */.  int bAsc,  
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fed0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
1fee0 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
1fef0 20 41 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74   ASC" */.  const
1ff00 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20   u8 *pToken,    
1ff10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1ff20 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1ff30 70 72 65 66 69 78 20 74 6f 20 6d 61 74 63 68 20  prefix to match 
1ff40 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  */.  int nToken,
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff60 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1ff70 62 75 66 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e  buffer pToken in
1ff80 20 62 79 74 65 73 20 2a 2f 0a 20 20 46 74 73 35   bytes */.  Fts5
1ff90 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1ffb0 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a  opulate this obj
1ffc0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ect */.){.  Fts5
1ffd0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1ffe0 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  ct;.  Fts5Buffer
1fff0 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74 20   *aBuf;.  const 
20000 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a 0a  int nBuf = 32;..
20010 20 20 61 42 75 66 20 3d 20 28 46 74 73 35 42 75    aBuf = (Fts5Bu
20020 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c  ffer*)fts5IdxMal
20030 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
20040 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66 29 3b  s5Buffer)*nBuf);
20050 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
20060 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
20070 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 61 42 75  , 0);..  if( aBu
20080 66 20 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a  f && pStruct ){.
20090 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
200a0 74 65 72 20 2a 70 44 6f 63 6c 69 73 74 3b 0a 20  ter *pDoclist;. 
200b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 36     int i;.    i6
200c0 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30  4 iLastRowid = 0
200d0 3b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74 69 53  ;.    Fts5MultiS
200e0 65 67 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20  egIter *p1 = 0; 
200f0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
20100 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20 64  used to gather d
20110 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a  ata from index *
20120 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
20130 20 64 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d   doclist;..    m
20140 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20  emset(&doclist, 
20150 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73  0, sizeof(doclis
20160 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  t));.    for(fts
20170 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
20180 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20   pStruct, 0, 1, 
20190 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20  pToken, nToken, 
201a0 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20  -1, 0, &p1);.   
201b0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
201c0 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b  erEof(p, p1)==0;
201d0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
201e0 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 31  tiIterNext(p, p1
201f0 2c 20 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a 20  , 0, 0).    ){. 
20200 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
20210 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
20220 6f 77 69 64 28 70 31 29 3b 0a 20 20 20 20 20 20  owid(p1);.      
20230 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20  int nTerm;.     
20240 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
20250 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
20260 54 65 72 6d 28 70 31 2c 20 26 6e 54 65 72 6d 29  Term(p1, &nTerm)
20270 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20280 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70  memcmp(pToken, p
20290 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e  Term, MIN(nToken
202a0 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a  , nTerm))<=0 );.
202b0 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c        if( nTerm<
202c0 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70  nToken || memcmp
202d0 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
202e0 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b  nToken) ) break;
202f0 0a 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c  ..      if( docl
20300 69 73 74 2e 6e 3e 30 20 0a 20 20 20 20 20 20 20  ist.n>0 .       
20310 26 26 20 28 28 21 62 41 73 63 20 26 26 20 69 52  && ((!bAsc && iR
20320 6f 77 69 64 3e 3d 69 4c 61 73 74 52 6f 77 69 64  owid>=iLastRowid
20330 29 20 7c 7c 20 28 62 41 73 63 20 26 26 20 69 52  ) || (bAsc && iR
20340 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64  owid<=iLastRowid
20350 29 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20  )).      ){..   
20360 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 64 6f       for(i=0; do
20370 63 6c 69 73 74 2e 6e 20 26 26 20 70 2d 3e 72 63  clist.n && p->rc
20380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
20390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
203a0 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20  ert( i<nBuf );. 
203b0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75           if( aBu
203c0 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  f[i].n==0 ){.   
203d0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
203e0 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74  ferSwap(&doclist
203f0 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
20400 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
20410 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74  ferZero(&doclist
20420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
20430 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
20440 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
20450 69 73 74 73 28 70 2c 20 62 41 73 63 2c 20 26 64  ists(p, bAsc, &d
20460 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d  oclist, &aBuf[i]
20470 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
20480 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61  ts5BufferZero(&a
20490 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
204a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
204b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
204c0 20 64 6f 63 6c 69 73 74 2e 6e 3d 3d 30 20 29 7b   doclist.n==0 ){
204d0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
204e0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
204f0 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74  &p->rc, &doclist
20500 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
20510 20 7d 65 6c 73 65 20 69 66 28 20 62 41 73 63 3d   }else if( bAsc=
20520 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  =0 ){.        ft
20530 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
20540 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f  rint(&p->rc, &do
20550 63 6c 69 73 74 2c 20 69 4c 61 73 74 52 6f 77 69  clist, iLastRowi
20560 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  d - iRowid);.   
20570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20580 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
20590 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
205a0 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69   &doclist, iRowi
205b0 64 20 2d 20 69 4c 61 73 74 52 6f 77 69 64 29 3b  d - iLastRowid);
205c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
205d0 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
205e0 69 64 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  id;.      fts5Mu
205f0 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70  ltiIterPoslist(p
20600 2c 20 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69 73  , p1, 1, &doclis
20610 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  t);.    }..    f
20620 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20  or(i=0; i<nBuf; 
20630 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
20640 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
20650 28 70 2c 20 62 41 73 63 2c 20 26 64 6f 63 6c 69  (p, bAsc, &docli
20660 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
20670 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46       fts5BufferF
20680 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20  ree(&aBuf[i]);. 
20690 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c     }.    fts5Mul
206a0 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 31  tiIterFree(p, p1
206b0 29 3b 0a 0a 20 20 20 20 70 44 6f 63 6c 69 73 74  );..    pDoclist
206c0 20 3d 20 28 46 74 73 35 44 6f 63 6c 69 73 74 49   = (Fts5DoclistI
206d0 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c  ter*)fts5IdxMall
206e0 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
206f0 35 44 6f 63 6c 69 73 74 49 74 65 72 29 29 3b 0a  5DoclistIter));.
20700 20 20 20 20 69 66 28 20 21 70 44 6f 63 6c 69 73      if( !pDoclis
20710 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42  t ){.      fts5B
20720 75 66 66 65 72 46 72 65 65 28 26 64 6f 63 6c 69  ufferFree(&docli
20730 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
20740 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 44 6f        pIter->pDo
20750 63 6c 69 73 74 20 3d 20 70 44 6f 63 6c 69 73 74  clist = pDoclist
20760 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c  ;.      fts5Docl
20770 69 73 74 49 74 65 72 49 6e 69 74 28 26 64 6f 63  istIterInit(&doc
20780 6c 69 73 74 2c 20 62 41 73 63 2c 20 70 49 74 65  list, bAsc, pIte
20790 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20  r->pDoclist);.  
207a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53    }.  }..  fts5S
207b0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
207c0 70 53 74 72 75 63 74 29 3b 0a 20 20 73 71 6c 69  pStruct);.  sqli
207d0 74 65 33 5f 66 72 65 65 28 61 42 75 66 29 3b 0a  te3_free(aBuf);.
207e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
207f0 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20  new iterator to 
20800 69 74 65 72 61 74 65 20 74 68 6f 75 67 68 20 61  iterate though a
20810 6c 6c 20 64 6f 63 69 64 73 20 74 68 61 74 20 6d  ll docids that m
20820 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70 65  atch the .** spe
20830 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20  cified token or 
20840 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f  token prefix..*/
20850 0a 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  .Fts5IndexIter *
20860 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
20870 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64  Query(.  Fts5Ind
20880 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
20890 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
208a0 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a  index to query *
208b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
208c0 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
208d0 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72  en, /* Token (or
208e0 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65 72   prefix) to quer
208f0 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66  y for */.  int f
20900 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
20910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20920 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
20930 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f  QUERY_X flags */
20940 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 49  .){.  Fts5IndexI
20950 74 65 72 20 2a 70 52 65 74 3b 0a 20 20 69 6e 74  ter *pRet;.  int
20960 20 69 49 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66   iIdx = 0;..  if
20970 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
20980 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58  DEX_QUERY_PREFIX
20990 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
209a0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
209b0 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 6f  >pConfig;.    fo
209c0 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d  r(iIdx=1; iIdx<=
209d0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
209e0 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20  ; iIdx++){.     
209f0 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50   if( pConfig->aP
20a00 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e  refix[iIdx-1]==n
20a10 54 6f 6b 65 6e 20 29 20 62 72 65 61 6b 3b 0a 20  Token ) break;. 
20a20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 49 64     }.    if( iId
20a30 78 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  x>pConfig->nPref
20a40 69 78 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78  ix ){.      iIdx
20a50 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d   = -1;.    }.  }
20a60 0a 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73 35  ..  pRet = (Fts5
20a70 49 6e 64 65 78 49 74 65 72 2a 29 73 71 6c 69 74  IndexIter*)sqlit
20a80 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
20a90 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 29 29  (Fts5IndexIter))
20aa0 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
20ab0 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c      memset(pRet,
20ac0 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49   0, sizeof(Fts5I
20ad0 6e 64 65 78 49 74 65 72 29 29 3b 0a 0a 20 20 20  ndexIter));..   
20ae0 20 70 52 65 74 2d 3e 70 49 6e 64 65 78 20 3d 20   pRet->pIndex = 
20af0 70 3b 0a 20 20 20 20 69 66 28 20 69 49 64 78 3e  p;.    if( iIdx>
20b00 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 52 65 74  =0 ){.      pRet
20b10 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73 35  ->pStruct = fts5
20b20 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 2c  StructureRead(p,
20b30 20 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66   iIdx);.      if
20b40 28 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74 20  ( pRet->pStruct 
20b50 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ){.        fts5M
20b60 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
20b70 52 65 74 2d 3e 70 53 74 72 75 63 74 2c 20 0a 20  Ret->pStruct, . 
20b80 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78 2c             iIdx,
20b90 20 66 6c 61 67 73 2c 20 28 63 6f 6e 73 74 20 75   flags, (const u
20ba0 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  8*)pToken, nToke
20bb0 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 2d  n, -1, 0, &pRet-
20bc0 3e 70 4d 75 6c 74 69 0a 20 20 20 20 20 20 20 20  >pMulti.        
20bd0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
20be0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
20bf0 62 41 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20  bAsc = (flags & 
20c00 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
20c10 41 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 66  ASC)!=0;.      f
20c20 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74  ts5SetupPrefixIt
20c30 65 72 28 70 2c 20 62 41 73 63 2c 20 28 63 6f 6e  er(p, bAsc, (con
20c40 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e  st u8*)pToken, n
20c50 54 6f 6b 65 6e 2c 20 70 52 65 74 29 3b 0a 20 20  Token, pRet);.  
20c60 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
20c70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->rc ){.    sqli
20c80 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
20c90 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52 65 74  (pRet);.    pRet
20ca0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
20cb0 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
20cc0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
20cd0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
20ce0 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
20cf0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20   argument is at 
20d00 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  EOF..*/.int sqli
20d10 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 46  te3Fts5IterEof(F
20d20 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
20d30 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
20d40 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 20 0a  r->pDoclist ){ .
20d50 20 20 20 20 72 65 74 75 72 6e 20 70 49 74 65 72      return pIter
20d60 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50 6f 73  ->pDoclist->aPos
20d70 6c 69 73 74 3d 3d 30 3b 20 0a 20 20 7d 65 6c 73  list==0; .  }els
20d80 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66 74  e{.    return ft
20d90 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
20da0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
20db0 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20  ter->pMulti);.  
20dc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  }.}../*.** Move 
20dd0 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
20de0 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a  hing rowid. .*/.
20df0 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
20e00 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
20e10 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
20e20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
20e30 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 66 74 73  clist ){.    fts
20e40 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
20e50 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74  (pIter->pDoclist
20e60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20e70 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
20e80 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
20e90 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
20ea0 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49  erNext(pIter->pI
20eb0 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75  ndex, pIter->pMu
20ec0 6c 74 69 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  lti, 0, 0);.  }.
20ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  }../*.** Move to
20ee0 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
20ef0 6e 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63  ng rowid that oc
20f00 63 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72  curs at or after
20f10 20 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20   iMatch. The.** 
20f20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61  definition of "a
20f30 74 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65  t or after" depe
20f40 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74  nds on whether t
20f50 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65  his iterator ite
20f60 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65  rates.** in asce
20f70 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64  nding or descend
20f80 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e  ing rowid order.
20f90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20fa0 46 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d  Fts5IterNextFrom
20fb0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
20fc0 70 49 74 65 72 2c 20 69 36 34 20 69 4d 61 74 63  pIter, i64 iMatc
20fd0 68 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  h){.  if( pIter-
20fe0 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  >pDoclist ){.   
20ff0 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
21000 20 20 2f 2a 20 66 74 73 35 44 6f 63 6c 69 73 74    /* fts5Doclist
21010 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74  IterNextFrom(pIt
21020 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2c 20 69 4d  er->pDoclist, iM
21030 61 74 63 68 29 3b 20 2a 2f 0a 20 20 7d 65 6c 73  atch); */.  }els
21040 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  e{.    fts5Multi
21050 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74  IterNextFrom(pIt
21060 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65  er->pIndex, pIte
21070 72 2d 3e 70 4d 75 6c 74 69 2c 20 69 4d 61 74 63  r->pMulti, iMatc
21080 68 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  h);.  }.}../*.**
21090 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
210a0 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36  ent rowid..*/.i6
210b0 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  4 sqlite3Fts5Ite
210c0 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78  rRowid(Fts5Index
210d0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
210e0 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
210f0 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ist ){.    retur
21100 6e 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  n pIter->pDoclis
21110 74 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 7d 65 6c  t->iRowid;.  }el
21120 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 66  se{.    return f
21130 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
21140 64 28 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29  d(pIter->pMulti)
21150 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
21160 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21170 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
21180 74 61 69 6e 69 6e 67 20 61 20 63 6f 70 79 20 6f  taining a copy o
21190 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  f the position l
211a0 69 73 74 20 66 6f 72 0a 2a 2a 20 74 68 65 20 63  ist for.** the c
211b0 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 4f 75  urrent entry. Ou
211c0 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70  tput variable *p
211d0 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
211e0 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
211f0 65 72 20 0a 2a 2a 20 69 6e 20 62 79 74 65 73 20  er .** in bytes 
21200 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
21210 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
21220 72 6e 65 64 20 62 75 66 66 65 72 20 64 6f 65 73  rned buffer does
21230 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
21240 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72   0x00 terminator
21250 20 62 79 74 65 20 73 74 6f 72 65 64 20 6f 6e 0a   byte stored on.
21260 2a 2a 20 64 69 73 6b 2e 0a 2a 2f 0a 63 6f 6e 73  ** disk..*/.cons
21270 74 20 75 38 20 2a 73 71 6c 69 74 65 33 46 74 73  t u8 *sqlite3Fts
21280 35 49 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73  5IterPoslist(Fts
21290 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
212a0 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69  r, int *pn){.  i
212b0 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69  f( pIter->pDocli
212c0 73 74 20 29 7b 0a 20 20 20 20 2a 70 6e 20 3d 20  st ){.    *pn = 
212d0 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d  pIter->pDoclist-
212e0 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 72  >nPoslist;.    r
212f0 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f  eturn pIter->pDo
21300 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3b  clist->aPoslist;
21310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74  .  }else{.    Ft
21320 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74  s5Index *p = pIt
21330 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  er->pIndex;.    
21340 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
21350 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
21360 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
21370 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 49 74  erPoslist(p, pIt
21380 65 72 2d 3e 70 4d 75 6c 74 69 2c 20 30 2c 20 26  er->pMulti, 0, &
21390 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
213a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
213b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
213c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
213d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 2a   return 0;.    *
213e0 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  pn = pIter->posl
213f0 69 73 74 2e 6e 3b 0a 20 20 20 20 72 65 74 75 72  ist.n;.    retur
21400 6e 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  n pIter->poslist
21410 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  .p;.  }.}../*.**
21420 20 43 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74   Close an iterat
21430 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  or opened by an 
21440 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
21450 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
21460 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Query()..*/.void
21470 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
21480 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49  Close(Fts5IndexI
21490 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
214a0 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
214b0 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  if( pIter->pDocl
214c0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ist ){.      sql
214d0 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d  ite3_free(pIter-
214e0 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 29 3b 0a 20  >pDoclist->a);. 
214f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
21500 65 28 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73  e(pIter->pDoclis
21510 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
21520 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
21530 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 49  erFree(pIter->pI
21540 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70 4d 75  ndex, pIter->pMu
21550 6c 74 69 29 3b 0a 20 20 20 20 20 20 66 74 73 35  lti);.      fts5
21560 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
21570 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29  (pIter->pStruct)
21580 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
21590 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70  erFree(&pIter->p
215a0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  oslist);.    }. 
215b0 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64     fts5CloseRead
215c0 65 72 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  er(pIter->pIndex
215d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
215e0 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ree(pIter);.  }.
215f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  }../*.** Read th
21600 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  e "averages" rec
21610 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 62 75 66  ord into the buf
21620 66 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20  fer supplied as 
21630 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61  the second .** a
21640 72 67 75 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  rgument. Return 
21650 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
21660 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
21670 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
21680 0a 2a 2a 20 69 66 20 61 6e 20 65 72 72 6f 72 20  .** if an error 
21690 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
216a0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 47  qlite3Fts5IndexG
216b0 65 74 41 76 65 72 61 67 65 73 28 46 74 73 35 49  etAverages(Fts5I
216c0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66  ndex *p, Fts5Buf
216d0 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 66 74  fer *pBuf){.  ft
216e0 73 35 44 61 74 61 52 65 61 64 4f 72 42 75 66 66  s5DataReadOrBuff
216f0 65 72 28 70 2c 20 70 42 75 66 2c 20 46 54 53 35  er(p, pBuf, FTS5
21700 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29  _AVERAGES_ROWID)
21710 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
21720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  ;.}../*.** Repla
21730 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22  ce the current "
21740 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
21750 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
21760 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
21770 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73   .** supplied as
21780 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
21790 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
217a0 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
217b0 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64  Averages(Fts5Ind
217c0 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20  ex *p, const u8 
217d0 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
217e0 61 29 7b 0a 20 20 66 74 73 35 44 61 74 61 57 72  a){.  fts5DataWr
217f0 69 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52  ite(p, FTS5_AVER
21800 41 47 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74  AGES_ROWID, pDat
21810 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74  a, nData);.  ret
21820 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a  urn p->rc;.}../*
21830 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
21840 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
21850 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75 6c  locks this modul
21860 65 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d 20  e has read from 
21870 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61  the %_data.** ta
21880 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61 73  ble since it was
21890 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74   created..*/.int
218a0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
218b0 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65 78  xReads(Fts5Index
218c0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
218d0 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a              ->nRead;.}..