/ Hex Artifact Content
Login

Artifact 9233b8b1f519e50d9ec139031032d9211dfcb541:


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 43 52 49 53 49 53 5f  ine FTS5_CRISIS_
06c0: 4d 45 52 47 45 20 20 20 31 36 20 20 20 20 2f 2a  MERGE   16    /*
06d0: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum 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 0a 23 64 65 66 69 6e 65  erge */..#define
0700: 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f   FTS5_MIN_DLIDX_
0710: 53 49 5a 45 20 20 34 20 20 20 20 2f 2a 20 41 64  SIZE  4    /* Ad
0720: 64 20 64 6c 69 64 78 20 69 66 20 74 68 69 73 20  d dlidx if this 
0730: 6d 61 6e 79 20 65 6d 70 74 79 20 70 61 67 65 73  many empty pages
0740: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 61 69   */../*.** Detai
0750: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ls:.**.** The %_
0760: 64 61 74 61 20 74 61 62 6c 65 20 6d 61 6e 61 67  data table manag
0770: 65 64 20 62 79 20 74 68 69 73 20 6d 6f 64 75 6c  ed by this modul
0780: 65 2c 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45  e,.**.**     CRE
0790: 41 54 45 20 54 41 42 4c 45 20 25 5f 64 61 74 61  ATE TABLE %_data
07a0: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
07b0: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
07c0: 4c 4f 42 29 3b 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f  LOB);.**.** , co
07d0: 6e 74 61 69 6e 73 20 74 68 65 20 66 6f 6c 6c 6f  ntains the follo
07e0: 77 69 6e 67 20 35 20 74 79 70 65 73 20 6f 66 20  wing 5 types of 
07f0: 72 65 63 6f 72 64 73 2e 20 53 65 65 20 74 68 65  records. See the
0800: 20 63 6f 6d 6d 65 6e 74 73 20 73 75 72 72 6f 75   comments surrou
0810: 6e 64 69 6e 67 0a 2a 2a 20 74 68 65 20 46 54 53  nding.** the FTS
0820: 35 5f 2a 5f 52 4f 57 49 44 20 6d 61 63 72 6f 73  5_*_ROWID macros
0830: 20 62 65 6c 6f 77 20 66 6f 72 20 61 20 64 65 73   below for a des
0840: 63 72 69 70 74 69 6f 6e 20 6f 66 20 68 6f 77 20  cription of how 
0850: 25 5f 64 61 74 61 20 72 6f 77 69 64 73 20 61 72  %_data rowids ar
0860: 65 20 0a 2a 2a 20 61 73 73 69 67 6e 65 64 20 74  e .** assigned t
0870: 6f 20 65 61 63 68 20 66 6f 20 74 68 65 6d 2e 0a  o each fo them..
0880: 2a 2a 0a 2a 2a 20 31 2e 20 53 74 72 75 63 74 75  **.** 1. Structu
0890: 72 65 20 52 65 63 6f 72 64 73 3a 0a 2a 2a 0a 2a  re Records:.**.*
08a0: 2a 20 20 20 54 68 65 20 73 65 74 20 6f 66 20 73  *   The set of s
08b0: 65 67 6d 65 6e 74 73 20 74 68 61 74 20 6d 61 6b  egments that mak
08c0: 65 20 75 70 20 61 6e 20 69 6e 64 65 78 20 2d 20  e up an index - 
08d0: 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
08e0: 75 72 65 20 2d 20 61 72 65 0a 2a 2a 20 20 20 72  ure - are.**   r
08f0: 65 63 6f 72 64 65 64 20 69 6e 20 61 20 73 69 6e  ecorded in a sin
0900: 67 6c 65 20 72 65 63 6f 72 64 20 77 69 74 68 69  gle record withi
0910: 6e 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  n the %_data tab
0920: 6c 65 2e 20 54 68 65 20 72 65 63 6f 72 64 20 63  le. The record c
0930: 6f 6e 73 69 73 74 73 0a 2a 2a 20 20 20 6f 66 20  onsists.**   of 
0940: 61 20 73 69 6e 67 6c 65 20 33 32 2d 62 69 74 20  a single 32-bit 
0950: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  configuration co
0960: 6f 6b 69 65 20 76 61 6c 75 65 20 66 6f 6c 6c 6f  okie value follo
0970: 77 65 64 20 62 79 20 61 20 6c 69 73 74 20 6f 66  wed by a list of
0980: 20 0a 2a 2a 20 20 20 53 51 4c 69 74 65 20 76 61   .**   SQLite va
0990: 72 69 6e 74 73 2e 20 49 66 20 74 68 65 20 46 54  rints. If the FT
09a0: 53 20 74 61 62 6c 65 20 66 65 61 74 75 72 65 73  S table features
09b0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 69   more than one i
09c0: 6e 64 65 78 20 28 62 65 63 61 75 73 65 0a 2a 2a  ndex (because.**
09d0: 20 20 20 74 68 65 72 65 20 61 72 65 20 6f 6e 65     there are one
09e0: 20 6f 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20   or more prefix 
09f0: 69 6e 64 65 78 65 73 29 2c 20 69 74 20 69 73 20  indexes), it is 
0a00: 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
0a10: 61 6c 6c 20 73 68 61 72 65 0a 2a 2a 20 20 20 74  all share.**   t
0a20: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
0a30: 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6d  alue..**.**   Im
0a40: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
0a50: 69 6e 67 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ing the configur
0a60: 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 2c 20 74 68  ation cookie, th
0a70: 65 20 72 65 63 6f 72 64 20 62 65 67 69 6e 73 20  e record begins 
0a80: 77 69 74 68 0a 2a 2a 20 20 20 74 68 72 65 65 20  with.**   three 
0a90: 76 61 72 69 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  varints:.**.**  
0aa0: 20 20 20 2b 20 6e 75 6d 62 65 72 20 6f 66 20 6c     + number of l
0ab0: 65 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b 20  evels,.**     + 
0ac0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
0ad0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 61 6c 6c 20  segments on all 
0ae0: 6c 65 76 65 6c 73 2c 0a 2a 2a 20 20 20 20 20 2b  levels,.**     +
0af0: 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 20   value of write 
0b00: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  counter..**.**  
0b10: 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20   Then, for each 
0b20: 6c 65 76 65 6c 20 66 72 6f 6d 20 30 20 74 6f 20  level from 0 to 
0b30: 6e 4d 61 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  nMax:.**.**     
0b40: 2b 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  + number of inpu
0b50: 74 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6f 6e  t segments in on
0b60: 67 6f 69 6e 67 20 6d 65 72 67 65 2e 0a 2a 2a 20  going merge..** 
0b70: 20 20 20 20 2b 20 74 6f 74 61 6c 20 6e 75 6d 62      + total numb
0b80: 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 69  er of segments i
0b90: 6e 20 6c 65 76 65 6c 2e 0a 2a 2a 20 20 20 20 20  n level..**     
0ba0: 2b 20 66 6f 72 20 65 61 63 68 20 73 65 67 6d 65  + for each segme
0bb0: 6e 74 20 66 72 6f 6d 20 6f 6c 64 65 73 74 20 74  nt from oldest t
0bc0: 6f 20 6e 65 77 65 73 74 3a 0a 2a 2a 20 20 20 20  o newest:.**    
0bd0: 20 20 20 20 20 2b 20 73 65 67 6d 65 6e 74 20 69       + segment i
0be0: 64 20 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a  d (always > 0).*
0bf0: 2a 20 20 20 20 20 20 20 20 20 2b 20 62 2d 74 72  *         + b-tr
0c00: 65 65 20 68 65 69 67 68 74 20 28 31 20 2d 3e 20  ee height (1 -> 
0c10: 72 6f 6f 74 20 69 73 20 6c 65 61 66 2c 20 32 20  root is leaf, 2 
0c20: 2d 3e 20 72 6f 6f 74 20 69 73 20 70 61 72 65 6e  -> root is paren
0c30: 74 20 6f 66 20 6c 65 61 66 20 65 74 63 2e 29 0a  t of leaf etc.).
0c40: 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 72  **         + fir
0c50: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
0c60: 62 65 72 20 28 6f 66 74 65 6e 20 31 29 0a 2a 2a  ber (often 1).**
0c70: 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61 6c           + final
0c80: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
0c90: 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20 41  r.**.** 2. The A
0ca0: 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a 0a  verages Record:.
0cb0: 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c 65  **.**   A single
0cc0: 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74   record within t
0cd0: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
0ce0: 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20 6c   The data is a l
0cf0: 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e 0a  ist of varints..
0d00: 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20 76  **   The first v
0d10: 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
0d20: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
0d30: 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20 66  e index. Then, f
0d40: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a 2a  or each column.*
0d50: 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  *   from left to
0d60: 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74 61   right, the tota
0d70: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b 65  l number of toke
0d80: 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  ns in the column
0d90: 20 66 6f 72 20 61 6c 6c 20 0a 2a 2a 20 20 20 72   for all .**   r
0da0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0db0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0dc0: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0dd0: 20 20 20 54 45 52 4d 20 44 4f 43 4c 49 53 54 20     TERM DOCLIST 
0de0: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0df0: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e00: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e10: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e20: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e30: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e40: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 68 65 20  l format of the 
0e50: 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74  term/doclist dat
0e60: 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  a is:.**.**     
0e70: 20 20 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a      varint : siz
0e80: 65 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a  e of first term.
0e90: 2a 2a 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a  **         blob:
0ea0: 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 64      first term d
0eb0: 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64  ata.**         d
0ec0: 6f 63 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f  oclist: first do
0ed0: 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20  clist.**        
0ee0: 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a   zero-or-more {.
0ef0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61 72  **           var
0f00: 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20  int:  number of 
0f10: 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20  bytes in common 
0f20: 77 69 74 68 20 70 72 65 76 69 6f 75 73 20 74 65  with previous te
0f30: 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  rm.**           
0f40: 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20  varint:  number 
0f50: 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20  of bytes of new 
0f60: 74 65 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29  term data (nNew)
0f70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c  .**           bl
0f80: 6f 62 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65  ob:    nNew byte
0f90: 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61  s of new term da
0fa0: 74 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ta.**           
0fb0: 64 6f 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f  doclist: next do
0fc0: 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20  clist.**        
0fd0: 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63   }.**.**     doc
0fe0: 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a  list format:.**.
0ff0: 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e  **         varin
1000: 74 3a 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a  t:  first rowid.
1010: 2a 2a 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69  **         posli
1020: 73 74 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73  st: first poslis
1030: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72  t.**         zer
1040: 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20  o-or-more {.**  
1050: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1060: 20 20 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61    rowid delta (a
1070: 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20  lways > 0).**   
1080: 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a          poslist:
1090: 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a 2a   first poslist.*
10a0: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20 20  *         }.**  
10b0: 20 20 20 20 20 20 20 30 78 30 30 20 62 79 74 65         0x00 byte
10c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 6f 73 6c 69  .**.**     posli
10d0: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
10e0: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
10f0: 20 73 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74   size of poslist
1100: 20 69 6e 20 62 79 74 65 73 2e 20 6e 6f 74 20 69   in bytes. not i
1110: 6e 63 6c 75 64 69 6e 67 20 74 68 69 73 20 66 69  ncluding this fi
1120: 65 6c 64 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  eld..**         
1130: 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74  collist: collist
1140: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 30 0a 2a 2a   for column 0.**
1150: 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f 72           zero-or
1160: 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20 20  -more {.**      
1170: 20 20 20 20 20 30 78 30 31 20 62 79 74 65 0a 2a       0x01 byte.*
1180: 2a 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69  *           vari
1190: 6e 74 3a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  nt: column numbe
11a0: 72 20 28 49 29 0a 2a 2a 20 20 20 20 20 20 20 20  r (I).**        
11b0: 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c 6c     collist: coll
11c0: 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 49  ist for column I
11d0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a  .**         }.**
11e0: 0a 2a 2a 20 20 20 20 20 63 6f 6c 6c 69 73 74 20  .**     collist 
11f0: 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  format:.**.**   
1200: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 66 69        varint: fi
1210: 72 73 74 20 6f 66 66 73 65 74 20 2b 20 32 0a 2a  rst offset + 2.*
1220: 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d 6f  *         zero-o
1230: 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20 20  r-more {.**     
1240: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 6f 66        varint: of
1250: 66 73 65 74 20 64 65 6c 74 61 20 2b 20 32 0a 2a  fset delta + 2.*
1260: 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a  *         }.**.*
1270: 2a 20 20 20 50 41 47 49 4e 41 54 49 4f 4e 0a 2a  *   PAGINATION.*
1280: 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20 66 6f 72  *.**     The for
1290: 6d 61 74 20 64 65 73 63 72 69 62 65 64 20 61 62  mat described ab
12a0: 6f 76 65 20 69 73 20 6f 6e 6c 79 20 61 63 63 75  ove is only accu
12b0: 72 61 74 65 20 69 66 20 74 68 65 20 65 6e 74 69  rate if the enti
12c0: 72 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 0a  re term/doclist.
12d0: 2a 2a 20 20 20 20 20 64 61 74 61 20 66 69 74 73  **     data fits
12e0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 6c 65 61   on a single lea
12f0: 66 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  f page. If this 
1300: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
1310: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 20   the format.**  
1320: 20 20 20 69 73 20 63 68 61 6e 67 65 64 20 69 6e     is changed in
1330: 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a   two ways:.**.**
1340: 20 20 20 20 20 20 20 2b 20 69 66 20 74 68 65 20         + if the 
1350: 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 61  first rowid on a
1360: 20 70 61 67 65 20 6f 63 63 75 72 73 20 62 65 66   page occurs bef
1370: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 74 65  ore the first te
1380: 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20 20 20 20  rm, it.**       
1390: 20 20 69 73 20 73 74 6f 72 65 64 20 61 73 20 61    is stored as a
13a0: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 3a 0a   literal value:.
13b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
13c0: 20 20 76 61 72 69 6e 74 3a 20 20 66 69 72 73 74    varint:  first
13d0: 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20 20 20 20   rowid.**.**    
13e0: 20 20 20 2b 20 74 68 65 20 66 69 72 73 74 20 74     + the first t
13f0: 65 72 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65  erm on each page
1400: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
1410: 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 74 68  e same way as th
1420: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 65 72  e.**         ver
1430: 79 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  y first term of 
1440: 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a 2a 2a 0a  the segment:.**.
1450: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 76  **             v
1460: 61 72 69 6e 74 20 3a 20 73 69 7a 65 20 6f 66 20  arint : size of 
1470: 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a 20 20 20  first term.**   
1480: 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20            blob: 
1490: 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61     first term da
14a0: 74 61 0a 2a 2a 0a 2a 2a 20 20 20 20 20 45 61 63  ta.**.**     Eac
14b0: 68 20 6c 65 61 66 20 70 61 67 65 20 62 65 67 69  h leaf page begi
14c0: 6e 73 20 77 69 74 68 3a 0a 2a 2a 0a 2a 2a 20 20  ns with:.**.**  
14d0: 20 20 20 20 20 2b 20 32 2d 62 79 74 65 20 75 6e       + 2-byte un
14e0: 73 69 67 6e 65 64 20 63 6f 6e 74 61 69 6e 69 6e  signed containin
14f0: 67 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  g offset to firs
1500: 74 20 72 6f 77 69 64 20 28 6f 72 20 30 29 2e 0a  t rowid (or 0)..
1510: 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74  **       + 2-byt
1520: 65 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61  e unsigned conta
1530: 69 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20  ining offset to 
1540: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 72 20 30  first term (or 0
1550: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 6f 6c 6c 6f  )..**.**   Follo
1560: 77 65 64 20 62 79 20 74 65 72 6d 2f 64 6f 63 6c  wed by term/docl
1570: 69 73 74 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ist data..**.** 
1580: 34 2e 20 53 65 67 6d 65 6e 74 20 69 6e 74 65 72  4. Segment inter
1590: 69 6f 72 20 6e 6f 64 65 73 3a 0a 2a 2a 0a 2a 2a  ior nodes:.**.**
15a0: 20 20 20 54 68 65 20 69 6e 74 65 72 69 6f 72 20     The interior 
15b0: 6e 6f 64 65 73 20 74 75 72 6e 20 74 68 65 20 6c  nodes turn the l
15c0: 69 73 74 20 6f 66 20 6c 65 61 76 65 73 20 69 6e  ist of leaves in
15d0: 74 6f 20 61 20 62 2b 74 72 65 65 2e 20 0a 2a 2a  to a b+tree. .**
15e0: 0a 2a 2a 20 20 20 45 61 63 68 20 69 6e 74 65 72  .**   Each inter
15f0: 69 6f 72 20 6e 6f 64 65 20 62 65 67 69 6e 73 20  ior node begins 
1600: 77 69 74 68 20 61 20 76 61 72 69 6e 74 20 2d 20  with a varint - 
1610: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1620: 6f 66 20 74 68 65 20 6c 65 66 74 0a 2a 2a 20 20  of the left.**  
1630: 20 6d 6f 73 74 20 63 68 69 6c 64 20 6e 6f 64 65   most child node
1640: 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  . Following this
1650: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20  , for each leaf 
1660: 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20  page except the 
1670: 66 69 72 73 74 2c 0a 2a 2a 20 20 20 74 68 65 20  first,.**   the 
1680: 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 20 63  interior nodes c
1690: 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  ontain:.**.**   
16a0: 20 20 61 29 20 49 66 20 74 68 65 20 6c 65 61 66    a) If the leaf
16b0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61   page contains a
16c0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d  t least one term
16d0: 2c 20 74 68 65 6e 20 61 20 74 65 72 6d 2d 70 72  , then a term-pr
16e0: 65 66 69 78 20 74 68 61 74 0a 2a 2a 20 20 20 20  efix that.**    
16f0: 20 20 20 20 69 73 20 67 72 65 61 74 65 72 20 74      is greater t
1700: 68 61 6e 20 61 6c 6c 20 70 72 65 76 69 6f 75 73  han all previous
1710: 20 74 65 72 6d 73 2c 20 61 6e 64 20 6c 65 73 73   terms, and less
1720: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1730: 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
1740: 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  first term on th
1750: 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a  e leaf page..**.
1760: 2a 2a 20 20 20 20 20 62 29 20 49 66 20 74 68 65  **     b) If the
1770: 20 6c 65 61 66 20 70 61 67 65 20 6e 6f 20 74 65   leaf page no te
1780: 72 6d 73 2c 20 61 20 72 65 63 6f 72 64 20 69 6e  rms, a record in
1790: 64 69 63 61 74 69 6e 67 20 68 6f 77 20 6d 61 6e  dicating how man
17a0: 79 20 63 6f 6e 73 65 63 75 74 69 76 65 0a 2a 2a  y consecutive.**
17b0: 20 20 20 20 20 20 20 20 6c 65 61 76 65 73 20 63          leaves c
17c0: 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2c  ontain no terms,
17d0: 20 61 6e 64 20 77 68 65 74 68 65 72 20 6f 72 20   and whether or 
17e0: 6e 6f 74 20 74 68 65 72 65 20 69 73 20 61 6e 20  not there is an 
17f0: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 20 20  associated.**   
1800: 20 20 20 20 20 62 79 2d 72 6f 77 69 64 20 69 6e       by-rowid in
1810: 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  dex record..**.*
1820: 2a 20 20 20 42 79 20 64 65 66 69 6e 69 74 69 6f  *   By definitio
1830: 6e 2c 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  n, there is neve
1840: 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  r more than one 
1850: 74 79 70 65 20 28 62 29 20 72 65 63 6f 72 64 20  type (b) record 
1860: 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a 20 20 20 54  in a row..**   T
1870: 79 70 65 20 28 62 29 20 72 65 63 6f 72 64 73 20  ype (b) records 
1880: 6f 6e 6c 79 20 65 76 65 72 20 61 70 70 65 61 72  only ever appear
1890: 20 6f 6e 20 68 65 69 67 68 74 3d 31 20 70 61 67   on height=1 pag
18a0: 65 73 20 2d 20 69 6d 6d 65 64 69 61 74 65 20 70  es - immediate p
18b0: 61 72 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 6c  arents.**   of l
18c0: 65 61 76 65 73 2e 20 4f 6e 6c 79 20 74 79 70 65  eaves. Only type
18d0: 20 28 61 29 20 72 65 63 6f 72 64 73 20 61 72 65   (a) records are
18e0: 20 70 75 73 68 65 64 20 74 6f 20 68 69 67 68 65   pushed to highe
18f0: 72 20 6c 65 76 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20  r levels..**.** 
1900: 20 20 54 65 72 6d 20 66 6f 72 6d 61 74 3a 0a 2a    Term format:.*
1910: 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65  *.**     * Numbe
1920: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 6f  r of bytes in co
1930: 6d 6d 6f 6e 20 77 69 74 68 20 70 72 65 76 69 6f  mmon with previo
1940: 75 73 20 74 65 72 6d 20 70 6c 75 73 20 32 2c 20  us term plus 2, 
1950: 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 20  as a varint..** 
1960: 20 20 20 20 2a 20 4e 75 6d 62 65 72 20 6f 66 20      * Number of 
1970: 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72  bytes of new ter
1980: 6d 20 64 61 74 61 2c 20 61 73 20 61 20 76 61 72  m data, as a var
1990: 69 6e 74 2e 0a 2a 2a 20 20 20 20 20 2a 20 6e 65  int..**     * ne
19a0: 77 20 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a  w term data..**.
19b0: 2a 2a 20 20 20 4e 6f 2d 74 65 72 6d 20 66 6f 72  **   No-term for
19c0: 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  mat:.**.**     *
19d0: 20 65 69 74 68 65 72 20 61 6e 20 30 78 30 30 20   either an 0x00 
19e0: 6f 72 20 30 78 30 31 20 62 79 74 65 2e 20 49 66  or 0x01 byte. If
19f0: 20 74 68 65 20 76 61 6c 75 65 20 30 78 30 31 20   the value 0x01 
1a00: 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68  is used, then th
1a10: 65 72 65 20 0a 2a 2a 20 20 20 20 20 20 20 69 73  ere .**       is
1a20: 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 69   an associated i
1a30: 6e 64 65 78 2d 62 79 2d 72 6f 77 69 64 20 72 65  ndex-by-rowid re
1a40: 63 6f 72 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 74  cord..**     * t
1a50: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 7a 65 72  he number of zer
1a60: 6f 2d 74 65 72 6d 20 6c 65 61 76 65 73 20 61 73  o-term leaves as
1a70: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a80: 20 35 2e 20 53 65 67 6d 65 6e 74 20 64 6f 63 6c   5. Segment docl
1a90: 69 73 74 20 69 6e 64 65 78 65 73 3a 0a 2a 2a 0a  ist indexes:.**.
1aa0: 2a 2a 20 20 20 41 20 6c 69 73 74 20 6f 66 20 76  **   A list of v
1ab0: 61 72 69 6e 74 73 20 2d 20 74 68 65 20 66 69 72  arints - the fir
1ac0: 73 74 20 64 6f 63 69 64 20 6f 6e 20 65 61 63 68  st docid on each
1ad0: 20 70 61 67 65 20 28 73 74 61 72 74 69 6e 67 20   page (starting 
1ae0: 77 69 74 68 20 74 68 65 0a 2a 2a 20 20 20 66 69  with the.**   fi
1af0: 72 73 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67  rst termless pag
1b00: 65 29 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73  e) of the doclis
1b10: 74 2e 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  t. First element
1b20: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20   in the list is 
1b30: 61 0a 2a 2a 20 20 20 6c 69 74 65 72 61 6c 20 64  a.**   literal d
1b40: 6f 63 69 64 2e 20 45 61 63 68 20 64 6f 63 69 64  ocid. Each docid
1b50: 20 74 68 65 72 65 61 66 74 65 72 20 69 73 20 61   thereafter is a
1b60: 20 28 6e 65 67 61 74 69 76 65 29 20 64 65 6c 74   (negative) delt
1b70: 61 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 20  a. If there.**  
1b80: 20 61 72 65 20 6e 6f 20 64 6f 63 69 64 73 20 61   are no docids a
1b90: 74 20 61 6c 6c 20 6f 6e 20 61 20 70 61 67 65 2c  t all on a page,
1ba0: 20 61 20 30 78 30 30 20 62 79 74 65 20 74 61 6b   a 0x00 byte tak
1bb0: 65 73 20 74 68 65 20 70 6c 61 63 65 20 6f 66 20  es the place of 
1bc0: 74 68 65 0a 2a 2a 20 20 20 64 65 6c 74 61 20 76  the.**   delta v
1bd0: 61 6c 75 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  alue..*/../*.** 
1be0: 52 6f 77 69 64 73 20 66 6f 72 20 74 68 65 20 61  Rowids for the a
1bf0: 76 65 72 61 67 65 73 20 61 6e 64 20 73 74 72 75  verages and stru
1c00: 63 74 75 72 65 20 72 65 63 6f 72 64 73 20 69 6e  cture records in
1c10: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
1c20: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  e..*/.#define FT
1c30: 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
1c40: 44 20 20 20 20 20 31 20 20 20 20 2f 2a 20 52 6f  D     1    /* Ro
1c50: 77 69 64 20 75 73 65 64 20 66 6f 72 20 74 68 65  wid used for the
1c60: 20 61 76 65 72 61 67 65 73 20 72 65 63 6f 72 64   averages record
1c70: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35   */.#define FTS5
1c80: 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
1c90: 28 69 49 64 78 29 20 28 31 30 20 2b 20 28 69 49  (iIdx) (10 + (iI
1ca0: 64 78 29 29 20 20 20 20 20 2f 2a 20 46 6f 72 20  dx))     /* For 
1cb0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cc0: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72  s */../*.** Macr
1cd0: 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 74  os determining t
1ce0: 68 65 20 72 6f 77 69 64 73 20 75 73 65 64 20 62  he rowids used b
1cf0: 79 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 73 2e  y segment nodes.
1d00: 20 41 6c 6c 20 6e 6f 64 65 73 20 69 6e 20 61 6c   All nodes in al
1d10: 6c 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 66 6f  l.** segments fo
1d20: 72 20 61 6c 6c 20 69 6e 64 65 78 65 73 20 28 74  r all indexes (t
1d30: 68 65 20 72 65 67 75 6c 61 72 20 46 54 53 20 69  he regular FTS i
1d40: 6e 64 65 78 20 61 6e 64 20 61 6e 79 20 70 72 65  ndex and any pre
1d50: 66 69 78 20 69 6e 64 65 78 65 73 29 0a 2a 2a 20  fix indexes).** 
1d60: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
1d70: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 77  e %_data table w
1d80: 69 74 68 20 6c 61 72 67 65 20 70 6f 73 69 74 69  ith large positi
1d90: 76 65 20 72 6f 77 69 64 73 2e 0a 2a 2a 0a 2a 2a  ve rowids..**.**
1da0: 20 54 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   The %_data tabl
1db0: 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 75 70  e may contain up
1dc0: 20 74 6f 20 28 31 3c 3c 46 54 53 35 5f 53 45 47   to (1<<FTS5_SEG
1dd0: 4d 45 4e 54 5f 49 4e 44 45 58 5f 42 49 54 53 29  MENT_INDEX_BITS)
1de0: 20 0a 2a 2a 20 69 6e 64 65 78 65 73 20 2d 20 6f   .** indexes - o
1df0: 6e 65 20 72 65 67 75 6c 61 72 20 74 65 72 6d 20  ne regular term 
1e00: 69 6e 64 65 78 20 61 6e 64 20 7a 65 72 6f 20 6f  index and zero o
1e10: 72 20 6d 6f 72 65 20 70 72 65 66 69 78 20 69 6e  r more prefix in
1e20: 64 65 78 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63  dexes..**.** Eac
1e30: 68 20 73 65 67 6d 65 6e 74 20 69 6e 20 61 6e 20  h segment in an 
1e40: 69 6e 64 65 78 20 68 61 73 20 61 20 75 6e 69 71  index has a uniq
1e50: 75 65 20 69 64 20 67 72 65 61 74 65 72 20 74 68  ue id greater th
1e60: 61 6e 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45  an zero..**.** E
1e70: 61 63 68 20 6e 6f 64 65 20 69 6e 20 61 20 73 65  ach node in a se
1e80: 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 69 73 20  gment b-tree is 
1e90: 61 73 73 69 67 6e 65 64 20 61 20 22 70 61 67 65  assigned a "page
1ea0: 20 6e 75 6d 62 65 72 22 20 74 68 61 74 20 69 73   number" that is
1eb0: 20 75 6e 69 71 75 65 0a 2a 2a 20 77 69 74 68 69   unique.** withi
1ec0: 6e 20 6e 6f 64 65 73 20 6f 66 20 69 74 73 20 68  n nodes of its h
1ed0: 65 69 67 68 74 20 77 69 74 68 69 6e 20 74 68 65  eight within the
1ee0: 20 73 65 67 6d 65 6e 74 20 28 6c 65 61 66 20 6e   segment (leaf n
1ef0: 6f 64 65 73 20 68 61 76 65 20 61 20 68 65 69 67  odes have a heig
1f00: 68 74 20 0a 2a 2a 20 6f 66 20 30 2c 20 70 61 72  ht .** of 0, par
1f10: 65 6e 74 73 20 31 2c 20 65 74 63 2e 29 2e 20 50  ents 1, etc.). P
1f20: 61 67 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  age numbers are 
1f30: 61 6c 6c 6f 63 61 74 65 64 20 73 65 71 75 65 6e  allocated sequen
1f40: 74 69 61 6c 6c 79 20 73 6f 20 74 68 61 74 0a 2a  tially so that.*
1f50: 2a 20 61 20 6e 6f 64 65 73 20 70 61 67 65 20 6e  * a nodes page n
1f60: 75 6d 62 65 72 20 69 73 20 61 6c 77 61 79 73 20  umber is always 
1f70: 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 20 69 74  one more than it
1f80: 73 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 2e 0a  s left sibling..
1f90: 2a 2a 0a 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  **.** The rowid 
1fa0: 66 6f 72 20 61 20 6e 6f 64 65 20 69 73 20 74 68  for a node is th
1fb0: 65 6e 20 66 6f 75 6e 64 20 75 73 69 6e 67 20 74  en found using t
1fc0: 68 65 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  he FTS5_SEGMENT_
1fd0: 52 4f 57 49 44 28 29 20 6d 61 63 72 6f 0a 2a 2a  ROWID() macro.**
1fe0: 20 62 65 6c 6f 77 2e 20 54 68 65 20 46 54 53 35   below. The FTS5
1ff0: 5f 53 45 47 4d 45 4e 54 5f 2a 5f 42 49 54 53 20  _SEGMENT_*_BITS 
2000: 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20 74 68  macros define th
2010: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
2020: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 65 6e 63 6f   used.** to enco
2030: 64 65 20 74 68 65 20 74 68 72 65 65 20 46 54 53  de the three FTS
2040: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
2050: 29 20 61 72 67 75 6d 65 6e 74 73 2e 20 54 68 69  ) arguments. Thi
2060: 73 20 6d 6f 64 75 6c 65 20 72 65 74 75 72 6e 73  s module returns
2070: 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  .** SQLITE_FULL 
2080: 61 6e 64 20 66 61 69 6c 73 20 74 68 65 20 63 75  and fails the cu
2090: 72 72 65 6e 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrent operation 
20a0: 69 66 20 74 68 65 79 20 65 76 65 72 20 70 72 6f  if they ever pro
20b0: 76 65 20 74 6f 6f 20 73 6d 61 6c 6c 2e 0a 2a 2f  ve too small..*/
20c0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41  .#define FTS5_DA
20d0: 54 41 5f 49 44 58 5f 42 20 20 20 20 20 35 20 20  TA_IDX_B     5  
20e0: 20 20 20 2f 2a 20 4d 61 78 20 6f 66 20 33 31 20     /* Max of 31 
20f0: 70 72 65 66 69 78 20 69 6e 64 65 78 65 73 20 2a  prefix indexes *
2100: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  /.#define FTS5_D
2110: 41 54 41 5f 49 44 5f 42 20 20 20 20 20 31 36 20  ATA_ID_B     16 
2120: 20 20 20 20 2f 2a 20 4d 61 78 20 73 65 67 20 69      /* Max seg i
2130: 64 20 6e 75 6d 62 65 72 20 36 35 35 33 35 20 2a  d number 65535 *
2140: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  /.#define FTS5_D
2150: 41 54 41 5f 48 45 49 47 48 54 5f 42 20 20 35 20  ATA_HEIGHT_B  5 
2160: 20 20 20 20 2f 2a 20 4d 61 78 20 62 2d 74 72 65      /* Max b-tre
2170: 65 20 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a  e height of 32 *
2180: 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44  /.#define FTS5_D
2190: 41 54 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20  ATA_PAGE_B   31 
21a0: 20 20 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20      /* Max page 
21b0: 6e 75 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38  number of 214748
21c0: 33 36 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  3648 */..#define
21d0: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
21e0: 57 49 44 28 69 64 78 2c 20 73 65 67 69 64 2c 20  WID(idx, segid, 
21f0: 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 28 20  height, pgno) ( 
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2220: 29 28 69 64 78 29 20 20 20 20 3c 3c 20 28 46 54  )(idx)    << (FT
2230: 53 35 5f 44 41 54 41 5f 49 44 5f 42 20 2b 20 46  S5_DATA_ID_B + F
2240: 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20  TS5_DATA_PAGE_B 
2250: 2b 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  + FTS5_DATA_HEIG
2260: 48 54 5f 42 29 29 20 2b 20 5c 0a 20 28 28 69 36  HT_B)) + \. ((i6
2270: 34 29 28 73 65 67 69 64 29 20 20 3c 3c 20 28 46  4)(segid)  << (F
2280: 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20  TS5_DATA_PAGE_B 
2290: 2b 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  + FTS5_DATA_HEIG
22a0: 48 54 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20  HT_B)) +        
22b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69            \. ((i
22c0: 36 34 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28  64)(height) << (
22d0: 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
22e0: 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  )) +            
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28             \. ((
2310: 69 36 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20  i64)(pgno))     
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a              \.).
2360: 0a 23 69 66 20 46 54 53 35 5f 4d 41 58 5f 50 52  .#if FTS5_MAX_PR
2370: 45 46 49 58 5f 49 4e 44 45 58 45 53 20 3e 20 28  EFIX_INDEXES > (
2380: 28 31 3c 3c 46 54 53 35 5f 44 41 54 41 5f 49 44  (1<<FTS5_DATA_ID
2390: 58 5f 42 29 2d 31 29 20 0a 23 20 65 72 72 6f 72  X_B)-1) .# error
23a0: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
23b0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
23c0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
23d0: 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 69 67 68 74  /*.** The height
23e0: 20 6f 66 20 73 65 67 6d 65 6e 74 20 62 2d 74 72   of segment b-tr
23f0: 65 65 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ees is actually 
2400: 6c 69 6d 69 74 65 64 20 74 6f 20 6f 6e 65 20 6c  limited to one l
2410: 65 73 73 20 74 68 61 6e 20 0a 2a 2a 20 28 31 3c  ess than .** (1<
2420: 3c 48 45 49 47 48 54 5f 42 49 54 53 29 2e 20 54  <HEIGHT_BITS). T
2430: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
2440: 68 65 20 72 6f 77 69 64 20 61 64 64 72 65 73 73  he rowid address
2450: 20 73 70 61 63 65 20 66 6f 72 20 6e 6f 64 65 73   space for nodes
2460: 0a 2a 2a 20 77 69 74 68 20 73 75 63 68 20 61 20  .** with such a 
2470: 68 65 69 67 68 74 20 69 73 20 75 73 65 64 20 62  height is used b
2480: 79 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 65  y doclist indexe
2490: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  s..*/.#define FT
24a0: 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58 5f 48  S5_SEGMENT_MAX_H
24b0: 45 49 47 48 54 20 28 28 31 20 3c 3c 20 46 54 53  EIGHT ((1 << FTS
24c0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29  5_DATA_HEIGHT_B)
24d0: 2d 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  -1)../*.** The r
24e0: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 64 6f 63  owid for the doc
24f0: 6c 69 73 74 20 69 6e 64 65 78 20 61 73 73 6f 63  list index assoc
2500: 69 61 74 65 64 20 77 69 74 68 20 6c 65 61 66 20  iated with leaf 
2510: 70 61 67 65 20 70 67 6e 6f 20 6f 66 20 73 65 67  page pgno of seg
2520: 6d 65 6e 74 0a 2a 2a 20 73 65 67 69 64 20 69 6e  ment.** segid in
2530: 20 69 6e 64 65 78 20 69 64 78 2e 0a 2a 2f 0a 23   index idx..*/.#
2540: 64 65 66 69 6e 65 20 46 54 53 35 5f 44 4f 43 4c  define FTS5_DOCL
2550: 49 53 54 5f 49 44 58 5f 52 4f 57 49 44 28 69 64  IST_IDX_ROWID(id
2560: 78 2c 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 20  x, segid, pgno) 
2570: 5c 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f 53  \.        FTS5_S
2580: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 64 78  EGMENT_ROWID(idx
2590: 2c 20 73 65 67 69 64 2c 20 46 54 53 35 5f 53 45  , segid, FTS5_SE
25a0: 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48 54  GMENT_MAX_HEIGHT
25b0: 2c 20 70 67 6e 6f 29 0a 0a 23 69 66 64 65 66 20  , pgno)..#ifdef 
25c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
25d0: 74 69 63 20 69 6e 74 20 66 74 73 35 43 6f 72 72  tic int fts5Corr
25e0: 75 70 74 28 29 20 7b 20 72 65 74 75 72 6e 20 53  upt() { return S
25f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54  QLITE_CORRUPT_VT
2600: 41 42 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 46  AB; }.# define F
2610: 54 53 35 5f 43 4f 52 52 55 50 54 20 66 74 73 35  TS5_CORRUPT fts5
2620: 43 6f 72 72 75 70 74 28 29 0a 23 65 6c 73 65 0a  Corrupt().#else.
2630: 23 20 64 65 66 69 6e 65 20 46 54 53 35 5f 43 4f  # define FTS5_CO
2640: 52 52 55 50 54 20 53 51 4c 49 54 45 5f 43 4f 52  RRUPT SQLITE_COR
2650: 52 55 50 54 5f 56 54 41 42 0a 23 65 6e 64 69 66  RUPT_VTAB.#endif
2660: 0a 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ...typedef struc
2670: 74 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20  t Fts5BtreeIter 
2680: 46 74 73 35 42 74 72 65 65 49 74 65 72 3b 0a 74  Fts5BtreeIter;.t
2690: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
26a0: 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65 6c  s5BtreeIterLevel
26b0: 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65   Fts5BtreeIterLe
26c0: 76 65 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72  vel;.typedef str
26d0: 75 63 74 20 46 74 73 35 43 68 75 6e 6b 49 74 65  uct Fts5ChunkIte
26e0: 72 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 3b  r Fts5ChunkIter;
26f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2700: 46 74 73 35 44 61 74 61 20 46 74 73 35 44 61 74  Fts5Data Fts5Dat
2710: 61 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  a;.typedef struc
2720: 74 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t Fts5DlidxIter 
2730: 46 74 73 35 44 6c 69 64 78 49 74 65 72 3b 0a 74  Fts5DlidxIter;.t
2740: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2750: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 46  s5MultiSegIter F
2760: 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 3b  ts5MultiSegIter;
2770: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2780: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 46 74 73  Fts5NodeIter Fts
2790: 35 4e 6f 64 65 49 74 65 72 3b 0a 74 79 70 65 64  5NodeIter;.typed
27a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 50 61  ef struct Fts5Pa
27b0: 67 65 57 72 69 74 65 72 20 46 74 73 35 50 61 67  geWriter Fts5Pag
27c0: 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66  eWriter;.typedef
27d0: 20 73 74 72 75 63 74 20 46 74 73 35 50 6f 73 49   struct Fts5PosI
27e0: 74 65 72 20 46 74 73 35 50 6f 73 49 74 65 72 3b  ter Fts5PosIter;
27f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2800: 46 74 73 35 53 65 67 49 74 65 72 20 46 74 73 35  Fts5SegIter Fts5
2810: 53 65 67 49 74 65 72 3b 0a 74 79 70 65 64 65 66  SegIter;.typedef
2820: 20 73 74 72 75 63 74 20 46 74 73 35 44 6f 63 6c   struct Fts5Docl
2830: 69 73 74 49 74 65 72 20 46 74 73 35 44 6f 63 6c  istIter Fts5Docl
2840: 69 73 74 49 74 65 72 3b 0a 74 79 70 65 64 65 66  istIter;.typedef
2850: 20 73 74 72 75 63 74 20 46 74 73 35 53 65 67 57   struct Fts5SegW
2860: 72 69 74 65 72 20 46 74 73 35 53 65 67 57 72 69  riter Fts5SegWri
2870: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2880: 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72  uct Fts5Structur
2890: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 3b  e Fts5Structure;
28a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
28b0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
28c0: 65 6c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  el Fts5Structure
28d0: 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65 66 20 73  Level;.typedef s
28e0: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
28f0: 75 72 65 53 65 67 6d 65 6e 74 20 46 74 73 35 53  ureSegment Fts5S
2900: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 3b  tructureSegment;
2910: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 62 6a 65  ../*.** One obje
2920: 63 74 20 70 65 72 20 25 5f 64 61 74 61 20 74 61  ct per %_data ta
2930: 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ble..*/.struct F
2940: 74 73 35 49 6e 64 65 78 20 7b 0a 20 20 46 74 73  ts5Index {.  Fts
2950: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
2960: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2970: 56 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f  Virtual table co
2980: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20  nfiguration */. 
2990: 20 63 68 61 72 20 2a 7a 44 61 74 61 54 62 6c 3b   char *zDataTbl;
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 25 5f 64 61   /* Name of %_da
29c0: 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ta table */.  in
29d0: 74 20 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 20  t nCrisisMerge; 
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f0: 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   Maximum allowed
2a00: 20 73 65 67 6d 65 6e 74 73 20 70 65 72 20 6c 65   segments per le
2a10: 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 6f  vel */.  int nWo
2a20: 72 6b 55 6e 69 74 3b 20 20 20 20 20 20 20 20 20  rkUnit;         
2a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66           /* Leaf
2a40: 20 70 61 67 65 73 20 69 6e 20 61 20 22 75 6e 69   pages in a "uni
2a50: 74 22 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 20  t" of work */.. 
2a60: 20 2f 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62 6c   /*.  ** Variabl
2a70: 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68  es related to th
2a80: 65 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e 20 6f  e accumulation o
2a90: 66 20 74 6f 6b 65 6e 73 20 61 6e 64 20 64 6f 63  f tokens and doc
2aa0: 6c 69 73 74 73 20 77 69 74 68 69 6e 20 74 68 65  lists within the
2ab0: 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
2ac0: 68 61 73 68 20 74 61 62 6c 65 73 20 62 65 66 6f  hash tables befo
2ad0: 72 65 20 74 68 65 79 20 61 72 65 20 66 6c 75 73  re they are flus
2ae0: 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a  hed to disk..  *
2af0: 2f 0a 20 20 46 74 73 35 48 61 73 68 20 2a 2a 61  /.  Fts5Hash **a
2b00: 70 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  pHash;          
2b10: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2b20: 68 61 73 68 20 74 61 62 6c 65 73 20 2a 2f 0a 20  hash tables */. 
2b30: 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67   int nMaxPending
2b40: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
2b50: 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e 67 20   /* Max pending 
2b60: 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c 75 73  data before flus
2b70: 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69  h to disk */.  i
2b80: 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b  nt nPendingData;
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ba0: 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 73 20  * Current bytes 
2bb0: 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20  of pending data 
2bc0: 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74 65 52  */.  i64 iWriteR
2bd0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
2be0: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
2bf0: 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20 62 65  r current doc be
2c00: 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a  ing written */..
2c10: 20 20 2f 2a 20 45 72 72 6f 72 20 73 74 61 74 65    /* Error state
2c20: 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  . */.  int rc;  
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2c50: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  t error code */.
2c60: 0a 20 20 2f 2a 20 53 74 61 74 65 20 75 73 65 64  .  /* State used
2c70: 20 62 79 20 74 68 65 20 66 74 73 35 44 61 74 61   by the fts5Data
2c80: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  XXX() functions.
2c90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c   */.  sqlite3_bl
2ca0: 6f 62 20 2a 70 52 65 61 64 65 72 3b 20 20 20 20  ob *pReader;    
2cb0: 20 20 20 20 20 20 2f 2a 20 52 4f 20 69 6e 63 72        /* RO incr
2cc0: 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f 6e 20 25 5f  -blob open on %_
2cd0: 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
2ce0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 57  sqlite3_stmt *pW
2cf0: 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  riter;          
2d00: 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25  /* "INSERT ... %
2d10: 5f 64 61 74 61 20 56 41 4c 55 45 53 28 3f 2c 3f  _data VALUES(?,?
2d20: 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  )" */.  sqlite3_
2d30: 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 72 3b 20  stmt *pDeleter; 
2d40: 20 20 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45          /* "DELE
2d50: 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 2e  TE FROM %_data .
2d60: 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c  .. id>=? AND id<
2d70: 3d 3f 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  =?" */.  int nRe
2d80: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
2d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
2da0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63  l number of bloc
2db0: 6b 73 20 72 65 61 64 20 2a 2f 0a 7d 3b 0a 0a 73  ks read */.};..s
2dc0: 74 72 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73  truct Fts5Doclis
2dd0: 74 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 62 41  tIter {.  int bA
2de0: 73 63 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69  sc;.  u8 *a;.  i
2df0: 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  nt n;.  int i;..
2e00: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
2e10: 61 62 6c 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d  ables. aPoslist=
2e20: 3d 30 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69  =0 at EOF */.  i
2e30: 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 75 38 20  64 iRowid;.  u8 
2e40: 2a 61 50 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74  *aPoslist;.  int
2e50: 20 6e 50 6f 73 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f   nPoslist;.};../
2e60: 2a 0a 2a 2a 20 45 61 63 68 20 69 74 65 72 61 74  *.** Each iterat
2e70: 6f 72 20 75 73 65 64 20 62 79 20 65 78 74 65 72  or used by exter
2e80: 6e 61 6c 20 6d 6f 64 75 6c 65 73 20 69 73 20 61  nal modules is a
2e90: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
2ea0: 69 73 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75  is type..*/.stru
2eb0: 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  ct Fts5IndexIter
2ec0: 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a   {.  Fts5Index *
2ed0: 70 49 6e 64 65 78 3b 0a 20 20 46 74 73 35 53 74  pIndex;.  Fts5St
2ee0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
2ef0: 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67  ;.  Fts5MultiSeg
2f00: 49 74 65 72 20 2a 70 4d 75 6c 74 69 3b 0a 20 20  Iter *pMulti;.  
2f10: 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
2f20: 2a 70 44 6f 63 6c 69 73 74 3b 0a 20 20 46 74 73  *pDoclist;.  Fts
2f30: 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 3b  5Buffer poslist;
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f50: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
2f60: 67 20 63 75 72 72 65 6e 74 20 70 6f 73 6c 69 73  g current poslis
2f70: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
2f80: 20 73 69 6e 67 6c 65 20 72 65 63 6f 72 64 20 72   single record r
2f90: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2fa0: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2fb0: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2fc0: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2ff0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
3000: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
3010: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3030: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
3040: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
3050: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3070: 20 52 65 66 20 63 6f 75 6e 74 20 2a 2f 0a 7d 3b   Ref count */.};
3080: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ../*.** The cont
3090: 65 6e 74 73 20 6f 66 20 74 68 65 20 22 73 74 72  ents of the "str
30a0: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 20 66  ucture" record f
30b0: 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20 61 72  or each index ar
30c0: 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a 2a 2a  e represented.**
30d0: 20 75 73 69 6e 67 20 61 6e 20 46 74 73 35 53 74   using an Fts5St
30e0: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 69  ructure record i
30f0: 6e 20 6d 65 6d 6f 72 79 2e 20 57 68 69 63 68 20  n memory. Which 
3100: 75 73 65 73 20 69 6e 73 74 61 6e 63 65 73 20 6f  uses instances o
3110: 66 20 74 68 65 20 0a 2a 2a 20 6f 74 68 65 72 20  f the .** other 
3120: 46 74 73 35 53 74 72 75 63 74 75 72 65 58 58 58  Fts5StructureXXX
3130: 20 74 79 70 65 73 20 61 73 20 63 6f 6d 70 6f 6e   types as compon
3140: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ents..*/.struct 
3150: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
3160: 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20 69 53 65  ment {.  int iSe
3170: 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  gid;            
3180: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
3190: 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20  ent id */.  int 
31a0: 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20 20 20  nHeight;        
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
31c0: 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65 6e 74  eight of segment
31d0: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
31e0: 20 70 67 6e 6f 46 69 72 73 74 3b 20 20 20 20 20   pgnoFirst;     
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3200: 46 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20  First leaf page 
3210: 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e  number in segmen
3220: 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 4c  t */.  int pgnoL
3230: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
3240: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c         /* Last l
3250: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
3260: 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 7d 3b  in segment */.};
3270: 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75  .struct Fts5Stru
3280: 63 74 75 72 65 4c 65 76 65 6c 20 7b 0a 20 20 69  ctureLevel {.  i
3290: 6e 74 20 6e 4d 65 72 67 65 3b 20 20 20 20 20 20  nt nMerge;      
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
32c0: 65 6e 74 73 20 69 6e 20 69 6e 63 72 2d 6d 65 72  ents in incr-mer
32d0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  ge */.  int nSeg
32e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3300: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
3310: 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 2a 2f 0a  nts on level */.
3320: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
3330: 65 67 6d 65 6e 74 20 2a 61 53 65 67 3b 20 20 20  egment *aSeg;   
3340: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65    /* Array of se
3350: 67 6d 65 6e 74 73 2e 20 61 53 65 67 5b 30 5d 20  gments. aSeg[0] 
3360: 69 73 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a 7d 3b  is oldest. */.};
3370: 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75  .struct Fts5Stru
3380: 63 74 75 72 65 20 7b 0a 20 20 75 36 34 20 6e 57  cture {.  u64 nW
3390: 72 69 74 65 43 6f 75 6e 74 65 72 3b 20 20 20 20  riteCounter;    
33a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
33b0: 61 6c 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  al leaves writte
33c0: 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f 0a  n to level 0 */.
33d0: 20 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20    int nLevel;   
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
3400: 65 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e  evels in this in
3410: 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  dex */.  Fts5Str
3420: 75 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76  uctureLevel aLev
3430: 65 6c 5b 30 5d 3b 20 20 20 2f 2a 20 41 72 72 61  el[0];   /* Arra
3440: 79 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65  y of nLevel leve
3450: 6c 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a  l objects */.};.
3460: 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
3470: 20 6f 66 20 74 79 70 65 20 46 74 73 35 53 65 67   of type Fts5Seg
3480: 57 72 69 74 65 72 20 69 73 20 75 73 65 64 20 74  Writer is used t
3490: 6f 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65  o write to segme
34a0: 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  nts..*/.struct F
34b0: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a  ts5PageWriter {.
34c0: 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20    int pgno;     
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
34f0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
3500: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
3510: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
3520: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3530: 6e 74 61 69 6e 69 6e 67 20 70 61 67 65 20 64 61  ntaining page da
3540: 74 61 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ta */.  Fts5Buff
3550: 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20  er term;        
3560: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
3570: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65  r containing pre
3580: 76 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61  vious term on pa
3590: 67 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20  ge */.};.struct 
35a0: 46 74 73 35 53 65 67 57 72 69 74 65 72 20 7b 0a  Fts5SegWriter {.
35b0: 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20    int iIdx;     
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d0: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
35e0: 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
35f0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
3600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3610: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3620: 20 2a 2f 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   */.  int nWrite
3630: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3640: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3650: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 57  of entries in aW
3660: 72 69 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 50  riter */.  Fts5P
3670: 61 67 65 57 72 69 74 65 72 20 2a 61 57 72 69 74  ageWriter *aWrit
3680: 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72  er;        /* Ar
3690: 72 61 79 20 6f 66 20 50 61 67 65 57 72 69 74 65  ray of PageWrite
36a0: 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 69  r objects */.  i
36b0: 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20  64 iPrevRowid;  
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36d0: 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69 64  * Previous docid
36e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72   written to curr
36f0: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38  ent leaf */.  u8
3700: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f   bFirstRowidInDo
3710: 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  clist;        /*
3720: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3730: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3740: 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20  doclist */.  u8 
3750: 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
3760: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3770: 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77  True if next row
3780: 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 70  id is first in p
3790: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  age */.  int nLe
37a0: 61 66 57 72 69 74 74 65 6e 3b 20 20 20 20 20 20  afWritten;      
37b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37c0: 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73  er of leaf pages
37d0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
37e0: 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20 20  t nEmpty;       
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3800: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74 69   Number of conti
3810: 67 75 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73 20  guous term-less 
3820: 6e 6f 64 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  nodes */.  Fts5B
3830: 75 66 66 65 72 20 64 6c 69 64 78 3b 20 20 20 20  uffer dlidx;    
3840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3850: 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  clist index */. 
3860: 20 69 36 34 20 69 44 6c 69 64 78 50 72 65 76 3b   i64 iDlidxPrev;
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3880: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3890: 69 64 20 61 70 70 65 6e 64 65 64 20 74 6f 20 64  id appended to d
38a0: 6c 69 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 44  lidx */.  int bD
38b0: 6c 69 64 78 50 72 65 76 56 61 6c 69 64 3b 20 20  lidxPrevValid;  
38c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
38d0: 65 20 69 66 20 69 44 6c 69 64 78 50 72 65 76 20  e if iDlidxPrev 
38e0: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 7d 3b 0a 0a  is valid */.};..
38f0: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
3900: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
3910: 67 68 20 74 68 65 20 6d 65 72 67 65 64 20 72 65  gh the merged re
3920: 73 75 6c 74 73 20 6f 66 20 6f 6e 65 20 6f 72 20  sults of one or 
3930: 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 2c 0a 2a  more segments,.*
3940: 2a 20 76 69 73 69 74 69 6e 67 20 65 61 63 68 20  * visiting each 
3950: 74 65 72 6d 2f 64 6f 63 69 64 20 70 61 69 72 20  term/docid pair 
3960: 69 6e 20 74 68 65 20 6d 65 72 67 65 64 20 64 61  in the merged da
3970: 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67 20 69  ta..**.** nSeg i
3980: 73 20 61 6c 77 61 79 73 20 61 20 70 6f 77 65 72  s always a power
3990: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
39a0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
39b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
39c0: 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20  * segments that 
39d0: 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 6d  this object is m
39e0: 65 72 67 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  erging data from
39f0: 2e 20 42 6f 74 68 20 74 68 65 20 61 53 65 67 5b  . Both the aSeg[
3a00: 5d 20 61 6e 64 0a 2a 2a 20 61 46 69 72 73 74 5b  ] and.** aFirst[
3a10: 5d 20 61 72 72 61 79 73 20 61 72 65 20 73 69 7a  ] arrays are siz
3a20: 65 64 20 61 74 20 6e 53 65 67 20 65 6e 74 72 69  ed at nSeg entri
3a30: 65 73 2e 20 54 68 65 20 61 53 65 67 5b 5d 20 61  es. The aSeg[] a
3a40: 72 72 61 79 20 69 73 20 70 61 64 64 65 64 0a 2a  rray is padded.*
3a50: 2a 20 77 69 74 68 20 7a 65 72 6f 65 64 20 6f 62  * with zeroed ob
3a60: 6a 65 63 74 73 20 2d 20 74 68 65 73 65 20 61 72  jects - these ar
3a70: 65 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20  e handled as if 
3a80: 74 68 65 79 20 77 65 72 65 20 69 74 65 72 61 74  they were iterat
3a90: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
3aa0: 20 65 6d 70 74 79 20 73 65 67 6d 65 6e 74 73 2e   empty segments.
3ab0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
3ac0: 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  ts of comparing 
3ad0: 73 65 67 6d 65 6e 74 73 20 61 53 65 67 5b 4e 5d  segments aSeg[N]
3ae0: 20 61 6e 64 20 61 53 65 67 5b 4e 2b 31 5d 2c 20   and aSeg[N+1], 
3af0: 77 68 65 72 65 20 4e 20 69 73 20 61 6e 0a 2a 2a  where N is an.**
3b00: 20 65 76 65 6e 20 6e 75 6d 62 65 72 2c 20 69 73   even number, is
3b10: 20 73 74 6f 72 65 64 20 69 6e 20 61 46 69 72 73   stored in aFirs
3b20: 74 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e 20 54  t[(nSeg+N)/2]. T
3b30: 68 65 20 22 72 65 73 75 6c 74 22 20 6f 66 20 74  he "result" of t
3b40: 68 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  he .** compariso
3b50: 6e 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78  n in this contex
3b60: 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  t is the index o
3b70: 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74  f the iterator t
3b80: 68 61 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  hat currently.**
3b90: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73   points to the s
3ba0: 6d 61 6c 6c 65 72 20 74 65 72 6d 2f 72 6f 77 69  maller term/rowi
3bb0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 49  d combination. I
3bc0: 74 65 72 61 74 6f 72 73 20 61 74 20 45 4f 46 20  terators at EOF 
3bd0: 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65  are.** considere
3be0: 64 20 74 6f 20 62 65 20 67 72 65 61 74 65 72 20  d to be greater 
3bf0: 74 68 61 6e 20 61 6c 6c 20 6f 74 68 65 72 20 69  than all other i
3c00: 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  terators..**.** 
3c10: 61 46 69 72 73 74 5b 31 5d 20 63 6f 6e 74 61 69  aFirst[1] contai
3c20: 6e 73 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  ns the index in 
3c30: 61 53 65 67 5b 5d 20 6f 66 20 74 68 65 20 69 74  aSeg[] of the it
3c40: 65 72 61 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  erator that poin
3c50: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 6d 61  ts to.** the sma
3c60: 6c 6c 65 73 74 20 6b 65 79 20 6f 76 65 72 61 6c  llest key overal
3c70: 6c 2e 20 61 46 69 72 73 74 5b 30 5d 20 69 73 20  l. aFirst[0] is 
3c80: 75 6e 75 73 65 64 2e 20 0a 2a 2f 0a 73 74 72 75  unused. .*/.stru
3c90: 63 74 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  ct Fts5MultiSegI
3ca0: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 53 65 67  ter {.  int nSeg
3cb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3cc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
3cd0: 6f 66 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20  of aSeg[] array 
3ce0: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20 20  */.  int bRev;  
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3d10: 69 74 65 72 61 74 65 20 69 6e 20 72 65 76 65 72  iterate in rever
3d20: 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74  se order */.  Ft
3d30: 73 35 53 65 67 49 74 65 72 20 2a 61 53 65 67 3b  s5SegIter *aSeg;
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d50: 20 41 72 72 61 79 20 6f 66 20 73 65 67 6d 65 6e   Array of segmen
3d60: 74 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 20  t iterators */. 
3d70: 20 75 31 36 20 2a 61 46 69 72 73 74 3b 20 20 20   u16 *aFirst;   
3d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d90: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 65 72 67   /* Current merg
3da0: 65 20 73 74 61 74 65 20 28 73 65 65 20 61 62 6f  e state (see abo
3db0: 76 65 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ve) */.};../*.**
3dc0: 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72   Object for iter
3dd0: 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 20  ating through a 
3de0: 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e 74 2c 20  single segment, 
3df0: 76 69 73 69 74 69 6e 67 20 65 61 63 68 20 74 65  visiting each te
3e00: 72 6d 2f 64 6f 63 69 64 0a 2a 2a 20 70 61 69 72  rm/docid.** pair
3e10: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e   in the segment.
3e20: 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a 2a 2a 20  .**.** pSeg:.** 
3e30: 20 20 54 68 65 20 73 65 67 6d 65 6e 74 20 74 6f    The segment to
3e40: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3e50: 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 50 67 6e  ..**.** iLeafPgn
3e60: 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65 6e 74 20  o:.**   Current 
3e70: 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72  leaf page number
3e80: 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 2e   within segment.
3e90: 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f 66 66 73  .**.** iLeafOffs
3ea0: 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65 20 6f 66  et:.**   Byte of
3eb0: 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
3ec0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 74 68 61  current leaf tha
3ed0: 74 20 69 73 20 6f 6e 65 20 62 79 74 65 20 70 61  t is one byte pa
3ee0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
3ef0: 65 0a 2a 2a 20 20 20 72 6f 77 69 64 20 66 69 65  e.**   rowid fie
3f00: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
3f10: 74 20 65 6e 74 72 79 2e 20 55 73 75 61 6c 6c 79  t entry. Usually
3f20: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 69 7a   this is the siz
3f30: 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 0a 2a  e field of the.*
3f40: 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  *   position lis
3f50: 74 20 64 61 74 61 2e 20 54 68 65 20 65 78 63 65  t data. The exce
3f60: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
3f70: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75  rowid for the cu
3f80: 72 72 65 6e 74 20 65 6e 74 72 79 20 0a 2a 2a 20  rrent entry .** 
3f90: 20 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 68    is the last th
3fa0: 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 61 66 20  ing on the leaf 
3fb0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 4c 65 61  page..**.** pLea
3fc0: 66 3a 0a 2a 2a 20 20 20 42 75 66 66 65 72 20 63  f:.**   Buffer c
3fd0: 6f 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e  ontaining curren
3fe0: 74 20 6c 65 61 66 20 70 61 67 65 20 64 61 74 61  t leaf page data
3ff0: 2e 20 53 65 74 20 74 6f 20 4e 55 4c 4c 20 61 74  . Set to NULL at
4000: 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72   EOF..**.** iTer
4010: 6d 4c 65 61 66 50 67 6e 6f 2c 20 69 54 65 72 6d  mLeafPgno, iTerm
4020: 4c 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20  LeafOffset:.**  
4030: 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   Leaf page numbe
4040: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
4050: 20 6c 61 73 74 20 74 65 72 6d 20 72 65 61 64 20   last term read 
4060: 66 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74  from the segment
4070: 2e 20 41 6e 64 0a 2a 2a 20 20 20 74 68 65 20 6f  . And.**   the o
4080: 66 66 73 65 74 20 69 6d 6d 65 64 69 61 74 65 6c  ffset immediatel
4090: 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
40a0: 74 65 72 6d 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  term data..**.**
40b0: 20 66 6c 61 67 73 3a 0a 2a 2a 20 20 20 4d 61 73   flags:.**   Mas
40c0: 6b 20 6f 66 20 46 54 53 35 5f 53 45 47 49 54 45  k of FTS5_SEGITE
40d0: 52 5f 58 58 58 20 76 61 6c 75 65 73 2e 20 49 6e  R_XXX values. In
40e0: 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
40f0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 54  lows:.**.**   FT
4100: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
4110: 52 4d 3a 0a 2a 2a 20 20 20 20 20 49 66 20 73 65  RM:.**     If se
4120: 74 2c 20 73 65 74 20 74 68 65 20 69 74 65 72 61  t, set the itera
4130: 74 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  tor to point to 
4140: 45 4f 46 20 61 66 74 65 72 20 74 68 65 20 63 75  EOF after the cu
4150: 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 0a 2a  rrent doclist .*
4160: 2a 20 20 20 20 20 68 61 73 20 62 65 65 6e 20 65  *     has been e
4170: 78 68 61 75 73 74 65 64 2e 20 44 6f 20 6e 6f 74  xhausted. Do not
4180: 20 70 72 6f 63 65 65 64 20 74 6f 20 74 68 65 20   proceed to the 
4190: 6e 65 78 74 20 74 65 72 6d 20 69 6e 20 74 68 65  next term in the
41a0: 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
41b0: 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52    FTS5_SEGITER_R
41c0: 45 56 45 52 53 45 3a 0a 2a 2a 20 20 20 20 20 54  EVERSE:.**     T
41d0: 68 69 73 20 66 6c 61 67 20 69 73 20 6f 6e 6c 79  his flag is only
41e0: 20 65 76 65 72 20 73 65 74 20 69 66 20 46 54 53   ever set if FTS
41f0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
4200: 4d 20 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 49  M is also set. I
4210: 66 0a 2a 2a 20 20 20 20 20 69 74 20 69 73 20 73  f.**     it is s
4220: 65 74 2c 20 69 74 65 72 61 74 65 20 74 68 72 6f  et, iterate thro
4230: 75 67 68 20 64 6f 63 69 64 73 20 69 6e 20 61 73  ugh docids in as
4240: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 69 6e  cending order in
4250: 73 74 65 61 64 20 6f 66 20 74 68 65 0a 2a 2a 20  stead of the.** 
4260: 20 20 20 20 64 65 66 61 75 6c 74 20 64 65 73 63      default desc
4270: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2a  ending order..**
4280: 0a 2a 2a 20 69 52 6f 77 69 64 4f 66 66 73 65 74  .** iRowidOffset
4290: 2f 6e 52 6f 77 69 64 4f 66 66 73 65 74 2f 61 52  /nRowidOffset/aR
42a0: 6f 77 69 64 4f 66 66 73 65 74 3a 0a 2a 2a 20 20  owidOffset:.**  
42b0: 20 20 20 54 68 65 73 65 20 61 72 65 20 75 73 65     These are use
42c0: 64 20 69 66 20 74 68 65 20 46 54 53 35 5f 53 45  d if the FTS5_SE
42d0: 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c  GITER_REVERSE fl
42e0: 61 67 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  ag is set..**.**
42f0: 20 20 20 20 20 45 61 63 68 20 74 69 6d 65 20 61       Each time a
4300: 20 6e 65 77 20 70 61 67 65 20 69 73 20 6c 6f 61   new page is loa
4310: 64 65 64 2c 20 74 68 65 20 69 74 65 72 61 74 6f  ded, the iterato
4320: 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
4330: 74 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  t to the.**     
4340: 66 69 6e 61 6c 20 72 6f 77 69 64 2e 20 41 64 64  final rowid. Add
4350: 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 61  itionally, the a
4360: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72  RowidOffset[] ar
4370: 72 61 79 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ray is populated
4380: 20 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68   .**     with th
4390: 65 20 62 79 74 65 20 6f 66 66 73 65 74 73 20 6f  e byte offsets o
43a0: 66 20 61 6c 6c 20 72 65 6c 65 76 61 6e 74 20 72  f all relevant r
43b0: 6f 77 69 64 20 66 69 65 6c 64 73 20 6f 6e 20 74  owid fields on t
43c0: 68 65 20 70 61 67 65 2e 20 0a 2a 2f 0a 73 74 72  he page. .*/.str
43d0: 75 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20  uct Fts5SegIter 
43e0: 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
43f0: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
4400: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
4410: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
4420: 68 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  h */.  int iIdx;
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
4450: 66 66 73 65 74 20 77 69 74 68 69 6e 20 63 75 72  ffset within cur
4460: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 69  rent leaf */.  i
4470: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4490: 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e 66 69 67  * Mask of config
44a0: 75 72 61 74 69 6f 6e 20 66 6c 61 67 73 20 2a 2f  uration flags */
44b0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
44c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
44d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
44e0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  af page number *
44f0: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c  /.  Fts5Data *pL
4500: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
4510: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
4520: 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  eaf data */.  in
4530: 74 20 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  t iLeafOffset;  
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4550: 20 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74   Byte offset wit
4560: 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66  hin current leaf
4570: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61   */..  /* The pa
4580: 67 65 20 61 6e 64 20 6f 66 66 73 65 74 20 66 72  ge and offset fr
4590: 6f 6d 20 77 68 69 63 68 20 74 68 65 20 63 75 72  om which the cur
45a0: 72 65 6e 74 20 74 65 72 6d 20 77 61 73 20 72 65  rent term was re
45b0: 61 64 2e 20 54 68 65 20 6f 66 66 73 65 74 20 0a  ad. The offset .
45c0: 20 20 2a 2a 20 69 73 20 74 68 65 20 6f 66 66 73    ** is the offs
45d0: 65 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  et of the first 
45e0: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 63 75 72  rowid in the cur
45f0: 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e 20 20 2a  rent doclist.  *
4600: 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61  /.  int iTermLea
4610: 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 69 54 65  fPgno;.  int iTe
4620: 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20  rmLeafOffset;.. 
4630: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
4640: 67 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20  g are only used 
4650: 69 66 20 74 68 65 20 46 54 53 35 5f 53 45 47 49  if the FTS5_SEGI
4660: 54 45 52 5f 52 45 56 45 52 53 45 20 66 6c 61 67  TER_REVERSE flag
4670: 20 69 73 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e   is set. */.  in
4680: 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 20  t iRowidOffset; 
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
46a0: 20 43 75 72 72 65 6e 74 20 65 6e 74 72 79 20 69   Current entry i
46b0: 6e 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  n aRowidOffset[]
46c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64   */.  int nRowid
46d0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
46e0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
46f0: 65 64 20 73 69 7a 65 20 6f 66 20 61 52 6f 77 69  ed size of aRowi
4700: 64 4f 66 66 73 65 74 5b 5d 20 61 72 72 61 79 20  dOffset[] array 
4710: 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 77 69 64  */.  int *aRowid
4720: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4730: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
4740: 20 6f 66 66 73 65 74 20 74 6f 20 72 6f 77 69 64   offset to rowid
4750: 20 66 69 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74   fields */..  Ft
4760: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
4770: 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  idx;          /*
4780: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64   If there is a d
4790: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a  oclist-index */.
47a0: 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 73 20  .  /* Variables 
47b0: 70 6f 70 75 6c 61 74 65 64 20 62 61 73 65 64 20  populated based 
47c0: 6f 6e 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  on current entry
47d0: 2e 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  . */.  Fts5Buffe
47e0: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
47f0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4800: 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20  t term */.  i64 
4810: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
4820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4830: 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
4840: 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  };..#define FTS5
4850: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
4860: 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54   0x01.#define FT
4870: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4880: 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a 20  SE 0x02.../*.** 
4890: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
48a0: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 70 61 67  ting through pag
48b0: 69 6e 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a  inated data..*/.
48c0: 73 74 72 75 63 74 20 46 74 73 35 43 68 75 6e 6b  struct Fts5Chunk
48d0: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 44 61 74  Iter {.  Fts5Dat
48e0: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
48f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4900: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 2e 20 4e  ent leaf data. N
4910: 55 4c 4c 20 2d 3e 20 45 4f 46 2e 20 2a 2f 0a 20  ULL -> EOF. */. 
4920: 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b   i64 iLeafRowid;
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4940: 20 2f 2a 20 41 62 73 6f 6c 75 74 65 20 72 6f 77   /* Absolute row
4950: 69 64 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65  id of current le
4960: 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d  af */.  int nRem
4970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4980: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 61 69          /* Remai
4990: 6e 69 6e 67 20 62 79 74 65 73 20 6f 66 20 64 61  ning bytes of da
49a0: 74 61 20 74 6f 20 72 65 61 64 20 2a 2f 0a 0a 20  ta to read */.. 
49b0: 20 2f 2a 20 4f 75 74 70 75 74 20 70 61 72 61 6d   /* Output param
49c0: 65 74 65 72 73 20 2a 2f 0a 20 20 75 38 20 2a 70  eters */.  u8 *p
49d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
49e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
49f0: 69 6e 74 65 72 20 74 6f 20 63 68 75 6e 6b 20 6f  inter to chunk o
4a00: 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  f data */.  int 
4a10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
4a30: 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 20  ize of buffer p 
4a40: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a 0a  in bytes */.};..
4a50: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
4a60: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
4a70: 67 68 20 61 20 73 69 6e 67 6c 65 20 70 6f 73 69  gh a single posi
4a80: 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20 64 69 73  tion list on dis
4a90: 6b 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  k..*/.struct Fts
4aa0: 35 50 6f 73 49 74 65 72 20 7b 0a 20 20 46 74 73  5PosIter {.  Fts
4ab0: 35 43 68 75 6e 6b 49 74 65 72 20 63 68 75 6e 6b  5ChunkIter chunk
4ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4ad0: 43 75 72 72 65 6e 74 20 63 68 75 6e 6b 20 6f 66  Current chunk of
4ae0: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69   data */.  int i
4af0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
4b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
4b10: 66 73 65 74 20 77 69 74 68 69 6e 20 63 68 75 6e  fset within chun
4b20: 6b 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 6e 74  k data */..  int
4b30: 20 69 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 50 6f   iCol;.  int iPo
4b40: 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  s;.};../*.** Obj
4b50: 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e  ect for iteratin
4b60: 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 63 6f  g through the co
4b70: 6e 65 6e 74 73 20 6f 66 20 61 20 73 69 6e 67 6c  nents of a singl
4b80: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  e internal node 
4b90: 69 6e 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a  in .** memory..*
4ba0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 4e 6f 64  /.struct Fts5Nod
4bb0: 65 49 74 65 72 20 7b 0a 20 20 2f 2a 20 49 6e 74  eIter {.  /* Int
4bc0: 65 72 6e 61 6c 2e 20 53 65 74 20 61 6e 64 20 6d  ernal. Set and m
4bd0: 61 6e 61 67 65 64 20 62 79 20 66 74 73 35 4e 6f  anaged by fts5No
4be0: 64 65 49 74 65 72 58 58 58 28 29 20 66 75 6e 63  deIterXXX() func
4bf0: 74 69 6f 6e 73 2e 20 45 78 63 65 70 74 2c 20 0a  tions. Except, .
4c00: 20 20 2a 2a 20 74 68 65 20 45 4f 46 20 74 65 73    ** the EOF tes
4c10: 74 20 66 6f 72 20 74 68 65 20 69 74 65 72 61 74  t for the iterat
4c20: 6f 72 20 69 73 20 28 46 74 73 35 4e 6f 64 65 49  or is (Fts5NodeI
4c30: 74 65 72 2e 61 44 61 74 61 3d 3d 30 29 2e 20 20  ter.aData==0).  
4c40: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  */.  const u8 *a
4c50: 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61 74  Data;.  int nDat
4c60: 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  a;.  int iOff;..
4c70: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
4c80: 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35 42  ables */.  Fts5B
4c90: 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e  uffer term;.  in
4ca0: 74 20 6e 45 6d 70 74 79 3b 0a 20 20 69 6e 74 20  t nEmpty;.  int 
4cb0: 69 43 68 69 6c 64 3b 0a 20 20 69 6e 74 20 62 44  iChild;.  int bD
4cc0: 6c 69 64 78 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  lidx;.};../*.** 
4cd0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4ce0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70  he following typ
4cf0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65  e is used to ite
4d00: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
4d10: 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
4d20: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
4d30: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44  record..**.** pD
4d40: 61 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64  ata:.**   Record
4d50: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
4d60: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61  doclist-index da
4d70: 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a  ta..**.** bEof:.
4d80: 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65  **   Set to true
4d90: 20 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68   once iterator h
4da0: 61 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a  as reached EOF..
4db0: 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20  **.** iOff:.**  
4dc0: 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72   Set to the curr
4dd0: 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69  ent offset withi
4de0: 6e 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a  n record pData..
4df0: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c  */.struct Fts5Dl
4e00: 69 64 78 49 74 65 72 20 7b 0a 20 20 46 74 73 35  idxIter {.  Fts5
4e10: 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20  Data *pData;    
4e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
4e30: 61 20 66 6f 72 20 64 6f 63 6c 69 73 74 20 69 6e  a for doclist in
4e40: 64 65 78 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20  dex, if any */. 
4e50: 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4e70: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
4e80: 20 69 6e 74 6f 20 70 44 6c 69 64 78 20 2a 2f 0a   into pDlidx */.
4e90: 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20 20    int bEof;     
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61 64  /* At EOF alread
4ec0: 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  y */.  int iFirs
4ed0: 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  tOff;           
4ee0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
4ef0: 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f 72  reverse iterator
4f00: 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20  s only */..  /* 
4f10: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
4f20: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
4f30: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4f40: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
4f50: 65 72 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65  er of current le
4f60: 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 36 34  af page */.  i64
4f70: 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
4f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4f90: 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61  rst rowid on lea
4fa0: 66 20 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d  f iLeafPgno */.}
4fb0: 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 46 74 73  ;.../*.** An Fts
4fc0: 35 42 74 72 65 65 49 74 65 72 20 6f 62 6a 65 63  5BtreeIter objec
4fd0: 74 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65  t is used to ite
4fe0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
4ff0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a   entries in the.
5000: 2a 2a 20 62 2d 74 72 65 65 20 68 69 65 72 61 72  ** b-tree hierar
5010: 63 68 79 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  chy belonging to
5020: 20 61 20 73 69 6e 67 6c 65 20 66 74 73 35 20 73   a single fts5 s
5030: 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20  egment. In this 
5040: 63 61 73 65 20 74 68 65 0a 2a 2a 20 22 62 2d 74  case the.** "b-t
5050: 72 65 65 20 68 69 65 72 61 72 63 68 79 22 20 69  ree hierarchy" i
5060: 73 20 61 6c 6c 20 62 2d 74 72 65 65 20 6e 6f 64  s all b-tree nod
5070: 65 73 20 65 78 63 65 70 74 20 6c 65 61 76 65 73  es except leaves
5080: 2e 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  . Each entry in 
5090: 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65 20 68 69  the.** b-tree hi
50a0: 65 72 61 72 63 68 79 20 63 6f 6e 73 69 73 74 73  erarchy consists
50b0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
50c0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 4c 65 61 66  g:.**.**   iLeaf
50d0: 3a 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  :  The page numb
50e0: 65 72 20 6f 66 20 74 68 65 20 6c 65 61 66 20 70  er of the leaf p
50f0: 61 67 65 20 74 68 65 20 65 6e 74 72 79 20 70 6f  age the entry po
5100: 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 20  ints to..**.**  
5110: 20 74 65 72 6d 3a 20 20 20 41 20 73 70 6c 69 74   term:   A split
5120: 2d 6b 65 79 20 74 68 61 74 20 61 6c 6c 20 74 65  -key that all te
5130: 72 6d 73 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  rms on leaf page
5140: 20 24 69 4c 65 61 66 20 6d 75 73 74 20 62 65 20   $iLeaf must be 
5150: 67 72 65 61 74 65 72 0a 2a 2a 20 20 20 20 20 20  greater.**      
5160: 20 20 20 20 20 74 68 61 6e 20 6f 72 20 65 71 75       than or equ
5170: 61 6c 20 74 6f 2e 20 54 68 65 20 22 74 65 72 6d  al to. The "term
5180: 22 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  " associated wit
5190: 68 20 74 68 65 20 66 69 72 73 74 20 62 2d 74 72  h the first b-tr
51a0: 65 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ee.**           
51b0: 68 69 65 72 61 72 63 68 79 20 65 6e 74 72 79 20  hierarchy entry 
51c0: 28 74 68 65 20 6f 6e 65 20 74 68 61 74 20 70 6f  (the one that po
51d0: 69 6e 74 73 20 74 6f 20 6c 65 61 66 20 70 61 67  ints to leaf pag
51e0: 65 20 31 29 20 69 73 20 61 6c 77 61 79 73 20 0a  e 1) is always .
51f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 6e 20  **           an 
5200: 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a  empty string..**
5210: 0a 2a 2a 20 20 20 6e 45 6d 70 74 79 3a 20 54 68  .**   nEmpty: Th
5220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74  e number of empt
5230: 79 20 28 74 65 72 6d 6c 65 73 73 29 20 6c 65 61  y (termless) lea
5240: 66 20 70 61 67 65 73 20 74 68 61 74 20 69 6d 6d  f pages that imm
5250: 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  ediately.**     
5260: 20 20 20 20 20 20 66 6f 6c 6c 6f 77 69 6e 67 20        following 
5270: 69 4c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  iLeaf..**.** The
5280: 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20 6f   Fts5BtreeIter o
5290: 62 6a 65 63 74 20 69 73 20 6f 6e 6c 79 20 75 73  bject is only us
52a0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
52b0: 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
52c0: 6b 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 72 75 63  k code..*/.struc
52d0: 74 20 46 74 73 35 42 74 72 65 65 49 74 65 72 4c  t Fts5BtreeIterL
52e0: 65 76 65 6c 20 7b 0a 20 20 46 74 73 35 4e 6f 64  evel {.  Fts5Nod
52f0: 65 49 74 65 72 20 73 3b 20 20 20 20 20 20 20 20  eIter s;        
5300: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
5310: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72  ator for the cur
5320: 72 65 6e 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 46  rent node */.  F
5330: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 20  ts5Data *pData; 
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5350: 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 63  * Data for the c
5360: 75 72 72 65 6e 74 20 6e 6f 64 65 20 2a 2f 0a 7d  urrent node */.}
5370: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 42 74 72  ;.struct Fts5Btr
5380: 65 65 49 74 65 72 20 7b 0a 20 20 46 74 73 35 49  eeIter {.  Fts5I
5390: 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20  ndex *p;        
53a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
53b0: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
53c0: 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
53d0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
53e0: 67 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74  g;     /* Iterat
53f0: 65 20 74 68 72 6f 75 67 68 20 74 68 69 73 20 73  e through this s
5400: 65 67 6d 65 6e 74 27 73 20 62 2d 74 72 65 65 20  egment's b-tree 
5410: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20  */.  int iIdx;  
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 70 53       /* Index pS
5440: 65 67 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  eg belongs to */
5450: 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b 20 20 20 20  .  int nLvl;    
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 4c     /* Size of aL
5480: 76 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  vl[] array */.  
5490: 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
54a0: 65 6c 20 2a 61 4c 76 6c 3b 20 20 20 20 20 20 20  el *aLvl;       
54b0: 2f 2a 20 4c 65 76 65 6c 20 66 6f 72 20 65 61 63  /* Level for eac
54c0: 68 20 74 69 65 72 20 6f 66 20 62 2d 74 72 65 65  h tier of b-tree
54d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   */..  /* Output
54e0: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
54f0: 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20  /* Current term 
5520: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 3b 20  */.  int iLeaf; 
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 63 6f 6e       /* Leaf con
5550: 74 61 69 6e 69 6e 67 20 74 65 72 6d 73 20 3e 3d  taining terms >=
5560: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f   current term */
5570: 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 20 20  .  int nEmpty;  
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
55a0: 22 65 6d 70 74 79 22 20 6c 65 61 76 65 73 20 66  "empty" leaves f
55b0: 6f 6c 6c 6f 77 69 6e 67 20 69 4c 65 61 66 20 2a  ollowing iLeaf *
55c0: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55e0: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
55f0: 75 65 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69  ue at EOF */.  i
5600: 6e 74 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20  nt bDlidx;      
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5620: 2a 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20  * True if there 
5630: 65 78 69 73 74 73 20 61 20 64 6c 69 64 78 20 2a  exists a dlidx *
5640: 2f 0a 7d 3b 0a 0a 0a 73 74 61 74 69 63 20 76 6f  /.};...static vo
5650: 69 64 20 66 74 73 35 50 75 74 55 31 36 28 75 38  id fts5PutU16(u8
5660: 20 2a 61 4f 75 74 2c 20 75 31 36 20 69 56 61 6c   *aOut, u16 iVal
5670: 29 7b 0a 20 20 61 4f 75 74 5b 30 5d 20 3d 20 28  ){.  aOut[0] = (
5680: 69 56 61 6c 3e 3e 38 29 3b 0a 20 20 61 4f 75 74  iVal>>8);.  aOut
5690: 5b 31 5d 20 3d 20 28 69 56 61 6c 26 30 78 46 46  [1] = (iVal&0xFF
56a0: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 31 36  );.}..static u16
56b0: 20 66 74 73 35 47 65 74 55 31 36 28 63 6f 6e 73   fts5GetU16(cons
56c0: 74 20 75 38 20 2a 61 49 6e 29 7b 0a 20 20 72 65  t u8 *aIn){.  re
56d0: 74 75 72 6e 20 28 28 75 31 36 29 61 49 6e 5b 30  turn ((u16)aIn[0
56e0: 5d 20 3c 3c 20 38 29 20 2b 20 61 49 6e 5b 31 5d  ] << 8) + aIn[1]
56f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
5700: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
5710: 20 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74   buffer at least
5720: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 20   nByte bytes in 
5730: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  size..**.** If a
5740: 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65  n OOM error is e
5750: 6e 63 6f 75 6e 74 65 72 65 64 2c 20 72 65 74 75  ncountered, retu
5760: 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 73 65 74 20  rn NULL and set 
5770: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
5780: 6e 0a 2a 2a 20 74 68 65 20 46 74 73 35 49 6e 64  n.** the Fts5Ind
5790: 65 78 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  ex handle passed
57a0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
57b0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
57c0: 63 20 76 6f 69 64 20 2a 66 74 73 35 49 64 78 4d  c void *fts5IdxM
57d0: 61 6c 6c 6f 63 28 46 74 73 35 49 6e 64 65 78 20  alloc(Fts5Index 
57e0: 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  *p, int nByte){.
57f0: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
5800: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
5810: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 52  QLITE_OK );.  pR
5820: 65 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  et = sqlite3_mal
5830: 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  loc(nByte);.  if
5840: 28 20 70 52 65 74 3d 3d 30 20 29 7b 0a 20 20 20  ( pRet==0 ){.   
5850: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
5860: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
5870: 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c      memset(pRet,
5880: 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a   0, nByte);.  }.
5890: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
58a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
58b0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
58c0: 74 68 65 20 70 4c 65 66 74 20 62 75 66 66 65 72  the pLeft buffer
58d0: 20 77 69 74 68 20 74 68 65 20 70 52 69 67 68 74   with the pRight
58e0: 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a  /nRight blob..**
58f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69  .** Return -ve i
5900: 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c  f pLeft is small
5910: 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20  er than pRight, 
5920: 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71  0 if they are eq
5930: 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66  ual or.** +ve if
5940: 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c   pRight is small
5950: 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49  er than pLeft. I
5960: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a  n other words:.*
5970: 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a  *.**     res = *
5980: 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a  pLeft - *pRight.
5990: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
59a0: 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42  s5BufferCompareB
59b0: 6c 6f 62 28 0a 20 20 46 74 73 35 42 75 66 66 65  lob(.  Fts5Buffe
59c0: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
59d0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 68         /* Left h
59e0: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70  and side of comp
59f0: 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  arison */.  cons
5a00: 74 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e  t u8 *pRight, in
5a10: 74 20 6e 52 69 67 68 74 20 20 20 20 2f 2a 20 52  t nRight    /* R
5a20: 69 67 68 74 20 68 61 6e 64 20 73 69 64 65 20 6f  ight hand side o
5a30: 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a  f comparison */.
5a40: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
5a50: 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20 6e 52  MIN(pLeft->n, nR
5a60: 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72 65 73  ight);.  int res
5a70: 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d   = memcmp(pLeft-
5a80: 3e 70 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d 70  >p, pRight, nCmp
5a90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73  );.  return (res
5aa0: 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20  ==0 ? (pLeft->n 
5ab0: 2d 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29  - nRight) : res)
5ac0: 3b 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69  ;.}..#if 0.stati
5ad0: 63 20 69 6e 74 20 66 74 73 35 43 6f 6d 70 61 72  c int fts5Compar
5ae0: 65 42 6c 6f 62 28 0a 20 20 63 6f 6e 73 74 20 75  eBlob(.  const u
5af0: 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74 20 6e 4c  8 *pLeft, int nL
5b00: 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20  eft,.  const u8 
5b10: 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69  *pRight, int nRi
5b20: 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d  ght.){.  int nCm
5b30: 70 20 3d 20 4d 49 4e 28 6e 4c 65 66 74 2c 20 6e  p = MIN(nLeft, n
5b40: 52 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72 65  Right);.  int re
5b50: 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74  s = memcmp(pLeft
5b60: 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b  , pRight, nCmp);
5b70: 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d 3d  .  return (res==
5b80: 30 20 3f 20 28 6e 4c 65 66 74 20 2d 20 6e 52 69  0 ? (nLeft - nRi
5b90: 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23  ght) : res);.}.#
5ba0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  endif../*.** Com
5bb0: 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pare the content
5bc0: 73 20 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66  s of the two buf
5bd0: 66 65 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d  fers using memcm
5be0: 70 28 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66  p(). If one buff
5bf0: 65 72 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69  er.** is a prefi
5c00: 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20  x of the other, 
5c10: 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  it is considered
5c20: 20 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a   the lesser..**.
5c30: 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66  ** Return -ve if
5c40: 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65   pLeft is smalle
5c50: 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30  r than pRight, 0
5c60: 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75   if they are equ
5c70: 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20  al or.** +ve if 
5c80: 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65  pRight is smalle
5c90: 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e  r than pLeft. In
5ca0: 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a   other words:.**
5cb0: 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70  .**     res = *p
5cc0: 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a  Left - *pRight.*
5cd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
5ce0: 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46  5BufferCompare(F
5cf0: 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74  ts5Buffer *pLeft
5d00: 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 52  , Fts5Buffer *pR
5d10: 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d  ight){.  int nCm
5d20: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
5d30: 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20  , pRight->n);.  
5d40: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
5d50: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5d60: 74 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  t->p, nCmp);.  r
5d70: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
5d80: 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67  (pLeft->n - pRig
5d90: 68 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d  ht->n) : res);.}
5da0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  .../*.** Close t
5db0: 68 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f  he read-only blo
5dc0: 62 20 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20  b handle, if it 
5dd0: 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  is open..*/.stat
5de0: 69 63 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73  ic void fts5Clos
5df0: 65 52 65 61 64 65 72 28 46 74 73 35 49 6e 64 65  eReader(Fts5Inde
5e00: 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  x *p){.  if( p->
5e10: 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73  pReader ){.    s
5e20: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
5e30: 65 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20  e(p->pReader);. 
5e40: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5e50: 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
5e60: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
5e70: 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72 28  ataReadOrBuffer(
5e80: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
5e90: 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a   .  Fts5Buffer *
5ea0: 70 42 75 66 2c 20 0a 20 20 69 36 34 20 69 52 6f  pBuf, .  i64 iRo
5eb0: 77 69 64 0a 29 7b 0a 20 20 46 74 73 35 44 61 74  wid.){.  Fts5Dat
5ec0: 61 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69  a *pRet = 0;.  i
5ed0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
5ee0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
5ef0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
5f00: 23 69 66 20 30 0a 46 74 73 35 42 75 66 66 65 72  #if 0.Fts5Buffer
5f10: 20 62 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a   buf = {0,0,0};.
5f20: 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26  fts5DebugRowid(&
5f30: 72 63 2c 20 26 62 75 66 2c 20 69 52 6f 77 69 64  rc, &buf, iRowid
5f40: 29 3b 0a 66 70 72 69 6e 74 66 28 73 74 64 6f 75  );.fprintf(stdou
5f50: 74 2c 20 22 72 65 61 64 3a 20 25 73 5c 6e 22 2c  t, "read: %s\n",
5f60: 20 62 75 66 2e 70 29 3b 0a 66 66 6c 75 73 68 28   buf.p);.fflush(
5f70: 73 74 64 6f 75 74 29 3b 0a 73 71 6c 69 74 65 33  stdout);.sqlite3
5f80: 5f 66 72 65 65 28 62 75 66 2e 70 29 3b 0a 23 65  _free(buf.p);.#e
5f90: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
5fa0: 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  pReader ){.     
5fb0: 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
5fc0: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
5fd0: 41 42 4f 52 54 20 69 66 20 74 68 65 72 65 20 68  ABORT if there h
5fe0: 61 73 20 62 65 65 6e 20 61 20 73 61 76 65 70 6f  as been a savepo
5ff0: 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  int.      ** rol
6000: 6c 62 61 63 6b 20 73 69 6e 63 65 20 69 74 20 77  lback since it w
6010: 61 73 20 6c 61 73 74 20 75 73 65 64 2e 20 49 6e  as last used. In
6020: 20 74 68 69 73 20 63 61 73 65 20 61 20 6e 65 77   this case a new
6030: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20   blob handle.   
6040: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
6050: 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  d.  */.      rc 
6060: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
6070: 65 6f 70 65 6e 28 70 2d 3e 70 52 65 61 64 65 72  eopen(p->pReader
6080: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
6090: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
60a0: 41 42 4f 52 54 20 29 7b 0a 20 20 20 20 20 20 20  ABORT ){.       
60b0: 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
60c0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  (p);.        rc 
60d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
60e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
60f0: 2f 2a 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68  /* If the blob h
6100: 61 6e 64 6c 65 20 69 73 20 6e 6f 74 20 79 65 74  andle is not yet
6110: 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20   open, open and 
6120: 73 65 65 6b 20 69 74 2e 20 4f 74 68 65 72 77 69  seek it. Otherwi
6130: 73 65 2c 20 75 73 65 0a 20 20 20 20 2a 2a 20 74  se, use.    ** t
6140: 68 65 20 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29  he blob_reopen()
6150: 20 41 50 49 20 74 6f 20 72 65 73 65 65 6b 20 74   API to reseek t
6160: 68 65 20 65 78 69 73 74 69 6e 67 20 62 6c 6f 62  he existing blob
6170: 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20   handle.  */.   
6180: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d   if( p->pReader=
6190: 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  =0 ){.      Fts5
61a0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
61b0: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
61c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
61d0: 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66  _blob_open(pConf
61e0: 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20  ig->db, .       
61f0: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
6200: 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62   p->zDataTbl, "b
6210: 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30  lock", iRowid, 0
6220: 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20  , &p->pReader.  
6230: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
6240: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6250: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
6260: 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33   nByte = sqlite3
6270: 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70  _blob_bytes(p->p
6280: 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69  Reader);.      i
6290: 66 28 20 70 42 75 66 20 29 7b 0a 20 20 20 20 20  f( pBuf ){.     
62a0: 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
62b0: 6f 28 70 42 75 66 29 3b 0a 20 20 20 20 20 20 20  o(pBuf);.       
62c0: 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28   fts5BufferGrow(
62d0: 26 72 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  &rc, pBuf, nByte
62e0: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
62f0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
6300: 64 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 70 42  d(p->pReader, pB
6310: 75 66 2d 3e 70 2c 20 6e 42 79 74 65 2c 20 30 29  uf->p, nByte, 0)
6320: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
6330: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 42  ==SQLITE_OK ) pB
6340: 75 66 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  uf->n = nByte;. 
6350: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6360: 20 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35      pRet = (Fts5
6370: 44 61 74 61 2a 29 66 74 73 35 49 64 78 4d 61 6c  Data*)fts5IdxMal
6380: 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
6390: 73 35 44 61 74 61 29 20 2b 20 6e 42 79 74 65 29  s5Data) + nByte)
63a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
63b0: 52 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Ret ) return 0;.
63c0: 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e  .        pRet->n
63d0: 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   = nByte;.      
63e0: 20 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a    pRet->p = (u8*
63f0: 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20  )&pRet[1];.     
6400: 20 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20     pRet->nRef = 
6410: 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
6420: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
6430: 64 28 70 2d 3e 70 52 65 61 64 65 72 2c 20 70 52  d(p->pReader, pR
6440: 65 74 2d 3e 70 2c 20 6e 42 79 74 65 2c 20 30 29  et->p, nByte, 0)
6450: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
6460: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6470: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6480: 5f 66 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20  _free(pRet);.   
6490: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b         pRet = 0;
64a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
64b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e   }.    }.    p->
64c0: 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e  rc = rc;.    p->
64d0: 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  nRead++;.  }..  
64e0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
64f0: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
6500: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
6510: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
6520: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
6530: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
6540: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
6550: 20 65 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74   error left in t
6560: 68 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78  he .** Fts5Index
6570: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
6580: 69 63 20 46 74 73 35 44 61 74 61 20 2a 66 74 73  ic Fts5Data *fts
6590: 35 44 61 74 61 52 65 61 64 28 46 74 73 35 49 6e  5DataRead(Fts5In
65a0: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
65b0: 69 64 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  id){.  Fts5Data 
65c0: 2a 70 52 65 74 20 3d 20 66 74 73 35 44 61 74 61  *pRet = fts5Data
65d0: 52 65 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20  ReadOrBuffer(p, 
65e0: 30 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 61 73  0, iRowid);.  as
65f0: 73 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d  sert( (pRet==0)=
6600: 3d 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  =(p->rc!=SQLITE_
6610: 4f 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  OK) );.  return 
6620: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
6630: 65 61 64 20 61 20 72 65 63 6f 72 64 20 66 72 6f  ead a record fro
6640: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
6650: 6c 65 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  le into the buff
6660: 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20 74  er supplied as t
6670: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67  he.** second arg
6680: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
6690: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
66a0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 6c 65 66   an error is lef
66b0: 74 20 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64  t in the Fts5Ind
66c0: 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e  ex object. If an
66d0: 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c  .** error has al
66e0: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
66f0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
6700: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
6710: 69 73 20 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a  is a .** no-op..
6720: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6730: 74 73 35 44 61 74 61 42 75 66 66 65 72 28 46 74  ts5DataBuffer(Ft
6740: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
6750: 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69 36  Buffer *pBuf, i6
6760: 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f  4 iRowid){.  (vo
6770: 69 64 29 66 74 73 35 44 61 74 61 52 65 61 64 4f  id)fts5DataReadO
6780: 72 42 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c  rBuffer(p, pBuf,
6790: 20 69 52 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a   iRowid);.}../*.
67a0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66  ** Release a ref
67b0: 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61 20 72  erence to data r
67c0: 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64 20 62  ecord returned b
67d0: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
67e0: 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61  l to.** fts5Data
67f0: 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Read()..*/.stati
6800: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52  c void fts5DataR
6810: 65 6c 65 61 73 65 28 46 74 73 35 44 61 74 61 20  elease(Fts5Data 
6820: 2a 70 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70  *pData){.  if( p
6830: 44 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65  Data ){.    asse
6840: 72 74 28 20 70 44 61 74 61 2d 3e 6e 52 65 66 3e  rt( pData->nRef>
6850: 30 20 29 3b 0a 20 20 20 20 70 44 61 74 61 2d 3e  0 );.    pData->
6860: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
6870: 70 44 61 74 61 2d 3e 6e 52 65 66 3d 3d 30 20 29  pData->nRef==0 )
6880: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
6890: 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ata);.  }.}..sta
68a0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
68b0: 61 52 65 66 65 72 65 6e 63 65 28 46 74 73 35 44  aReference(Fts5D
68c0: 61 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 70  ata *pData){.  p
68d0: 44 61 74 61 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a  Data->nRef++;.}.
68e0: 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f 52  ./*.** INSERT OR
68f0: 20 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f 72   REPLACE a recor
6900: 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61 74  d into the %_dat
6910: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  a table..*/.stat
6920: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
6930: 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20  Write(Fts5Index 
6940: 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c 20  *p, i64 iRowid, 
6950: 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c  const u8 *pData,
6960: 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 69   int nData){.  i
6970: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  f( p->rc!=SQLITE
6980: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  _OK ) return;.. 
6990: 20 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72 3d   if( p->pWriter=
69a0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
69b0: 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  ;.    Fts5Config
69c0: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
69d0: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72  Config;.    char
69e0: 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
69f0: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6a00: 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20    "REPLACE INTO 
6a10: 27 25 71 27 2e 25 51 28 69 64 2c 20 62 6c 6f 63  '%q'.%Q(id, bloc
6a20: 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c  k) VALUES(?,?)",
6a30: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
6a40: 2d 3e 7a 44 61 74 61 54 62 6c 0a 20 20 20 20 29  ->zDataTbl.    )
6a50: 3b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d  ;.    if( zSql==
6a60: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
6a70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6a80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
6a90: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
6aa0: 61 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e  are_v2(pConfig->
6ab0: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
6ac0: 2d 3e 70 57 72 69 74 65 72 2c 20 30 29 3b 0a 20  ->pWriter, 0);. 
6ad0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6ae0: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
6af0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6b00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
6b10: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
6b20: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
6b30: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  }..  sqlite3_bin
6b40: 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69 74  d_int64(p->pWrit
6b50: 65 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a  er, 1, iRowid);.
6b60: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
6b70: 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c 20  lob(p->pWriter, 
6b80: 32 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c  2, pData, nData,
6b90: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
6ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  .  sqlite3_step(
6bb0: 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 70  p->pWriter);.  p
6bc0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
6bd0: 65 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72 29  eset(p->pWriter)
6be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  ;.}../*.** Execu
6bf0: 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  te the following
6c00: 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   SQL:.**.**     
6c10: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
6c20: 74 61 20 57 48 45 52 45 20 69 64 20 42 45 54 57  ta WHERE id BETW
6c30: 45 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44 20  EEN $iFirst AND 
6c40: 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63  $iLast.*/.static
6c50: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 44 65   void fts5DataDe
6c60: 6c 65 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  lete(Fts5Index *
6c70: 70 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20 69  p, i64 iFirst, i
6c80: 36 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66 28  64 iLast){.  if(
6c90: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
6ca0: 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69  K ) return;..  i
6cb0: 66 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d  f( p->pDeleter==
6cc0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  0 ){.    int rc;
6cd0: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
6ce0: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
6cf0: 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20  onfig;.    char 
6d00: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
6d10: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
6d20: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25   "DELETE FROM '%
6d30: 71 27 2e 25 51 20 57 48 45 52 45 20 69 64 3e 3d  q'.%Q WHERE id>=
6d40: 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 70 43  ? AND id<=?", pC
6d50: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
6d60: 44 61 74 61 54 62 6c 0a 20 20 20 20 29 3b 0a 20  DataTbl.    );. 
6d70: 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29     if( zSql==0 )
6d80: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
6d90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
6da0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
6db0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
6dc0: 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  _v2(pConfig->db,
6dd0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70   zSql, -1, &p->p
6de0: 44 65 6c 65 74 65 72 2c 20 30 29 3b 0a 20 20 20  Deleter, 0);.   
6df0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6e00: 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
6e10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6e20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  OK ){.      p->r
6e30: 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
6e40: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
6e50: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
6e60: 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65  int64(p->pDelete
6e70: 72 2c 20 31 2c 20 69 46 69 72 73 74 29 3b 0a 20  r, 1, iFirst);. 
6e80: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
6e90: 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c  t64(p->pDeleter,
6ea0: 20 32 2c 20 69 4c 61 73 74 29 3b 0a 20 20 73 71   2, iLast);.  sq
6eb0: 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44  lite3_step(p->pD
6ec0: 65 6c 65 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63  eleter);.  p->rc
6ed0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
6ee0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d  (p->pDeleter);.}
6ef0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
6f00: 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 68  e sqlite3_blob h
6f10: 61 6e 64 6c 65 20 75 73 65 64 20 74 6f 20 72 65  andle used to re
6f20: 61 64 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ad records from 
6f30: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
6f40: 2e 0a 2a 2a 20 41 6e 64 20 64 69 73 63 61 72 64  ..** And discard
6f50: 20 61 6e 79 20 63 61 63 68 65 64 20 72 65 61 64   any cached read
6f60: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
6f70: 20 69 73 20 63 61 6c 6c 65 64 20 61 74 20 74 68   is called at th
6f80: 65 20 65 6e 64 20 6f 66 0a 2a 2a 20 61 20 72 65  e end of.** a re
6f90: 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad transaction o
6fa0: 72 20 77 68 65 6e 20 61 6e 79 20 73 75 62 2d 74  r when any sub-t
6fb0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
6fc0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74  lled back..*/.st
6fd0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
6fe0: 74 61 52 65 73 65 74 28 46 74 73 35 49 6e 64 65  taReset(Fts5Inde
6ff0: 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  x *p){.  if( p->
7000: 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73  pReader ){.    s
7010: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
7020: 65 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20  e(p->pReader);. 
7030: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
7040: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
7050: 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72  Remove all recor
7060: 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ds associated wi
7070: 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69  th segment iSegi
7080: 64 20 69 6e 20 69 6e 64 65 78 20 69 49 64 78 2e  d in index iIdx.
7090: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
70a0: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
70b0: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
70c0: 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 69 6e  *p, int iIdx, in
70d0: 74 20 69 53 65 67 69 64 29 7b 0a 20 20 69 36 34  t iSegid){.  i64
70e0: 20 69 46 69 72 73 74 20 3d 20 46 54 53 35 5f 53   iFirst = FTS5_S
70f0: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64  EGMENT_ROWID(iId
7100: 78 2c 20 69 53 65 67 69 64 2c 20 30 2c 20 30 29  x, iSegid, 0, 0)
7110: 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
7120: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
7130: 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2b  ID(iIdx, iSegid+
7140: 31 2c 20 30 2c 20 30 29 2d 31 3b 0a 20 20 66 74  1, 0, 0)-1;.  ft
7150: 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20  s5DataDelete(p, 
7160: 69 46 69 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a  iFirst, iLast);.
7170: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
7180: 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20  lize and return 
7190: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  the structure re
71a0: 63 6f 72 64 20 63 75 72 72 65 6e 74 6c 79 20 73  cord currently s
71b0: 74 6f 72 65 64 20 69 6e 20 73 65 72 69 61 6c 69  tored in seriali
71c0: 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68  zed.** form with
71d0: 69 6e 20 62 75 66 66 65 72 20 70 44 61 74 61 2f  in buffer pData/
71e0: 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nData..**.** The
71f0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61   Fts5Structure.a
7200: 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68  Level[] and each
7210: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7220: 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79  vel.aSeg[] array
7230: 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c  .** are over-all
7240: 6f 63 61 74 65 64 20 62 79 20 6f 6e 65 20 73 6c  ocated by one sl
7250: 6f 74 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ot. This allows 
7260: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  the structure co
7270: 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20  ntents.** to be 
7280: 6d 6f 72 65 20 65 61 73 69 6c 79 20 65 64 69 74  more easily edit
7290: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
72a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
72b0: 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 4e  pOut is set to N
72c0: 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74  ULL and an SQLit
72d0: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
72e0: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
72f0: 69 73 65 2c 20 2a 70 70 4f 75 74 20 69 73 20 73  ise, *ppOut is s
7300: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
7310: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e  he new object an
7320: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
7330: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
7340: 69 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63  ic int fts5Struc
7350: 74 75 72 65 44 65 63 6f 64 65 28 0a 20 20 63 6f  tureDecode(.  co
7360: 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 20  nst u8 *pData,  
7370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7380: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
7390: 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 73 74  ng serialized st
73a0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
73b0: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
73d0: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
73e0: 44 61 74 61 20 69 6e 20 62 79 74 65 73 20 2a 2f  Data in bytes */
73f0: 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65  .  int *piCookie
7400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7410: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
7420: 69 6f 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ion cookie value
7430: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
7440: 75 72 65 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ure **ppOut     
7450: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65        /* OUT: De
7460: 73 65 72 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63  serialized objec
7470: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
7480: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7490: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
74a0: 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65   iLvl;.  int nLe
74b0: 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vel = 0;.  int n
74c0: 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69  Segment = 0;.  i
74d0: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
74f0: 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
7500: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 74 20   to allocate at 
7510: 70 52 65 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  pRet */.  Fts5St
7520: 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20  ructure *pRet = 
7530: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  0;        /* Str
7540: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 74 6f  ucture object to
7550: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
7560: 20 47 72 61 62 20 74 68 65 20 63 6f 6f 6b 69 65   Grab the cookie
7570: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20   value */.  if( 
7580: 70 69 43 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f  piCookie ) *piCo
7590: 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 46 74  okie = sqlite3Ft
75a0: 73 35 47 65 74 33 32 28 70 44 61 74 61 29 3b 0a  s5Get32(pData);.
75b0: 20 20 69 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52    i = 4;..  /* R
75c0: 65 61 64 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ead the total nu
75d0: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 61  mber of levels a
75e0: 6e 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nd segments from
75f0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
7600: 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
7610: 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69   record.  */.  i
7620: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7630: 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65  &pData[i], nLeve
7640: 6c 29 3b 0a 20 20 69 20 2b 3d 20 67 65 74 56 61  l);.  i += getVa
7650: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
7660: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e  , nSegment);.  n
7670: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73  Byte = (.      s
7680: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7690: 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ure) +          
76a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
76b0: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
76c0: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
76d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20  StructureLevel) 
76e0: 2a 20 28 6e 4c 65 76 65 6c 29 20 20 20 20 20 20  * (nLevel)      
76f0: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7700: 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74  y */.  );.  pRet
7710: 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
7720: 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
7730: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
7740: 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65  yte);..  if( pRe
7750: 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  t ){.    pRet->n
7760: 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a  Level = nLevel;.
7770: 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
7780: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
7790: 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69  [i], &pRet->nWri
77a0: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  teCounter);..   
77b0: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63 3d   for(iLvl=0; rc=
77c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
77d0: 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  vl<nLevel; iLvl+
77e0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
77f0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
7800: 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76  vl = &pRet->aLev
7810: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
7820: 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20  int nTotal;.    
7830: 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20    int iSeg;..   
7840: 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e     i += getVarin
7850: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
7860: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20  Lvl->nMerge);.  
7870: 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69      i += getVari
7880: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7890: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61  nTotal);.      a
78a0: 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70  ssert( nTotal>=p
78b0: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20  Lvl->nMerge );. 
78c0: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
78d0: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
78e0: 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33  Segment*)sqlite3
78f0: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
7900: 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e  rc, .          n
7910: 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46  Total * sizeof(F
7920: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7930: 65 6e 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20  ent).      );.. 
7940: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7950: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7960: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
7970: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7980: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
7990: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
79a0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
79b0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  getVarint32(&pDa
79c0: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
79d0: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
79e0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
79f0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  getVarint32(&pDa
7a00: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7a10: 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74 29  g[iSeg].nHeight)
7a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
7a30: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44   getVarint32(&pD
7a40: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
7a50: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
7a60: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  st);.          i
7a70: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7a80: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7a90: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
7aa0: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Last);.        }
7ab0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7ac0: 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70   }..  *ppOut = p
7ad0: 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Ret;.  return rc
7ae0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74  ;.}../*.**.*/.st
7af0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
7b00: 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28  ructureAddLevel(
7b10: 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53 74  int *pRc, Fts5St
7b20: 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
7b30: 63 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d  ct){.  if( *pRc=
7b40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7b50: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7b60: 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
7b70: 72 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e 4c  ruct;.    int nL
7b80: 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e  evel = pStruct->
7b90: 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74 20  nLevel;.    int 
7ba0: 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20  nByte = (.      
7bb0: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7bc0: 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20  ucture) +       
7bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7be0: 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  in structure */.
7bf0: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46          sizeof(F
7c00: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
7c10: 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20  l) * (nLevel+1) 
7c20: 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72   /* aLevel[] arr
7c30: 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20  ay */.    );..  
7c40: 20 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69    pStruct = sqli
7c50: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74 72  te3_realloc(pStr
7c60: 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  uct, nByte);.   
7c70: 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
7c80: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
7c90: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c  truct->aLevel[nL
7ca0: 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  evel], 0, sizeof
7cb0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
7cc0: 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53 74  vel));.      pSt
7cd0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a  ruct->nLevel++;.
7ce0: 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74 20        *ppStruct 
7cf0: 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d  = pStruct;.    }
7d00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63  else{.      *pRc
7d10: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7d20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
7d30: 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65 6c  .** Extend level
7d40: 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74 68   iLvl so that th
7d50: 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72 20  ere is room for 
7d60: 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61 20  at least nExtra 
7d70: 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74 73  more.** segments
7d80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7d90: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
7da0: 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e 74  tendLevel(.  int
7db0: 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53 74   *pRc, .  Fts5St
7dc0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
7dd0: 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 0a  , .  int iLvl, .
7de0: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a 20    int nExtra, . 
7df0: 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b 0a   int bInsert.){.
7e00: 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
7e10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
7e20: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
7e30: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
7e40: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
7e50: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
7e60: 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a  eSegment *aNew;.
7e70: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a      int nByte;..
7e80: 20 20 20 20 6e 42 79 74 65 20 3d 20 28 70 4c 76      nByte = (pLv
7e90: 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72 61  l->nSeg + nExtra
7ea0: 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  ) * sizeof(Fts5S
7eb0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
7ec0: 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c  ;.    aNew = sql
7ed0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c 76  ite3_realloc(pLv
7ee0: 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65 29 3b  l->aSeg, nByte);
7ef0: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 20 29 7b  .    if( aNew ){
7f00: 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 73 65  .      if( bInse
7f10: 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rt==0 ){.       
7f20: 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c   memset(&aNew[pL
7f30: 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69  vl->nSeg], 0, si
7f40: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7f50: 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78  reSegment) * nEx
7f60: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tra);.      }els
7f70: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
7f80: 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  Move = pLvl->nSe
7f90: 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  g * sizeof(Fts5S
7fa0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
7fb0: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76  ;.        memmov
7fc0: 65 28 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c  e(&aNew[nExtra],
7fd0: 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20   aNew, nMove);. 
7fe0: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 4e         memset(aN
7ff0: 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  ew, 0, sizeof(Ft
8000: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8010: 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20  nt) * nExtra);. 
8020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 76       }.      pLv
8030: 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a  l->aSeg = aNew;.
8040: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8050: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
8060: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
8070: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20 64  }../*.** Read, d
8080: 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72  eserialize and r
8090: 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74  eturn the struct
80a0: 75 72 65 20 72 65 63 6f 72 64 20 66 6f 72 20 69  ure record for i
80b0: 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex iIdx..**.**
80c0: 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74 75   The Fts5Structu
80d0: 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20  re.aLevel[] and 
80e0: 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74 75  each Fts5Structu
80f0: 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61  reLevel.aSeg[] a
8100: 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72  rray.** are over
8110: 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 64 65  -allocated as de
8120: 73 63 72 69 62 65 64 20 66 6f 72 20 66 75 6e 63  scribed for func
8130: 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63 74 75  tion fts5Structu
8140: 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61  reDecode() .** a
8150: 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  bove..**.** If a
8160: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8170: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
8180: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
8190: 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a  de left in the.*
81a0: 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  * Fts5Index hand
81b0: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
81c0: 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
81d0: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
81e0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61  unction.** is ca
81f0: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
8200: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46  -op..*/.static F
8210: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74  ts5Structure *ft
8220: 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
8230: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
8240: 74 20 69 49 64 78 29 7b 0a 20 20 46 74 73 35 43  t iIdx){.  Fts5C
8250: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
8260: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46   p->pConfig;.  F
8270: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
8280: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
8290: 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72 65 74 75  * Object to retu
82a0: 72 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  rn */.  Fts5Data
82b0: 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20   *pData;        
82c0: 20 20 20 20 20 20 20 20 2f 2a 20 25 5f 64 61 74          /* %_dat
82d0: 61 20 65 6e 74 72 79 20 63 6f 6e 74 61 69 6e 69  a entry containi
82e0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65 63  ng structure rec
82f0: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ord */.  int iCo
8300: 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20  okie;           
8310: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
8320: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
8330: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
8340: 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
8350: 72 65 66 69 78 20 29 3b 0a 20 20 70 44 61 74 61  refix );.  pData
8360: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
8370: 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  p, FTS5_STRUCTUR
8380: 45 5f 52 4f 57 49 44 28 69 49 64 78 29 29 3b 0a  E_ROWID(iIdx));.
8390: 20 20 69 66 28 20 21 70 44 61 74 61 20 29 20 72    if( !pData ) r
83a0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 72 63  eturn 0;.  p->rc
83b0: 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
83c0: 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c  Decode(pData->p,
83d0: 20 70 44 61 74 61 2d 3e 6e 2c 20 26 69 43 6f 6f   pData->n, &iCoo
83e0: 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a 0a 20 20  kie, &pRet);..  
83f0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8400: 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f 6e 66  E_OK && p->pConf
8410: 69 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f  ig->iCookie!=iCo
8420: 6f 6b 69 65 20 29 7b 0a 20 20 20 20 70 2d 3e 72  okie ){.    p->r
8430: 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43  c = sqlite3Fts5C
8440: 6f 6e 66 69 67 4c 6f 61 64 28 70 2d 3e 70 43 6f  onfigLoad(p->pCo
8450: 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a  nfig, iCookie);.
8460: 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52    }..  fts5DataR
8470: 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
8480: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8490: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
84a0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e   reference to an
84b0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
84c0: 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20 62  bject returned b
84d0: 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a 2a  y an earlier .**
84e0: 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74 72   call to fts5Str
84f0: 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72 20  uctureRead() or 
8500: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
8510: 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ode()..*/.static
8520: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
8530: 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35 53  ureRelease(Fts5S
8540: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
8550: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  t){.  int i;.  f
8560: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63  or(i=0; i<pStruc
8570: 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b  t->nLevel; i++){
8580: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
8590: 65 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  e(pStruct->aLeve
85a0: 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 7d 0a  l[i].aSeg);.  }.
85b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
85c0: 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Struct);.}../*.*
85d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
85e0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  al number of seg
85f0: 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73  ments in index s
8600: 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74  tructure pStruct
8610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8620: 66 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75  fts5StructureCou
8630: 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73 35 53  ntSegments(Fts5S
8640: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
8650: 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65  t){.  int nSegme
8660: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
8670: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
8680: 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
8690: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 3b  s */.  int iLvl;
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
86c0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
86d0: 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 0a 20 20 66  h levels */..  f
86e0: 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
86f0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
8700: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 6e 53   iLvl++){.    nS
8710: 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63  egment += pStruc
8720: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
8730: 6e 53 65 67 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  nSeg;.  }..  ret
8740: 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a  urn nSegment;.}.
8750: 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65  ./*.** Serialize
8760: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22   and store the "
8770: 73 74 72 75 63 74 75 72 65 22 20 72 65 63 6f 72  structure" recor
8780: 64 20 66 6f 72 20 69 6e 64 65 78 20 69 49 64 78  d for index iIdx
8790: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
87a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
87b0: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
87c0: 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  in the Fts5Index
87d0: 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a   object. If an.*
87e0: 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  * error has alre
87f0: 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
8800: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
8810: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
8820: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
8830: 74 75 72 65 57 72 69 74 65 28 46 74 73 35 49 6e  tureWrite(Fts5In
8840: 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78  dex *p, int iIdx
8850: 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
8860: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
8870: 20 6e 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20   nSegment;      
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8890: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
88a0: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74  segments */.  Ft
88b0: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
88d0: 20 42 75 66 66 65 72 20 74 6f 20 73 65 72 69 61   Buffer to seria
88e0: 6c 69 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  lize record into
88f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 20   */.  int iLvl; 
8900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8910: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
8920: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
8930: 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 69 6e 74   levels */.  int
8940: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8960: 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f 20  Cookie value to 
8970: 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 6e 53 65 67  store */..  nSeg
8980: 6d 65 6e 74 20 3d 20 66 74 73 35 53 74 72 75 63  ment = fts5Struc
8990: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
89a0: 73 28 70 53 74 72 75 63 74 29 3b 0a 20 20 6d 65  s(pStruct);.  me
89b0: 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
89c0: 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
89d0: 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20  );..  /* Append 
89e0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66  the current conf
89f0: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
8a00: 20 2a 2f 0a 20 20 69 43 6f 6f 6b 69 65 20 3d 20   */.  iCookie = 
8a10: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f  p->pConfig->iCoo
8a20: 6b 69 65 3b 0a 20 20 69 66 28 20 69 43 6f 6f 6b  kie;.  if( iCook
8a30: 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d  ie<0 ) iCookie =
8a40: 20 30 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72   0;.  fts5Buffer
8a50: 41 70 70 65 6e 64 33 32 28 26 70 2d 3e 72 63 2c  Append32(&p->rc,
8a60: 20 26 62 75 66 2c 20 69 43 6f 6f 6b 69 65 29 3b   &buf, iCookie);
8a70: 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ..  fts5BufferAp
8a80: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
8a90: 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74  c, &buf, pStruct
8aa0: 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 66 74 73  ->nLevel);.  fts
8ab0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
8ac0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
8ad0: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 66  , nSegment);.  f
8ae0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8af0: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8b00: 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74  uf, (i64)pStruct
8b10: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
8b20: 3b 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  ;..  for(iLvl=0;
8b30: 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
8b40: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
8b50: 20 20 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20      int iSeg;   
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b70: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
8b80: 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67  rate through seg
8b90: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 46 74 73  ments */.    Fts
8ba0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
8bb0: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
8bc0: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
8bd0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
8be0: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
8bf0: 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e  c, &buf, pLvl->n
8c00: 4d 65 72 67 65 29 3b 0a 20 20 20 20 66 74 73 35  Merge);.    fts5
8c10: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8c20: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8c30: 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20   pLvl->nSeg);.  
8c40: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
8c50: 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53  nMerge<=pLvl->nS
8c60: 65 67 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  eg );..    for(i
8c70: 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c  Seg=0; iSeg<pLvl
8c80: 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ->nSeg; iSeg++){
8c90: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
8ca0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8cb0: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8cc0: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ->aSeg[iSeg].iSe
8cd0: 67 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35  gid);.      fts5
8ce0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8cf0: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8d00: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
8d10: 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20  ].nHeight);.    
8d20: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8d30: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8d40: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
8d50: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
8d60: 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  t);.      fts5Bu
8d70: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8d80: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
8d90: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8da0: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 7d  pgnoLast);.    }
8db0: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
8dc0: 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54  Write(p, FTS5_ST
8dd0: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 28 69 49  RUCTURE_ROWID(iI
8de0: 64 78 29 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  dx), buf.p, buf.
8df0: 6e 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  n);.  fts5Buffer
8e00: 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 23  Free(&buf);.}..#
8e10: 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64  if 0.static void
8e20: 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74   fts5PrintStruct
8e30: 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ure(const char *
8e40: 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74  zCaption, Fts5St
8e50: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
8e60: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
8e70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42  LITE_OK;.  Fts5B
8e80: 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
8e90: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
8ea0: 65 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73  eof(buf));.  fts
8eb0: 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
8ec0: 26 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75  &rc, &buf, pStru
8ed0: 63 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  ct);.  fprintf(s
8ee0: 74 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e  tdout, "%s: %s\n
8ef0: 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66  ", zCaption, buf
8f00: 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74  .p);.  fflush(st
8f10: 64 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66  dout);.  fts5Buf
8f20: 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
8f30: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
8f40: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
8f50: 72 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a  re(x,y).#endif..
8f60: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
8f70: 65 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53  egmentSize(Fts5S
8f80: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
8f90: 2a 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e  *pSeg){.  return
8fa0: 20 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   1 + pSeg->pgnoL
8fb0: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
8fc0: 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  First;.}../*.** 
8fd0: 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  Return a copy of
8fe0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
8ff0: 20 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74   pStruct. Except
9000: 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e  , promote as man
9010: 79 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 61 73  y segments.** as
9020: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76   possible to lev
9030: 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20  el iPromote. If 
9040: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e  an OOM occurs, N
9050: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ULL is returned.
9060: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9070: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9080: 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e  moteTo(.  Fts5In
9090: 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50  dex *p,.  int iP
90a0: 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a  romote,.  int sz
90b0: 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53  Promote,.  Fts5S
90c0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
90d0: 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69  t.){.  int il, i
90e0: 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  s;.  Fts5Structu
90f0: 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20  reLevel *pOut = 
9100: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
9110: 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 66  [iPromote];..  f
9120: 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31  or(il=iPromote+1
9130: 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  ; il<pStruct->nL
9140: 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20  evel; il++){.   
9150: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9160: 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
9170: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d  ruct->aLevel[il]
9180: 3b 0a 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76  ;.    for(is=pLv
9190: 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30  l->nSeg-1; is>=0
91a0: 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 69  ; is--){.      i
91b0: 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d  nt sz = fts5Segm
91c0: 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61  entSize(&pLvl->a
91d0: 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20  Seg[is]);.      
91e0: 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65  if( sz>szPromote
91f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
9200: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
9210: 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
9220: 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d  , pStruct, iProm
9230: 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  ote, 1, 1);.    
9240: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
9250: 74 75 72 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 63  turn;.      memc
9260: 70 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26  py(pOut->aSeg, &
9270: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20  pLvl->aSeg[is], 
9280: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
9290: 74 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20  tureSegment));. 
92a0: 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b       pOut->nSeg+
92b0: 2b 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e  +;.      pLvl->n
92c0: 53 65 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  Seg--;.    }.  }
92d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20  .}../*.** A new 
92e0: 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74  segment has just
92f0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
9300: 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69   level iLvl of i
9310: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a  ndex structure.*
9320: 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20  * pStruct. This 
9330: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
9340: 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65  nes if any segme
9350: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72  nts should be pr
9360: 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72  omoted.** as a r
9370: 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20  esult. Segments 
9380: 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20  are promoted in 
9390: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
93a0: 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65  *.**   a) If the
93b0: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
93c0: 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72  itten is smaller
93d0: 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   than one or mor
93e0: 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20  e segments.**   
93f0: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 72     within the pr
9400: 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64  evious populated
9410: 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72   level, it is pr
9420: 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72  omoted to the pr
9430: 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70  evious.**      p
9440: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a  opulated level..
9450: 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68  **.**   b) If th
9460: 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  e segment just w
9470: 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72  ritten is larger
9480: 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74   than the newest
9490: 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20   segment on.**  
94a0: 20 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70      the next pop
94b0: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68  ulated level, th
94c0: 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c  en that segment,
94d0: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61   and any other a
94e0: 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20  djacent.**      
94f0: 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72  segments that ar
9500: 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74  e also smaller t
9510: 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74  han the one just
9520: 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a   written, are .*
9530: 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e  *      promoted.
9540: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f   .**.** If one o
9550: 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20  r more segments 
9560: 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68  are promoted, th
9570: 65 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  e structure obje
9580: 63 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a  ct is updated.**
9590: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73   to reflect this
95a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
95b0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
95c0: 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64  omote(.  Fts5Ind
95d0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
95e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
95f0: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
9600: 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20  */.  int iLvl,  
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65       /* Index le
9630: 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64  vel just updated
9640: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
9650: 75 72 65 20 2a 70 53 74 72 75 63 74 20 20 20 20  ure *pStruct    
9660: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
9670: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
9680: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9690: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
96a0: 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69   iTst;.    int i
96b0: 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20  Promote = -1;.  
96c0: 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 3b    int szPromote;
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68  /* Promote anyth
96f0: 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72  ing this size or
9700: 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
9710: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9720: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
9730: 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   Segment just wr
9740: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 46 74 73  itten */.    Fts
9750: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9760: 2a 70 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 73  *pTst;.    int s
9770: 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  zSeg;           
9780: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9790: 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73 74   of segment just
97a0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 0a 20 20   written */...  
97b0: 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
97c0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
97d0: 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c  aSeg[pStruct->aL
97e0: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d  evel[iLvl].nSeg-
97f0: 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20 3d 20  1];.    szSeg = 
9800: 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  (1 + pSeg->pgnoL
9810: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
9820: 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  First);..    /* 
9830: 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74  Check for condit
9840: 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20 20 66  ion (a) */.    f
9850: 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20  or(iTst=iLvl-1; 
9860: 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74 72 75  iTst>=0 && pStru
9870: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d  ct->aLevel[iTst]
9880: 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d  .nSeg==0; iTst--
9890: 29 3b 0a 20 20 20 20 70 54 73 74 20 3d 20 26 70  );.    pTst = &p
98a0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
98b0: 54 73 74 5d 3b 0a 20 20 20 20 69 66 28 20 69 54  Tst];.    if( iT
98c0: 73 74 3e 3d 30 20 26 26 20 70 54 73 74 2d 3e 6e  st>=0 && pTst->n
98d0: 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Merge==0 ){.    
98e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
98f0: 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20  nt szMax = 0;.  
9900: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
9910: 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  Tst->nSeg; i++){
9920: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
9930: 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  = pTst->aSeg[i].
9940: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d  pgnoLast - pTst-
9950: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72  >aSeg[i].pgnoFir
9960: 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  st + 1;.        
9970: 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73  if( sz>szMax ) s
9980: 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20  zMax = sz;.     
9990: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
99a0: 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20  ax>=szSeg ){.   
99b0: 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
99c0: 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50  n (a) is true. P
99d0: 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73  romote the newes
99e0: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76  t segment on lev
99f0: 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  el .        ** i
9a00: 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73  Lvl to level iTs
9a10: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  t.  */.        i
9a20: 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a  Promote = iTst;.
9a30: 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74          szPromot
9a40: 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20  e = szMax;.     
9a50: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
9a60: 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64 69   Check for condi
9a70: 74 69 6f 6e 20 28 62 29 20 2a 2f 0a 20 20 20 20  tion (b) */.    
9a80: 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29  if( iPromote<0 )
9a90: 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
9aa0: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74  ctureLevel *pTst
9ab0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54 73 74  ;.      for(iTst
9ac0: 3d 69 4c 76 6c 2b 31 3b 20 69 54 73 74 3c 70 53  =iLvl+1; iTst<pS
9ad0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
9ae0: 54 73 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Tst++){.        
9af0: 70 54 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d  pTst = &pStruct-
9b00: 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20  >aLevel[iTst];. 
9b10: 20 20 20 20 20 20 20 69 66 28 20 70 54 73 74 2d         if( pTst-
9b20: 3e 6e 53 65 67 20 29 20 62 72 65 61 6b 3b 0a 20  >nSeg ) break;. 
9b30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9b40: 20 69 54 73 74 3c 70 53 74 72 75 63 74 2d 3e 6e   iTst<pStruct->n
9b50: 4c 65 76 65 6c 20 26 26 20 70 54 73 74 2d 3e 6e  Level && pTst->n
9b60: 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Merge==0 ){.    
9b70: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
9b80: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 32 20  eSegment *pSeg2 
9b90: 3d 20 26 70 54 73 74 2d 3e 61 53 65 67 5b 70 54  = &pTst->aSeg[pT
9ba0: 73 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20  st->nSeg-1];.   
9bb0: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 53       int sz = pS
9bc0: 65 67 32 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  eg2->pgnoLast - 
9bd0: 70 53 65 67 32 2d 3e 70 67 6e 6f 46 69 72 73 74  pSeg2->pgnoFirst
9be0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   + 1;.        if
9bf0: 28 20 73 7a 3c 3d 73 7a 53 65 67 20 29 7b 0a 20  ( sz<=szSeg ){. 
9c00: 20 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74           iPromot
9c10: 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20  e = iLvl;.      
9c20: 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20      szPromote = 
9c30: 73 7a 53 65 67 3b 0a 20 20 20 20 20 20 20 20 7d  szSeg;.        }
9c40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9c50: 20 20 20 20 2f 2a 20 49 66 20 69 50 72 6f 6d 6f      /* If iPromo
9c60: 74 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  te is greater th
9c70: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
9c80: 65 72 6f 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ero at this poin
9c90: 74 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a  t, then it.    *
9ca0: 2a 20 69 73 20 74 68 65 20 6c 65 76 65 6c 20 6e  * is the level n
9cb0: 75 6d 62 65 72 20 6f 66 20 61 20 6c 65 76 65 6c  umber of a level
9cc0: 20 74 6f 20 77 68 69 63 68 20 73 65 67 6d 65 6e   to which segmen
9cd0: 74 73 20 74 68 61 74 20 63 6f 6e 73 69 73 74 20  ts that consist 
9ce0: 6f 66 0a 20 20 20 20 2a 2a 20 73 7a 50 72 6f 6d  of.    ** szProm
9cf0: 6f 74 65 20 6f 72 20 66 65 77 65 72 20 70 61 67  ote or fewer pag
9d00: 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f  es should be pro
9d10: 6d 6f 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69  moted. */ .    i
9d20: 66 28 20 69 50 72 6f 6d 6f 74 65 3e 3d 30 20 29  f( iPromote>=0 )
9d30: 7b 0a 20 20 20 20 20 20 66 74 73 35 50 72 69 6e  {.      fts5Prin
9d40: 74 53 74 72 75 63 74 75 72 65 28 22 42 45 46 4f  tStructure("BEFO
9d50: 52 45 22 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  RE", pStruct);. 
9d60: 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
9d70: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69  rePromoteTo(p, i
9d80: 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f  Promote, szPromo
9d90: 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  te, pStruct);.  
9da0: 20 20 20 20 66 74 73 35 50 72 69 6e 74 53 74 72      fts5PrintStr
9db0: 75 63 74 75 72 65 28 22 41 46 54 45 52 22 2c 20  ucture("AFTER", 
9dc0: 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
9dd0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66    }.}.../*.** If
9de0: 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f 66 66   the pIter->iOff
9df0: 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c   offset currentl
9e00: 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  y points to an e
9e10: 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e 67 20  ntry indicating 
9e20: 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20 74  one.** or more t
9e30: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 2c 20  erm-less nodes, 
9e40: 61 64 76 61 6e 63 65 20 70 61 73 74 20 69 74 20  advance past it 
9e50: 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d 3e 6e  and set pIter->n
9e60: 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68 65 20  Empty to.** the 
9e70: 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74 79 20  number of empty 
9e80: 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a 2f 0a  child nodes..*/.
9e90: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9ea0: 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65 4e 45  NodeIterGobbleNE
9eb0: 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49 74 65  mpty(Fts5NodeIte
9ec0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
9ed0: 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 49 74   pIter->iOff<pIt
9ee0: 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30 3d 3d  er->nData && 0==
9ef0: 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49  (pIter->aData[pI
9f00: 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78 66  ter->iOff] & 0xf
9f10: 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  e) ){.    pIter-
9f20: 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
9f30: 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f  >aData[pIter->iO
9f40: 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20 20 20  ff] & 0x01;.    
9f50: 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b 0a 20  pIter->iOff++;. 
9f60: 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b     pIter->iOff +
9f70: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
9f80: 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65  Iter->aData[pIte
9f90: 72 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65 72 2d  r->iOff], pIter-
9fa0: 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65 6c 73  >nEmpty);.  }els
9fb0: 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 45  e{.    pIter->nE
9fc0: 6d 70 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 49  mpty = 0;.    pI
9fd0: 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 30 3b  ter->bDlidx = 0;
9fe0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
9ff0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
a000: 74 20 65 6e 74 72 79 20 77 69 74 68 69 6e 20 74  t entry within t
a010: 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  he node..*/.stat
a020: 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65  ic void fts5Node
a030: 49 74 65 72 4e 65 78 74 28 69 6e 74 20 2a 70 52  IterNext(int *pR
a040: 63 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20  c, Fts5NodeIter 
a050: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
a060: 49 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65  Iter->iOff>=pIte
a070: 72 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  r->nData ){.    
a080: 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 30  pIter->aData = 0
a090: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 43 68  ;.    pIter->iCh
a0a0: 69 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 45  ild += pIter->nE
a0b0: 6d 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mpty;.  }else{. 
a0c0: 20 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e 4e 65     int nPre, nNe
a0d0: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f  w;.    pIter->iO
a0e0: 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ff += getVarint3
a0f0: 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  2(&pIter->aData[
a100: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 50  pIter->iOff], nP
a110: 72 65 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  re);.    pIter->
a120: 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
a130: 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74  t32(&pIter->aDat
a140: 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20  a[pIter->iOff], 
a150: 6e 4e 65 77 29 3b 0a 20 20 20 20 70 49 74 65 72  nNew);.    pIter
a160: 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65 2d  ->term.n = nPre-
a170: 32 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  2;.    fts5Buffe
a180: 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c  rAppendBlob(pRc,
a190: 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
a1a0: 4e 65 77 2c 20 70 49 74 65 72 2d 3e 61 44 61 74  New, pIter->aDat
a1b0: 61 2b 70 49 74 65 72 2d 3e 69 4f 66 66 29 3b 0a  a+pIter->iOff);.
a1c0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
a1d0: 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49 74  += nNew;.    pIt
a1e0: 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 28 31  er->iChild += (1
a1f0: 20 2b 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79   + pIter->nEmpty
a200: 29 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49  );.    fts5NodeI
a210: 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28  terGobbleNEmpty(
a220: 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
a230: 2a 70 52 63 20 29 20 70 49 74 65 72 2d 3e 61 44  *pRc ) pIter->aD
a240: 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ata = 0;.  }.}..
a250: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
a260: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
a270: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
a280: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
a290: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 73  he internal.** s
a2a0: 65 67 6d 65 6e 74 20 6e 6f 64 65 20 69 6e 20 70  egment node in p
a2b0: 44 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Data..*/.static 
a2c0: 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74 65  void fts5NodeIte
a2d0: 72 49 6e 69 74 28 63 6f 6e 73 74 20 75 38 20 2a  rInit(const u8 *
a2e0: 61 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  aData, int nData
a2f0: 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a  , Fts5NodeIter *
a300: 70 49 74 65 72 29 7b 0a 20 20 6d 65 6d 73 65 74  pIter){.  memset
a310: 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
a320: 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
a330: 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 61 44 61  ter->aData = aDa
a340: 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 44 61  ta;.  pIter->nDa
a350: 74 61 20 3d 20 6e 44 61 74 61 3b 0a 20 20 70 49  ta = nData;.  pI
a360: 74 65 72 2d 3e 69 4f 66 66 20 3d 20 67 65 74 56  ter->iOff = getV
a370: 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c 20 70  arint32(aData, p
a380: 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b 0a 20  Iter->iChild);. 
a390: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62   fts5NodeIterGob
a3a0: 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65 72 29  bleNEmpty(pIter)
a3b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
a3c0: 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  any memory alloc
a3d0: 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
a3e0: 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ator object..*/.
a3f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
a400: 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46 74 73  NodeIterFree(Fts
a410: 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72  5NodeIter *pIter
a420: 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  ){.  fts5BufferF
a430: 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  ree(&pIter->term
a440: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
a450: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
a460: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
a470: 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f  ument has the fo
a480: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73  llowing fields s
a490: 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  et.** as follows
a4a0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
a4b0: 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73 74  sets up the rest
a4c0: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
a4d0: 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70   so that it.** p
a4e0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
a4f0: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
a500: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
a510: 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 20 70 6f  *.**   pData: po
a520: 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
a530: 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 0a  -index record, .
a540: 2a 2a 20 20 20 69 4c 65 61 66 50 67 6e 6f 3a 20  **   iLeafPgno: 
a550: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74  page number that
a560: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2d 69 6e   this doclist-in
a570: 64 65 78 20 69 73 20 61 73 73 6f 63 69 61 74 65  dex is associate
a580: 64 20 77 69 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  d with..*/.stati
a590: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
a5a0: 74 65 72 46 69 72 73 74 28 46 74 73 35 44 6c 69  terFirst(Fts5Dli
a5b0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
a5c0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
a5d0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61 74 61  a = pIter->pData
a5e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
a5f0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 61  sert( pIter->pDa
a600: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
a610: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
a620: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e  >0 );..  /* Coun
a630: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
a640: 6c 65 61 64 69 6e 67 20 30 78 30 30 20 62 79 74  leading 0x00 byt
a650: 65 73 2e 20 54 68 65 6e 20 73 65 74 20 69 4c 65  es. Then set iLe
a660: 61 66 50 67 6e 6f 2e 20 2a 2f 0a 20 20 66 6f 72  afPgno. */.  for
a670: 28 69 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e 6e  (i=0; i<pData->n
a680: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69 66 28  ; i++){ .    if(
a690: 20 70 44 61 74 61 2d 3e 70 5b 69 5d 20 29 20 62   pData->p[i] ) b
a6a0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 49 74 65  reak;.  }.  pIte
a6b0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20  r->iLeafPgno += 
a6c0: 28 69 2b 31 29 3b 0a 20 20 70 49 74 65 72 2d 3e  (i+1);.  pIter->
a6d0: 69 4f 66 66 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20  iOff = i;..  /* 
a6e0: 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20 61 6c  Unless we are al
a6f0: 72 65 61 64 79 20 61 74 20 74 68 65 20 65 6e 64  ready at the end
a700: 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2d   of the doclist-
a710: 69 6e 64 65 78 2c 20 6c 6f 61 64 20 74 68 65 20  index, load the 
a720: 66 69 72 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64  first.  ** rowid
a730: 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 69 66   value.  */.  if
a740: 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70 44  ( pIter->iOff<pD
a750: 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49  ata->n ){.    pI
a760: 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74  ter->iOff += get
a770: 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70  Varint(&pData->p
a780: 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 28  [pIter->iOff], (
a790: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
a7a0: 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  wid);.  }else{. 
a7b0: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
a7c0: 20 31 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d   1;.  }.  pIter-
a7d0: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 49 74  >iFirstOff = pIt
a7e0: 65 72 2d 3e 69 4f 66 66 3b 0a 20 20 72 65 74 75  er->iOff;.  retu
a7f0: 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a  rn pIter->bEof;.
a800: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
a810: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
a820: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
a830: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
a840: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
a850: 64 78 49 74 65 72 4e 65 78 74 28 46 74 73 35 44  dxIterNext(Fts5D
a860: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
a870: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  {.  Fts5Data *pD
a880: 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61  ata = pIter->pDa
a890: 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ta;.  int iOff;.
a8a0: 0a 20 20 66 6f 72 28 69 4f 66 66 3d 70 49 74 65  .  for(iOff=pIte
a8b0: 72 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  r->iOff; iOff<pD
a8c0: 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b  ata->n; iOff++){
a8d0: 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
a8e0: 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b  p[iOff] ) break;
a8f0: 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66   .  }..  if( iOf
a900: 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20  f<pData->n ){.  
a910: 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
a920: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
a930: 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 49 74 65   += (iOff - pIte
a940: 72 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a 20 20  r->iOff) + 1;.  
a950: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
a960: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
a970: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
a980: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52  );.    pIter->iR
a990: 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20  owid -= iVal;.  
a9a0: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20    pIter->iOff = 
a9b0: 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iOff;.  }else{. 
a9c0: 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
a9d0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
a9e0: 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d  n pIter->bEof;.}
a9f0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
aa00: 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74  5DlidxIterEof(Ft
aa10: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
aa20: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
aa30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  ){.  return (p->
aa40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
aa50: 20 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d   pIter->bEof);.}
aa60: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
aa70: 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28  s5DlidxIterLast(
aa80: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
aa90: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 66 74 73  Iter){.  if( fts
aaa0: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
aab0: 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  pIter)==0 ){.   
aac0: 20 77 68 69 6c 65 28 20 30 3d 3d 66 74 73 35 44   while( 0==fts5D
aad0: 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 49 74  lidxIterNext(pIt
aae0: 65 72 29 20 29 3b 0a 20 20 20 20 70 49 74 65 72  er) );.    pIter
aaf0: 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 7d 0a  ->bEof = 0;.  }.
ab00: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
ab10: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
ab20: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
ab30: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 4f 66  Iter){.  int iOf
ab40: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4f 66 66 3b  f = pIter->iOff;
ab50: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
ab60: 72 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  r->bEof==0 );.  
ab70: 69 66 28 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d  if( iOff<=pIter-
ab80: 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20 20  >iFirstOff ){.  
ab90: 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20    pIter->bEof = 
aba0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
abb0: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
abc0: 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69 36 34  Data->p;.    i64
abd0: 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74 20 69   iVal;.    int i
abe0: 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 43  Limit;..    /* C
abf0: 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20 70 6f  urrently iOff po
ac00: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
ac10: 74 20 62 79 74 65 20 6f 66 20 61 20 76 61 72 69  t byte of a vari
ac20: 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 0a  nt. This block .
ac30: 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65 6e 74      ** decrement
ac40: 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69 74 20  s iOff until it 
ac50: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
ac60: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
ac70: 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20 2a 2a  previous .    **
ac80: 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e 67 20   varint. Taking 
ac90: 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65 61 64  care not to read
aca0: 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f 63 61   any memory loca
acb0: 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72  tions that occur
acc0: 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  .    ** before t
acd0: 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d 65 6d  he buffer in mem
ace0: 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 4c 69  ory.  */.    iLi
acf0: 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20 3f 20  mit = (iOff>9 ? 
ad00: 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20 20 20  iOff-9 : 0);.   
ad10: 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69 4f 66   for(iOff--; iOf
ad20: 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66 2d 2d  f>iLimit; iOff--
ad30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 5b  ){.      if( (a[
ad40: 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30 29 3d  iOff-1] & 0x80)=
ad50: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
ad60: 7d 0a 0a 20 20 20 20 67 65 74 56 61 72 69 6e 74  }..    getVarint
ad70: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
ad80: 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70 49 74  )&iVal);.    pIt
ad90: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 56  er->iRowid += iV
ada0: 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  al;.    pIter->i
adb0: 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20  LeafPgno--;..   
adc0: 20 77 68 69 6c 65 28 20 69 4f 66 66 3e 70 49 74   while( iOff>pIt
add0: 65 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 0a 20  er->iFirstOff . 
ade0: 20 20 20 20 20 20 20 26 26 20 61 5b 69 4f 66 66         && a[iOff
adf0: 2d 31 5d 3d 3d 30 78 30 30 20 26 26 20 28 61 5b  -1]==0x00 && (a[
ae00: 69 4f 66 66 2d 32 5d 20 26 20 30 78 38 30 29 3d  iOff-2] & 0x80)=
ae10: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
ae20: 20 69 4f 66 66 2d 2d 3b 0a 20 20 20 20 20 20 70   iOff--;.      p
ae30: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
ae40: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74  -;.    }.    pIt
ae50: 65 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b  er->iOff = iOff;
ae60: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
ae70: 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73  Iter->bEof;.}..s
ae80: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
ae90: 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20  lidxIterInit(.  
aea0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20  /* Fts5 Backend 
aed0: 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
aee0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  n */.  int bRev,
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
af10: 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20  or ORDER BY ASC 
af20: 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 69  */.  int iIdx, i
af30: 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20  nt iSegid,      
af40: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
af50: 69 53 65 67 69 64 20 77 69 74 68 69 6e 20 69 6e  iSegid within in
af60: 64 65 78 20 69 49 64 78 20 2a 2f 0a 20 20 69 6e  dex iIdx */.  in
af70: 74 20 69 4c 65 61 66 50 67 6e 6f 2c 20 20 20 20  t iLeafPgno,    
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af90: 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   Leaf page numbe
afa0: 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64 78 20  r to load dlidx 
afb0: 66 6f 72 20 2a 2f 0a 20 20 46 74 73 35 44 6c 69  for */.  Fts5Dli
afc0: 64 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20  dxIter **ppIter 
afd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
afe0: 20 50 6f 70 75 6c 61 74 65 64 20 69 74 65 72 61   Populated itera
aff0: 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  tor */.){.  Fts5
b000: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b010: 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 46 74   = *ppIter;.  Ft
b020: 73 35 44 61 74 61 20 2a 70 44 6c 69 64 78 3b 0a  s5Data *pDlidx;.
b030: 0a 20 20 70 44 6c 69 64 78 20 3d 20 66 74 73 35  .  pDlidx = fts5
b040: 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
b050: 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57  _DOCLIST_IDX_ROW
b060: 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c  ID(iIdx, iSegid,
b070: 20 69 4c 65 61 66 50 67 6e 6f 29 29 3b 0a 20 20   iLeafPgno));.  
b080: 69 66 28 20 70 44 6c 69 64 78 3d 3d 30 20 29 20  if( pDlidx==0 ) 
b090: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 49  return;.  if( pI
b0a0: 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ter==0 ){.    *p
b0b0: 70 49 74 65 72 20 3d 20 70 49 74 65 72 20 3d 20  pIter = pIter = 
b0c0: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29  (Fts5DlidxIter*)
b0d0: 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
b0e0: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
b0f0: 78 49 74 65 72 29 29 3b 0a 20 20 20 20 69 66 28  xIter));.    if(
b100: 20 70 49 74 65 72 3d 3d 30 20 29 7b 20 0a 20 20   pIter==0 ){ .  
b110: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
b120: 61 73 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  ase(pDlidx);.   
b130: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
b140: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
b150: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
b160: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 49  izeof(Fts5DlidxI
b170: 74 65 72 29 29 3b 0a 20 20 7d 0a 0a 20 20 70 49  ter));.  }..  pI
b180: 74 65 72 2d 3e 70 44 61 74 61 20 3d 20 70 44 6c  ter->pData = pDl
b190: 69 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  idx;.  pIter->iL
b1a0: 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
b1b0: 67 6e 6f 3b 0a 20 20 69 66 28 20 62 52 65 76 3d  gno;.  if( bRev=
b1c0: 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6c  =0 ){.    fts5Dl
b1d0: 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74  idxIterFirst(pIt
b1e0: 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
b1f0: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c    fts5DlidxIterL
b200: 61 73 74 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ast(pIter);.  }.
b210: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
b220: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 74  doclist-index it
b230: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c  erator object al
b240: 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73 35 44  located by fts5D
b250: 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29 2e 0a  lidxIterInit()..
b260: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
b270: 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
b280: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
b290: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
b2a0: 74 65 72 20 29 7b 0a 20 20 20 20 66 74 73 35 44  ter ){.    fts5D
b2b0: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
b2c0: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 73 71  ->pData);.    sq
b2d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
b2e0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
b2f0: 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65  Load the next le
b300: 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  af page into the
b310: 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
b320: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b330: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
b340: 74 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64  tPage(.  Fts5Ind
b350: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
b360: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
b370: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
b380: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
b390: 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
b3a0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
b3b0: 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e   to advance to n
b3c0: 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  ext page */.){. 
b3d0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
b3e0: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
b3f0: 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 69 66 28  ter->pSeg;.  if(
b400: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 20   pIter->pLeaf ) 
b410: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
b420: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
b430: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b440: 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72  o++;.  if( pIter
b450: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65  ->iLeafPgno<=pSe
b460: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
b470: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
b480: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
b490: 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f  , .        FTS5_
b4a0: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 49  SEGMENT_ROWID(pI
b4b0: 74 65 72 2d 3e 69 49 64 78 2c 20 70 53 65 67 2d  ter->iIdx, pSeg-
b4c0: 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65  >iSegid, 0, pIte
b4d0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  r->iLeafPgno).  
b4e0: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
b4f0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
b500: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
b510: 20 4c 65 61 76 65 20 70 49 74 65 72 2d 3e 69 4c   Leave pIter->iL
b520: 65 61 66 4f 66 66 73 65 74 20 61 73 20 74 68 65  eafOffset as the
b530: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
b540: 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
b550: 20 66 69 72 73 74 0a 2a 2a 20 70 6f 73 69 74 69   first.** positi
b560: 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73  on list. The pos
b570: 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e  ition list belon
b580: 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74  ging to document
b590: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 2e 0a   pIter->iRowid..
b5a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
b5b0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65  ts5SegIterLoadTe
b5c0: 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  rm(Fts5Index *p,
b5d0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
b5e0: 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b  ter, int nKeep){
b5f0: 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72  .  u8 *a = pIter
b600: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20  ->pLeaf->p;     
b610: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
b620: 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a  read data from *
b630: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70  /.  int iOff = p
b640: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
b650: 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f  t;  /* Offset to
b660: 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e   read at */.  in
b670: 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b690: 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   Bytes of new da
b6a0: 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d  ta */..  iOff +=
b6b0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b   getVarint32(&a[
b6c0: 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
b6d0: 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20  pIter->term.n = 
b6e0: 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42 75 66  nKeep;.  fts5Buf
b6f0: 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
b700: 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
b710: 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66  rm, nNew, &a[iOf
b720: 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e  f]);.  iOff += n
b730: 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54  New;.  pIter->iT
b740: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ermLeafOffset = 
b750: 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69  iOff;.  pIter->i
b760: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70  TermLeafPgno = p
b770: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
b780: 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74  .  if( iOff>=pIt
b790: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a  er->pLeaf->n ){.
b7a0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
b7b0: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
b7c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
b7d0: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
b7e0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
b7f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
b800: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
b810: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
b820: 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20     }.    iOff = 
b830: 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72  4;.    a = pIter
b840: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a  ->pLeaf->p;.  }.
b850: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
b860: 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  3GetVarint(&a[iO
b870: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
b880: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70 49  r->iRowid);.  pI
b890: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
b8a0: 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   = iOff;.}../*.*
b8b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
b8c0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
b8d0: 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74   pIter to iterat
b8e0: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e  e through the en
b8f0: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d  tries in.** segm
b900: 65 6e 74 20 70 53 65 67 20 77 69 74 68 69 6e 20  ent pSeg within 
b910: 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68 65 20  index iIdx. The 
b920: 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
b930: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
b940: 20 0a 2a 2a 20 66 69 72 73 74 20 65 6e 74 72 79   .** first entry
b950: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
b960: 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a  ion returns..**.
b970: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
b980: 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78  ccurs, Fts5Index
b990: 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  .rc is set to an
b9a0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
b9b0: 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20  or code. If .** 
b9c0: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
b9d0: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
b9e0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
b9f0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
ba00: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
ba10: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
ba20: 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  gIterInit(.  Fts
ba30: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
ba40: 20 20 20 20 0a 20 20 69 6e 74 20 69 49 64 78 2c      .  int iIdx,
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
ba70: 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f  .aHash[] index o
ba80: 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20  f FTS index */. 
ba90: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
baa0: 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20  gment *pSeg,    
bab0: 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
bac0: 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  of segment */.  
bad0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
bae0: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
baf0: 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
bb00: 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  ulate */.){.  if
bb10: 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ( pSeg->pgnoFirs
bb20: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  t==0 ){.    /* T
bb30: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 74  his happens if t
bb40: 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20 62 65  he segment is be
bb50: 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e 20 69  ing used as an i
bb60: 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63 72 65  nput to an incre
bb70: 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65  mental.    ** me
bb80: 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61 74 61  rge and all data
bb90: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
bba0: 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53 65 65  n "trimmed". See
bbb0: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a   function.    **
bbc0: 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
bbd0: 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  s() for details.
bbe0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65   In this case le
bbf0: 61 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ave the iterator
bc00: 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54   empty..    ** T
bc10: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73  he caller will s
bc20: 65 65 20 74 68 65 20 28 70 49 74 65 72 2d 3e 70  ee the (pIter->p
bc30: 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61 73 73  Leaf==0) and ass
bc40: 75 6d 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ume the iterator
bc50: 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f   is.    ** at EO
bc60: 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20  F already. */.  
bc70: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
bc80: 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  >pLeaf==0 );.   
bc90: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
bca0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
bcb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73  E_OK ){.    mems
bcc0: 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
bcd0: 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
bce0: 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20    pIter->pSeg = 
bcf0: 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d  pSeg;.    pIter-
bd00: 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a 20 20  >iIdx = iIdx;.  
bd10: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
bd20: 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  no = pSeg->pgnoF
bd30: 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35  irst-1;.    fts5
bd40: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
bd50: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a  p, pIter);.  }..
bd60: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
bd70: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38  ITE_OK ){.    u8
bd80: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
bd90: 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74 65 72  af->p;.    pIter
bda0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
bdb0: 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d  fts5GetU16(&a[2]
bdc0: 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  );.    fts5SegIt
bdd0: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
bde0: 74 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  ter, 0);.  }.}..
bdf0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
be00: 4c 65 61 66 48 65 61 64 65 72 28 46 74 73 35 44  LeafHeader(Fts5D
be10: 61 74 61 20 2a 70 4c 65 61 66 2c 20 69 6e 74 20  ata *pLeaf, int 
be20: 2a 70 69 52 6f 77 69 64 2c 20 69 6e 74 20 2a 70  *piRowid, int *p
be30: 69 54 65 72 6d 29 7b 0a 20 20 2a 70 69 52 6f 77  iTerm){.  *piRow
be40: 69 64 20 3d 20 28 69 6e 74 29 66 74 73 35 47 65  id = (int)fts5Ge
be50: 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30  tU16(&pLeaf->p[0
be60: 5d 29 3b 0a 20 20 2a 70 69 54 65 72 6d 20 3d 20  ]);.  *piTerm = 
be70: 28 69 6e 74 29 66 74 73 35 47 65 74 55 31 36 28  (int)fts5GetU16(
be80: 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 7d  &pLeaf->p[2]);.}
be90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
bea0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76  ction is only ev
beb0: 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65  er called on ite
bec0: 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62  rators created b
bed0: 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74  y calls to.** Ft
bee0: 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77  s5IndexQuery() w
bef0: 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45  ith the FTS5INDE
bf00: 58 5f 51 55 45 52 59 5f 41 53 43 20 66 6c 61 67  X_QUERY_ASC flag
bf10: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e   set..**.** When
bf20: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
bf30: 73 20 63 61 6c 6c 65 64 2c 20 69 74 65 72 61 74  s called, iterat
bf40: 6f 72 20 70 49 74 65 72 20 70 6f 69 6e 74 73 20  or pIter points 
bf50: 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
bf60: 69 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72  id.** on the cur
bf70: 72 65 6e 74 20 6c 65 61 66 20 61 73 73 6f 63 69  rent leaf associ
bf80: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 65  ated with the te
bf90: 72 6d 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  rm being queried
bfa0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  . This function.
bfb0: 2a 2a 20 61 64 76 61 6e 63 65 73 20 69 74 20 74  ** advances it t
bfc0: 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6c  o point to the l
bfd0: 61 73 74 20 73 75 63 68 20 72 6f 77 69 64 20 61  ast such rowid a
bfe0: 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
bff0: 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 0a 2a 2a  , initializes.**
c000: 20 74 68 65 20 61 52 6f 77 69 64 4f 66 66 73 65   the aRowidOffse
c010: 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66  t[] and iRowidOf
c020: 66 73 65 74 20 76 61 72 69 61 62 6c 65 73 2e 0a  fset variables..
c030: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
c040: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
c050: 65 49 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e  eInitPage(Fts5In
c060: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
c070: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
c080: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
c090: 65 61 66 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20  eaf->n;.  int i 
c0a0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
c0b0: 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20  fset;.  u8 *a = 
c0c0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
c0d0: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
c0e0: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  set = 0;..  whil
c0f0: 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
c100: 5f 4f 4b 20 26 26 20 69 3c 6e 20 29 7b 0a 20 20  _OK && i<n ){.  
c110: 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30    i64 iDelta = 0
c120: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  ;.    int nPos;.
c130: 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72  .    i += getVar
c140: 69 6e 74 33 32 28 26 61 5b 69 5d 2c 20 6e 50 6f  int32(&a[i], nPo
c150: 73 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50 6f  s);.    i += nPo
c160: 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20  s;.    if( i>=n 
c170: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b  ) break;.    i +
c180: 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69  = getVarint(&a[i
c190: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
c1a0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c 74  );.    if( iDelt
c1b0: 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  a==0 ) break;.  
c1c0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20    pIter->iRowid 
c1d0: 2d 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  -= iDelta;..    
c1e0: 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74  if( iRowidOffset
c1f0: 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f  >=pIter->nRowidO
c200: 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
c210: 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d  nt nNew = pIter-
c220: 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20  >nRowidOffset + 
c230: 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e  8;.      int *aN
c240: 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ew = (int*)sqlit
c250: 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72  e3_realloc(pIter
c260: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20  ->aRowidOffset, 
c270: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29  nNew*sizeof(int)
c280: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65  );.      if( aNe
c290: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
c2a0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
c2b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72  OMEM;.        br
c2c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
c2d0: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
c2e0: 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20  Offset = aNew;. 
c2f0: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77       pIter->nRow
c300: 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b  idOffset = nNew;
c310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65  .    }..    pIte
c320: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
c330: 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20  iRowidOffset++] 
c340: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
c350: 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  fset;.    pIter-
c360: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
c370: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69  ;.  }.  pIter->i
c380: 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52  RowidOffset = iR
c390: 6f 77 69 64 4f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  owidOffset;.}../
c3a0: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
c3b0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
c3c0: 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74  everseNewPage(Ft
c3d0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
c3e0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
c3f0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
c400: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
c410: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29  EGITER_REVERSE )
c420: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
c430: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
c440: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
c450: 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65  );..  fts5DataRe
c460: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
c470: 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c  af);.  pIter->pL
c480: 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  eaf = 0;.  while
c490: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
c4a0: 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65  OK && pIter->iLe
c4b0: 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54  afPgno>pIter->iT
c4c0: 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ermLeafPgno ){. 
c4d0: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65     Fts5Data *pNe
c4e0: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  w;.    pIter->iL
c4f0: 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70  eafPgno--;.    p
c500: 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65  New = fts5DataRe
c510: 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
c520: 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20  NT_ROWID(.      
c530: 20 20 20 20 70 49 74 65 72 2d 3e 69 49 64 78 2c      pIter->iIdx,
c540: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
c550: 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e  egid, 0, pIter->
c560: 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29  iLeafPgno.    ))
c570: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20 29  ;.    if( pNew )
c580: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
c590: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 49  r->iLeafPgno==pI
c5a0: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
c5b0: 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  no ){.        if
c5c0: 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ( pIter->iTermLe
c5d0: 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 6e  afOffset<pNew->n
c5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
c5f0: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65  ter->pLeaf = pNe
c600: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  w;.          pIt
c610: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
c620: 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  = pIter->iTermLe
c630: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  afOffset;.      
c640: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
c650: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
c660: 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b 0a 20  widOff, dummy;. 
c670: 20 20 20 20 20 20 20 66 74 73 35 4c 65 61 66 48         fts5LeafH
c680: 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52 6f  eader(pNew, &iRo
c690: 77 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b  widOff, &dummy);
c6a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f  .        if( iRo
c6b0: 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  widOff ){.      
c6c0: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
c6d0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
c6e0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
c6f0: 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66  ffset = iRowidOf
c700: 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  f;.        }.   
c710: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
c720: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
c730: 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20          u8 *a = 
c740: 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  &pIter->pLeaf->p
c750: 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66  [pIter->iLeafOff
c760: 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  set];.        pI
c770: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c780: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 61 2c   += getVarint(a,
c790: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
c7a0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
c7b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c  break;.      }el
c7c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
c7d0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
c7e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c7f0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65  .  }..  if( pIte
c800: 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
c810: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
c820: 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
c830: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ter);.  }.}../*.
c840: 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61  ** Advance itera
c850: 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65  tor pIter to the
c860: 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a   next entry. .**
c870: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
c880: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
c890: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
c8a0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
c8b0: 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a  ror code. It .**
c8c0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
c8d0: 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
c8e0: 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
c8f0: 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65  hes EOF. If an e
c900: 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
c910: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
c920: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
c930: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
c940: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
c950: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
c960: 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  gIterNext(.  Fts
c970: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c990: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
c9a0: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
c9b0: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
c9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
c9d0: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
c9e0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
c9f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ca00: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66      if( pIter->f
ca10: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
ca20: 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20  TER_REVERSE ){. 
ca30: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
ca40: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
ca50: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20  {.        u8 *a 
ca60: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
ca70: 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  p;.        int i
ca80: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Off;.        int
ca90: 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69   nPos;.        i
caa0: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
cab0: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
cac0: 4f 66 66 73 65 74 2d 2d 3b 0a 0a 20 20 20 20 20  Offset--;..     
cad0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
cae0: 66 66 73 65 74 20 3d 20 69 4f 66 66 20 3d 20 70  ffset = iOff = p
caf0: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
cb00: 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  et[pIter->iRowid
cb10: 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20  Offset];.       
cb20: 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69   iOff += getVari
cb30: 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
cb40: 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  Pos);.        iO
cb50: 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  ff += nPos;.    
cb60: 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 26 61      getVarint(&a
cb70: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
cb80: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
cb90: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
cba0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d   iDelta;.      }
cbb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
cbc0: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
cbd0: 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72  NewPage(p, pIter
cbe0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
cbf0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35  else{.      Fts5
cc00: 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
cc10: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20  ter->pLeaf;.    
cc20: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
cc30: 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
cc40: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b   0;.      int nK
cc50: 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  eep = 0;..      
cc60: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
cc70: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  e end of the pos
cc80: 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69  ition list withi
cc90: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
cca0: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ge. */.      u8 
ccb0: 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20  *a = pLeaf->p;. 
ccc0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65       int n = pLe
ccd0: 61 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f  af->n;..      iO
cce0: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
ccf0: 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  fOffset;.      i
cd00: 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
cd10: 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73       int nPoslis
cd20: 74 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  t;.        iOff 
cd30: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
cd40: 61 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73  a[iOff], nPoslis
cd50: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  t);.        iOff
cd60: 20 2b 3d 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20   += nPoslist;.  
cd70: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
cd80: 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
cd90: 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65     /* The next e
cda0: 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63  ntry is on the c
cdb0: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
cdc0: 20 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74         u64 iDelt
cdd0: 61 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  a;.        iOff 
cde0: 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  += sqlite3GetVar
cdf0: 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69  int(&a[iOff], &i
ce00: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
ce10: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ce20: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
ce30: 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
ce40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e   ){.          bN
ce50: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
ce60: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
ce70: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
ce80: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
ce90: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
ceb0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
cec0: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   4;.          }e
ced0: 6c 73 65 20 69 66 28 20 69 4f 66 66 21 3d 66 74  lse if( iOff!=ft
cee0: 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 20  s5GetU16(&a[2]) 
cef0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
cf00: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cf10: 74 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  t += getVarint32
cf20: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
cf30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
cf40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
cf50: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
cf60: 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b  Rowid -= iDelta;
cf70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cf80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cf90: 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  iOff = 0;.      
cfa0: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
cfb0: 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
cfc0: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
cfd0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66        while( iOf
cfe0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
cff0: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
d000: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
d010: 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61 66  .          pLeaf
d020: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
d030: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
d040: 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
d050: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
d060: 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  iOff = fts5GetU1
d070: 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29  6(&pLeaf->p[0]))
d080: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d090: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47  iOff += sqlite3G
d0a0: 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d  etVarint(&pLeaf-
d0b0: 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  >p[iOff], (u64*)
d0c0: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
d0d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
d0e0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d0f0: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
d100: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c    }.          el
d110: 73 65 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66  se if( (iOff = f
d120: 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66  ts5GetU16(&pLeaf
d130: 2d 3e 70 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20  ->p[2])) ){.    
d140: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
d150: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
d160: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  f;.            b
d170: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
d180: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d190: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
d1a0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
d1b0: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f  e iterator is no
d1c0: 77 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c  w at EOF. If so,
d1d0: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a   return early. *
d1e0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  /.      if( pIte
d1f0: 72 2d 3e 70 4c 65 61 66 20 26 26 20 62 4e 65 77  r->pLeaf && bNew
d200: 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
d210: 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  if( pIter->flags
d220: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
d230: 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20 20 20 20  ONETERM ){.     
d240: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
d250: 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61  ease(pIter->pLea
d260: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  f);.          pI
d270: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
d280: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d290: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
d2a0: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20  IterLoadTerm(p, 
d2b0: 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20  pIter, nKeep);. 
d2c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d2d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
d2e0: 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
d2f0: 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
d300: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
d310: 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c   rowid in a docl
d320: 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ist. This.** fun
d330: 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69  ction sets the i
d340: 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68  terator up so th
d350: 61 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72  at iterates in r
d360: 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72  everse order thr
d370: 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c  ough.** the docl
d380: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
d390: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
d3a0: 65 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78  everse(Fts5Index
d3b0: 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20 46   *p, int iIdx, F
d3c0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
d3d0: 72 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  r){.  Fts5Data *
d3e0: 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
d3f0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
d400: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20   leaf data */.  
d410: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
d420: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ->iLeafOffset;  
d430: 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 77  /* Byte offset w
d440: 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c 65  ithin current le
d450: 61 66 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  af */.  Fts5Data
d460: 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69   *pLast = 0;.  i
d470: 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
d480: 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 74 6f 20 74  ..  /* Move to t
d490: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
d4a0: 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74 20 72  tains the last r
d4b0: 6f 77 69 64 20 69 6e 20 74 68 69 73 20 64 6f 63  owid in this doc
d4c0: 6c 69 73 74 2e 20 2a 2f 0a 20 20 70 4c 65 61 66  list. */.  pLeaf
d4d0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
d4e0: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ..  if( pIter->p
d4f0: 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74  Dlidx ){.    int
d500: 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d   iSegid = pIter-
d510: 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
d520: 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 49     pgnoLast = pI
d530: 74 65 72 2d 3e 70 44 6c 69 64 78 2d 3e 69 4c 65  ter->pDlidx->iLe
d540: 61 66 50 67 6e 6f 3b 0a 20 20 20 20 70 4c 61 73  afPgno;.    pLas
d550: 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  t = fts5DataRead
d560: 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
d570: 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65  _ROWID(iIdx, iSe
d580: 67 69 64 2c 20 30 2c 20 70 67 6e 6f 4c 61 73 74  gid, 0, pgnoLast
d590: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
d5a0: 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65   while( iOff<pLe
d5b0: 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69  af->n ){.      i
d5c0: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69  nt nPos;.      i
d5d0: 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20  64 iDelta;..    
d5e0: 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69    /* Position li
d5f0: 73 74 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  st size in bytes
d600: 20 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b   */.      iOff +
d610: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
d620: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
d630: 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  Pos);.      iOff
d640: 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20   += nPos;.      
d650: 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d  if( iOff>=pLeaf-
d660: 3e 6e 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  >n ) break;..   
d670: 20 20 20 2f 2a 20 52 6f 77 69 64 20 64 65 6c 74     /* Rowid delt
d680: 61 2e 20 4f 72 2c 20 69 66 20 30 78 30 30 2c 20  a. Or, if 0x00, 
d690: 74 68 65 20 65 6e 64 20 6f 66 20 64 6f 63 6c 69  the end of docli
d6a0: 73 74 20 6d 61 72 6b 65 72 2e 20 2a 2f 0a 20 20  st marker. */.  
d6b0: 20 20 20 20 6e 50 6f 73 20 3d 20 67 65 74 56 61      nPos = getVa
d6c0: 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
d6d0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
d6e0: 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lta);.      if( 
d6f0: 69 44 65 6c 74 61 3d 3d 30 20 29 20 62 72 65 61  iDelta==0 ) brea
d700: 6b 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  k;.      iOff +=
d710: 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 0a 20 20   nPos;.    }..  
d720: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61    if( iOff>=pLea
d730: 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 46 74  f->n ){.      Ft
d740: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
d750: 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72  nt *pSeg = pIter
d760: 2d 3e 70 53 65 67 3b 0a 20 20 20 20 20 20 69 36  ->pSeg;.      i6
d770: 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45  4 iAbs = FTS5_SE
d780: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
d790: 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
d7a0: 30 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  0, pIter->iLeafP
d7b0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 36 34 20  gno);.      i64 
d7c0: 69 4c 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47  iLast = FTS5_SEG
d7d0: 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c  MENT_ROWID(iIdx,
d7e0: 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30   pSeg->iSegid, 0
d7f0: 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  , pSeg->pgnoLast
d800: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
d810: 20 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74   last rowid in t
d820: 68 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e  he doclist may n
d830: 6f 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72  ot be on the cur
d840: 72 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63  rent page. Searc
d850: 68 0a 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 77  h.       ** forw
d860: 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ard to find the 
d870: 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  page containing 
d880: 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20  the last rowid. 
d890: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 41   */.      for(iA
d8a0: 62 73 2b 2b 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  bs++; p->rc==SQL
d8b0: 49 54 45 5f 4f 4b 20 26 26 20 69 41 62 73 3c 3d  ITE_OK && iAbs<=
d8c0: 69 4c 61 73 74 3b 20 69 41 62 73 2b 2b 29 7b 0a  iLast; iAbs++){.
d8d0: 20 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61          Fts5Data
d8e0: 20 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74   *pNew = fts5Dat
d8f0: 61 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a  aRead(p, iAbs);.
d900: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
d910: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
d920: 74 20 69 52 6f 77 69 64 2c 20 69 54 65 72 6d 3b  t iRowid, iTerm;
d930: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 4c  .          fts5L
d940: 65 61 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20  eafHeader(pNew, 
d950: 26 69 52 6f 77 69 64 2c 20 26 69 54 65 72 6d 29  &iRowid, &iTerm)
d960: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d970: 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
d980: 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
d990: 70 54 6d 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20  pTmp = pLast;.  
d9a0: 20 20 20 20 20 20 20 20 20 20 70 4c 61 73 74 20            pLast 
d9b0: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
d9c0: 20 20 20 20 70 4e 65 77 20 3d 20 70 54 6d 70 3b      pNew = pTmp;
d9d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e  .            pgn
d9e0: 6f 4c 61 73 74 20 3d 20 69 41 62 73 20 26 20 28  oLast = iAbs & (
d9f0: 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
da00: 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31  DATA_PAGE_B) - 1
da10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
da20: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65           if( iTe
da30: 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rm ){.          
da40: 20 20 69 41 62 73 20 3d 20 69 4c 61 73 74 3b 0a    iAbs = iLast;.
da50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
da60: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
da70: 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
da80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
da90: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
daa0: 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20  f pLast is NULL 
dab0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  at this point, t
dac0: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77  hen the last row
dad0: 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c  id for this docl
dae0: 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e  ist.  ** lies on
daf0: 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e   the page curren
db00: 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79  tly indicated by
db10: 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49   the iterator. I
db20: 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a  n this case .  *
db30: 2a 20 69 4c 61 73 74 4f 66 66 20 69 73 20 73 65  * iLastOff is se
db40: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 74  t to the value t
db50: 68 61 74 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  hat pIter->iLeaf
db60: 4f 66 66 73 65 74 20 77 69 6c 6c 20 74 61 6b 65  Offset will take
db70: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 69   when.  ** the i
db80: 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74  terator points t
db90: 6f 20 74 68 61 74 20 72 6f 77 69 64 2e 0a 20 20  o that rowid..  
dba0: 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70  **.  ** Or, if p
dbb0: 4c 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  Last is non-NULL
dbc0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
dbd0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
dbe0: 69 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a  ins the last.  *
dbf0: 2a 20 72 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20  * rowid..  */.  
dc00: 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20  if( pLast ){.   
dc10: 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20   int dummy;.    
dc20: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
dc30: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
dc40: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
dc50: 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74  = pLast;.    pIt
dc60: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
dc70: 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 66 74  pgnoLast;.    ft
dc80: 73 35 4c 65 61 66 48 65 61 64 65 72 28 70 4c 61  s5LeafHeader(pLa
dc90: 73 74 2c 20 26 69 4f 66 66 2c 20 26 64 75 6d 6d  st, &iOff, &dumm
dca0: 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  y);.    iOff += 
dcb0: 67 65 74 56 61 72 69 6e 74 28 26 70 4c 61 73 74  getVarint(&pLast
dcc0: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
dcd0: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
dce0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
dcf0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
dd00: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49  .  }..  fts5SegI
dd10: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
dd20: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  ge(p, pIter);.}.
dd30: 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20  ./*.** Iterator 
dd40: 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20  pIter currently 
dd50: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
dd60: 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64  rst rowid of a d
dd70: 6f 63 6c 69 73 74 20 77 69 74 68 69 6e 0a 2a 2a  oclist within.**
dd80: 20 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68 65   index iIdx. The
dd90: 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
dda0: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
ddb0: 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20   with the final 
ddc0: 74 65 72 6d 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  term on.** the c
ddd0: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 49 66 20  urrent page. If 
dde0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
ddf0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65 72   is the last ter
de00: 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 0a  m on the page, .
de10: 2a 2a 20 6c 6f 61 64 20 74 68 65 20 64 6f 63 6c  ** load the docl
de20: 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64  ist-index from d
de30: 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  isk and initiali
de40: 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 61  ze an iterator a
de50: 74 20 0a 2a 2a 20 28 70 49 74 65 72 2d 3e 70 44  t .** (pIter->pD
de60: 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  lidx)..*/.static
de70: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
de80: 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35 49  rLoadDlidx(Fts5I
de90: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49 64  ndex *p, int iId
dea0: 78 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  x, Fts5SegIter *
deb0: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53  pIter){.  int iS
dec0: 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53  egid = pIter->pS
ded0: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e  eg->iSegid;.  in
dee0: 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d  t bRev = (pIter-
def0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
df00: 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a  GITER_REVERSE);.
df10: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
df20: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
df30: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61  ; /* Current lea
df40: 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  f data */.  int 
df50: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
df60: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 42  eafOffset;  /* B
df70: 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69  yte offset withi
df80: 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a  n current leaf *
df90: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  /..  assert( pIt
dfa0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
dfb0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
dfc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
dfd0: 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29  ter->pDlidx==0 )
dfe0: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
dff0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
e000: 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69  list ends on thi
e010: 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f  s page. If it do
e020: 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  es, return.  ** 
e030: 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f  early without lo
e040: 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73  ading the doclis
e050: 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62  t-index (as it b
e060: 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66  elongs to a diff
e070: 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e  erent.  ** term.
e080: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 4f 66   */.  while( iOf
e090: 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20  f<pLeaf->n ){.  
e0a0: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
e0b0: 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a    int nPoslist;.
e0c0: 0a 20 20 20 20 2f 2a 20 69 4f 66 66 20 69 73 20  .    /* iOff is 
e0d0: 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 6f 66  currently the of
e0e0: 66 73 65 74 20 6f 66 20 74 68 65 20 73 69 7a 65  fset of the size
e0f0: 20 66 69 65 6c 64 20 6f 66 20 61 20 70 6f 73 69   field of a posi
e100: 74 69 6f 6e 20 6c 69 73 74 2e 20 2a 2f 0a 20 20  tion list. */.  
e110: 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72    iOff += getVar
e120: 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
e130: 69 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73 74 29  iOff], nPoslist)
e140: 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50  ;.    iOff += nP
e150: 6f 73 6c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28  oslist;..    if(
e160: 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29   iOff<pLeaf->n )
e170: 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  {.      iOff += 
e180: 67 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  getVarint(&pLeaf
e190: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
e1a0: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
e1b0: 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
e1c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
e1d0: 20 7d 0a 0a 20 20 66 74 73 35 44 6c 69 64 78 49   }..  fts5DlidxI
e1e0: 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c  terInit(p, bRev,
e1f0: 20 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20 70   iIdx, iSegid, p
e200: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2c  Iter->iLeafPgno,
e210: 20 26 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29   &pIter->pDlidx)
e220: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
e230: 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
e240: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
e250: 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
e260: 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65  erm within segme
e270: 6e 74 0a 2a 2a 20 70 53 65 67 2c 20 69 6e 64 65  nt.** pSeg, inde
e280: 78 20 69 49 64 78 2e 20 49 66 20 74 68 65 72 65  x iIdx. If there
e290: 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d   is no such term
e2a0: 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20 74   in the index, t
e2b0: 68 65 20 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69  he iterator.** i
e2c0: 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a  s set to EOF..**
e2d0: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
e2e0: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
e2f0: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
e300: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
e310: 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a  ror code. If .**
e320: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
e330: 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77  ready occurred w
e340: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
e350: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
e360: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
e370: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
e380: 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 0a  egIterSeekInit(.
e390: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
e3c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  d */.  int iIdx,
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3e0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67         /* Config
e3f0: 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f  .aHash[] index o
e400: 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20  f FTS index */. 
e410: 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
e420: 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20  , int nTerm,    
e430: 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b   /* Term to seek
e440: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   to */.  int fla
e450: 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
e460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
e470: 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58   of FTS5INDEX_XX
e480: 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73  X flags */.  Fts
e490: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
e4a0: 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20  t *pSeg,     /* 
e4b0: 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73  Description of s
e4c0: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35  egment */.  Fts5
e4d0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e4f0: 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
e500: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50  e */.){.  int iP
e510: 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 68 3b 0a  g = 1;.  int h;.
e520: 20 20 69 6e 74 20 62 47 65 20 3d 20 28 28 66 6c    int bGe = ((fl
e530: 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
e540: 51 55 45 52 59 5f 50 52 45 46 49 58 29 20 26 26  QUERY_PREFIX) &&
e550: 20 69 49 64 78 3d 3d 30 29 3b 0a 20 20 69 6e 74   iIdx==0);.  int
e560: 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20   bDlidx = 0;    
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e580: 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
e590: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
e5a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 62   */..  assert( b
e5b0: 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  Ge==0 || (flags 
e5c0: 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
e5d0: 59 5f 41 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61  Y_ASC)==0 );.  a
e5e0: 73 73 65 72 74 28 20 70 54 65 72 6d 20 26 26 20  ssert( pTerm && 
e5f0: 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65  nTerm );.  memse
e600: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
e610: 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
e620: 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
e630: 67 3b 0a 20 20 70 49 74 65 72 2d 3e 69 49 64 78  g;.  pIter->iIdx
e640: 20 3d 20 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 54   = iIdx;..  /* T
e650: 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73  his block sets s
e660: 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50  tack variable iP
e670: 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61  g to the leaf pa
e680: 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d  ge number that m
e690: 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20  ay.  ** contain 
e6a0: 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72  term (pTerm/nTer
e6b0: 6d 29 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  m), if it is pre
e6c0: 73 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d  sent in the segm
e6d0: 65 6e 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 68 3d  ent. */.  for(h=
e6e0: 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b  pSeg->nHeight-1;
e6f0: 20 68 3e 30 3b 20 68 2d 2d 29 7b 0a 20 20 20 20   h>0; h--){.    
e700: 46 74 73 35 4e 6f 64 65 49 74 65 72 20 6e 6f 64  Fts5NodeIter nod
e710: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
e720: 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
e730: 20 74 68 72 6f 75 67 68 20 69 6e 74 65 72 6e 61   through interna
e740: 6c 20 6e 6f 64 65 73 20 2a 2f 0a 20 20 20 20 69  l nodes */.    i
e750: 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
e760: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
e770: 49 64 78 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  Idx, pSeg->iSegi
e780: 64 2c 20 68 2c 20 69 50 67 29 3b 0a 20 20 20 20  d, h, iPg);.    
e790: 46 74 73 35 44 61 74 61 20 2a 70 4e 6f 64 65 20  Fts5Data *pNode 
e7a0: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
e7b0: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 69  , iRowid);.    i
e7c0: 66 28 20 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72  f( pNode==0 ) br
e7d0: 65 61 6b 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f  eak;..    fts5No
e7e0: 64 65 49 74 65 72 49 6e 69 74 28 70 4e 6f 64 65  deIterInit(pNode
e7f0: 2d 3e 70 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26  ->p, pNode->n, &
e800: 6e 6f 64 65 29 3b 0a 20 20 20 20 61 73 73 65 72  node);.    asser
e810: 74 28 20 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d  t( node.term.n==
e820: 30 20 29 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20  0 );..    iPg = 
e830: 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20  node.iChild;.   
e840: 20 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62   bDlidx = node.b
e850: 44 6c 69 64 78 3b 0a 20 20 20 20 66 6f 72 28 66  Dlidx;.    for(f
e860: 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
e870: 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a  &p->rc, &node);.
e880: 20 20 20 20 20 20 20 20 6e 6f 64 65 2e 61 44 61          node.aDa
e890: 74 61 20 26 26 20 66 74 73 35 42 75 66 66 65 72  ta && fts5Buffer
e8a0: 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64  CompareBlob(&nod
e8b0: 65 2e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  e.term, pTerm, n
e8c0: 54 65 72 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20  Term)<=0;.      
e8d0: 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65    fts5NodeIterNe
e8e0: 78 74 28 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65  xt(&p->rc, &node
e8f0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
e900: 50 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64  Pg = node.iChild
e910: 3b 0a 20 20 20 20 20 20 62 44 6c 69 64 78 20 3d  ;.      bDlidx =
e920: 20 6e 6f 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20   node.bDlidx;.  
e930: 20 20 7d 0a 20 20 20 20 66 74 73 35 4e 6f 64 65    }.    fts5Node
e940: 49 74 65 72 46 72 65 65 28 26 6e 6f 64 65 29 3b  IterFree(&node);
e950: 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
e960: 65 61 73 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d  ease(pNode);.  }
e970: 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67  ..  if( iPg<pSeg
e980: 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20  ->pgnoFirst ){. 
e990: 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70     iPg = pSeg->p
e9a0: 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44  gnoFirst;.    bD
e9b0: 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lidx = 0;.  }.. 
e9c0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
e9d0: 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66  o = iPg - 1;.  f
e9e0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
e9f0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  ge(p, pIter);.. 
ea00: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
ea10: 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  f ){.    int res
ea20: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
ea30: 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47  afOffset = fts5G
ea40: 65 74 55 31 36 28 26 70 49 74 65 72 2d 3e 70 4c  etU16(&pIter->pL
ea50: 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20  eaf->p[2]);.    
ea60: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54  fts5SegIterLoadT
ea70: 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 30 29  erm(p, pIter, 0)
ea80: 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ;.    do {.     
ea90: 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65   res = fts5Buffe
eaa0: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49  rCompareBlob(&pI
eab0: 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d  ter->term, pTerm
eac0: 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , nTerm);.      
ead0: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 62 72 65  if( res>=0 ) bre
eae0: 61 6b 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  ak;.      fts5Se
eaf0: 67 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  gIterNext(p, pIt
eb00: 65 72 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  er);.    }while(
eb10: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b   pIter->pLeaf );
eb20: 0a 0a 20 20 20 20 69 66 28 20 62 47 65 3d 3d 30  ..    if( bGe==0
eb30: 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 20   && res ){.     
eb40: 20 2f 2a 20 53 65 74 20 69 74 65 72 61 74 6f 72   /* Set iterator
eb50: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f 46   to point to EOF
eb60: 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61   */.      fts5Da
eb70: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
eb80: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70  >pLeaf);.      p
eb90: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
eba0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
ebb0: 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20  ( bGe==0 ){.    
ebc0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
ebd0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
ebe0: 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49  TERM;.    if( pI
ebf0: 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
ec00: 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
ec10: 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
ec20: 41 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ASC ){.        p
ec30: 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
ec40: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
ec50: 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RSE;.      }.   
ec60: 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b     if( bDlidx ){
ec70: 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
ec80: 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c  IterLoadDlidx(p,
ec90: 20 69 49 64 78 2c 20 70 49 74 65 72 29 3b 0a 20   iIdx, pIter);. 
eca0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ecb0: 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
ecc0: 45 58 5f 51 55 45 52 59 5f 41 53 43 20 29 7b 0a  EX_QUERY_ASC ){.
ecd0: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
ece0: 74 65 72 52 65 76 65 72 73 65 28 70 2c 20 69 49  terReverse(p, iI
ecf0: 64 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  dx, pIter);.    
ed00: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
ed10: 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20  ./*.** Zero the 
ed20: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
ed30: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
ed40: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
ed50: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
ed60: 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74 65  Clear(Fts5SegIte
ed70: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73  r *pIter){.  fts
ed80: 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
ed90: 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73  er->term);.  fts
eda0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
edb0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74  er->pLeaf);.  ft
edc0: 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
edd0: 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a  pIter->pDlidx);.
ede0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
edf0: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
ee00: 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  et);.  memset(pI
ee10: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
ee20: 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a  ts5SegIter));.}.
ee30: 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f  ./*.** Do the co
ee40: 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61  mparison necessa
ee50: 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70  ry to populate p
ee60: 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
ee70: 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  t]..**.** If the
ee80: 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
ee90: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
eea0: 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65  n it is the inde
eeb0: 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  x of an entry.**
eec0: 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
eed0: 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74  Seg[] array that
eee0: 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45   is (a) not at E
eef0: 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e  OF, and (b) poin
ef00: 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79  ting.** to a key
ef10: 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69   that is a dupli
ef20: 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c  cate of another,
ef30: 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79   higher priority
ef40: 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74  , .** segment-it
ef50: 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53  erator in the pS
ef60: 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  eg->aSeg[] array
ef70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ef80: 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
ef90: 6f 6d 70 61 72 65 28 46 74 73 35 4d 75 6c 74 69  ompare(Fts5Multi
efa0: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
efb0: 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74  int iOut){.  int
efc0: 20 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   i1;            
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efe0: 49 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61  Index of left-ha
eff0: 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
f000: 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20  /.  int i2;     
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
f030: 72 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53  right-hand Fts5S
f040: 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
f050: 69 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49  iRes;.  Fts5SegI
f060: 74 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20  ter *p1;        
f070: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d          /* Left-
f080: 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
f090: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
f0a0: 72 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20  r *p2;          
f0b0: 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68        /* Right-h
f0c0: 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
f0d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f  */..  assert( iO
f0e0: 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26  ut<pIter->nSeg &
f0f0: 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73  & iOut>0 );.  as
f100: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65  sert( pIter->bRe
f110: 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62  v==0 || pIter->b
f120: 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28  Rev==1 );..  if(
f130: 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e   iOut>=(pIter->n
f140: 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31  Seg/2) ){.    i1
f150: 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72   = (iOut - pIter
f160: 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20  ->nSeg/2) * 2;. 
f170: 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a     i2 = i1 + 1;.
f180: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20    }else{.    i1 
f190: 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
f1a0: 69 4f 75 74 2a 32 5d 3b 0a 20 20 20 20 69 32 20  iOut*2];.    i2 
f1b0: 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
f1c0: 69 4f 75 74 2a 32 2b 31 5d 3b 0a 20 20 7d 0a 20  iOut*2+1];.  }. 
f1d0: 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   p1 = &pIter->aS
f1e0: 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26  eg[i1];.  p2 = &
f1f0: 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b  pIter->aSeg[i2];
f200: 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61  ..  if( p1->pLea
f210: 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  f==0 ){         
f220: 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74    /* If p1 is at
f230: 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73   EOF */.    iRes
f240: 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69   = i2;.  }else i
f250: 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20  f( p2->pLeaf==0 
f260: 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20  ){     /* If p2 
f270: 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20  is at EOF */.   
f280: 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65   iRes = i1;.  }e
f290: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  lse{.    int res
f2a0: 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d   = fts5BufferCom
f2b0: 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20  pare(&p1->term, 
f2c0: 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20  &p2->term);.    
f2d0: 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
f2e0: 20 20 20 20 61 73 73 65 72 74 28 20 69 32 3e 69      assert( i2>i
f2f0: 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  1 );.      asser
f300: 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20  t( i2!=0 );.    
f310: 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64    if( p1->iRowid
f320: 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 20 72  ==p2->iRowid ) r
f330: 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20 20  eturn i2;.      
f340: 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
f350: 69 64 20 3c 20 70 32 2d 3e 69 52 6f 77 69 64 29  id < p2->iRowid)
f360: 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
f370: 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a   -1 : +1;.    }.
f380: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21      assert( res!
f390: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  =0 );.    if( re
f3a0: 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65  s<0 ){.      iRe
f3b0: 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73  s = i1;.    }els
f3c0: 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  e{.      iRes = 
f3d0: 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i2;.    }.  }.. 
f3e0: 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
f3f0: 4f 75 74 5d 20 3d 20 69 52 65 73 3b 0a 20 20 72  Out] = iRes;.  r
f400: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f410: 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72 61  * Free the itera
f420: 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65  tor object passe
f430: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
f440: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
f450: 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
f460: 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35 49  tiIterFree(Fts5I
f470: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75 6c  ndex *p, Fts5Mul
f480: 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
f490: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
f4a0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
f4b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
f4c0: 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  r->nSeg; i++){. 
f4d0: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
f4e0: 43 6c 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53  Clear(&pIter->aS
f4f0: 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eg[i]);.    }.  
f500: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
f510: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
f520: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
f530: 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
f540: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
f550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f560: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
f570: 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
f580: 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 4d 75  thin */.  Fts5Mu
f590: 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
f5a0: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65  r,        /* Ite
f5b0: 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65 20  rator to update 
f5c0: 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20 66  aFirst[] array f
f5d0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61  or */.  int iCha
f5e0: 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20 20  nged,           
f5f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
f600: 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f 72   of sub-iterator
f610: 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20 2a   just advanced *
f620: 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65 74 20  /.  int iMinset 
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65      /* Minimum e
f650: 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74 5b 5d  ntry in aFirst[]
f660: 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20   to set */.){.  
f670: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28  int i;.  for(i=(
f680: 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61  pIter->nSeg+iCha
f690: 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e  nged)/2; i>=iMin
f6a0: 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  set && p->rc==SQ
f6b0: 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b  LITE_OK; i=i/2){
f6c0: 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20  .    int iEq;.  
f6d0: 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73    if( (iEq = fts
f6e0: 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
f6f0: 61 72 65 28 70 49 74 65 72 2c 20 69 29 29 20 29  are(pIter, i)) )
f700: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
f710: 74 65 72 4e 65 78 74 28 70 2c 20 26 70 49 74 65  terNext(p, &pIte
f720: 72 2d 3e 61 53 65 67 5b 69 45 71 5d 29 3b 0a 20  r->aSeg[iEq]);. 
f730: 20 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e       i = pIter->
f740: 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20  nSeg + iEq;.    
f750: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  }.  }.}../*.** M
f760: 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65 72  ove the seg-iter
f770: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
f780: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
f790: 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c  rowid on page iL
f7a0: 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69  eafPgno..** It i
f7b0: 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65  s an error if le
f7c0: 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 63 6f 6e  af iLeafPgno con
f7d0: 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 2e 0a  tains no rowid..
f7e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
f7f0: 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
f800: 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
f810: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
f820: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
f830: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
f840: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
f850: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
f860: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
f870: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
f880: 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20  t iLeafPgno.){. 
f890: 20 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67   assert( iLeafPg
f8a0: 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no>pIter->iLeafP
f8b0: 67 6e 6f 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  gno );.  if( p->
f8c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f8d0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
f8e0: 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
f8f0: 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  o-1;.    fts5Seg
f900: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
f910: 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  pIter);.    asse
f920: 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
f930: 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69  E_OK || pIter->i
f940: 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50  LeafPgno==iLeafP
f950: 67 6e 6f 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  gno );.  }..  if
f960: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
f970: 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f  OK ){.    int iO
f980: 66 66 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20  ff;.    u8 *a = 
f990: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
f9a0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74  .    int n = pIt
f9b0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 0a 20  er->pLeaf->n;.. 
f9c0: 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65     iOff = fts5Ge
f9d0: 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20  tU16(&a[0]);.   
f9e0: 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69   if( iOff<4 || i
f9f0: 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Off>=n ){.      
fa00: 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
fa10: 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  RUPT;.    }else{
fa20: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
fa30: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
fa40: 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
fa50: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
fa60: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
fa70: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d  et = iOff;.    }
fa80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
fa90: 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
faa0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
fab0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
fac0: 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20   until it is at 
fad0: 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69  or .** past rowi
fae0: 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c  d iFrom. Regardl
faf0: 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
fb00: 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69   of iFrom, the i
fb10: 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c  terator is.** al
fb20: 77 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74  ways advanced at
fb30: 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a   least once..*/.
fb40: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
fb50: 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
fb60: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
fb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb80: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
fb90: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
fba0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
fbb0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
fbc0: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
fbd0: 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69  vance */.  i64 i
fbe0: 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20  Match           
fbf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
fc00: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61  vance iterator a
fc10: 74 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72  t least this far
fc20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65   */.){.  int bRe
fc30: 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  v = (pIter->flag
fc40: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
fc50: 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73  _REVERSE);.  Fts
fc60: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
fc70: 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69  dx = pIter->pDli
fc80: 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50  dx;.  int iLeafP
fc90: 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
fca0: 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d  afPgno;.  int bM
fcb0: 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  ove = 1;..  asse
fcc0: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
fcd0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
fce0: 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
fcf0: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
fd00: 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dx );.  assert( 
fd10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a  pIter->pLeaf );.
fd20: 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29  .  if( bRev==0 )
fd30: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73  {.    while( fts
fd40: 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
fd50: 20 70 44 6c 69 64 78 29 3d 3d 30 20 26 26 20 69   pDlidx)==0 && i
fd60: 4d 61 74 63 68 3c 70 44 6c 69 64 78 2d 3e 69 52  Match<pDlidx->iR
fd70: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  owid ){.      iL
fd80: 65 61 66 50 67 6e 6f 20 3d 20 70 44 6c 69 64 78  eafPgno = pDlidx
fd90: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ->iLeafPgno;.   
fda0: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
fdb0: 4e 65 78 74 28 70 44 6c 69 64 78 29 3b 0a 20 20  Next(pDlidx);.  
fdc0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
fdd0: 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72  iLeafPgno>=pIter
fde0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70  ->iLeafPgno || p
fdf0: 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20  ->rc );.    if( 
fe00: 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
fe10: 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  >iLeafPgno ){.  
fe20: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 47      fts5SegIterG
fe30: 6f 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65 72  otoPage(p, pIter
fe40: 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20  , iLeafPgno);.  
fe50: 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20      bMove = 0;. 
fe60: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
fe70: 20 20 61 73 73 65 72 74 28 20 69 4d 61 74 63 68    assert( iMatch
fe80: 3e 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 29  >pIter->iRowid )
fe90: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73  ;.    while( fts
fea0: 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
feb0: 20 70 44 6c 69 64 78 29 3d 3d 30 20 26 26 20 69   pDlidx)==0 && i
fec0: 4d 61 74 63 68 3e 70 44 6c 69 64 78 2d 3e 69 52  Match>pDlidx->iR
fed0: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 66 74  owid ){.      ft
fee0: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
fef0: 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20  pDlidx);.    }. 
ff00: 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70     iLeafPgno = p
ff10: 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f  Dlidx->iLeafPgno
ff20: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  ;..    assert( f
ff30: 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
ff40: 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c  p, pDlidx) || iL
ff50: 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e  eafPgno<=pIter->
ff60: 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
ff70: 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c    if( iLeafPgno<
ff80: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
ff90: 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
ffa0: 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
ffb0: 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20  afPgno+1;.      
ffc0: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
ffd0: 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
ffe0: 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  er);.      bMove
fff0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
10000 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
10010 20 20 20 69 66 28 20 62 4d 6f 76 65 20 29 20 66     if( bMove ) f
10020 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
10030 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  , pIter);.    if
10040 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
10050 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
10060 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49  f( bRev==0 && pI
10070 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61  ter->iRowid<=iMa
10080 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
10090 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26 20   if( bRev!=0 && 
100a0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69  pIter->iRowid>=i
100b0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
100c0 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20     bMove = 1;.  
100d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  }.}../*.** Move 
100e0 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
100f0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
10100 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
10110 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
10120 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
10130 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
10140 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  . It is not .** 
10150 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
10160 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61  ror if the itera
10170 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c  tor reaches EOF,
10180 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72   or if it is alr
10190 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20  eady at .** EOF 
101a0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
101b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
101c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
101d0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a  5MultiIterNext(.
101e0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
101f0 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  .  Fts5MultiSegI
10200 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e  ter *pIter,.  in
10210 74 20 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t bFrom,        
10220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10230 20 54 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e   True if argumen
10240 74 20 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64  t iFrom is valid
10250 20 2a 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20   */.  i64 iFrom 
10260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10270 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
10280 20 61 74 20 6c 65 61 73 74 20 61 73 20 66 61 72   at least as far
10290 20 61 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20   as this */.){. 
102a0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
102b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
102c0 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
102d0 3e 61 46 69 72 73 74 5b 31 5d 3b 0a 20 20 20 20  >aFirst[1];.    
102e0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
102f0 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
10300 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 69 66  [iFirst];.    if
10310 28 20 62 46 72 6f 6d 20 26 26 20 70 53 65 67 2d  ( bFrom && pSeg-
10320 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  >pDlidx ){.     
10330 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
10340 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46  From(p, pSeg, iF
10350 72 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  rom);.    }else{
10360 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
10370 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 29 3b  erNext(p, pSeg);
10380 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
10390 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
103a0 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73  (p, pIter, iFirs
103b0 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, 1);.  }.}../*
103c0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
103d0 65 77 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49  ew Fts5MultiSegI
103e0 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ter object..**.*
103f0 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  * The new object
10400 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
10410 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
10420 20 64 61 74 61 20 69 6e 20 73 74 72 75 63 74 75   data in structu
10430 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49  re pStruct..** I
10440 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c  f iLevel is -ve,
10450 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   then all data i
10460 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  n all segments i
10470 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69 66  s merged. Or, if
10480 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65   iLevel.** is ze
10490 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20 64  ro or greater, d
104a0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69 72  ata from the fir
104b0 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d  st nSegment segm
104c0 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c  ents on level iL
104d0 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65  evel.** is merge
104e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65  d..**.** The ite
104f0 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20  rator initially 
10500 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
10510 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20 65  rst term/rowid e
10520 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20  ntry in the .** 
10530 69 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a 2a  iterated data..*
10540 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
10550 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 0a  s5MultiIterNew(.
10560 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10580 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
10590 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
105a0 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  hin */.  Fts5Str
105b0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 2c  ucture *pStruct,
105c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75           /* Stru
105d0 63 74 75 72 65 20 6f 66 20 73 70 65 63 69 66 69  cture of specifi
105e0 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  c index */.  int
105f0 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20   iIdx,          
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10610 43 6f 6e 66 69 67 2e 61 48 61 73 68 5b 5d 20 69  Config.aHash[] i
10620 6e 64 65 78 20 6f 66 20 46 54 53 20 69 6e 64 65  ndex of FTS inde
10630 78 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  x */.  int flags
10640 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10650 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
10660 6f 72 20 3e 3d 20 2a 2f 0a 20 20 63 6f 6e 73 74  or >= */.  const
10670 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
10680 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
10690 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
106a0 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
106b0 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
106d0 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
106e0 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
106f0 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
10700 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
10710 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10720 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
10730 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
10740 2a 2f 0a 20 20 46 74 73 35 4d 75 6c 74 69 53 65  */.  Fts5MultiSe
10750 67 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  gIter **ppOut   
10760 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
10770 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
10780 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
10790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
107a0 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
107b0 20 6d 65 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74   merged */.  int
107c0 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20   nSlot;         
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
107e0 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20  Power of two >= 
107f0 6e 53 65 67 20 2a 2f 0a 20 20 69 6e 74 20 69 49  nSeg */.  int iI
10800 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ter = 0;        
10810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a            /* */.
10820 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20 20 20    int iSeg;     
10830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10840 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
10850 72 61 74 65 20 74 68 72 6f 75 67 68 20 73 65 67  rate through seg
10860 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53  ments */.  Fts5S
10870 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
10880 4c 76 6c 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69  Lvl;.  Fts5Multi
10890 53 65 67 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  SegIter *pNew;..
108a0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
108b0 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
108c0 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
108d0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
108e0 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
108f0 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
10900 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c  tor. */.  if( iL
10910 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 6e 53  evel<0 ){.    nS
10920 65 67 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  eg = fts5Structu
10930 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
10940 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 65 6c 73  pStruct);.  }els
10950 65 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 4d 49  e{.    nSeg = MI
10960 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  N(pStruct->aLeve
10970 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20  l[iLevel].nSeg, 
10980 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20  nSegment);.  }. 
10990 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53   for(nSlot=2; nS
109a0 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d  lot<nSeg; nSlot=
109b0 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 2a 70 70 4f  nSlot*2);.  *ppO
109c0 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73 35  ut = pNew = fts5
109d0 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20  IdxMalloc(p, .  
109e0 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 4d      sizeof(Fts5M
109f0 75 6c 74 69 53 65 67 49 74 65 72 29 20 2b 20 20  ultiSegIter) +  
10a00 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20          /* pNew 
10a10 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
10a20 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 6e  Fts5SegIter) * n
10a30 53 6c 6f 74 20 2b 20 20 20 20 20 20 20 2f 2a 20  Slot +       /* 
10a40 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a  pNew->aSeg[] */.
10a50 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 31 36        sizeof(u16
10a60 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20 20  ) * nSlot       
10a70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
10a80 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20  w->aFirst[] */. 
10a90 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
10aa0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e  0 ) return;.  pN
10ab0 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74  ew->nSeg = nSlot
10ac0 3b 0a 20 20 70 4e 65 77 2d 3e 61 53 65 67 20 3d  ;.  pNew->aSeg =
10ad0 20 28 46 74 73 35 53 65 67 49 74 65 72 2a 29 26   (Fts5SegIter*)&
10ae0 70 4e 65 77 5b 31 5d 3b 0a 20 20 70 4e 65 77 2d  pNew[1];.  pNew-
10af0 3e 61 46 69 72 73 74 20 3d 20 28 75 31 36 2a 29  >aFirst = (u16*)
10b00 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f  &pNew->aSeg[nSlo
10b10 74 5d 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76  t];.  pNew->bRev
10b20 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20   = (0!=(flags & 
10b30 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
10b40 41 53 43 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  ASC));..  /* Ini
10b50 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20  tialize each of 
10b60 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65  the component se
10b70 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e  gment iterators.
10b80 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c   */.  if( iLevel
10b90 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  <0 ){.    Fts5St
10ba0 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45  ructureLevel *pE
10bb0 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  nd = &pStruct->a
10bc0 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
10bd0 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28  Level];.    for(
10be0 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61  pLvl=&pStruct->a
10bf0 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70  Level[0]; pLvl<p
10c00 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20  End; pLvl++){.  
10c10 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76      for(iSeg=pLv
10c20 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e  l->nSeg-1; iSeg>
10c30 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20  =0; iSeg--){.   
10c40 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
10c50 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
10c60 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
10c70 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73  eg];.        Fts
10c80 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
10c90 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
10ca0 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  ter++];.        
10cb0 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a  if( pTerm==0 ){.
10cc0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
10cd0 67 49 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64  gIterInit(p, iId
10ce0 78 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b  x, pSeg, pIter);
10cf0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
10d00 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
10d10 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c  gIterSeekInit(p,
10d20 20 69 49 64 78 2c 20 70 54 65 72 6d 2c 20 6e 54   iIdx, pTerm, nT
10d30 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67  erm, flags, pSeg
10d40 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
10d50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10d60 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
10d70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
10d80 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a  aLevel[iLevel];.
10d90 20 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65      for(iSeg=nSe
10da0 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
10db0 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73  eg--){.      fts
10dc0 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
10dd0 69 49 64 78 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  iIdx, &pLvl->aSe
10de0 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e  g[iSeg], &pNew->
10df0 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a  aSeg[iIter++]);.
10e00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
10e10 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20  rt( iIter==nSeg 
10e20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
10e30 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73  above was succes
10e40 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f  sful, each compo
10e50 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e  nent iterators n
10e60 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20  ow points .  ** 
10e70 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
10e80 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e  ry in its segmen
10e90 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
10ea0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a  initialize the .
10eb0 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72    ** aFirst[] ar
10ec0 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ray. Or, if an e
10ed0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
10ee0 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72  d, free the iter
10ef0 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  ator.  ** object
10f00 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74   and set the out
10f10 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
10f20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
10f30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10f40 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65   ){.    for(iIte
10f50 72 3d 6e 53 6c 6f 74 2d 31 3b 20 69 49 74 65 72  r=nSlot-1; iIter
10f60 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20  >0; iIter--){.  
10f70 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20      int iEq;.   
10f80 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
10f90 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
10fa0 70 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72  pare(pNew, iIter
10fb0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  )) ){.        ft
10fc0 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
10fd0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71   &pNew->aSeg[iEq
10fe0 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ]);.        fts5
10ff0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
11000 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20  d(p, pNew, iEq, 
11010 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  iIter);.      }.
11020 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
11030 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
11040 46 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20  Free(p, pNew);. 
11050 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20     *ppOut = 0;. 
11060 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
11070 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
11080 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
11090 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  F or if an error
110a0 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
110b0 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  ** False otherwi
110c0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
110d0 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  t fts5MultiIterE
110e0 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
110f0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
11100 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
11110 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49  urn (p->rc || pI
11120 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
11130 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 2e 70 4c  ->aFirst[1] ].pL
11140 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eaf==0);.}../*.*
11150 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77  * Return the row
11160 69 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20  id of the entry 
11170 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f  that the iterato
11180 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
11190 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65  ts.** to. If the
111a0 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73   iterator points
111b0 20 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69   to EOF when thi
111c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
111d0 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75  lled the.** resu
111e0 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65  lts are undefine
111f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34  d..*/.static i64
11200 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f   fts5MultiIterRo
11210 77 69 64 28 46 74 73 35 4d 75 6c 74 69 53 65 67  wid(Fts5MultiSeg
11220 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
11230 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61  assert( pIter->a
11240 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
11250 73 74 5b 31 5d 20 5d 2e 70 4c 65 61 66 20 29 3b  st[1] ].pLeaf );
11260 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
11270 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
11280 69 72 73 74 5b 31 5d 20 5d 2e 69 52 6f 77 69 64  irst[1] ].iRowid
11290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
112a0 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
112b0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61  the next entry a
112c0 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  t or following i
112d0 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  Match..*/.static
112e0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
112f0 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
11300 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
11310 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
11320 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20   *pIter, .  i64 
11330 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c  iMatch.){.  whil
11340 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20  e( 1 ){.    i64 
11350 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35  iRowid;.    fts5
11360 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
11370 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63   pIter, 1, iMatc
11380 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35  h);.    if( fts5
11390 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
113a0 70 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a  pIter) ) break;.
113b0 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73      iRowid = fts
113c0 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
113d0 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
113e0 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26  pIter->bRev==0 &
113f0 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68  & iRowid<=iMatch
11400 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
11410 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30  ( pIter->bRev!=0
11420 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74   && iRowid>=iMat
11430 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ch ) break;.  }.
11440 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11450 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
11460 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
11470 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69   the term associ
11480 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a  ated with the .*
11490 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  * entry that the
114a0 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
114b0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
114c0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
114d0 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72  8 *fts5MultiIter
114e0 54 65 72 6d 28 46 74 73 35 4d 75 6c 74 69 53 65  Term(Fts5MultiSe
114f0 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  gIter *pIter, in
11500 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65  t *pn){.  Fts5Se
11510 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65  gIter *p = &pIte
11520 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
11530 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a 20 20 2a  aFirst[1] ];.  *
11540 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a  pn = p->term.n;.
11550 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d    return p->term
11560 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  .p;.}../*.** Ret
11570 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
11580 63 68 75 6e 6b 20 69 74 65 72 61 74 6f 72 20 70  chunk iterator p
11590 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
115a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  ond argument is.
115b0 2a 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66  ** at EOF. Or if
115c0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
115d0 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20  ready occurred. 
115e0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
115f0 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74  n false..*/.stat
11600 69 63 20 69 6e 74 20 66 74 73 35 43 68 75 6e 6b  ic int fts5Chunk
11610 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
11620 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e 6b 49  x *p, Fts5ChunkI
11630 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
11640 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20  eturn (p->rc || 
11650 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
11660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
11670 63 65 20 74 68 65 20 63 68 75 6e 6b 2d 69 74 65  ce the chunk-ite
11680 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  rator to the nex
11690 74 20 63 68 75 6e 6b 20 6f 66 20 64 61 74 61 20  t chunk of data 
116a0 74 6f 20 72 65 61 64 2e 0a 2a 2f 0a 73 74 61 74  to read..*/.stat
116b0 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e  ic void fts5Chun
116c0 6b 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  kIterNext(Fts5In
116d0 64 65 78 20 2a 70 2c 20 46 74 73 35 43 68 75 6e  dex *p, Fts5Chun
116e0 6b 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  kIter *pIter){. 
116f0 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
11700 6e 52 65 6d 3e 3d 70 49 74 65 72 2d 3e 6e 20 29  nRem>=pIter->n )
11710 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d 20  ;.  pIter->nRem 
11720 2d 3d 20 70 49 74 65 72 2d 3e 6e 3b 0a 20 20 66  -= pIter->n;.  f
11730 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
11740 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
11750 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
11760 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 30  ;.  pIter->p = 0
11770 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e  ;.  if( pIter->n
11780 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 46 74 73  Rem>0 ){.    Fts
11790 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20  5Data *pLeaf;.  
117a0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f    pIter->iLeafRo
117b0 77 69 64 2b 2b 3b 0a 20 20 20 20 70 4c 65 61 66  wid++;.    pLeaf
117c0 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20   = pIter->pLeaf 
117d0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
117e0 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 52 6f  , pIter->iLeafRo
117f0 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  wid);.    if( pL
11800 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 49 74  eaf ){.      pIt
11810 65 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 49 74 65  er->n = MIN(pIte
11820 72 2d 3e 6e 52 65 6d 2c 20 70 4c 65 61 66 2d 3e  r->nRem, pLeaf->
11830 6e 2d 34 29 3b 0a 20 20 20 20 20 20 70 49 74 65  n-4);.      pIte
11840 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70 2b  r->p = pLeaf->p+
11850 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
11860 2f 2a 0a 2a 2a 20 49 6e 74 69 61 6c 69 7a 65 20  /*.** Intialize 
11870 74 68 65 20 63 68 75 6e 6b 20 69 74 65 72 61 74  the chunk iterat
11880 6f 72 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  or to read the p
11890 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74  osition list dat
118a0 61 20 66 6f 72 20 77 68 69 63 68 20 0a 2a 2a 20  a for which .** 
118b0 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 69  the size field i
118c0 73 20 61 74 20 6f 66 66 73 65 74 20 69 4f 66 66  s at offset iOff
118d0 20 6f 66 20 6c 65 61 66 20 70 4c 65 61 66 2e 20   of leaf pLeaf. 
118e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
118f0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e 69  fts5ChunkIterIni
11900 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
11910 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
11920 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
11930 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
11940 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
11950 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eg,             
11960 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 74 65 72   /* Segment iter
11970 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f 73  ator to read pos
11980 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 46  list from */.  F
11990 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49  ts5ChunkIter *pI
119a0 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  ter            /
119b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
119c0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  s object */.){. 
119d0 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d   int iId = pSeg-
119e0 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20  >pSeg->iSegid;. 
119f0 20 69 36 34 20 72 6f 77 69 64 20 3d 20 46 54 53   i64 rowid = FTS
11a00 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
11a10 70 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c  pSeg->iIdx, iId,
11a20 20 30 2c 20 70 53 65 67 2d 3e 69 4c 65 61 66 50   0, pSeg->iLeafP
11a30 67 6e 6f 29 3b 0a 20 20 46 74 73 35 44 61 74 61  gno);.  Fts5Data
11a40 20 2a 70 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e   *pLeaf = pSeg->
11a50 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f 66  pLeaf;.  int iOf
11a60 66 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f  f = pSeg->iLeafO
11a70 66 66 73 65 74 3b 0a 0a 20 20 6d 65 6d 73 65 74  ffset;..  memset
11a80 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
11a90 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
11aa0 74 65 72 2d 3e 69 4c 65 61 66 52 6f 77 69 64 20  ter->iLeafRowid 
11ab0 3d 20 72 6f 77 69 64 3b 0a 20 20 69 66 28 20 69  = rowid;.  if( i
11ac0 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a  Off<pLeaf->n ){.
11ad0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 66 65      fts5DataRefe
11ae0 72 65 6e 63 65 28 70 4c 65 61 66 29 3b 0a 20 20  rence(pLeaf);.  
11af0 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
11b00 20 70 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 7b   pLeaf;.  }else{
11b10 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 65 6d  .    pIter->nRem
11b20 20 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 43 68   = 1;.    fts5Ch
11b30 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70  unkIterNext(p, p
11b40 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
11b50 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
11b60 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20     iOff = 4;.   
11b70 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e   pLeaf = pIter->
11b80 70 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 69 4f  pLeaf;.  }..  iO
11b90 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ff += getVarint3
11ba0 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
11bb0 5d 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b  ], pIter->nRem);
11bc0 0a 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 4d 49  .  pIter->n = MI
11bd0 4e 28 70 4c 65 61 66 2d 3e 6e 20 2d 20 69 4f 66  N(pLeaf->n - iOf
11be0 66 2c 20 70 49 74 65 72 2d 3e 6e 52 65 6d 29 3b  f, pIter->nRem);
11bf0 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d 20 70 4c  .  pIter->p = pL
11c00 65 61 66 2d 3e 70 20 2b 20 69 4f 66 66 3b 0a 0a  eaf->p + iOff;..
11c10 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e 3d 3d    if( pIter->n==
11c20 30 20 29 7b 0a 20 20 20 20 66 74 73 35 43 68 75  0 ){.    fts5Chu
11c30 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  nkIterNext(p, pI
11c40 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
11c50 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
11c60 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 46 74  nkIterRelease(Ft
11c70 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49 74  s5ChunkIter *pIt
11c80 65 72 29 7b 0a 20 20 66 74 73 35 44 61 74 61 52  er){.  fts5DataR
11c90 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
11ca0 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  eaf);.  pIter->p
11cb0 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Leaf = 0;.}../*.
11cc0 2a 2a 20 52 65 61 64 20 61 6e 64 20 72 65 74 75  ** Read and retu
11cd0 72 6e 20 74 68 65 20 6e 65 78 74 20 33 32 2d 62  rn the next 32-b
11ce0 69 74 20 76 61 72 69 6e 74 20 66 72 6f 6d 20 74  it varint from t
11cf0 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
11d00 20 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70 61   iterator .** pa
11d10 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
11d20 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
11d30 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
11d40 63 63 75 72 73 2c 20 7a 65 72 6f 20 69 73 20 72  ccurs, zero is r
11d50 65 74 75 72 6e 65 64 20 61 6e 20 61 6e 20 65 72  eturned an an er
11d60 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e  ror code left in
11d70 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 2e 72   .** Fts5Index.r
11d80 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  c. If an error h
11d90 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
11da0 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
11db0 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 63 61 6c  nction is.** cal
11dc0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
11dd0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
11de0 74 20 66 74 73 35 50 6f 73 49 74 65 72 52 65 61  t fts5PosIterRea
11df0 64 56 61 72 69 6e 74 28 46 74 73 35 49 6e 64 65  dVarint(Fts5Inde
11e00 78 20 2a 70 2c 20 46 74 73 35 50 6f 73 49 74 65  x *p, Fts5PosIte
11e10 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
11e20 20 69 56 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28   iVal = 0;.  if(
11e30 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11e40 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  K ){.    if( pIt
11e50 65 72 2d 3e 69 4f 66 66 3e 3d 70 49 74 65 72 2d  er->iOff>=pIter-
11e60 3e 63 68 75 6e 6b 2e 6e 20 29 7b 0a 20 20 20 20  >chunk.n ){.    
11e70 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e    fts5ChunkIterN
11e80 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 63  ext(p, &pIter->c
11e90 68 75 6e 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  hunk);.      if(
11ea0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f   fts5ChunkIterEo
11eb0 66 28 70 2c 20 26 70 49 74 65 72 2d 3e 63 68 75  f(p, &pIter->chu
11ec0 6e 6b 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nk) ) return 0;.
11ed0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66        pIter->iOf
11ee0 66 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  f = 0;.    }.   
11ef0 20 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20   pIter->iOff += 
11f00 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  getVarint32(&pIt
11f10 65 72 2d 3e 63 68 75 6e 6b 2e 70 5b 70 49 74 65  er->chunk.p[pIte
11f20 72 2d 3e 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b  r->iOff], iVal);
11f30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 56  .  }.  return iV
11f40 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  al;.}../*.** Adv
11f50 61 6e 63 65 20 74 68 65 20 70 6f 73 69 74 69 6f  ance the positio
11f60 6e 20 6c 69 73 74 20 69 74 65 72 61 74 6f 72 20  n list iterator 
11f70 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
11f80 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
11f90 64 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78  d fts5PosIterNex
11fa0 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
11fb0 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74  Fts5PosIter *pIt
11fc0 65 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 3b  er){.  int iVal;
11fd0 0a 20 20 61 73 73 65 72 74 28 20 66 74 73 35 43  .  assert( fts5C
11fe0 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26  hunkIterEof(p, &
11ff0 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d 3d 30  pIter->chunk)==0
12000 20 29 3b 0a 20 20 69 56 61 6c 20 3d 20 66 74 73   );.  iVal = fts
12010 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69  5PosIterReadVari
12020 6e 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  nt(p, pIter);.  
12030 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65  if( fts5ChunkIte
12040 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e  rEof(p, &pIter->
12050 63 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  chunk)==0 ){.   
12060 20 69 66 28 20 69 56 61 6c 3d 3d 31 20 29 7b 0a   if( iVal==1 ){.
12070 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 43 6f        pIter->iCo
12080 6c 20 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52  l = fts5PosIterR
12090 65 61 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74  eadVarint(p, pIt
120a0 65 72 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  er);.      pIter
120b0 2d 3e 69 50 6f 73 20 3d 20 66 74 73 35 50 6f 73  ->iPos = fts5Pos
120c0 49 74 65 72 52 65 61 64 56 61 72 69 6e 74 28 70  IterReadVarint(p
120d0 2c 20 70 49 74 65 72 29 20 2d 20 32 3b 0a 20 20  , pIter) - 2;.  
120e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
120f0 49 74 65 72 2d 3e 69 50 6f 73 20 2b 3d 20 28 69  Iter->iPos += (i
12100 56 61 6c 20 2d 20 32 29 3b 0a 20 20 20 20 7d 0a  Val - 2);.    }.
12110 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69    }.}../*.** Ini
12120 74 69 61 6c 69 7a 65 20 74 68 65 20 46 74 73 35  tialize the Fts5
12130 50 6f 73 49 74 65 72 20 6f 62 6a 65 63 74 20 70  PosIter object p
12140 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 6e  assed as the fin
12150 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69  al argument to i
12160 74 65 72 61 74 65 0a 2a 2a 20 74 68 72 6f 75 67  terate.** throug
12170 68 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  h the position-l
12180 69 73 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ist associated w
12190 69 74 68 20 74 68 65 20 69 6e 64 65 78 20 65 6e  ith the index en
121a0 74 72 79 20 74 68 61 74 20 69 74 65 72 61 74 6f  try that iterato
121b0 72 20 0a 2a 2a 20 70 4d 75 6c 74 69 20 63 75 72  r .** pMulti cur
121c0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
121d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
121e0 20 66 74 73 35 50 6f 73 49 74 65 72 49 6e 69 74   fts5PosIterInit
121f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
12200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12210 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
12220 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
12230 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72  Fts5MultiSegIter
12240 20 2a 70 4d 75 6c 74 69 2c 20 20 20 20 20 20 20   *pMulti,       
12250 2f 2a 20 4d 75 6c 74 69 2d 73 65 67 20 69 74 65  /* Multi-seg ite
12260 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 70 6f  rator to read po
12270 73 2d 6c 69 73 74 20 66 72 6f 6d 20 2a 2f 0a 20  s-list from */. 
12280 20 46 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49   Fts5PosIter *pI
12290 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
122a0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
122b0 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
122c0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
122d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
122e0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
122f0 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67   = &pMulti->aSeg
12300 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74  [ pMulti->aFirst
12310 5b 31 5d 20 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  [1] ];.    memse
12320 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
12330 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20  of(*pIter));.   
12340 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e   fts5ChunkIterIn
12350 69 74 28 70 2c 20 70 53 65 67 2c 20 26 70 49 74  it(p, pSeg, &pIt
12360 65 72 2d 3e 63 68 75 6e 6b 29 3b 0a 20 20 20 20  er->chunk);.    
12370 69 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65  if( fts5ChunkIte
12380 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e  rEof(p, &pIter->
12390 63 68 75 6e 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  chunk)==0 ){.   
123a0 20 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65     fts5PosIterNe
123b0 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  xt(p, pIter);.  
123c0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
123d0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
123e0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 65  the position ite
123f0 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
12400 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12410 65 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45 4f 46  ent is.** at EOF
12420 2e 20 4f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  . Or if an error
12430 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
12440 75 72 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urred. Otherwise
12450 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65 2e 0a  , return false..
12460 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
12470 73 35 50 6f 73 49 74 65 72 45 6f 66 28 46 74 73  s5PosIterEof(Fts
12480 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 50  5Index *p, Fts5P
12490 6f 73 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  osIter *pIter){.
124a0 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20    return (p->rc 
124b0 7c 7c 20 70 49 74 65 72 2d 3e 63 68 75 6e 6b 2e  || pIter->chunk.
124c0 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  pLeaf==0);.}../*
124d0 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79  .** Add an entry
124e0 20 66 6f 72 20 28 69 52 6f 77 69 64 2f 69 43 6f   for (iRowid/iCo
124f0 6c 2f 69 50 6f 73 29 20 74 6f 20 74 68 65 20 64  l/iPos) to the d
12500 6f 63 6c 69 73 74 20 66 6f 72 20 28 70 54 6f 6b  oclist for (pTok
12510 65 6e 2f 6e 54 6f 6b 65 6e 29 0a 2a 2a 20 69 6e  en/nToken).** in
12520 20 68 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   hash table for 
12530 69 6e 64 65 78 20 69 49 64 78 2e 20 49 66 20 69  index iIdx. If i
12540 49 64 78 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  Idx is zero, thi
12550 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 74 65  s is the main te
12560 72 6d 73 20 0a 2a 2a 20 69 6e 64 65 78 2e 20 56  rms .** index. V
12570 61 6c 75 65 73 20 6f 66 20 31 20 61 6e 64 20 67  alues of 1 and g
12580 72 65 61 74 65 72 20 66 6f 72 20 69 49 64 78 20  reater for iIdx 
12590 61 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  are prefix index
125a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  es..**.** If an 
125b0 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
125c0 6f 75 6e 74 65 72 65 64 2c 20 73 65 74 20 74 68  ountered, set th
125d0 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
125e0 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 61 63  rror code .** ac
125f0 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74  cordingly..*/.st
12600 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 64  atic void fts5Ad
12610 64 54 65 72 6d 54 6f 48 61 73 68 28 0a 20 20 46  dTermToHash(.  F
12620 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12640 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74  * Index object t
12650 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
12660 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20 20 20  int iIdx,       
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 2f 2a 20 45 6e 74 72 79 20 69 6e 20 70 2d 3e 61  /* Entry in p->a
12690 48 61 73 68 5b 5d 20 74 6f 20 75 70 64 61 74 65  Hash[] to update
126a0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
126d0 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e  token appears in
126e0 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29   (-ve -> delete)
126f0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12710 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
12720 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  n of token withi
12730 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  n column */.  co
12740 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
12750 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
12760 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
12770 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
12780 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  om index */.){. 
12790 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
127a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
127b0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
127c0 48 61 73 68 57 72 69 74 65 28 0a 20 20 20 20 20  HashWrite(.     
127d0 20 20 20 70 2d 3e 61 70 48 61 73 68 5b 69 49 64     p->apHash[iId
127e0 78 5d 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  x], p->iWriteRow
127f0 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
12800 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20  pToken, nToken. 
12810 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a     );.  }.}../*.
12820 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
12830 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72  w segment-id for
12840 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
12850 53 74 72 75 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  Struct..**.** If
12860 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
12870 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
12880 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
12890 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a   a no-op. 0 is .
128a0 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74  ** returned in t
128b0 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61  his case..*/.sta
128c0 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f  tic int fts5Allo
128d0 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49 6e  cateSegid(Fts5In
128e0 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75  dex *p, Fts5Stru
128f0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b  cture *pStruct){
12900 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
12910 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
12920 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
12930 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 30 3b 20  for(i=0; i<100; 
12940 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  i++){.    int iS
12950 65 67 69 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  egid;.    sqlite
12960 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
12970 65 6f 66 28 69 6e 74 29 2c 20 28 76 6f 69 64 2a  eof(int), (void*
12980 29 26 69 53 65 67 69 64 29 3b 0a 20 20 20 20 69  )&iSegid);.    i
12990 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 20 26  Segid = iSegid &
129a0 20 28 28 31 20 3c 3c 20 46 54 53 35 5f 44 41 54   ((1 << FTS5_DAT
129b0 41 5f 49 44 5f 42 29 2d 31 29 3b 0a 20 20 20 20  A_ID_B)-1);.    
129c0 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20  if( iSegid ){.  
129d0 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
129e0 65 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c  eg;.      for(iL
129f0 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
12a00 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
12a10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
12a20 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
12a30 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
12a40 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
12a50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
12a60 20 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74   iSegid==pStruct
12a70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
12a80 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
12a90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12aa0 69 53 65 67 69 64 20 3d 20 30 3b 0a 20 20 20 20  iSegid = 0;.    
12ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12ac0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12ad0 20 20 20 20 69 66 28 20 69 53 65 67 69 64 20 29      if( iSegid )
12ae0 20 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a   return iSegid;.
12af0 20 20 7d 0a 0a 20 20 70 2d 3e 72 63 20 3d 20 53    }..  p->rc = S
12b00 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 72  QLITE_ERROR;.  r
12b10 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
12b20 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61  * Discard all da
12b30 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63  ta currently cac
12b40 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d  hed in the hash-
12b50 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
12b60 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
12b70 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73 35  DiscardData(Fts5
12b80 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  Index *p){.  ass
12b90 65 72 74 28 20 70 2d 3e 61 70 48 61 73 68 20 7c  ert( p->apHash |
12ba0 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  | p->nPendingDat
12bb0 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  a==0 );.  if( p-
12bc0 3e 61 70 48 61 73 68 20 29 7b 0a 20 20 20 20 46  >apHash ){.    F
12bd0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
12be0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
12bf0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12c00 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e  for(i=0; i<=pCon
12c10 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b  fig->nPrefix; i+
12c20 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
12c30 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70  3Fts5HashClear(p
12c40 2d 3e 61 70 48 61 73 68 5b 69 5d 29 3b 0a 20 20  ->apHash[i]);.  
12c50 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64    }.    p->nPend
12c60 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d  ingData = 0;.  }
12c70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12c80 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12c90 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65   prefix, in byte
12ca0 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 28  s, that buffer (
12cb0 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72 65  nNew/pNew) share
12cc0 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65 72  s.** with buffer
12cd0 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f   (nOld/pOld)..*/
12ce0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
12cf0 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a  PrefixCompress(.
12d00 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73    int nOld, cons
12d10 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e  t u8 *pOld,.  in
12d20 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75 38  t nNew, const u8
12d30 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20   *pNew.){.  int 
12d40 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
12d50 6e 4e 65 77 20 26 26 20 69 3c 6e 4f 6c 64 3b 20  nNew && i<nOld; 
12d60 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  i++){.    if( pO
12d70 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29  ld[i]!=pNew[i] )
12d80 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
12d90 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
12da0 20 49 66 20 61 6e 20 22 6e 45 6d 70 74 79 22 20   If an "nEmpty" 
12db0 72 65 63 6f 72 64 20 6d 75 73 74 20 62 65 20 77  record must be w
12dc0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 62 2d  ritten to the b-
12dd0 74 72 65 65 20 62 65 66 6f 72 65 20 74 68 65 20  tree before the 
12de0 6e 65 78 74 0a 2a 2a 20 74 65 72 6d 2c 20 77 72  next.** term, wr
12df0 69 74 65 20 69 74 20 6e 6f 77 2e 0a 2a 2f 0a 73  ite it now..*/.s
12e00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
12e10 72 69 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28  riteBtreeNEmpty(
12e20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
12e30 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
12e40 69 74 65 72 29 7b 0a 20 20 69 66 28 20 70 57 72  iter){.  if( pWr
12e50 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a  iter->nEmpty ){.
12e60 20 20 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20      int bFlag = 
12e70 30 3b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57  0;.    Fts5PageW
12e80 72 69 74 65 72 20 2a 70 50 67 3b 0a 20 20 20 20  riter *pPg;.    
12e90 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  pPg = &pWriter->
12ea0 61 57 72 69 74 65 72 5b 31 5d 3b 0a 20 20 20 20  aWriter[1];.    
12eb0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  if( pWriter->nEm
12ec0 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c  pty>=FTS5_MIN_DL
12ed0 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  IDX_SIZE ){.    
12ee0 20 20 69 36 34 20 69 4b 65 79 20 3d 20 46 54 53    i64 iKey = FTS
12ef0 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52 4f  5_DOCLIST_IDX_RO
12f00 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
12f10 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57  Writer->iIdx, pW
12f20 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 0a  riter->iSegid, .
12f30 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65            pWrite
12f40 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 2e 70 67  r->aWriter[0].pg
12f50 6e 6f 20 2d 20 31 20 2d 20 70 57 72 69 74 65 72  no - 1 - pWriter
12f60 2d 3e 6e 45 6d 70 74 79 0a 20 20 20 20 20 20 29  ->nEmpty.      )
12f70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12f80 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2e 6e  pWriter->dlidx.n
12f90 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  >0 );.      fts5
12fa0 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4b 65  DataWrite(p, iKe
12fb0 79 2c 20 70 57 72 69 74 65 72 2d 3e 64 6c 69 64  y, pWriter->dlid
12fc0 78 2e 70 2c 20 70 57 72 69 74 65 72 2d 3e 64 6c  x.p, pWriter->dl
12fd0 69 64 78 2e 6e 29 3b 0a 20 20 20 20 20 20 62 46  idx.n);.      bF
12fe0 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  lag = 1;.    }. 
12ff0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
13000 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
13010 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 62 46 6c  , &pPg->buf, bFl
13020 61 67 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  ag);.    fts5Buf
13030 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
13040 26 70 2d 3e 72 63 2c 20 26 70 50 67 2d 3e 62 75  &p->rc, &pPg->bu
13050 66 2c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  f, pWriter->nEmp
13060 74 79 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72  ty);.    pWriter
13070 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20  ->nEmpty = 0;.  
13080 7d 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20  }..  /* Whether 
13090 6f 72 20 6e 6f 74 20 69 74 20 77 61 73 20 77 72  or not it was wr
130a0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2c 20 7a  itten to disk, z
130b0 65 72 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20  ero the doclist 
130c0 69 6e 64 65 78 20 61 74 20 74 68 69 73 0a 20 20  index at this.  
130d0 2a 2a 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 73 71  ** point */.  sq
130e0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
130f0 65 72 6f 28 26 70 57 72 69 74 65 72 2d 3e 64 6c  ero(&pWriter->dl
13100 69 64 78 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  idx);.  pWriter-
13110 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69 64  >bDlidxPrevValid
13120 20 3d 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   = 0;.}..static 
13130 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
13140 72 65 65 47 72 6f 77 28 46 74 73 35 49 6e 64 65  reeGrow(Fts5Inde
13150 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
13160 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
13170 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
13180 2a 61 4e 65 77 3b 0a 20 20 46 74 73 35 50 61 67  *aNew;.  Fts5Pag
13190 65 57 72 69 74 65 72 20 2a 70 4e 65 77 3b 0a 20  eWriter *pNew;. 
131a0 20 69 6e 74 20 6e 4e 65 77 20 3d 20 73 69 7a 65   int nNew = size
131b0 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65  of(Fts5PageWrite
131c0 72 29 20 2a 20 28 70 57 72 69 74 65 72 2d 3e 6e  r) * (pWriter->n
131d0 57 72 69 74 65 72 2b 31 29 3b 0a 0a 20 20 61 4e  Writer+1);..  aN
131e0 65 77 20 3d 20 28 46 74 73 35 50 61 67 65 57 72  ew = (Fts5PageWr
131f0 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65  iter*)sqlite3_re
13200 61 6c 6c 6f 63 28 70 57 72 69 74 65 72 2d 3e 61  alloc(pWriter->a
13210 57 72 69 74 65 72 2c 20 6e 4e 65 77 29 3b 0a 20  Writer, nNew);. 
13220 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 20 72   if( aNew==0 ) r
13230 65 74 75 72 6e 3b 0a 0a 20 20 70 4e 65 77 20 3d  eturn;..  pNew =
13240 20 26 61 4e 65 77 5b 70 57 72 69 74 65 72 2d 3e   &aNew[pWriter->
13250 6e 57 72 69 74 65 72 5d 3b 0a 20 20 6d 65 6d 73  nWriter];.  mems
13260 65 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65  et(pNew, 0, size
13270 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65  of(Fts5PageWrite
13280 72 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 67 6e  r));.  pNew->pgn
13290 6f 20 3d 20 31 3b 0a 20 20 66 74 73 35 42 75 66  o = 1;.  fts5Buf
132a0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
132b0 26 70 2d 3e 72 63 2c 20 26 70 4e 65 77 2d 3e 62  &p->rc, &pNew->b
132c0 75 66 2c 20 31 29 3b 0a 0a 20 20 70 57 72 69 74  uf, 1);..  pWrit
132d0 65 72 2d 3e 6e 57 72 69 74 65 72 2b 2b 3b 0a 20  er->nWriter++;. 
132e0 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
132f0 72 20 3d 20 61 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  r = aNew;.}../*.
13300 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
13310 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
13320 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74  leaf page except
13330 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20   the first that 
13340 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c  contains.** at l
13350 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41  east one term. A
13360 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70  rgument (nTerm/p
13370 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c  Term) is the spl
13380 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20  it-key - a term 
13390 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65  that.** is large
133a0 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73  r than all terms
133b0 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c   written to earl
133c0 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20  ier leaves, and 
133d0 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73  equal to or.** s
133e0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
133f0 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  first term on th
13400 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a  e new leaf..**.*
13410 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
13420 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
13430 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
13440 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20  ts5Index.rc. If 
13450 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20  an error.** has 
13460 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
13470 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
13480 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
13490 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
134a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
134b0 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
134c0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134e0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
134f0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
13500 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
13510 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
13520 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
13530 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
13540 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
13550 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65       /* First te
13560 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a  rm on new page *
13570 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 48 65 69 67  /.){.  int iHeig
13580 68 74 3b 0a 20 20 66 6f 72 28 69 48 65 69 67 68  ht;.  for(iHeigh
13590 74 3d 31 3b 20 31 3b 20 69 48 65 69 67 68 74 2b  t=1; 1; iHeight+
135a0 2b 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65  +){.    Fts5Page
135b0 57 72 69 74 65 72 20 2a 70 50 61 67 65 3b 0a 0a  Writer *pPage;..
135c0 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3e      if( iHeight>
135d0 3d 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65  =pWriter->nWrite
135e0 72 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  r ){.      fts5W
135f0 72 69 74 65 42 74 72 65 65 47 72 6f 77 28 70 2c  riteBtreeGrow(p,
13600 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20   pWriter);.     
13610 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
13620 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
13630 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
13640 3e 61 57 72 69 74 65 72 5b 69 48 65 69 67 68 74  >aWriter[iHeight
13650 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
13660 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c 20  eBtreeNEmpty(p, 
13670 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 20 20 69  pWriter);..    i
13680 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  f( pPage->buf.n>
13690 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
136a0 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  z ){.      /* pP
136b0 61 67 65 20 77 69 6c 6c 20 62 65 20 77 72 69 74  age will be writ
136c0 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 54 68 65  ten to disk. The
136d0 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 77 72   term will be wr
136e0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 20  itten into the. 
136f0 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 6f       ** parent o
13700 66 20 70 50 61 67 65 2e 20 20 2a 2f 0a 20 20 20  f pPage.  */.   
13710 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
13720 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
13730 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70 57  ID(.          pW
13740 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
13750 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 48  iter->iSegid, iH
13760 65 69 67 68 74 2c 20 70 50 61 67 65 2d 3e 70 67  eight, pPage->pg
13770 6e 6f 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  no.      );.    
13780 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
13790 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
137a0 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
137b0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  buf.n);.      ft
137c0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50  s5BufferZero(&pP
137d0 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20  age->buf);.     
137e0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
137f0 26 70 50 61 67 65 2d 3e 74 65 72 6d 29 3b 0a 20  &pPage->term);. 
13800 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
13810 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
13820 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
13830 20 70 50 61 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29   pPage[-1].pgno)
13840 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70  ;.      pPage->p
13850 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  gno++;.    }else
13860 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65  {.      int nPre
13870 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
13880 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72  press(pPage->ter
13890 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  m.n, pPage->term
138a0 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  .p, nTerm, pTerm
138b0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
138c0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
138d0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
138e0 62 75 66 2c 20 6e 50 72 65 2b 32 29 3b 0a 20 20  buf, nPre+2);.  
138f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
13900 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
13910 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
13920 6e 54 65 72 6d 2d 6e 50 72 65 29 3b 0a 20 20 20  nTerm-nPre);.   
13930 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
13940 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
13950 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
13960 72 6d 2d 6e 50 72 65 2c 20 70 54 65 72 6d 2b 6e  rm-nPre, pTerm+n
13970 50 72 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35  Pre);.      fts5
13980 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
13990 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
139a0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
139b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
139c0 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
139d0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
139e0 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73  reeNoTerm(.  Fts
139f0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a10 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
13a20 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
13a30 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
13a40 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
13a50 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
13a60 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
13a70 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
13a80 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 72 6f   ){.    /* No ro
13a90 77 69 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67  wids on this pag
13aa0 65 2e 20 41 70 70 65 6e 64 20 61 6e 20 30 78 30  e. Append an 0x0
13ab0 30 20 62 79 74 65 20 74 6f 20 74 68 65 20 63 75  0 byte to the cu
13ac0 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20 64 6f  rrent .    ** do
13ad0 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 20  clist-index */. 
13ae0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
13af0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
13b00 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
13b10 72 2d 3e 64 6c 69 64 78 2c 20 30 29 3b 0a 20 20  r->dlidx, 0);.  
13b20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  }.  pWriter->nEm
13b30 70 74 79 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pty++;.}../*.** 
13b40 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73  Rowid iRowid has
13b50 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e   just been appen
13b60 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
13b70 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 41 73  nt leaf page. As
13b80 20 69 74 20 69 73 0a 2a 2a 20 74 68 65 20 66 69   it is.** the fi
13b90 72 73 74 20 6f 6e 20 69 74 73 20 70 61 67 65 2c  rst on its page,
13ba0 20 61 70 70 65 6e 64 20 61 6e 20 65 6e 74 72 79   append an entry
13bb0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
13bc0 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
13bd0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
13be0 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
13bf0 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nd(.  Fts5Index 
13c00 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
13c10 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
13c20 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a    i64 iRowid.){.
13c30 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 69 66    i64 iVal;.  if
13c40 28 20 70 57 72 69 74 65 72 2d 3e 62 44 6c 69 64  ( pWriter->bDlid
13c50 78 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20  xPrevValid ){.  
13c60 20 20 69 56 61 6c 20 3d 20 70 57 72 69 74 65 72    iVal = pWriter
13c70 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 2d 20 69  ->iDlidxPrev - i
13c80 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rowid;.  }else{.
13c90 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69      iVal = iRowi
13ca0 64 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  d;.  }.  sqlite3
13cb0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
13cc0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
13cd0 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2c 20  pWriter->dlidx, 
13ce0 69 56 61 6c 29 3b 0a 20 20 70 57 72 69 74 65 72  iVal);.  pWriter
13cf0 2d 3e 62 44 6c 69 64 78 50 72 65 76 56 61 6c 69  ->bDlidxPrevVali
13d00 64 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  d = 1;.  pWriter
13d10 2d 3e 69 44 6c 69 64 78 50 72 65 76 20 3d 20 69  ->iDlidxPrev = i
13d20 52 6f 77 69 64 3b 0a 7d 0a 0a 73 74 61 74 69 63  Rowid;.}..static
13d30 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
13d40 6c 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64  lushLeaf(Fts5Ind
13d50 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
13d60 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
13d70 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
13d80 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30  8 zero[] = { 0x0
13d90 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30  0, 0x00, 0x00, 0
13da0 78 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67  x00 };.  Fts5Pag
13db0 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
13dc0 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
13dd0 65 72 5b 30 5d 3b 0a 20 20 69 36 34 20 69 52 6f  er[0];.  i64 iRo
13de0 77 69 64 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  wid;..  if( pPag
13df0 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a  e->term.n==0 ){.
13e00 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77      /* No term w
13e10 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  as written to th
13e20 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  is page. */.    
13e30 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47  assert( 0==fts5G
13e40 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  etU16(&pPage->bu
13e50 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66  f.p[2]) );.    f
13e60 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54  ts5WriteBtreeNoT
13e70 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b  erm(p, pWriter);
13e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
13e90 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
13ea0 65 20 74 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a  e to the db. */.
13eb0 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
13ec0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
13ed0 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72  riter->iIdx, pWr
13ee0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c  iter->iSegid, 0,
13ef0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
13f00 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
13f10 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d  , iRowid, pPage-
13f20 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
13f30 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  uf.n);..  /* Ini
13f40 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74  tialize the next
13f50 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35   page. */.  fts5
13f60 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
13f70 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42  e->buf);.  fts5B
13f80 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65  ufferZero(&pPage
13f90 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  ->term);.  fts5B
13fa0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
13fb0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
13fc0 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20  buf, 4, zero);. 
13fd0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a   pPage->pgno++;.
13fe0 0a 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74  .  /* Increase t
13ff0 68 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65  he leaves writte
14000 6e 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70  n counter */.  p
14010 57 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69  Writer->nLeafWri
14020 74 74 65 6e 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tten++;.}../*.**
14030 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
14040 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
14050 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
14060 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
14070 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
14080 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14090 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
140a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
140b0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
140c0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
140d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
140e0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
140f0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
14100 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
14110 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14120 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
14130 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
14140 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
14150 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
14160 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
14170 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
14180 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141a0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
141b0 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
141c0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
141d0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
141e0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
141f0 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 0a 20  ->aWriter[0];.. 
14200 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
14210 62 75 66 2e 6e 3d 3d 30 20 7c 7c 20 70 50 61 67  buf.n==0 || pPag
14220 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 3b 0a 20 20  e->buf.n>4 );.  
14230 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  if( pPage->buf.n
14240 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65  ==0 ){.    /* Ze
14250 72 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  ro the first ter
14260 6d 20 61 6e 64 20 66 69 72 73 74 20 64 6f 63 69  m and first doci
14270 64 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20 20  d fields */.    
14280 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
14290 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c  zero[] = { 0x00,
142a0 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
142b0 30 20 7d 3b 0a 20 20 20 20 66 74 73 35 42 75 66  0 };.    fts5Buf
142c0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
142d0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
142e0 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 20  f, 4, zero);.   
142f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
14300 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20 7d  term.n==0 );.  }
14310 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72  .  if( p->rc ) r
14320 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28 20  eturn;.  .  if( 
14330 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d 30  pPage->term.n==0
14340 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   ){.    /* Updat
14350 65 20 74 68 65 20 22 66 69 72 73 74 20 74 65 72  e the "first ter
14360 6d 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  m" field of the 
14370 70 61 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  page header. */.
14380 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14390 65 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26  e->buf.p[2]==0 &
143a0 26 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33  & pPage->buf.p[3
143b0 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35  ]==0 );.    fts5
143c0 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  PutU16(&pPage->b
143d0 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e  uf.p[2], pPage->
143e0 62 75 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65  buf.n);.    nPre
143f0 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
14400 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
14410 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a  r[0].pgno!=1 ){.
14420 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42        fts5WriteB
14430 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69  treeTerm(p, pWri
14440 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
14450 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  m);.      pPage 
14460 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
14470 74 65 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20  ter[0];.    }.  
14480 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66  }else{.    nPref
14490 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  ix = fts5PrefixC
144a0 6f 6d 70 72 65 73 73 28 0a 20 20 20 20 20 20 20  ompress(.       
144b0 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20   pPage->term.n, 
144c0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e  pPage->term.p, n
144d0 54 65 72 6d 2c 20 70 54 65 72 6d 0a 20 20 20 20  Term, pTerm.    
144e0 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
144f0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
14500 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
14510 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d  f, nPrefix);.  }
14520 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
14530 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
14540 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74  s of new data, t
14550 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74  hen the term dat
14560 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f  a itself.  ** to
14570 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
14580 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
14590 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
145a0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
145b0 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  m - nPrefix);.  
145c0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
145d0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
145e0 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
145f0 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72  - nPrefix, &pTer
14600 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20  m[nPrefix]);..  
14610 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
14620 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65 72  s5PageWriter.ter
14630 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74  m field. */.  ft
14640 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
14650 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d  rc, &pPage->term
14660 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
14670 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ..  pWriter->bFi
14680 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
14690 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   0;.  pWriter->b
146a0 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c  FirstRowidInDocl
146b0 69 73 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 49  ist = 1;..  /* I
146c0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  f the current le
146d0 61 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2c  af page is full,
146e0 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73   flush it to dis
146f0 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  k. */.  if( pPag
14700 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f  e->buf.n>=p->pCo
14710 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
14720 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
14730 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
14740 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
14750 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
14760 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
14770 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63 69  ** Append a doci
14780 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 72 73  d to the writers
14790 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61   output. .*/.sta
147a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
147b0 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20  teAppendRowid(. 
147c0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
147d0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
147e0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20  *pWriter,.  i64 
147f0 69 52 6f 77 69 64 0a 29 7b 0a 20 20 46 74 73 35  iRowid.){.  Fts5
14800 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
14810 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  e = &pWriter->aW
14820 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 2f 2a 20  riter[0];..  /* 
14830 49 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65  If this is to be
14840 20 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64   the first docid
14850 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
14860 70 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20  page, set the . 
14870 20 2a 2a 20 64 6f 63 69 64 2d 70 6f 69 6e 74 65   ** docid-pointe
14880 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65  r in the page-he
14890 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e  ader. Also appen
148a0 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65  d a value to the
148b0 20 64 6c 69 64 78 0a 20 20 2a 2a 20 62 75 66 66   dlidx.  ** buff
148c0 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f  er, in case a do
148d0 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72  clist-index is r
148e0 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 69  equired.  */.  i
148f0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
14900 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b  stRowidInPage ){
14910 0a 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28  .    fts5PutU16(
14920 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50  pPage->buf.p, pP
14930 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20  age->buf.n);.   
14940 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41   fts5WriteDlidxA
14950 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72  ppend(p, pWriter
14960 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 0a  , iRowid);.  }..
14970 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 64    /* Write the d
14980 6f 63 69 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ocid. */.  if( p
14990 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
149a0 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20  widInDoclist || 
149b0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
149c0 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20  owidInPage ){.  
149d0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
149e0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
149f0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52   &pPage->buf, iR
14a00 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  owid);.  }else{.
14a10 20 20 20 20 61 73 73 65 72 74 28 20 69 52 6f 77      assert( iRow
14a20 69 64 3c 70 57 72 69 74 65 72 2d 3e 69 50 72 65  id<pWriter->iPre
14a30 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 66 74  vRowid );.    ft
14a40 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
14a50 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
14a60 61 67 65 2d 3e 62 75 66 2c 20 70 57 72 69 74 65  age->buf, pWrite
14a70 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 2d 20  r->iPrevRowid - 
14a80 69 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20 20 70  iRowid);.  }.  p
14a90 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
14aa0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70  id = iRowid;.  p
14ab0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
14ac0 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30  widInDoclist = 0
14ad0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
14ae0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
14af0 20 30 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   0;..  if( pPage
14b00 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e  ->buf.n>=p->pCon
14b10 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
14b20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
14b30 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
14b40 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46  .    pWriter->bF
14b50 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
14b60 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = 1;.  }.}..stat
14b70 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
14b80 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e  eAppendPoslistIn
14b90 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
14ba0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
14bb0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
14bc0 69 6e 74 20 69 56 61 6c 0a 29 7b 0a 20 20 46 74  int iVal.){.  Ft
14bd0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
14be0 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
14bf0 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 66 74  aWriter[0];.  ft
14c00 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
14c10 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
14c20 61 67 65 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b  age->buf, iVal);
14c30 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75  .  if( pPage->bu
14c40 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  f.n>=p->pConfig-
14c50 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66 74 73  >pgsz ){.    fts
14c60 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
14c70 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
14c80 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
14c90 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
14ca0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
14cb0 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
14cc0 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a  endPoslistData(.
14cd0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
14ce0 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
14cf0 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f   *pWriter, .  co
14d00 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a  nst u8 *aData, .
14d10 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20    int nData.){. 
14d20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
14d30 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
14d40 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20  r->aWriter[0];. 
14d50 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61   const u8 *a = a
14d60 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Data;.  int n = 
14d70 6e 44 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65  nData;.  .  asse
14d80 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  rt( p->pConfig->
14d90 70 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c  pgsz>0 );.  whil
14da0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
14db0 5f 4f 4b 20 26 26 20 28 70 50 61 67 65 2d 3e 62  _OK && (pPage->b
14dc0 75 66 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43  uf.n + n)>=p->pC
14dd0 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
14de0 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d     int nReq = p-
14df0 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d  >pConfig->pgsz -
14e00 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 20   pPage->buf.n;. 
14e10 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30     int nCopy = 0
14e20 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f  ;.    while( nCo
14e30 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20  py<nReq ){.     
14e40 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20   i64 dummy;.    
14e50 20 20 6e 43 6f 70 79 20 2b 3d 20 67 65 74 56 61    nCopy += getVa
14e60 72 69 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20  rint(&a[nCopy], 
14e70 28 75 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20  (u64*)&dummy);. 
14e80 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66     }.    fts5Buf
14e90 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
14ea0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
14eb0 66 2c 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20  f, nCopy, a);.  
14ec0 20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20    a += nCopy;.  
14ed0 20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20    n -= nCopy;.  
14ee0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
14ef0 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
14f00 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62  ;.    pWriter->b
14f10 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
14f20 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
14f30 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  n>0 ){.    fts5B
14f40 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
14f50 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
14f60 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a  buf, n, a);.  }.
14f70 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
14f80 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65  ts5WriteAppendZe
14f90 72 6f 62 79 74 65 28 46 74 73 35 49 6e 64 65 78  robyte(Fts5Index
14fa0 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
14fb0 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
14fc0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
14fd0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
14fe0 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72  pWriter->aWriter
14ff0 5b 30 5d 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a  [0].buf, 0);.}..
15000 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
15010 64 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74  data cached by t
15020 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74  he writer object
15030 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15040 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c  . Free any.** al
15050 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
15060 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72  ated with the wr
15070 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iter..*/.static 
15080 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69  void fts5WriteFi
15090 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  nish(.  Fts5Inde
150a0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
150b0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
150c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
150d0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
150e0 6e 74 20 2a 70 6e 48 65 69 67 68 74 2c 20 20 20  nt *pnHeight,   
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15100 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20 6f 66  * OUT: Height of
15110 20 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 20   the b-tree */. 
15120 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20   int *pnLeaf    
15130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15140 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
15150 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e  of leaf pages in
15160 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20   b-tree */.){.  
15170 69 6e 74 20 69 3b 0a 20 20 2a 70 6e 4c 65 61 66  int i;.  *pnLeaf
15180 20 3d 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69   = pWriter->aWri
15190 74 65 72 5b 30 5d 2e 70 67 6e 6f 3b 0a 20 20 69  ter[0].pgno;.  i
151a0 66 28 20 2a 70 6e 4c 65 61 66 3d 3d 31 20 26 26  f( *pnLeaf==1 &&
151b0 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
151c0 72 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b  r[0].buf.n==0 ){
151d0 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 30  .    *pnLeaf = 0
151e0 3b 0a 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20  ;.    *pnHeight 
151f0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
15200 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
15210 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
15220 3b 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  ;.    if( pWrite
15230 72 2d 3e 6e 57 72 69 74 65 72 3d 3d 31 20 26 26  r->nWriter==1 &&
15240 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
15250 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58  >=FTS5_MIN_DLIDX
15260 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 66  _SIZE ){.      f
15270 74 73 35 57 72 69 74 65 42 74 72 65 65 47 72 6f  ts5WriteBtreeGro
15280 77 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  w(p, pWriter);. 
15290 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 57 72     }.    if( pWr
152a0 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 3e 31 20  iter->nWriter>1 
152b0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
152c0 74 65 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c  teBtreeNEmpty(p,
152d0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d   pWriter);.    }
152e0 0a 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d  .    *pnHeight =
152f0 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65   pWriter->nWrite
15300 72 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  r;..    for(i=1;
15310 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72 69   i<pWriter->nWri
15320 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ter; i++){.     
15330 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
15340 2a 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d  *pPg = &pWriter-
15350 3e 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20  >aWriter[i];.   
15360 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
15370 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46  (p, .          F
15380 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
15390 44 28 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c  D(pWriter->iIdx,
153a0 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
153b0 2c 20 69 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 2c  , i, pPg->pgno),
153c0 20 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d   .          pPg-
153d0 3e 62 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66  >buf.p, pPg->buf
153e0 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .n.      );.    
153f0 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  }.  }.  for(i=0;
15400 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 57 72 69   i<pWriter->nWri
15410 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  ter; i++){.    F
15420 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
15430 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  Pg = &pWriter->a
15440 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20 66  Writer[i];.    f
15450 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
15460 50 67 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 66  Pg->term);.    f
15470 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
15480 50 67 2d 3e 62 75 66 29 3b 0a 20 20 7d 0a 20 20  Pg->buf);.  }.  
15490 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
154a0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 29 3b 0a  iter->aWriter);.
154b0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
154c0 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72  ferFree(&pWriter
154d0 2d 3e 64 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61  ->dlidx);.}..sta
154e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
154f0 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  teInit(.  Fts5In
15500 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
15510 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
15520 72 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20  r, .  int iIdx, 
15530 69 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20  int iSegid.){.  
15540 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
15550 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
15560 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72  gWriter));.  pWr
15570 69 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49 64  iter->iIdx = iId
15580 78 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53  x;.  pWriter->iS
15590 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a  egid = iSegid;..
155a0 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74    pWriter->aWrit
155b0 65 72 20 3d 20 28 46 74 73 35 50 61 67 65 57 72  er = (Fts5PageWr
155c0 69 74 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c  iter*)fts5IdxMal
155d0 6c 6f 63 28 70 2c 73 69 7a 65 6f 66 28 46 74 73  loc(p,sizeof(Fts
155e0 35 50 61 67 65 57 72 69 74 65 72 29 29 3b 0a 20  5PageWriter));. 
155f0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 61 57   if( pWriter->aW
15600 72 69 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72  riter==0 ) retur
15610 6e 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57  n;.  pWriter->nW
15620 72 69 74 65 72 20 3d 20 31 3b 0a 20 20 70 57 72  riter = 1;.  pWr
15630 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
15640 2e 70 67 6e 6f 20 3d 20 31 3b 0a 7d 0a 0a 73 74  .pgno = 1;.}..st
15650 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
15660 69 74 65 49 6e 69 74 46 6f 72 41 70 70 65 6e 64  iteInitForAppend
15670 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15690 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
156a0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
156b0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
156c0 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
156d0 2f 2a 20 57 72 69 74 65 72 20 74 6f 20 69 6e 69  /* Writer to ini
156e0 74 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  tialize */.  int
156f0 20 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20   iIdx,          
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15710 49 6e 64 65 78 20 73 65 67 6d 65 6e 74 20 69 73  Index segment is
15720 20 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20   a part of */.  
15730 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
15740 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20  ment *pSeg      
15750 2f 2a 20 53 65 67 6d 65 6e 74 20 6f 62 6a 65 63  /* Segment objec
15760 74 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 2a  t to append to *
15770 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  /.){.  int nByte
15780 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74   = pSeg->nHeight
15790 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 50 61   * sizeof(Fts5Pa
157a0 67 65 57 72 69 74 65 72 29 3b 0a 20 20 6d 65 6d  geWriter);.  mem
157b0 73 65 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20  set(pWriter, 0, 
157c0 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72  sizeof(Fts5SegWr
157d0 69 74 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65  iter));.  pWrite
157e0 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
157f0 20 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69    pWriter->iSegi
15800 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64  d = pSeg->iSegid
15810 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72  ;.  pWriter->aWr
15820 69 74 65 72 20 3d 20 28 46 74 73 35 50 61 67 65  iter = (Fts5Page
15830 57 72 69 74 65 72 2a 29 66 74 73 35 49 64 78 4d  Writer*)fts5IdxM
15840 61 6c 6c 6f 63 28 70 2c 20 6e 42 79 74 65 29 3b  alloc(p, nByte);
15850 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69  .  pWriter->nWri
15860 74 65 72 20 3d 20 70 53 65 67 2d 3e 6e 48 65 69  ter = pSeg->nHei
15870 67 68 74 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  ght;..  if( p->r
15880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15890 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 31      int pgno = 1
158a0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
158b0 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65   pWriter->aWrite
158c0 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 53 65 67  r[0].pgno = pSeg
158d0 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20  ->pgnoLast+1;.  
158e0 20 20 66 6f 72 28 69 3d 70 53 65 67 2d 3e 6e 48    for(i=pSeg->nH
158f0 65 69 67 68 74 2d 31 3b 20 69 3e 30 3b 20 69 2d  eight-1; i>0; i-
15900 2d 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52  -){.      i64 iR
15910 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
15920 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65  ENT_ROWID(pWrite
15930 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72  r->iIdx, pWriter
15940 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 67 6e  ->iSegid, i, pgn
15950 6f 29 3b 0a 20 20 20 20 20 20 46 74 73 35 50 61  o);.      Fts5Pa
15960 67 65 57 72 69 74 65 72 20 2a 70 50 67 20 3d 20  geWriter *pPg = 
15970 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74 65  &pWriter->aWrite
15980 72 5b 69 5d 3b 0a 20 20 20 20 20 20 70 50 67 2d  r[i];.      pPg-
15990 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
159a0 20 20 20 20 66 74 73 35 44 61 74 61 42 75 66 66      fts5DataBuff
159b0 65 72 28 70 2c 20 26 70 50 67 2d 3e 62 75 66 2c  er(p, &pPg->buf,
159c0 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
159d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
159e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
159f0 46 74 73 35 4e 6f 64 65 49 74 65 72 20 73 73 3b  Fts5NodeIter ss;
15a00 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f 64  .        fts5Nod
15a10 65 49 74 65 72 49 6e 69 74 28 70 50 67 2d 3e 62  eIterInit(pPg->b
15a20 75 66 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e  uf.p, pPg->buf.n
15a30 2c 20 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20  , &ss);.        
15a40 77 68 69 6c 65 28 20 73 73 2e 61 44 61 74 61 20  while( ss.aData 
15a50 29 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65  ) fts5NodeIterNe
15a60 78 74 28 26 70 2d 3e 72 63 2c 20 26 73 73 29 3b  xt(&p->rc, &ss);
15a70 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
15a80 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
15a90 70 50 67 2d 3e 74 65 72 6d 2c 20 73 73 2e 74 65  pPg->term, ss.te
15aa0 72 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 29  rm.n, ss.term.p)
15ab0 3b 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d  ;.        pgno =
15ac0 20 73 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20   ss.iChild;.    
15ad0 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72      fts5NodeIter
15ae0 46 72 65 65 28 26 73 73 29 3b 0a 20 20 20 20 20  Free(&ss);.     
15af0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
15b00 20 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 3d 3d   pSeg->nHeight==
15b10 31 20 29 7b 0a 20 20 20 20 20 20 70 57 72 69 74  1 ){.      pWrit
15b20 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70 53 65  er->nEmpty = pSe
15b30 67 2d 3e 70 67 6e 6f 4c 61 73 74 2d 31 3b 0a 20  g->pgnoLast-1;. 
15b40 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15b50 20 28 70 67 6e 6f 2b 70 57 72 69 74 65 72 2d 3e   (pgno+pWriter->
15b60 6e 45 6d 70 74 79 29 3d 3d 70 53 65 67 2d 3e 70  nEmpty)==pSeg->p
15b70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 7d 0a 7d  gnoLast );.  }.}
15b80 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
15b90 20 70 49 74 65 72 20 77 61 73 20 75 73 65 64 20   pIter was used 
15ba0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
15bb0 67 68 20 74 68 65 20 69 6e 70 75 74 20 73 65 67  gh the input seg
15bc0 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a  ments of on an.*
15bd0 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * incremental me
15be0 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  rge operation. T
15bf0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15c00 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e  called if the in
15c10 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72  cremental.** mer
15c20 67 65 20 73 74 65 70 20 68 61 73 20 66 69 6e 69  ge step has fini
15c30 73 68 65 64 20 62 75 74 20 74 68 65 20 69 6e 70  shed but the inp
15c40 75 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ut has not been 
15c50 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75  completely exhau
15c60 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
15c70 76 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65 67  void fts5TrimSeg
15c80 6d 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20  ments(Fts5Index 
15c90 2a 70 2c 20 46 74 73 35 4d 75 6c 74 69 53 65 67  *p, Fts5MultiSeg
15ca0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
15cb0 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42 75 66  int i;.  Fts5Buf
15cc0 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65  fer buf;.  memse
15cd0 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f  t(&buf, 0, sizeo
15ce0 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
15cf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
15d00 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  er->nSeg; i++){.
15d10 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
15d20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
15d30 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28  aSeg[i];.    if(
15d40 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29   pSeg->pSeg==0 )
15d50 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  {.      /* no-op
15d60 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
15d70 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
15d80 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   ){.      pSeg->
15d90 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
15da0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   0;.      pSeg->
15db0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
15dc0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
15dd0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
15de0 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
15df0 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f  Offset;     /* O
15e00 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72  ffset on new fir
15e10 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  st leaf page */.
15e20 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52        i64 iLeafR
15e30 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35  owid;.      Fts5
15e40 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
15e50 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65     int iId = pSe
15e60 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  g->pSeg->iSegid;
15e70 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34  .      u8 aHdr[4
15e80 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c  ] = {0x00, 0x00,
15e90 20 30 78 30 30 2c 20 30 78 30 34 7d 3b 0a 0a 20   0x00, 0x04};.. 
15ea0 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20       iLeafRowid 
15eb0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
15ec0 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c  OWID(pSeg->iIdx,
15ed0 20 69 49 64 2c 20 30 2c 20 70 53 65 67 2d 3e 69   iId, 0, pSeg->i
15ee0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  TermLeafPgno);. 
15ef0 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73       pData = fts
15f00 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c 65  5DataRead(p, iLe
15f10 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  afRowid);.      
15f20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
15f30 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
15f40 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20  ero(&buf);.     
15f50 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
15f60 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
15f70 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48 64  &buf, sizeof(aHd
15f80 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20 20  r), aHdr);.     
15f90 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
15fa0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
15fb0 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
15fc0 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66  rm.n);.        f
15fd0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
15fe0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
15ff0 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20  , pSeg->term.n, 
16000 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20  pSeg->term.p);. 
16010 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
16020 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
16030 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
16040 3e 6e 20 2d 20 69 4f 66 66 2c 20 26 70 44 61 74  >n - iOff, &pDat
16050 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  a->p[iOff]);.   
16060 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
16070 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
16080 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
16090 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 70 53 65  >pgnoFirst = pSe
160a0 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
160b0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
160c0 74 61 44 65 6c 65 74 65 28 70 2c 20 46 54 53 35  taDelete(p, FTS5
160d0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
160e0 53 65 67 2d 3e 69 49 64 78 2c 20 69 49 64 2c 20  Seg->iIdx, iId, 
160f0 30 2c 20 31 29 2c 69 4c 65 61 66 52 6f 77 69 64  0, 1),iLeafRowid
16100 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
16110 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61  ataWrite(p, iLea
16120 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62  fRowid, buf.p, b
16130 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uf.n);.      }. 
16140 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42     }.  }.  fts5B
16150 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
16160 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61  .}../*.**.*/.sta
16170 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
16180 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20  exMergeLevel(.  
16190 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
161c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
161d0 69 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20  iIdx,           
161e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
161f0 6e 64 65 78 20 74 6f 20 77 6f 72 6b 20 6f 6e 20  ndex to work on 
16200 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
16210 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
16220 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
16230 53 74 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  Stucture of inde
16240 78 20 69 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  x iIdx */.  int 
16250 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iLvl,           
16260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
16270 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70  evel to read inp
16280 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ut from */.  int
16290 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20   *pnRem         
162a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
162b0 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69 73  Write up to this
162c0 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61   many output lea
162d0 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ves */.){.  Fts5
162e0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
162f0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
16300 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
16310 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
16320 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
16330 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63  vl];.  Fts5Struc
16340 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f  tureLevel *pLvlO
16350 75 74 3b 0a 20 20 46 74 73 35 4d 75 6c 74 69 53  ut;.  Fts5MultiS
16360 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  egIter *pIter = 
16370 30 3b 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f  0;    /* Iterato
16380 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  r to read input 
16390 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  data */.  int nR
163a0 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e  em = pnRem ? *pn
163b0 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74  Rem : 0;  /* Out
163c0 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c  put leaf pages l
163d0 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
163e0 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20    int nInput;   
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16400 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
16410 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
16420 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
16430 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20   writer;        
16440 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
16450 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
16460 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
16470 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70  Seg;     /* Outp
16480 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
16490 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
164a0 0a 20 20 69 6e 74 20 62 52 65 71 75 69 72 65 44  .  int bRequireD
164b0 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 30 3b 20  oclistTerm = 0; 
164c0 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 65     /* Doclist te
164d0 72 6d 69 6e 61 74 6f 72 20 28 30 78 30 30 29 20  rminator (0x00) 
164e0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
164f0 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20 20  t bOldest;      
16500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16510 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   True if the out
16520 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20 74  put segment is t
16530 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 0a 20 20  he oldest */..  
16540 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53 74  assert( iLvl<pSt
16550 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a  ruct->nLevel );.
16560 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
16570 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53  nMerge<=pLvl->nS
16580 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  eg );..  memset(
16590 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  &writer, 0, size
165a0 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
165b0 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 65  ));.  memset(&te
165c0 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  rm, 0, sizeof(Ft
165d0 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 77 72  s5Buffer));.  wr
165e0 69 74 65 72 2e 69 49 64 78 20 3d 20 69 49 64 78  iter.iIdx = iIdx
165f0 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d  ;.  if( pLvl->nM
16600 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c  erge ){.    pLvl
16610 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Out = &pStruct->
16620 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a  aLevel[iLvl+1];.
16630 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
16640 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20  Out->nSeg>0 );. 
16650 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
16660 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 66 74  ->nMerge;.    ft
16670 73 35 57 72 69 74 65 49 6e 69 74 46 6f 72 41 70  s5WriteInitForAp
16680 70 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c  pend(p, &writer,
16690 20 69 49 64 78 2c 20 26 70 4c 76 6c 4f 75 74 2d   iIdx, &pLvlOut-
166a0 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
166b0 53 65 67 2d 31 5d 29 3b 0a 20 20 20 20 70 53 65  Seg-1]);.    pSe
166c0 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
166d0 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
166e0 2d 31 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1];.  }else{.  
166f0 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66    int iSegid = f
16700 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
16710 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20  (p, pStruct);.. 
16720 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65     /* Extend the
16730 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
16740 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72 65  bject as require
16750 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  d to ensure the 
16760 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65  output.    ** se
16770 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f  gment exists. */
16780 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70  .    if( iLvl==p
16790 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31  Struct->nLevel-1
167a0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
167b0 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28  ructureAddLevel(
167c0 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74  &p->rc, ppStruct
167d0 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
167e0 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
167f0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
16800 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
16810 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
16820 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b  , iLvl+1, 1, 0);
16830 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74  .    pLvl = &pSt
16840 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
16850 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20  l];.    pLvlOut 
16860 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
16870 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20  el[iLvl+1];..   
16880 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
16890 2c 20 26 77 72 69 74 65 72 2c 20 69 49 64 78 2c  , &writer, iIdx,
168a0 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f   iSegid);..    /
168b0 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73 65  * Add the new se
168c0 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75 74  gment to the out
168d0 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
168e0 20 69 66 28 20 69 4c 76 6c 2b 31 3d 3d 70 53 74   if( iLvl+1==pSt
168f0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 20 70  ruct->nLevel ) p
16900 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b  Struct->nLevel++
16910 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c  ;.    pSeg = &pL
16920 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
16930 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20  Out->nSeg];.    
16940 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b  pLvlOut->nSeg++;
16950 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46  .    pSeg->pgnoF
16960 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53  irst = 1;.    pS
16970 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  eg->iSegid = iSe
16980 67 69 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  gid;..    /* Rea
16990 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c  d input from all
169a0 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65   segments in the
169b0 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a   input level */.
169c0 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
169d0 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62  l->nSeg;.  }.  b
169e0 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75  Oldest = (pLvlOu
169f0 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53  t->nSeg==1 && pS
16a00 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69  truct->nLevel==i
16a10 4c 76 6c 2b 32 29 3b 0a 0a 23 69 66 20 30 0a 66  Lvl+2);..#if 0.f
16a20 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22  printf(stdout, "
16a30 6d 65 72 67 69 6e 67 20 25 64 20 73 65 67 6d 65  merging %d segme
16a40 6e 74 73 20 66 72 6f 6d 20 6c 65 76 65 6c 20 25  nts from level %
16a50 64 21 22 2c 20 6e 49 6e 70 75 74 2c 20 69 4c 76  d!", nInput, iLv
16a60 6c 29 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f 75  l);.fflush(stdou
16a70 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f  t);.#endif..  fo
16a80 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
16a90 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 69  ew(p, pStruct, i
16aa0 49 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c  Idx, 0, 0, 0, iL
16ab0 76 6c 2c 20 6e 49 6e 70 75 74 2c 20 26 70 49 74  vl, nInput, &pIt
16ac0 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  er);.      fts5M
16ad0 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
16ae0 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  Iter)==0;.      
16af0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
16b00 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
16b10 29 0a 20 20 29 7b 0a 20 20 20 20 46 74 73 35 53  ).  ){.    Fts5S
16b20 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
16b30 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
16b40 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b  er->aFirst[1] ];
16b50 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49 74  .    Fts5ChunkIt
16b60 65 72 20 73 50 6f 73 3b 20 20 20 20 20 20 20 20  er sPos;        
16b70 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
16b80 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 70 6f  erate through po
16b90 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a  sition list */..
16ba0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
16bb0 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74  gment being writ
16bc0 74 65 6e 20 69 73 20 74 68 65 20 6f 6c 64 65 73  ten is the oldes
16bd0 74 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  t in the entire 
16be0 69 6e 64 65 78 20 61 6e 64 0a 20 20 20 20 2a 2a  index and.    **
16bf0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
16c00 73 74 20 69 73 20 65 6d 70 74 79 20 28 69 2e 65  st is empty (i.e
16c10 2e 20 74 68 65 20 65 6e 74 72 79 20 69 73 20 61  . the entry is a
16c20 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 29 2c   delete marker),
16c30 20 6e 6f 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79   no.    ** entry
16c40 20 6e 65 65 64 20 62 65 20 77 72 69 74 74 65 6e   need be written
16c50 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20   to the output. 
16c60 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e   */.    fts5Chun
16c70 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  kIterInit(p, pSe
16c80 67 2c 20 26 73 50 6f 73 29 3b 0a 20 20 20 20 69  g, &sPos);.    i
16c90 66 28 20 62 4f 6c 64 65 73 74 3d 3d 30 20 7c 7c  f( bOldest==0 ||
16ca0 20 73 50 6f 73 2e 6e 52 65 6d 3e 30 20 29 7b 0a   sPos.nRem>0 ){.
16cb0 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b        int nTerm;
16cc0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20  .      const u8 
16cd0 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c  *pTerm = fts5Mul
16ce0 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
16cf0 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  , &nTerm);.     
16d00 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d   if( nTerm!=term
16d10 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65  .n || memcmp(pTe
16d20 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72  rm, term.p, nTer
16d30 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m) ){.        if
16d40 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65  ( pnRem && write
16d50 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e  r.nLeafWritten>n
16d60 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rem ){.         
16d70 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65   fts5ChunkIterRe
16d80 6c 65 61 73 65 28 26 73 50 6f 73 29 3b 0a 20 20  lease(&sPos);.  
16d90 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16da0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
16db0 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
16dc0 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20  ew term. Append 
16dd0 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75  a term to the ou
16de0 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f  tput segment. */
16df0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 52 65  .        if( bRe
16e00 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d  quireDoclistTerm
16e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
16e20 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72  s5WriteAppendZer
16e30 6f 62 79 74 65 28 70 2c 20 26 77 72 69 74 65 72  obyte(p, &writer
16e40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16e50 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
16e60 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
16e70 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  ter, nTerm, pTer
16e80 6d 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  m);.        fts5
16e90 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
16ea0 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , &term, nTerm, 
16eb0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
16ec0 62 52 65 71 75 69 72 65 44 6f 63 6c 69 73 74 54  bRequireDoclistT
16ed0 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  erm = 1;.      }
16ee0 0a 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  ..      /* Appen
16ef0 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74  d the rowid to t
16f00 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
16f10 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
16f20 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74  ndRowid(p, &writ
16f30 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65  er, fts5MultiIte
16f40 72 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b 0a  rRowid(pIter));.
16f50 0a 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  .      /* Copy t
16f60 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
16f70 20 66 72 6f 6d 20 69 6e 70 75 74 20 74 6f 20 6f   from input to o
16f80 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 66  utput */.      f
16f90 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
16fa0 73 6c 69 73 74 49 6e 74 28 70 2c 20 26 77 72 69  slistInt(p, &wri
16fb0 74 65 72 2c 20 73 50 6f 73 2e 6e 52 65 6d 29 3b  ter, sPos.nRem);
16fc0 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f  .      for(/* no
16fd0 6f 70 20 2a 2f 3b 20 21 66 74 73 35 43 68 75 6e  op */; !fts5Chun
16fe0 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50 6f  kIterEof(p, &sPo
16ff0 73 29 3b 20 66 74 73 35 43 68 75 6e 6b 49 74 65  s); fts5ChunkIte
17000 72 4e 65 78 74 28 70 2c 20 26 73 50 6f 73 29 29  rNext(p, &sPos))
17010 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72  {.        fts5Wr
17020 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
17030 44 61 74 61 28 70 2c 20 26 77 72 69 74 65 72 2c  Data(p, &writer,
17040 20 73 50 6f 73 2e 70 2c 20 73 50 6f 73 2e 6e 29   sPos.p, sPos.n)
17050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17060 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74  .    fts5ChunkIt
17070 65 72 52 65 6c 65 61 73 65 28 26 73 50 6f 73 29  erRelease(&sPos)
17080 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73  ;.  }..  /* Flus
17090 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20  h the last leaf 
170a0 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65  page to disk. Se
170b0 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  t the output seg
170c0 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67  ment b-tree heig
170d0 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74  ht.  ** and last
170e0 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
170f0 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  r at the same ti
17100 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72  me.  */.  fts5Wr
17110 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
17120 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65  iter, &pSeg->nHe
17130 69 67 68 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e  ight, &pSeg->pgn
17140 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66  oLast);..  if( f
17150 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
17160 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
17170 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20   int i;..    /* 
17180 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e  Remove the redun
17190 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72  dant segments fr
171a0 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
171b0 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ble */.    for(i
171c0 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b  =0; i<nInput; i+
171d0 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61  +){.      fts5Da
171e0 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28  taRemoveSegment(
171f0 70 2c 20 69 49 64 78 2c 20 70 4c 76 6c 2d 3e 61  p, iIdx, pLvl->a
17200 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a  Seg[i].iSegid);.
17210 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
17220 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
17230 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nt segments from
17240 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c   the input level
17250 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c   */.    if( pLvl
17260 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29  ->nSeg!=nInput )
17270 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76  {.      int nMov
17280 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20  e = (pLvl->nSeg 
17290 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65  - nInput) * size
172a0 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
172b0 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Segment);.      
172c0 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53  memmove(pLvl->aS
172d0 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  eg, &pLvl->aSeg[
172e0 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b  nInput], nMove);
172f0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d  .    }.    pLvl-
17300 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b  >nSeg -= nInput;
17310 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  .    pLvl->nMerg
17320 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
17330 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30  Seg->pgnoLast==0
17340 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75   ){.      pLvlOu
17350 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 7d  t->nSeg--;.    }
17360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
17370 73 65 72 74 28 20 70 53 65 67 2d 3e 6e 48 65 69  sert( pSeg->nHei
17380 67 68 74 3e 30 20 26 26 20 70 53 65 67 2d 3e 70  ght>0 && pSeg->p
17390 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20  gnoLast>0 );.   
173a0 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
173b0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
173c0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
173d0 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66  nInput;.  }..  f
173e0 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
173f0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74  (p, pIter);.  ft
17400 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
17410 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
17420 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
17430 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
17440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f 74  ;.}../*.** A tot
17450 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61 66  al of nLeaf leaf
17460 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20 68   pages of data h
17470 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c 75  as just been flu
17480 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c 2d  shed to a level-
17490 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 69 6e  0.** segments in
174a0 20 69 6e 64 65 78 20 69 49 64 78 20 77 69 74 68   index iIdx with
174b0 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
174c0 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ct. This functio
174d0 6e 20 75 70 64 61 74 65 73 20 74 68 65 0a 2a 2a  n updates the.**
174e0 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61   write-counter a
174f0 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20  ccordingly and, 
17500 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 70 65  if necessary, pe
17510 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74  rforms increment
17520 61 6c 20 6d 65 72 67 65 0a 2a 2a 20 77 6f 72 6b  al merge.** work
17530 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
17540 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
17550 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
17560 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
17570 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
17580 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
17590 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
175a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
175b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
175c0 49 6e 64 65 78 57 6f 72 6b 28 0a 20 20 46 74 73  IndexWork(.  Fts
175d0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
175e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
175f0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
17600 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ect */.  int iId
17610 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
17620 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17630 78 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a  x to work on */.
17640 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
17650 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
17660 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
17670 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
17680 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
17690 20 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20   nLeaf          
176a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
176b0 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  Number of output
176c0 20 6c 65 61 76 65 73 20 6a 75 73 74 20 77 72 69   leaves just wri
176d0 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  tten */.){.  Fts
176e0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
176f0 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
17700 0a 20 20 69 36 34 20 6e 57 72 69 74 65 3b 20 20  .  i64 nWrite;  
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
17730 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75  lue of write-cou
17740 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 57  nter */.  int nW
17750 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ork;            
17760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17770 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e  ber of work-quan
17780 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f  ta to perform */
17790 0a 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20  .  int nRem;    
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
177c0 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20  leaf pages left 
177d0 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 2f  to write */..  /
177e0 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69  * Update the wri
177f0 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c  te-counter. Whil
17800 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20  e doing so, set 
17810 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 6e 57 72 69  nWork. */.  nWri
17820 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  te = pStruct->nW
17830 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 6e  riteCounter;.  n
17840 57 6f 72 6b 20 3d 20 28 28 6e 57 72 69 74 65 20  Work = ((nWrite 
17850 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57  + nLeaf) / p->nW
17860 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69  orkUnit) - (nWri
17870 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  te / p->nWorkUni
17880 74 29 3b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e  t);.  pStruct->n
17890 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20  WriteCounter += 
178a0 6e 4c 65 61 66 3b 0a 20 20 6e 52 65 6d 20 3d 20  nLeaf;.  nRem = 
178b0 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e  p->nWorkUnit * n
178c0 57 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e  Work * pStruct->
178d0 6e 4c 65 76 65 6c 3b 0a 0a 20 20 77 68 69 6c 65  nLevel;..  while
178e0 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
178f0 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
17900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17910 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
17920 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20  h levels */.    
17930 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30  int iBestLvl = 0
17940 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
17950 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68  evel offering th
17960 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67  e most input seg
17970 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
17980 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20   nBest = 0;     
17990 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
179a0 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
179b0 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76  ents on best lev
179c0 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  el */..    /* Se
179d0 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68  t iBestLvl to th
179e0 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  e level to read 
179f0 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66  input segments f
17a00 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  rom. */.    asse
17a10 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  rt( pStruct->nLe
17a20 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72  vel>0 );.    for
17a30 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
17a40 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
17a50 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
17a60 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
17a70 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
17a80 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
17a90 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
17aa0 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  >nMerge ){.     
17ab0 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
17ac0 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  rge>nBest ){.   
17ad0 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20         iBestLvl 
17ae0 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20  = iLvl;.        
17af0 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e    nBest = pLvl->
17b00 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20  nMerge;.        
17b10 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
17b20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17b30 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42  f( pLvl->nSeg>nB
17b40 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  est ){.        n
17b50 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  Best = pLvl->nSe
17b60 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74  g;.        iBest
17b70 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
17b80 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
17b90 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74  * If nBest is st
17ba0 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20  ill 0, then the 
17bb0 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d  index must be em
17bc0 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  pty. */.#ifdef S
17bd0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
17be0 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73  for(iLvl=0; nBes
17bf0 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74  t==0 && iLvl<pSt
17c00 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
17c10 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  vl++){.      ass
17c20 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c  ert( pStruct->aL
17c30 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d  evel[iLvl].nSeg=
17c40 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  =0 );.    }.#end
17c50 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73  if..    if( nBes
17c60 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  t<p->pConfig->nA
17c70 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20 26  utomerge .     &
17c80 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  & pStruct->aLeve
17c90 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72  l[iBestLvl].nMer
17ca0 67 65 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  ge==0 .    ){.  
17cb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17cc0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65  .    fts5IndexMe
17cd0 72 67 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78  rgeLevel(p, iIdx
17ce0 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73  , &pStruct, iBes
17cf0 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  tLvl, &nRem);.  
17d00 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50    fts5StructureP
17d10 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73 74 4c  romote(p, iBestL
17d20 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a  vl+1, pStruct);.
17d30 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 6d      assert( nRem
17d40 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  ==0 || p->rc==SQ
17d50 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 2a  LITE_OK );.    *
17d60 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
17d70 63 74 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  ct;.  }.}..stati
17d80 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
17d90 43 72 69 73 69 73 4d 65 72 67 65 28 0a 20 20 46  CrisisMerge(.  F
17da0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
17db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17dc0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
17dd0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
17de0 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
17df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17e00 64 65 78 20 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a  dex to work on *
17e10 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
17e20 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20  e **ppStruct    
17e30 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
17e40 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65  urrent structure
17e50 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a   of index */.){.
17e60 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
17e70 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
17e80 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c  ruct;.  int iLvl
17e90 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
17ea0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
17eb0 0a 20 20 20 20 20 20 26 26 20 69 4c 76 6c 3c 70  .      && iLvl<p
17ec0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 0a 20  Struct->nLevel. 
17ed0 20 20 20 20 20 26 26 20 70 53 74 72 75 63 74 2d       && pStruct-
17ee0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
17ef0 65 67 3e 3d 70 2d 3e 6e 43 72 69 73 69 73 4d 65  eg>=p->nCrisisMe
17f00 72 67 65 20 0a 20 20 29 7b 0a 20 20 20 20 66 74  rge .  ){.    ft
17f10 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
17f20 6c 28 70 2c 20 69 49 64 78 2c 20 26 70 53 74 72  l(p, iIdx, &pStr
17f30 75 63 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20  uct, iLvl, 0);. 
17f40 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
17f50 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b  Promote(p, iLvl+
17f60 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20  1, pStruct);.   
17f70 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a   iLvl++;.  }.  *
17f80 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
17f90 63 74 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73  ct;.}..typedef s
17fa0 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
17fb0 74 78 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b  tx Fts5FlushCtx;
17fc0 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73  .struct Fts5Flus
17fd0 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64  hCtx {.  Fts5Ind
17fe0 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35  ex *pIdx;.  Fts5
17ff0 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72  SegWriter writer
18000 3b 20 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  ; .};..static in
18010 74 20 66 74 73 35 46 6c 75 73 68 4e 65 77 54 65  t fts5FlushNewTe
18020 72 6d 28 76 6f 69 64 20 2a 70 43 74 78 2c 20 63  rm(void *pCtx, c
18030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
18040 2c 20 69 6e 74 20 6e 54 65 72 6d 29 7b 0a 20 20  , int nTerm){.  
18050 46 74 73 35 46 6c 75 73 68 43 74 78 20 2a 70 20  Fts5FlushCtx *p 
18060 3d 20 28 46 74 73 35 46 6c 75 73 68 43 74 78 2a  = (Fts5FlushCtx*
18070 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 72 63 20  )pCtx;.  int rc 
18080 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  = SQLITE_OK;.  f
18090 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65  ts5WriteAppendTe
180a0 72 6d 28 70 2d 3e 70 49 64 78 2c 20 26 70 2d 3e  rm(p->pIdx, &p->
180b0 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 28  writer, nTerm, (
180c0 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29  const u8*)zTerm)
180d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
180e0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
180f0 35 46 6c 75 73 68 54 65 72 6d 44 6f 6e 65 28 76  5FlushTermDone(v
18100 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20 46 74  oid *pCtx){.  Ft
18110 73 35 46 6c 75 73 68 43 74 78 20 2a 70 20 3d 20  s5FlushCtx *p = 
18120 28 46 74 73 35 46 6c 75 73 68 43 74 78 2a 29 70  (Fts5FlushCtx*)p
18130 43 74 78 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Ctx;.  int rc = 
18140 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 2f 2a 20  SQLITE_OK;.  /* 
18150 57 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73  Write the doclis
18160 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a  t terminator */.
18170 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
18180 64 5a 65 72 6f 62 79 74 65 28 70 2d 3e 70 49 64  dZerobyte(p->pId
18190 78 2c 20 26 70 2d 3e 77 72 69 74 65 72 29 3b 0a  x, &p->writer);.
181a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
181b0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 46  static int fts5F
181c0 6c 75 73 68 4e 65 77 45 6e 74 72 79 28 0a 20 20  lushNewEntry(.  
181d0 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69  void *pCtx, .  i
181e0 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 63 6f  64 iRowid, .  co
181f0 6e 73 74 20 75 38 20 2a 61 50 6f 73 6c 69 73 74  nst u8 *aPoslist
18200 2c 20 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73  , .  int nPoslis
18210 74 0a 29 7b 0a 20 20 46 74 73 35 46 6c 75 73 68  t.){.  Fts5Flush
18220 43 74 78 20 2a 70 20 3d 20 28 46 74 73 35 46 6c  Ctx *p = (Fts5Fl
18230 75 73 68 43 74 78 2a 29 70 43 74 78 3b 0a 20 20  ushCtx*)pCtx;.  
18240 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18250 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64  OK;..  /* Append
18260 20 74 68 65 20 72 6f 77 69 64 20 69 74 73 65 6c   the rowid itsel
18270 66 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65  f */.  fts5Write
18280 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2d 3e 70  AppendRowid(p->p
18290 49 64 78 2c 20 26 70 2d 3e 77 72 69 74 65 72 2c  Idx, &p->writer,
182a0 20 69 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20   iRowid);..  /* 
182b0 41 70 70 65 6e 64 20 74 68 65 20 73 69 7a 65 20  Append the size 
182c0 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
182d0 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
182e0 0a 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65  .  fts5WriteAppe
182f0 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 70 2d 3e  ndPoslistInt(p->
18300 70 49 64 78 2c 20 26 70 2d 3e 77 72 69 74 65 72  pIdx, &p->writer
18310 2c 20 6e 50 6f 73 6c 69 73 74 29 3b 0a 0a 20 20  , nPoslist);..  
18320 2f 2a 20 41 6e 64 20 74 68 65 20 70 6f 73 6c 69  /* And the posli
18330 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 66 74 73  st data */.  fts
18340 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
18350 69 73 74 44 61 74 61 28 70 2d 3e 70 49 64 78 2c  istData(p->pIdx,
18360 20 26 70 2d 3e 77 72 69 74 65 72 2c 20 61 50 6f   &p->writer, aPo
18370 73 6c 69 73 74 2c 20 6e 50 6f 73 6c 69 73 74 29  slist, nPoslist)
18380 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18390 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68  ../*.** Flush th
183a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  e contents of in
183b0 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
183c0 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65  le iHash to a ne
183d0 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65  w level-0 .** se
183e0 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41  gment on disk. A
183f0 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63  lso update the c
18400 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72  orresponding str
18410 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a  ucture record..*
18420 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
18430 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
18440 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
18450 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
18460 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
18470 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
18480 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
18490 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
184a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75  tic void fts5Flu
184b0 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e  shOneHash(Fts5In
184c0 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 48 61 73  dex *p, int iHas
184d0 68 2c 20 69 6e 74 20 2a 70 6e 4c 65 61 66 29 7b  h, int *pnLeaf){
184e0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
184f0 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74   *pStruct;.  int
18500 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70   iSegid;.  int p
18510 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20  gnoLast = 0;    
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18530 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
18540 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
18550 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
18560 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18570 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
18580 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ure and allocate
18590 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69   a new segment-i
185a0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  d.  ** for the n
185b0 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65  ew level-0 segme
185c0 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63  nt.  */.  pStruc
185d0 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
185e0 65 52 65 61 64 28 70 2c 20 69 48 61 73 68 29 3b  eRead(p, iHash);
185f0 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74 73 35  .  iSegid = fts5
18600 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c  AllocateSegid(p,
18610 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69 66   pStruct);..  if
18620 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20  ( iSegid ){.    
18630 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
18640 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
18650 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74   New segment wit
18660 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20  hin pStruct */. 
18670 20 20 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20     int nHeight; 
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 6e 65   /* Height of ne
186a0 77 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  w segment b-tree
186b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
186c0 20 20 20 20 46 74 73 35 46 6c 75 73 68 43 74 78      Fts5FlushCtx
186d0 20 63 74 78 3b 0a 0a 20 20 20 20 66 74 73 35 57   ctx;..    fts5W
186e0 72 69 74 65 49 6e 69 74 28 70 2c 20 26 63 74 78  riteInit(p, &ctx
186f0 2e 77 72 69 74 65 72 2c 20 69 48 61 73 68 2c 20  .writer, iHash, 
18700 69 53 65 67 69 64 29 3b 0a 20 20 20 20 63 74 78  iSegid);.    ctx
18710 2e 70 49 64 78 20 3d 20 70 3b 0a 0a 20 20 20 20  .pIdx = p;..    
18720 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
18730 48 61 73 68 49 74 65 72 61 74 65 28 20 70 2d 3e  HashIterate( p->
18740 61 70 48 61 73 68 5b 69 48 61 73 68 5d 2c 20 28  apHash[iHash], (
18750 76 6f 69 64 2a 29 26 63 74 78 2c 20 0a 20 20 20  void*)&ctx, .   
18760 20 20 20 20 20 66 74 73 35 46 6c 75 73 68 4e 65       fts5FlushNe
18770 77 54 65 72 6d 2c 20 66 74 73 35 46 6c 75 73 68  wTerm, fts5Flush
18780 4e 65 77 45 6e 74 72 79 2c 20 66 74 73 35 46 6c  NewEntry, fts5Fl
18790 75 73 68 54 65 72 6d 44 6f 6e 65 0a 20 20 20 20  ushTermDone.    
187a0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
187b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  ==SQLITE_OK ) p-
187c0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 66 74  >rc = rc;.    ft
187d0 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
187e0 20 26 63 74 78 2e 77 72 69 74 65 72 2c 20 26 6e   &ctx.writer, &n
187f0 48 65 69 67 68 74 2c 20 26 70 67 6e 6f 4c 61 73  Height, &pgnoLas
18800 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  t);..    /* Upda
18810 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75 63  te the Fts5Struc
18820 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69 74  ture. It is writ
18830 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
18840 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 0a  database by the.
18850 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63      ** fts5Struc
18860 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63 61  tureRelease() ca
18870 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ll below.  */.  
18880 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e    if( pStruct->n
18890 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Level==0 ){.    
188a0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41    fts5StructureA
188b0 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ddLevel(&p->rc, 
188c0 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d  &pStruct);.    }
188d0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
188e0 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
188f0 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30  ->rc, pStruct, 0
18900 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
18910 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18920 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20  K ){.      pSeg 
18930 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
18940 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72  el[0].aSeg[ pStr
18950 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e  uct->aLevel[0].n
18960 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70  Seg++ ];.      p
18970 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
18980 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67  egid;.      pSeg
18990 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
189a0 67 68 74 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  ght;.      pSeg-
189b0 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a  >pgnoFirst = 1;.
189c0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
189d0 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b  Last = pgnoLast;
189e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
189f0 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  ( p->pConfig->nA
18a00 75 74 6f 6d 65 72 67 65 3e 30 20 29 20 66 74 73  utomerge>0 ) fts
18a10 35 49 6e 64 65 78 57 6f 72 6b 28 70 2c 20 69 48  5IndexWork(p, iH
18a20 61 73 68 2c 20 26 70 53 74 72 75 63 74 2c 20 70  ash, &pStruct, p
18a30 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35  gnoLast);.  fts5
18a40 49 6e 64 65 78 43 72 69 73 69 73 4d 65 72 67 65  IndexCrisisMerge
18a50 28 70 2c 20 69 48 61 73 68 2c 20 26 70 53 74 72  (p, iHash, &pStr
18a60 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
18a70 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 69 48  ctureWrite(p, iH
18a80 61 73 68 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  ash, pStruct);. 
18a90 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
18aa0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
18ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
18ac0 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  ny data stored i
18ad0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
18ae0 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74  hash tables to t
18af0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
18b00 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
18b10 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35 49  IndexFlush(Fts5I
18b20 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
18b30 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
18b40 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
18b50 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b70 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
18b80 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
18b90 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  es */.  int nLea
18ba0 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
18bb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
18bc0 72 20 6f 66 20 6c 65 61 76 65 73 20 77 72 69 74  r of leaves writ
18bd0 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ten */..  /* If 
18be0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
18bf0 65 61 64 79 20 6f 63 63 75 72 65 64 20 74 68 69  eady occured thi
18c00 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
18c10 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  p. */.  if( p->r
18c20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
18c30 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
18c40 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
18c50 73 73 65 72 74 28 20 70 2d 3e 61 70 48 61 73 68  ssert( p->apHash
18c60 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20   );..  /* Flush 
18c70 74 68 65 20 74 65 72 6d 73 20 61 6e 64 20 65 61  the terms and ea
18c80 63 68 20 70 72 65 66 69 78 20 69 6e 64 65 78 20  ch prefix index 
18c90 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 66 6f 72  to disk */.  for
18ca0 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67  (i=0; i<=pConfig
18cb0 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b  ->nPrefix; i++){
18cc0 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e  .    fts5FlushOn
18cd0 65 48 61 73 68 28 70 2c 20 69 2c 20 26 6e 4c 65  eHash(p, i, &nLe
18ce0 61 66 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50  af);.  }.  p->nP
18cf0 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
18d00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18d10 61 20 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75  a simple checksu
18d20 6d 20 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e  m value based on
18d30 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a   the arguments..
18d40 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66 74  */.static u64 ft
18d50 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
18d60 6d 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  m(.  i64 iRowid,
18d70 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20   .  int iCol, . 
18d80 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20 63 6f   int iPos, .  co
18d90 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c  nst char *pTerm,
18da0 20 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b   .  int nTerm.){
18db0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20  .  int i;.  u64 
18dc0 72 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  ret = iRowid;.  
18dd0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
18de0 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d  + iCol;.  ret +=
18df0 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73   (ret<<3) + iPos
18e00 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
18e10 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b  Term; i++) ret +
18e20 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 70 54 65  = (ret<<3) + pTe
18e30 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20  rm[i];.  return 
18e40 72 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ret;.}..static v
18e50 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65  oid fts5BtreeIte
18e60 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
18e70 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 49  ex *p, .  int iI
18e80 64 78 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  dx,.  Fts5Struct
18e90 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
18ea0 2c 20 0a 20 20 46 74 73 35 42 74 72 65 65 49 74  , .  Fts5BtreeIt
18eb0 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69  er *pIter.){.  i
18ec0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
18ed0 69 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  i;.  nByte = siz
18ee0 65 6f 66 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  eof(pIter->aLvl[
18ef0 30 5d 29 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65  0]) * (pSeg->nHe
18f00 69 67 68 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65  ight-1);.  memse
18f10 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
18f20 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
18f30 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65  Iter->nLvl = pSe
18f40 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 0a 20 20  g->nHeight-1;.  
18f50 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49  pIter->iIdx = iI
18f60 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d  dx;.  pIter->p =
18f70 20 70 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65   p;.  pIter->pSe
18f80 67 20 3d 20 70 53 65 67 3b 0a 20 20 69 66 28 20  g = pSeg;.  if( 
18f90 6e 42 79 74 65 20 26 26 20 70 2d 3e 72 63 3d 3d  nByte && p->rc==
18fa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18fb0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 20 3d 20 28   pIter->aLvl = (
18fc0 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
18fd0 65 6c 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  el*)fts5IdxMallo
18fe0 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  c(p, nByte);.  }
18ff0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
19000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19010 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
19020 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  ++){.    i64 iRo
19030 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
19040 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70  NT_ROWID(iIdx, p
19050 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 2b 31  Seg->iSegid, i+1
19060 2c 20 31 29 3b 0a 20 20 20 20 46 74 73 35 44 61  , 1);.    Fts5Da
19070 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  ta *pData;.    p
19080 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44  Iter->aLvl[i].pD
19090 61 74 61 20 3d 20 70 44 61 74 61 20 3d 20 66 74  ata = pData = ft
190a0 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
190b0 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70  owid);.    if( p
190c0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74  Data ){.      ft
190d0 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
190e0 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
190f0 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  n, &pIter->aLvl[
19100 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  i].s);.    }.  }
19110 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e  ..  if( pIter->n
19120 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20  Lvl==0 || p->rc 
19130 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45  ){.    pIter->bE
19140 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 74 65  of = 1;.    pIte
19150 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53 65 67 2d  r->iLeaf = pSeg-
19160 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c  >pgnoLast;.  }el
19170 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e  se{.    pIter->n
19180 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61  Empty = pIter->a
19190 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b  Lvl[0].s.nEmpty;
191a0 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
191b0 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
191c0 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20  0].s.iChild;.   
191d0 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d   pIter->bDlidx =
191e0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
191f0 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a  s.bDlidx;.  }.}.
19200 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
19210 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28 46  5BtreeIterNext(F
19220 74 73 35 42 74 72 65 65 49 74 65 72 20 2a 70 49  ts5BtreeIter *pI
19230 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  ter){.  Fts5Inde
19240 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 3b  x *p = pIter->p;
19250 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
19260 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f 66  ert( pIter->bEof
19270 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 61 4c  ==0 && pIter->aL
19280 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61 20 29 3b  vl[0].s.aData );
19290 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
192a0 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e  ter->nLvl && p->
192b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
192c0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74 72  ++){.    Fts5Btr
192d0 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76  eeIterLevel *pLv
192e0 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
192f0 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64  [i];.    fts5Nod
19300 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
19310 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20  , &pLvl->s);.   
19320 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e 61 44 61   if( pLvl->s.aDa
19330 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ta ){.      fts5
19340 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
19350 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
19360 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20  pLvl->s.term.n, 
19370 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b  pLvl->s.term.p);
19380 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19390 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
193a0 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
193b0 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20  &pLvl->s);.     
193c0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
193d0 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
193e0 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
193f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
19400 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e    if( i==pIter->
19410 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63 20 29 7b  nLvl || p->rc ){
19420 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
19430 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
19440 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
19450 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
19460 67 69 64 3b 0a 20 20 20 20 66 6f 72 28 69 2d 2d  gid;.    for(i--
19470 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
19480 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74 65      Fts5BtreeIte
19490 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  rLevel *pLvl = &
194a0 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  pIter->aLvl[i];.
194b0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
194c0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
194d0 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 49 64  ROWID(pIter->iId
194e0 78 2c 69 53 65 67 69 64 2c 69 2b 31 2c 70 4c 76  x,iSegid,i+1,pLv
194f0 6c 5b 31 5d 2e 73 2e 69 43 68 69 6c 64 29 3b 0a  l[1].s.iChild);.
19500 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
19510 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
19520 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  (p, iRowid);.   
19530 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61     if( pLvl->pDa
19540 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ta ){.        ft
19550 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
19560 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 2c 20 70  Lvl->pData->p, p
19570 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 6e 2c 20 26  Lvl->pData->n, &
19580 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20  pLvl->s);.      
19590 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
195a0 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70  Iter->nEmpty = p
195b0 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
195c0 6e 45 6d 70 74 79 3b 0a 20 20 70 49 74 65 72 2d  nEmpty;.  pIter-
195d0 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
195e0 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64  >aLvl[0].s.bDlid
195f0 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  x;.  pIter->iLea
19600 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
19610 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 61  0].s.iChild;.  a
19620 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
19630 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
19640 2d 3e 62 45 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61  ->bEof );.}..sta
19650 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72  tic void fts5Btr
19660 65 65 49 74 65 72 46 72 65 65 28 46 74 73 35 42  eeIterFree(Fts5B
19670 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29  treeIter *pIter)
19680 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
19690 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
196a0 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Lvl; i++){.    F
196b0 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
196c0 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
196d0 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66  ->aLvl[i];.    f
196e0 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
196f0 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69  &pLvl->s);.    i
19700 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
19710 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
19720 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44  Release(pLvl->pD
19730 61 74 61 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  ata);.      pLvl
19740 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->pData = 0;.   
19750 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
19760 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 4c 76  _free(pIter->aLv
19770 6c 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  l);.  fts5Buffer
19780 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72  Free(&pIter->ter
19790 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  m);.}../*.** Thi
197a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75  s function is pu
197b0 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
197c0 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
197d0 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
197e0 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
197f0 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
19800 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
19810 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
19820 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  .**.** Instead, 
19830 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74 68  it tests that th
19840 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67  e same set of pg
19850 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61  no/rowid combina
19860 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69  tions are .** vi
19870 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73 73  sited regardless
19880 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
19890 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64  doclist-index id
198a0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
198b0 6d 65 74 65 72 73 0a 2a 2a 20 69 49 64 78 2f 69  meters.** iIdx/i
198c0 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73 20 69  Segid/iLeaf is i
198d0 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72 77 61  terated in forwa
198e0 72 64 73 20 6f 72 20 72 65 76 65 72 73 65 20 6f  rds or reverse o
198f0 72 64 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rder..*/.#ifdef 
19900 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
19910 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
19920 64 78 49 74 65 72 54 65 73 74 52 65 76 65 72 73  dxIterTestRevers
19930 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
19940 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20  p, .  int iIdx, 
19950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19960 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
19970 6f 20 6c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69  o load doclist-i
19980 6e 64 65 78 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ndex from */.  i
19990 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20  nt iSegid,      
199a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
199b0 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20  * Segment id to 
199c0 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  load from */.  i
199d0 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20 20 20  nt iLeaf        
199e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
199f0 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69  * Load doclist-i
19a00 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65  ndex for this le
19a10 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  af */.){.  Fts5D
19a20 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
19a30 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 6b 73 75   = 0;.  i64 cksu
19a40 6d 31 20 3d 20 31 33 3b 0a 20 20 69 36 34 20 63  m1 = 13;.  i64 c
19a50 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66  ksum2 = 13;..  f
19a60 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
19a70 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
19a80 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 2c 20   iSegid, iLeaf, 
19a90 26 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  &pDlidx);.      
19aa0 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
19ab0 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
19ac0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
19ad0 74 65 72 4e 65 78 74 28 70 44 6c 69 64 78 29 0a  terNext(pDlidx).
19ae0 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
19af0 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67   pDlidx->iLeafPg
19b00 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  no>iLeaf );.    
19b10 63 6b 73 75 6d 31 20 3d 20 28 63 6b 73 75 6d 31  cksum1 = (cksum1
19b20 20 5e 20 28 20 28 69 36 34 29 28 70 44 6c 69 64   ^ ( (i64)(pDlid
19b30 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c  x->iLeafPgno) <<
19b40 20 33 32 20 29 29 3b 0a 20 20 20 20 63 6b 73 75   32 ));.    cksu
19b50 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 70  m1 = (cksum1 ^ p
19b60 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a  Dlidx->iRowid);.
19b70 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49    }.  fts5DlidxI
19b80 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
19b90 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a  .  pDlidx = 0;..
19ba0 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49    for(fts5DlidxI
19bb0 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 49  terInit(p, 1, iI
19bc0 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61  dx, iSegid, iLea
19bd0 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20  f, &pDlidx);.   
19be0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
19bf0 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
19c00 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  0;.      fts5Dli
19c10 64 78 49 74 65 72 50 72 65 76 28 70 44 6c 69 64  dxIterPrev(pDlid
19c20 78 29 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  x).  ){.    asse
19c30 72 74 28 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61  rt( pDlidx->iLea
19c40 66 50 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20  fPgno>iLeaf );. 
19c50 20 20 20 63 6b 73 75 6d 32 20 3d 20 28 63 6b 73     cksum2 = (cks
19c60 75 6d 32 20 5e 20 28 20 28 69 36 34 29 28 70 44  um2 ^ ( (i64)(pD
19c70 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  lidx->iLeafPgno)
19c80 20 3c 3c 20 33 32 20 29 29 3b 0a 20 20 20 20 63   << 32 ));.    c
19c90 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20  ksum2 = (cksum2 
19ca0 5e 20 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64  ^ pDlidx->iRowid
19cb0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69  );.  }.  fts5Dli
19cc0 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
19cd0 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30  x);.  pDlidx = 0
19ce0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
19cf0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
19d00 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d  um1!=cksum2 ) p-
19d10 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
19d20 50 54 3b 20 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  PT; .}.#else.# d
19d30 65 66 69 6e 65 20 66 74 73 35 44 6c 69 64 78 49  efine fts5DlidxI
19d40 74 65 72 54 65 73 74 52 65 76 65 72 73 65 28 77  terTestReverse(w
19d50 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
19d60 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
19d70 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
19d80 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  eckSegment(.  Ft
19d90 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19db0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
19dc0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ject */.  int iI
19dd0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
19de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
19df0 65 78 20 74 68 61 74 20 70 53 65 67 20 69 73 20  ex that pSeg is 
19e00 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46  a part of */.  F
19e10 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
19e20 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f  ent *pSeg      /
19e30 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65  * Segment to che
19e40 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73  ck internal cons
19e50 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20  istency */.){.  
19e60 46 74 73 35 42 74 72 65 65 49 74 65 72 20 69 74  Fts5BtreeIter it
19e70 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
19e80 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
19e90 74 65 20 74 68 72 6f 75 67 68 20 62 2d 74 72 65  te through b-tre
19ea0 65 20 68 69 65 72 61 72 63 68 79 20 2a 2f 0a 0a  e hierarchy */..
19eb0 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
19ec0 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65 20  ough the b-tree 
19ed0 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20  hierarchy.  */. 
19ee0 20 66 6f 72 28 66 74 73 35 42 74 72 65 65 49 74   for(fts5BtreeIt
19ef0 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20  erInit(p, iIdx, 
19f00 70 53 65 67 2c 20 26 69 74 65 72 29 3b 0a 20 20  pSeg, &iter);.  
19f10 20 20 20 20 69 74 65 72 2e 62 45 6f 66 3d 3d 30      iter.bEof==0
19f20 3b 0a 20 20 20 20 20 20 66 74 73 35 42 74 72 65  ;.      fts5Btre
19f30 65 49 74 65 72 4e 65 78 74 28 26 69 74 65 72 29  eIterNext(&iter)
19f40 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
19f50 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
19f60 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
19f70 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
19f80 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
19f90 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
19fa0 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
19fb0 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20  this leaf */.   
19fc0 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
19fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19fe0 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
19ff0 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a  t term on leaf *
1a000 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
1a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a020 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
1a030 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65  terate through e
1a040 6d 70 74 79 20 6c 65 61 76 65 73 20 2a 2f 0a 0a  mpty leaves */..
1a050 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
1a060 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
1a070 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1a080 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
1a090 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
1a0a0 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
1a0b0 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
1a0c0 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
1a0d0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
1a0e0 20 20 20 69 66 28 20 69 74 65 72 2e 69 4c 65 61     if( iter.iLea
1a0f0 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  f<pSeg->pgnoFirs
1a100 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1a110 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45    iRow = FTS5_SE
1a120 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
1a130 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
1a140 30 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a  0, iter.iLeaf);.
1a150 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
1a160 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
1a170 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
1a180 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
1a190 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1a1a0 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e  the leaf contain
1a1b0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  s at least one t
1a1c0 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20 69 74  erm, and that it
1a1d0 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a   is equal.    **
1a1e0 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68   to or larger th
1a1f0 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  an the split-key
1a200 20 69 6e 20 69 74 65 72 2e 74 65 72 6d 2e 20 20   in iter.term.  
1a210 2a 2f 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74  */.    iOff = ft
1a220 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
1a230 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  >p[2]);.    if( 
1a240 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
1a250 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1a260 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
1a270 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  {.      int nTer
1a280 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1a290 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1a2a0 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62  erm on leaf in b
1a2b0 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ytes */.      in
1a2c0 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
1a2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1a2e0 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20  parison of term 
1a2f0 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f  and split-key */
1a300 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
1a310 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
1a320 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
1a330 6d 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  m);.      res = 
1a340 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70  memcmp(&pLeaf->p
1a350 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72  [iOff], iter.ter
1a360 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20  m.p, MIN(nTerm, 
1a370 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20  iter.term.n));. 
1a380 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1a390 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
1a3a0 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20  iter.term.n;.   
1a3b0 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
1a3c0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1a3d0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
1a3e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a3f0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1a400 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
1a410 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
1a420 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b      /* Now check
1a430 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
1a440 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
1a450 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
1a460 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28  nt leaf.    ** (
1a470 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
1a480 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
1a490 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  s. */.    for(i=
1a4a0 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  1; p->rc==SQLITE
1a4b0 5f 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e  _OK && i<=iter.n
1a4c0 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  Empty; i++){.   
1a4d0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1a4e0 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b  ataRead(p, iRow+
1a4f0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  i);.      if( pL
1a500 65 61 66 20 26 26 20 30 21 3d 66 74 73 35 47 65  eaf && 0!=fts5Ge
1a510 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
1a520 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ]) ){.        p-
1a530 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1a540 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1a550 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1a560 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  e(pLeaf);.    }.
1a570 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1a580 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
1a590 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20  dex, check that 
1a5a0 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20  it looks right. 
1a5b0 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e  */.    if( iter.
1a5c0 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  bDlidx ){.      
1a5d0 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
1a5e0 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46  Dlidx = 0;  /* F
1a5f0 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
1a600 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64  ough doclist ind
1a610 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
1a620 69 50 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72  iPrevLeaf = iter
1a630 2e 69 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e  .iLeaf;.      in
1a640 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  t iSegid = pSeg-
1a650 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69  >iSegid;.      i
1a660 6e 74 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36  nt iPg;.      i6
1a670 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66  4 iKey;..      f
1a680 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
1a690 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
1a6a0 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c   iSegid, iter.iL
1a6b0 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20  eaf, &pDlidx);. 
1a6c0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
1a6d0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
1a6e0 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
1a6f0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1a700 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 20  Next(pDlidx).   
1a710 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f     ){..        /
1a720 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69  * Check any rowi
1a730 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  d-less pages tha
1a740 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
1a750 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1a760 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
1a770 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b  iPg=iPrevLeaf+1;
1a780 20 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65   iPg<pDlidx->iLe
1a790 61 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a  afPgno; iPg++){.
1a7a0 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d            iKey =
1a7b0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1a7c0 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1a7d0 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20  , 0, iPg);.     
1a7e0 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
1a7f0 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65  5DataRead(p, iKe
1a800 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1a810 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
1a820 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 47         if( fts5G
1a830 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
1a840 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  0])!=0 ) p->rc =
1a850 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
1a860 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44             fts5D
1a870 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
1a880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1a890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a8a0 20 69 50 72 65 76 4c 65 61 66 20 3d 20 70 44 6c   iPrevLeaf = pDl
1a8b0 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  idx->iLeafPgno;.
1a8c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
1a8d0 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
1a8e0 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62  page indicated b
1a8f0 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  y the iterator r
1a900 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20  eally does.     
1a910 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68     ** contain th
1a920 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65  e rowid suggeste
1a930 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a  d by the same. *
1a940 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  /.        iKey =
1a950 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1a960 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1a970 2c 20 30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c 65  , 0, pDlidx->iLe
1a980 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  afPgno);.       
1a990 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1a9a0 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1a9b0 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1a9c0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1a9d0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
1a9e0 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
1a9f0 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
1aa00 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
1aa10 20 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69           getVari
1aa20 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
1aa30 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
1aa40 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1aa50 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 70     if( iRowid!=p
1aa60 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 20  Dlidx->iRowid ) 
1aa70 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1aa80 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
1aa90 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1aaa0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
1aab0 7d 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  }..      }..    
1aac0 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
1aad0 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65  eaf+1; iPg<=(ite
1aae0 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e  r.iLeaf + iter.n
1aaf0 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a  Empty); iPg++){.
1ab00 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
1ab10 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1ab20 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
1ab30 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  0, iPg);.       
1ab40 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1ab50 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1ab60 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1ab70 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1ab80 66 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70  f( fts5GetU16(&p
1ab90 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29  Leaf->p[0])!=0 )
1aba0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1abb0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
1abc0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1abd0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
1abe0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
1abf0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
1ac00 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  ree(pDlidx);.   
1ac10 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1ac20 54 65 73 74 52 65 76 65 72 73 65 28 70 2c 20 69  TestReverse(p, i
1ac30 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 74 65  Idx, iSegid, ite
1ac40 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  r.iLeaf);.    }.
1ac50 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1ac60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1ac70 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d  ter.iLeaf!=pSeg-
1ac80 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
1ac90 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1aca0 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74  RRUPT;.  }..  ft
1acb0 73 35 42 74 72 65 65 49 74 65 72 46 72 65 65 28  s5BtreeIterFree(
1acc0 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &iter);.}../*.**
1acd0 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69   Iterator pMulti
1ace0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1acf0 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  s to a valid ent
1ad00 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68  ry (not EOF). Th
1ad10 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1ad20 70 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66  ppends a copy of
1ad30 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
1ad40 73 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20  st of the entry 
1ad50 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65  pMulti .** curre
1ad60 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
1ad70 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  o buffer pBuf..*
1ad80 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1ad90 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
1ada0 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
1adb0 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61  n p->rc. It is a
1adc0 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72  ssumed.** no err
1add0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
1ade0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
1adf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1ae00 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
1ae10 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
1ae20 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
1ae30 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
1ae40 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
1ae50 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a  Multi,.  int bSz
1ae60 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
1ae70 70 42 75 66 0a 29 7b 0a 20 20 46 74 73 35 43 68  pBuf.){.  Fts5Ch
1ae80 75 6e 6b 49 74 65 72 20 69 74 65 72 3b 0a 20 20  unkIter iter;.  
1ae90 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
1aea0 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65  g = &pMulti->aSe
1aeb0 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73  g[ pMulti->aFirs
1aec0 74 5b 31 5d 20 5d 3b 0a 20 20 61 73 73 65 72 74  t[1] ];.  assert
1aed0 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
1aee0 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30  of(p, pMulti)==0
1aef0 20 29 3b 0a 20 20 66 74 73 35 43 68 75 6e 6b 49   );.  fts5ChunkI
1af00 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c  terInit(p, pSeg,
1af10 20 26 69 74 65 72 29 3b 0a 20 20 69 66 28 20 66   &iter);.  if( f
1af20 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28  ts5ChunkIterEof(
1af30 70 2c 20 26 69 74 65 72 29 3d 3d 30 20 29 7b 0a  p, &iter)==0 ){.
1af40 20 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a 20      if( bSz ){. 
1af50 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1af60 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1af70 72 63 2c 20 70 42 75 66 2c 20 69 74 65 72 2e 6e  rc, pBuf, iter.n
1af80 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Rem);.    }.    
1af90 77 68 69 6c 65 28 20 66 74 73 35 43 68 75 6e 6b  while( fts5Chunk
1afa0 49 74 65 72 45 6f 66 28 70 2c 20 26 69 74 65 72  IterEof(p, &iter
1afb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  )==0 ){.      ft
1afc0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1afd0 6f 62 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c  ob(&p->rc, pBuf,
1afe0 20 69 74 65 72 2e 6e 2c 20 69 74 65 72 2e 70 29   iter.n, iter.p)
1aff0 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e  ;.      fts5Chun
1b000 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 26 69 74  kIterNext(p, &it
1b010 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
1b020 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52 65   fts5ChunkIterRe
1b030 6c 65 61 73 65 28 26 69 74 65 72 29 3b 0a 7d 0a  lease(&iter);.}.
1b040 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b050 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
1b060 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72  (Fts5DoclistIter
1b070 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
1b080 70 49 74 65 72 2d 3e 69 3c 70 49 74 65 72 2d 3e  pIter->i<pIter->
1b090 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  n ){.    if( pIt
1b0a0 65 72 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20 69  er->i ){.      i
1b0b0 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
1b0c0 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67 65 74   pIter->i += get
1b0d0 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e 61  Varint(&pIter->a
1b0e0 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36 34  [pIter->i], (u64
1b0f0 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
1b100 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 41 73    if( pIter->bAs
1b110 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  c ){.        pIt
1b120 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
1b130 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73  elta;.      }els
1b140 65 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  e{.        pIter
1b150 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c  ->iRowid -= iDel
1b160 74 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ta;.      }.    
1b170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
1b180 65 72 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72 69  er->i += getVari
1b190 6e 74 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74  nt(&pIter->a[pIt
1b1a0 65 72 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70  er->i], (u64*)&p
1b1b0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
1b1c0 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e     }.    pIter->
1b1d0 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  i += getVarint32
1b1e0 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72  (&pIter->a[pIter
1b1f0 2d 3e 69 5d 2c 20 70 49 74 65 72 2d 3e 6e 50 6f  ->i], pIter->nPo
1b200 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65  slist);.    pIte
1b210 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 26 70  r->aPoslist = &p
1b220 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69  Iter->a[pIter->i
1b230 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20  ];.    pIter->i 
1b240 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69  += pIter->nPosli
1b250 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  st;.  }else{.   
1b260 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
1b270 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 0;.  }.}..sta
1b280 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63  tic void fts5Doc
1b290 6c 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20  listIterInit(.  
1b2a0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1b2b0 2c 20 0a 20 20 69 6e 74 20 62 41 73 63 2c 20 0a  , .  int bAsc, .
1b2c0 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65    Fts5DoclistIte
1b2d0 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65  r *pIter.){.  me
1b2e0 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
1b2f0 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a  izeof(*pIter));.
1b300 20 20 70 49 74 65 72 2d 3e 61 20 3d 20 70 42 75    pIter->a = pBu
1b310 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 6e  f->p;.  pIter->n
1b320 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 70 49   = pBuf->n;.  pI
1b330 74 65 72 2d 3e 62 41 73 63 20 3d 20 62 41 73 63  ter->bAsc = bAsc
1b340 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49  ;.  fts5DoclistI
1b350 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
1b360 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1b370 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66  a doclist to buf
1b380 66 65 72 20 70 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer pBuf..*/.sta
1b390 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72  tic void fts5Mer
1b3a0 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20  geAppendDocid(. 
1b3b0 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3d0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
1b3e0 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  r code */.  int 
1b3f0 62 41 73 63 2c 0a 20 20 46 74 73 35 42 75 66 66  bAsc,.  Fts5Buff
1b400 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
1b410 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1b420 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
1b430 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f  .  i64 *piLastRo
1b440 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
1b450 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72     /* IN/OUT: Pr
1b460 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69  evious rowid wri
1b470 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f  tten (if any) */
1b480 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20  .  i64 iRowid   
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4a0 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61     /* Rowid to a
1b4b0 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  ppend */.){.  if
1b4c0 28 20 70 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a  ( pBuf->n==0 ){.
1b4d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1b4e0 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20  pendVarint(pRc, 
1b4f0 70 42 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20  pBuf, iRowid);. 
1b500 20 7d 65 6c 73 65 20 69 66 28 20 62 41 73 63 3d   }else if( bAsc=
1b510 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  =0 ){.    fts5Bu
1b520 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1b530 28 70 52 63 2c 20 70 42 75 66 2c 20 2a 70 69 4c  (pRc, pBuf, *piL
1b540 61 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77 69  astRowid - iRowi
1b550 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
1b560 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1b570 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75  dVarint(pRc, pBu
1b580 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c  f, iRowid - *piL
1b590 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  astRowid);.  }. 
1b5a0 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20   *piLastRowid = 
1b5b0 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iRowid;.}../*.**
1b5c0 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20   Buffers p1 and 
1b5d0 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69  p2 contain docli
1b5e0 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  sts. This functi
1b5f0 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f  on merges the co
1b600 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20  ntent.** of the 
1b610 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67  two doclists tog
1b620 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62  ether and sets b
1b630 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20  uffer p1 to the 
1b640 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a  result before.**
1b650 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1b660 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1b670 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
1b680 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70  ode is left in p
1b690 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  ->rc. If an erro
1b6a0 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  r has.** already
1b6b0 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1b6c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1b6d0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1b6e0 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65  oid fts5MergePre
1b6f0 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35  fixLists(.  Fts5
1b700 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1b710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1b720 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1b730 63 74 20 2a 2f 0a 20 20 69 6e 74 20 62 41 73 63  ct */.  int bAsc
1b740 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
1b750 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
1b760 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73      /* First lis
1b770 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20  t to merge */.  
1b780 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20  Fts5Buffer *p2  
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7a0 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74  /* Second list t
1b7b0 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20  o merge */.){.  
1b7c0 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20  if( p2->n ){.   
1b7d0 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
1b7e0 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63  = 0;.    Fts5Doc
1b7f0 6c 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20  listIter i1;.   
1b800 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
1b810 20 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66   i2;.    Fts5Buf
1b820 66 65 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73  fer out;.    Fts
1b830 35 42 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20  5Buffer tmp;.   
1b840 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c   memset(&out, 0,
1b850 20 73 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20   sizeof(out));. 
1b860 20 20 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20     memset(&tmp, 
1b870 30 2c 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b  0, sizeof(tmp));
1b880 0a 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73  ..    fts5Doclis
1b890 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20 62 41  tIterInit(p1, bA
1b8a0 73 63 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74  sc, &i1);.    ft
1b8b0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
1b8c0 74 28 70 32 2c 20 62 41 73 63 2c 20 26 69 32 29  t(p2, bAsc, &i2)
1b8d0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 31 2e  ;.    while( i1.
1b8e0 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69  aPoslist!=0 || i
1b8f0 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20 29 7b  2.aPoslist!=0 ){
1b900 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50  .      if( i2.aP
1b910 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31  oslist==0 || (i1
1b920 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 0a 20 20  .aPoslist && .  
1b930 20 20 20 20 20 20 20 20 20 28 20 28 21 62 41 73           ( (!bAs
1b940 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3e 69  c && i1.iRowid>i
1b950 32 2e 69 52 6f 77 69 64 29 20 7c 7c 20 28 62 41  2.iRowid) || (bA
1b960 73 63 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c  sc && i1.iRowid<
1b970 69 32 2e 69 52 6f 77 69 64 29 20 29 0a 20 20 20  i2.iRowid) ).   
1b980 20 20 20 29 29 7b 0a 20 20 20 20 20 20 20 20 2f     )){.        /
1b990 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f  * Copy entry fro
1b9a0 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20  m i1 */.        
1b9b0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
1b9c0 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 41 73  ocid(&p->rc, bAs
1b9d0 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52  c, &out, &iLastR
1b9e0 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29  owid, i1.iRowid)
1b9f0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1ba00 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1ba10 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69  (&p->rc, &out, i
1ba20 31 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  1.nPoslist);.   
1ba30 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1ba40 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1ba50 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73 6c  , &out, i1.nPosl
1ba60 69 73 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74  ist, i1.aPoslist
1ba70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1ba80 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
1ba90 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i1);.      }.   
1baa0 20 20 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61     else if( i1.a
1bab0 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32  Poslist==0 || i2
1bac0 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77  .iRowid!=i1.iRow
1bad0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  id ){.        /*
1bae0 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
1baf0 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i2 */.        f
1bb00 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
1bb10 63 69 64 28 26 70 2d 3e 72 63 2c 20 62 41 73 63  cid(&p->rc, bAsc
1bb20 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f  , &out, &iLastRo
1bb30 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b  wid, i2.iRowid);
1bb40 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1bb50 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1bb60 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32  &p->rc, &out, i2
1bb70 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .nPoslist);.    
1bb80 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1bb90 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1bba0 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69   &out, i2.nPosli
1bbb0 73 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 29  st, i2.aPoslist)
1bbc0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
1bbd0 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
1bbe0 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
1bbf0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
1bc00 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
1bc10 72 20 72 31 3b 0a 20 20 20 20 20 20 20 20 46 74  r r1;.        Ft
1bc20 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
1bc30 72 32 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  r2;.        Fts5
1bc40 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
1bc50 69 74 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 6d  iter;..        m
1bc60 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1bc70 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29  , sizeof(writer)
1bc80 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d  );..        /* M
1bc90 65 72 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73  erge the two pos
1bca0 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20  ition lists. */ 
1bcb0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
1bcc0 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70  geAppendDocid(&p
1bcd0 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f 75 74  ->rc, bAsc, &out
1bce0 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  , &iLastRowid, i
1bcf0 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
1bd00 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
1bd10 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20  o(&tmp);.       
1bd20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1bd30 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31  istReaderInit(-1
1bd40 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i1.aPoslist, i
1bd50 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 72 31 29  1.nPoslist, &r1)
1bd60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1bd70 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
1bd80 65 72 49 6e 69 74 28 2d 31 2c 20 69 32 2e 61 50  erInit(-1, i2.aP
1bd90 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c  oslist, i2.nPosl
1bda0 69 73 74 2c 20 26 72 32 29 3b 0a 20 20 20 20 20  ist, &r2);.     
1bdb0 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1bdc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 72  =SQLITE_OK && (r
1bdd0 31 2e 62 45 6f 66 3d 3d 30 20 7c 7c 20 72 32 2e  1.bEof==0 || r2.
1bde0 62 45 6f 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20  bEof==0) ){.    
1bdf0 20 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a        i64 iNew;.
1be00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 32            if( r2
1be10 2e 62 45 6f 66 20 7c 7c 20 28 72 31 2e 62 45 6f  .bEof || (r1.bEo
1be20 66 3d 3d 30 20 26 26 20 72 31 2e 69 50 6f 73 3c  f==0 && r1.iPos<
1be30 72 32 2e 69 50 6f 73 29 20 29 7b 0a 20 20 20 20  r2.iPos) ){.    
1be40 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 72          iNew = r
1be50 31 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  1.iPos;.        
1be60 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
1be70 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
1be80 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  (&r1);.         
1be90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1bea0 20 20 20 20 69 4e 65 77 20 3d 20 72 32 2e 69 50      iNew = r2.iP
1beb0 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
1bec0 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1bed0 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 32  stReaderNext(&r2
1bee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1bef0 66 28 20 72 31 2e 69 50 6f 73 3d 3d 72 32 2e 69  f( r1.iPos==r2.i
1bf00 50 6f 73 20 29 20 73 71 6c 69 74 65 33 46 74 73  Pos ) sqlite3Fts
1bf10 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65  5PoslistReaderNe
1bf20 78 74 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20  xt(&r1);.       
1bf30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
1bf40 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
1bf50 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41  s5PoslistWriterA
1bf60 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 77 72 69  ppend(&tmp, &wri
1bf70 74 65 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20  ter, iNew);.    
1bf80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66      }..        f
1bf90 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1bfa0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f  arint(&p->rc, &o
1bfb0 75 74 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20  ut, tmp.n);.    
1bfc0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1bfd0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1bfe0 20 26 6f 75 74 2c 20 74 6d 70 2e 6e 2c 20 74 6d   &out, tmp.n, tm
1bff0 70 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74  p.p);.        ft
1c000 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1c010 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20  t(&i1);.        
1c020 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
1c030 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
1c040 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  }.    }..    fts
1c050 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
1c060 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75  c, p1, out.n, ou
1c070 74 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75  t.p);.    fts5Bu
1c080 66 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a  fferFree(&tmp);.
1c090 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
1c0a0 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a  ee(&out);.  }.}.
1c0b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1c0c0 35 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35  5BufferSwap(Fts5
1c0d0 42 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35  Buffer *p1, Fts5
1c0e0 42 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46  Buffer *p2){.  F
1c0f0 74 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20  ts5Buffer tmp = 
1c100 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32  *p1;.  *p1 = *p2
1c110 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d  ;.  *p2 = tmp;.}
1c120 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1c130 73 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65  s5SetupPrefixIte
1c140 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r(.  Fts5Index *
1c150 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1c160 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
1c170 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1c180 69 6e 74 20 62 41 73 63 2c 20 20 20 20 20 20 20  int bAsc,       
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1a0 2f 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44  /* True for "ORD
1c1b0 45 52 20 42 59 20 72 6f 77 69 64 20 41 53 43 22  ER BY rowid ASC"
1c1c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
1c1d0 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  pToken,         
1c1e0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1c1f0 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69  containing prefi
1c200 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20  x to match */.  
1c210 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20  int nToken,     
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
1c240 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65  r pToken in byte
1c250 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  s */.  Fts5Index
1c260 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
1c270 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61         /* Popula
1c280 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  te this object *
1c290 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  /.){.  Fts5Struc
1c2a0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
1c2b0 20 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75   Fts5Buffer *aBu
1c2c0 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  f;.  const int n
1c2d0 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75  Buf = 32;..  aBu
1c2e0 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a  f = (Fts5Buffer*
1c2f0 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70  )fts5IdxMalloc(p
1c300 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
1c310 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53  fer)*nBuf);.  pS
1c320 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
1c330 63 74 75 72 65 52 65 61 64 28 70 2c 20 30 29 3b  ctureRead(p, 0);
1c340 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20  ..  if( aBuf && 
1c350 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 46  pStruct ){.    F
1c360 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a  ts5DoclistIter *
1c370 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e  pDoclist;.    in
1c380 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61  t i;.    i64 iLa
1c390 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
1c3a0 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
1c3b0 72 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f  r *p1 = 0;     /
1c3c0 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20  * Iterator used 
1c3d0 74 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66  to gather data f
1c3e0 72 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  rom index */.   
1c3f0 20 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c   Fts5Buffer docl
1c400 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  ist;..    memset
1c410 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69  (&doclist, 0, si
1c420 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a  zeof(doclist));.
1c430 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74      for(fts5Mult
1c440 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
1c450 75 63 74 2c 20 30 2c 20 31 2c 20 70 54 6f 6b 65  uct, 0, 1, pToke
1c460 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30  n, nToken, -1, 0
1c470 2c 20 26 70 31 29 3b 0a 20 20 20 20 20 20 20 20  , &p1);.        
1c480 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1c490 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20  (p, p1)==0;.    
1c4a0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1c4b0 72 4e 65 78 74 28 70 2c 20 70 31 2c 20 30 2c 20  rNext(p, p1, 0, 
1c4c0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
1c4d0 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
1c4e0 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
1c4f0 70 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  p1);.      int n
1c500 54 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73  Term;.      cons
1c510 74 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74  t u8 *pTerm = ft
1c520 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
1c530 70 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20  p1, &nTerm);.   
1c540 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
1c550 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c  p(pToken, pTerm,
1c560 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65   MIN(nToken, nTe
1c570 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20  rm))<=0 );.     
1c580 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65   if( nTerm<nToke
1c590 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b  n || memcmp(pTok
1c5a0 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65  en, pTerm, nToke
1c5b0 6e 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  n) ) break;..   
1c5c0 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e     if( doclist.n
1c5d0 3e 30 20 0a 20 20 20 20 20 20 20 26 26 20 28 28  >0 .       && ((
1c5e0 21 62 41 73 63 20 26 26 20 69 52 6f 77 69 64 3e  !bAsc && iRowid>
1c5f0 3d 69 4c 61 73 74 52 6f 77 69 64 29 20 7c 7c 20  =iLastRowid) || 
1c600 28 62 41 73 63 20 26 26 20 69 52 6f 77 69 64 3c  (bAsc && iRowid<
1c610 3d 69 4c 61 73 74 52 6f 77 69 64 29 29 0a 20 20  =iLastRowid)).  
1c620 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20      ){..        
1c630 66 6f 72 28 69 3d 30 3b 20 64 6f 63 6c 69 73 74  for(i=0; doclist
1c640 2e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  .n && p->rc==SQL
1c650 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20  ITE_OK; i++){.  
1c660 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c670 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  i<nBuf );.      
1c680 20 20 20 20 69 66 28 20 61 42 75 66 5b 69 5d 2e      if( aBuf[i].
1c690 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1c6a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 77      fts5BufferSw
1c6b0 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26 61 42  ap(&doclist, &aB
1c6c0 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
1c6d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
1c6e0 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  ro(&doclist);.  
1c6f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1c700 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 4d             fts5M
1c710 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28  ergePrefixLists(
1c720 70 2c 20 62 41 73 63 2c 20 26 64 6f 63 6c 69 73  p, bAsc, &doclis
1c730 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
1c740 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1c750 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69  fferZero(&aBuf[i
1c760 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
1c770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c780 7d 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63 6c  }.      if( docl
1c790 69 73 74 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ist.n==0 ){.    
1c7a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1c7b0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1c7c0 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f  c, &doclist, iRo
1c7d0 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  wid);.      }els
1c7e0 65 20 69 66 28 20 62 41 73 63 3d 3d 30 20 29 7b  e if( bAsc==0 ){
1c7f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1c800 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1c810 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74  &p->rc, &doclist
1c820 2c 20 69 4c 61 73 74 52 6f 77 69 64 20 2d 20 69  , iLastRowid - i
1c830 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d 65  Rowid);.      }e
1c840 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
1c850 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1c860 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63  int(&p->rc, &doc
1c870 6c 69 73 74 2c 20 69 52 6f 77 69 64 20 2d 20 69  list, iRowid - i
1c880 4c 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 20 20  LastRowid);.    
1c890 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 52    }.      iLastR
1c8a0 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1c8b0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1c8c0 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 31 2c  erPoslist(p, p1,
1c8d0 20 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20   1, &doclist);. 
1c8e0 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
1c8f0 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b  0; i<nBuf; i++){
1c900 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65  .      fts5Merge
1c910 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20 62  PrefixLists(p, b
1c920 41 73 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26  Asc, &doclist, &
1c930 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
1c940 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1c950 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aBuf[i]);.    }.
1c960 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1c970 72 46 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20  rFree(p, p1);.. 
1c980 20 20 20 70 44 6f 63 6c 69 73 74 20 3d 20 28 46     pDoclist = (F
1c990 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 2a 29  ts5DoclistIter*)
1c9a0 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
1c9b0 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6f 63 6c   sizeof(Fts5Docl
1c9c0 69 73 74 49 74 65 72 29 29 3b 0a 20 20 20 20 69  istIter));.    i
1c9d0 66 28 20 21 70 44 6f 63 6c 69 73 74 20 29 7b 0a  f( !pDoclist ){.
1c9e0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1c9f0 46 72 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a  Free(&doclist);.
1ca00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ca10 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
1ca20 20 3d 20 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20   = pDoclist;.   
1ca30 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
1ca40 65 72 49 6e 69 74 28 26 64 6f 63 6c 69 73 74 2c  erInit(&doclist,
1ca50 20 62 41 73 63 2c 20 70 49 74 65 72 2d 3e 70 44   bAsc, pIter->pD
1ca60 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  oclist);.    }. 
1ca70 20 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74   }..  fts5Struct
1ca80 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
1ca90 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ct);.  sqlite3_f
1caa0 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 73 74  ree(aBuf);.}..st
1cab0 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
1cac0 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e 64  exReturn(Fts5Ind
1cad0 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ex *p){.  int rc
1cae0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72   = p->rc;.  p->r
1caf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cb00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cb10 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61  *.** Run interna
1cb20 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e 73 75  l checks to ensu
1cb30 72 65 20 74 68 61 74 20 74 68 65 20 46 54 53 20  re that the FTS 
1cb40 69 6e 64 65 78 20 28 61 29 20 69 73 20 69 6e 74  index (a) is int
1cb50 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73  ernally .** cons
1cb60 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29 20 63  istent and (b) c
1cb70 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20  ontains entries 
1cb80 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 58 4f  for which the XO
1cb90 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73 75  R of the checksu
1cba0 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61  ms.** as calcula
1cbb0 74 65 64 20 62 79 20 66 74 73 35 49 6e 64 65 78  ted by fts5Index
1cbc0 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20  EntryCksum() is 
1cbd0 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  cksum..**.** Ret
1cbe0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1cbf0 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  PT if any of the
1cc00 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
1cc10 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65   fail, or if the
1cc20 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  .** checksum doe
1cc30 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74  s not match. Ret
1cc40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
1cc50 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73   all checks pass
1cc60 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f   without.** erro
1cc70 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  r, or some other
1cc80 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
1cc90 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72  de if another er
1cca0 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a  ror (e.g. OOM).*
1ccb0 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
1ccc0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
1ccd0 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28  xIntegrityCheck(
1cce0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36  Fts5Index *p, u6
1ccf0 34 20 63 6b 73 75 6d 29 7b 0a 20 20 46 74 73 35  4 cksum){.  Fts5
1cd00 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
1cd10 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
1cd20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20  int iIdx;       
1cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd40 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
1cd50 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
1cd60 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1cd90 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20  n code */.  u64 
1cda0 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20  cksum2 = 0;     
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1cdc0 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
1cdd0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64   contents of ind
1cde0 65 78 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68  exes */..  /* Ch
1cdf0 65 63 6b 20 74 68 61 74 20 74 68 65 20 63 68 65  eck that the che
1ce00 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 69 6e 64  cksum of the ind
1ce10 65 78 20 6d 61 74 63 68 65 73 20 74 68 65 20 61  ex matches the a
1ce20 72 67 75 6d 65 6e 74 20 63 68 65 63 6b 73 75 6d  rgument checksum
1ce30 20 2a 2f 0a 20 20 66 6f 72 28 69 49 64 78 3d 30   */.  for(iIdx=0
1ce40 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ; iIdx<=pConfig-
1ce50 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b  >nPrefix; iIdx++
1ce60 29 7b 0a 20 20 20 20 46 74 73 35 4d 75 6c 74 69  ){.    Fts5Multi
1ce70 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 3b 0a  SegIter *pIter;.
1ce80 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1ce90 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73  e *pStruct = fts
1cea0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
1ceb0 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 66 6f 72  , iIdx);.    for
1cec0 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
1ced0 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 69 49  w(p, pStruct, iI
1cee0 64 78 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c  dx, 0, 0, 0, -1,
1cef0 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20   0, &pIter);.   
1cf00 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1cf10 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
1cf20 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  =0;.        fts5
1cf30 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
1cf40 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20   pIter, 0, 0).  
1cf50 20 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 50    ){.      Fts5P
1cf60 6f 73 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20  osIter sPos;    
1cf70 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1cf80 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1cf90 68 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  h position list 
1cfa0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 20  */.      int n; 
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfc0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1cfd0 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  term in bytes */
1cfe0 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
1cff0 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
1d000 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
1d010 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28       char *z = (
1d020 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49  char*)fts5MultiI
1d030 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
1d040 6e 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 66  n);..      for(f
1d050 74 73 35 50 6f 73 49 74 65 72 49 6e 69 74 28 70  ts5PosIterInit(p
1d060 2c 20 70 49 74 65 72 2c 20 26 73 50 6f 73 29 3b  , pIter, &sPos);
1d070 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50  .          fts5P
1d080 6f 73 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50  osIterEof(p, &sP
1d090 6f 73 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  os)==0;.        
1d0a0 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78    fts5PosIterNex
1d0b0 74 28 70 2c 20 26 73 50 6f 73 29 0a 20 20 20 20  t(p, &sPos).    
1d0c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73    ){.        cks
1d0d0 75 6d 32 20 5e 3d 20 66 74 73 35 49 6e 64 65 78  um2 ^= fts5Index
1d0e0 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69  EntryCksum(iRowi
1d0f0 64 2c 20 73 50 6f 73 2e 69 43 6f 6c 2c 20 73 50  d, sPos.iCol, sP
1d100 6f 73 2e 69 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a  os.iPos, z, n);.
1d110 23 69 66 20 30 0a 20 20 20 20 20 20 20 20 66 70  #if 0.        fp
1d120 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72  rintf(stdout, "r
1d130 6f 77 69 64 3d 25 64 20 22 2c 20 28 69 6e 74 29  owid=%d ", (int)
1d140 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1d150 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
1d160 20 22 74 65 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e   "term=%.*s ", n
1d170 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 66 70  , z);.        fp
1d180 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 63  rintf(stdout, "c
1d190 6f 6c 3d 25 64 20 22 2c 20 73 50 6f 73 2e 69 43  ol=%d ", sPos.iC
1d1a0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  ol);.        fpr
1d1b0 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 6f 66  intf(stdout, "of
1d1c0 66 3d 25 64 5c 6e 22 2c 20 73 50 6f 73 2e 69 50  f=%d\n", sPos.iP
1d1d0 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c  os);.        ffl
1d1e0 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e  ush(stdout);.#en
1d1f0 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
1d200 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  }.    fts5MultiI
1d210 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72  terFree(p, pIter
1d220 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
1d230 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1d240 75 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  uct);.  }.  rc =
1d250 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63   p->rc;.  if( rc
1d260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
1d270 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 72  ksum!=cksum2 ) r
1d280 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
1d290 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
1d2a0 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  at the internal 
1d2b0 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65  nodes of each se
1d2c0 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20  gment match the 
1d2d0 6c 65 61 76 65 73 20 2a 2f 0a 20 20 66 6f 72 28  leaves */.  for(
1d2e0 69 49 64 78 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iIdx=0; rc==SQLI
1d2f0 54 45 5f 4f 4b 20 26 26 20 69 49 64 78 3c 3d 70  TE_OK && iIdx<=p
1d300 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
1d310 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74   iIdx++){.    Ft
1d320 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1d330 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
1d340 74 75 72 65 52 65 61 64 28 70 2c 20 69 49 64 78  tureRead(p, iIdx
1d350 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  );.    if( pStru
1d360 63 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ct ){.      int 
1d370 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
1d380 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
1d390 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1d3a0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1d3b0 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
1d3c0 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
1d3d0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1d3e0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
1d3f0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
1d400 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
1d410 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1d420 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
1d430 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 66  eg];.          f
1d440 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
1d450 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c  yCheckSegment(p,
1d460 20 69 49 64 78 2c 20 70 53 65 67 29 3b 0a 20 20   iIdx, pSeg);.  
1d470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1d480 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
1d490 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
1d4a0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 72 63 20  Struct);.    rc 
1d4b0 3d 20 70 2d 3e 72 63 3b 0a 20 20 7d 0a 0a 20 20  = p->rc;.  }..  
1d4c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1d4d0 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
1d4e0 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  at all subsequen
1d4f0 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
1d500 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
1d510 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f  () pertain.** to
1d520 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
1d530 74 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e  th rowid iRowid.
1d540 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
1d550 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69  ts5IndexBeginWri
1d560 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
1d570 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20   i64 iRowid){.  
1d580 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
1d590 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
1d5a0 28 20 69 52 6f 77 69 64 3c 3d 70 2d 3e 69 57 72  ( iRowid<=p->iWr
1d5b0 69 74 65 52 6f 77 69 64 20 7c 7c 20 28 70 2d 3e  iteRowid || (p->
1d5c0 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3e 20 70  nPendingData > p
1d5d0 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74  ->nMaxPendingDat
1d5e0 61 29 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  a) ){.    fts5In
1d5f0 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d  dexFlush(p);.  }
1d600 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  .  p->iWriteRowi
1d610 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65  d = iRowid;.  re
1d620 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
1d630 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
1d640 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f  * Commit data to
1d650 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
1d660 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 79  lite3Fts5IndexSy
1d670 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  nc(Fts5Index *p,
1d680 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
1d690 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1d6a0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
1d6b0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
1d6c0 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 20  ;.  if( bCommit 
1d6d0 29 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65  ) fts5CloseReade
1d6e0 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  r(p);.  return f
1d6f0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
1d700 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  );.}../*.** Disc
1d710 61 72 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ard any data sto
1d720 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
1d730 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
1d740 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69  . Do not write i
1d750 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  t.** to the data
1d760 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
1d770 6c 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ly, assume that 
1d780 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1d790 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61  the %_data.** ta
1d7a0 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68 61  ble may have cha
1d7b0 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  nged on disk. So
1d7c0 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   any in-memory c
1d7d0 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20  aches of %_data 
1d7e0 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74  .** records must
1d7f0 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e   be invalidated.
1d800 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
1d810 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b  ts5IndexRollback
1d820 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1d830 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
1d840 72 28 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  r(p);.  fts5Inde
1d850 78 44 69 73 63 61 72 64 44 61 74 61 28 70 29 3b  xDiscardData(p);
1d860 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1d870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1d880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d890 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  K;.}../*.** Open
1d8a0 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78   a new Fts5Index
1d8b0 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20   handle. If the 
1d8c0 62 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74  bCreate argument
1d8d0 20 69 73 20 74 72 75 65 2c 20 63 72 65 61 74 65   is true, create
1d8e0 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
1d8f0 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
1d900 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  g %_data table..
1d910 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1d920 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ful, set *pp to 
1d930 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77  point to the new
1d940 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
1d950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
1d960 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20   Otherwise, set 
1d970 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  *pp to NULL and 
1d980 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
1d990 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
1d9a0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1d9b0 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35  ndexOpen(.  Fts5
1d9c0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
1d9d0 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c   .  int bCreate,
1d9e0 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a   .  Fts5Index **
1d9f0 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  pp,.  char **pzE
1da00 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rr.){.  int rc =
1da10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74   SQLITE_OK;.  Ft
1da20 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20  s5Index *p;     
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da40 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a   New object */..
1da50 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73    *pp = p = (Fts
1da60 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 5f  5Index*)sqlite3_
1da70 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46 74  malloc(sizeof(Ft
1da80 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28  s5Index));.  if(
1da90 20 21 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c   !p ) return SQL
1daa0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 6d 65  ITE_NOMEM;..  me
1dab0 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
1dac0 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a 20  f(Fts5Index));. 
1dad0 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43   p->pConfig = pC
1dae0 6f 6e 66 69 67 3b 0a 20 20 70 2d 3e 6e 43 72 69  onfig;.  p->nCri
1daf0 73 69 73 4d 65 72 67 65 20 3d 20 46 54 53 35 5f  sisMerge = FTS5_
1db00 43 52 49 53 49 53 5f 4d 45 52 47 45 3b 0a 20 20  CRISIS_MERGE;.  
1db10 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46  p->nWorkUnit = F
1db20 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20  TS5_WORK_UNIT;. 
1db30 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44   p->nMaxPendingD
1db40 61 74 61 20 3d 20 31 30 32 34 2a 31 30 32 34 3b  ata = 1024*1024;
1db50 0a 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d  .  p->zDataTbl =
1db60 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1db70 28 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e  ("%s_data", pCon
1db80 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  fig->zName);.  i
1db90 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d 3d  f( p->zDataTbl==
1dba0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
1dbb0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
1dbc0 6c 73 65 20 69 66 28 20 62 43 72 65 61 74 65 20  lse if( bCreate 
1dbd0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1dbe0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1dbf0 73 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  s;.    rc = sqli
1dc00 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61 62  te3Fts5CreateTab
1dc10 6c 65 28 0a 20 20 20 20 20 20 20 20 70 43 6f 6e  le(.        pCon
1dc20 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
1dc30 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1dc40 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
1dc50 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
1dc60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1dc70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dc80 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20    memset(&s, 0, 
1dc90 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
1dca0 74 75 72 65 29 29 3b 0a 20 20 20 20 20 20 66 6f  ture));.      fo
1dcb0 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67  r(i=0; i<pConfig
1dcc0 2d 3e 6e 50 72 65 66 69 78 2b 31 3b 20 69 2b 2b  ->nPrefix+1; i++
1dcd0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
1dce0 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
1dcf0 20 69 2c 20 26 73 29 3b 0a 20 20 20 20 20 20 7d   i, &s);.      }
1dd00 0a 20 20 20 20 20 20 72 63 20 3d 20 70 2d 3e 72  .      rc = p->r
1dd10 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1dd20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1dd30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1dd40 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
1dd50 41 76 65 72 61 67 65 73 28 70 2c 20 28 63 6f 6e  Averages(p, (con
1dd60 73 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20  st u8*)"", 0);. 
1dd70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1dd80 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
1dd90 45 5f 4f 4b 20 7c 7c 20 72 63 21 3d 53 51 4c 49  E_OK || rc!=SQLI
1dda0 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72  TE_OK );.  if( r
1ddb0 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
1ddc0 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 70  Fts5IndexClose(p
1ddd0 2c 20 30 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  , 0);.    *pp = 
1dde0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1ddf0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
1de00 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e  se a handle open
1de10 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
1de20 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1de30 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e  Fts5IndexOpen().
1de40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
1de50 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74  ts5IndexClose(Ft
1de60 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
1de70 62 44 65 73 74 72 6f 79 29 7b 0a 20 20 69 6e 74  bDestroy){.  int
1de80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1de90 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1dea0 69 66 28 20 62 44 65 73 74 72 6f 79 20 29 7b 0a  if( bDestroy ){.
1deb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1dec0 65 33 46 74 73 35 44 72 6f 70 54 61 62 6c 65 28  e3Fts5DropTable(
1ded0 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 22 64 61 74  p->pConfig, "dat
1dee0 61 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  a");.    }.    a
1def0 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65  ssert( p->pReade
1df00 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  r==0 );.    sqli
1df10 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
1df20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71  pWriter);.    sq
1df30 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1df40 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 20  ->pDeleter);.   
1df50 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68 20 29   if( p->apHash )
1df60 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1df70 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1df80 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  =p->pConfig->nPr
1df90 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  efix; i++){.    
1dfa0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
1dfb0 61 73 68 46 72 65 65 28 70 2d 3e 61 70 48 61 73  ashFree(p->apHas
1dfc0 68 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  h[i]);.      }. 
1dfd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1dfe0 65 28 70 2d 3e 61 70 48 61 73 68 29 3b 0a 20 20  e(p->apHash);.  
1dff0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
1e000 66 72 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c  free(p->zDataTbl
1e010 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1e020 72 65 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ree(p);.  }.  re
1e030 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e040 2a 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20  * Calculate and 
1e050 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
1e060 6d 20 74 68 61 74 20 69 73 20 74 68 65 20 58 4f  m that is the XO
1e070 52 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  R of the index e
1e080 6e 74 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75 6d  ntry.** checksum
1e090 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
1e0a0 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 67 65  that would be ge
1e0b0 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 74  nerated by the t
1e0c0 6f 6b 65 6e 20 73 70 65 63 69 66 69 65 64 0a 2a  oken specified.*
1e0d0 2a 20 62 79 20 74 68 65 20 66 69 6e 61 6c 20 35  * by the final 5
1e0e0 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75   arguments..*/.u
1e0f0 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  64 sqlite3Fts5In
1e100 64 65 78 43 6b 73 75 6d 28 0a 20 20 46 74 73 35  dexCksum(.  Fts5
1e110 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c  Config *pConfig,
1e120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1e130 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
1e140 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  ect */.  i64 iRo
1e150 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
1e160 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 75           /* Docu
1e170 6d 65 6e 74 20 74 65 72 6d 20 61 70 70 65 61 72  ment term appear
1e180 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  s in */.  int iC
1e190 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
1e1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1e1b0 75 6d 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73  umn term appears
1e1c0 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f   in */.  int iPo
1e1d0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1e1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
1e1f0 74 69 6f 6e 20 74 65 72 6d 20 61 70 70 65 61 72  tion term appear
1e200 73 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  s in */.  const 
1e210 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74  char *pTerm, int
1e220 20 6e 54 65 72 6d 20 20 20 20 2f 2a 20 54 65 72   nTerm    /* Ter
1e230 6d 20 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a  m at iPos */.){.
1e240 20 20 75 36 34 20 72 65 74 20 3d 20 30 3b 20 20    u64 ret = 0;  
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e260 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1e270 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b  e */.  int iIdx;
1e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e290 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74         /* For it
1e2a0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
1e2b0 69 6e 64 65 78 65 73 20 2a 2f 0a 0a 20 20 66 6f  indexes */..  fo
1e2c0 72 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 3d  r(iIdx=0; iIdx<=
1e2d0 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
1e2e0 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69  ; iIdx++){.    i
1e2f0 6e 74 20 6e 20 3d 20 28 28 69 49 64 78 3d 3d 70  nt n = ((iIdx==p
1e300 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 29  Config->nPrefix)
1e310 20 3f 20 6e 54 65 72 6d 20 3a 20 70 43 6f 6e 66   ? nTerm : pConf
1e320 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78  ig->aPrefix[iIdx
1e330 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 3d 6e  ]);.    if( n<=n
1e340 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  Term ){.      re
1e350 74 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  t ^= fts5IndexEn
1e360 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
1e370 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 65   iCol, iPos, pTe
1e380 72 6d 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  rm, n);.    }.  
1e390 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  }..  return ret;
1e3a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
1e3b0 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61 20   or remove data 
1e3c0 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 69  to or from the i
1e3d0 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65 20  ndex. Each time 
1e3e0 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a  a document is .*
1e3f0 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72 65  * added to or re
1e400 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69  moved from the i
1e410 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63 74  ndex, this funct
1e420 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ion is called on
1e430 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d  e or more.** tim
1e440 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  es..**.** For an
1e450 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73 74   insert, it must
1e460 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
1e470 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69  for each token i
1e480 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d 65  n the new docume
1e490 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  nt..** If the op
1e4a0 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65 6c  eration is a del
1e4b0 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ete, it must be 
1e4c0 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73 74  called (at least
1e4d0 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a  ) once for each.
1e4e0 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20  ** unique token 
1e4f0 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  in the document 
1e500 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c  with an iCol val
1e510 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  ue less than zer
1e520 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61  o. The iPos.** a
1e530 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72  rgument is ignor
1e540 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65 2e  ed for a delete.
1e550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
1e560 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a 20  ts5IndexWrite(. 
1e570 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69   /* Index to wri
1e5a0 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  te to */.  int i
1e5b0 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
1e5c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1e5d0 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61  lumn token appea
1e5e0 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65  rs in (-ve -> de
1e5f0 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69  lete) */.  int i
1e600 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Pos,            
1e610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1e620 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20  sition of token 
1e630 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f  within column */
1e640 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
1e650 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65  Token, int nToke
1e660 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61  n  /* Token to a
1e670 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20  dd or remove to 
1e680 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f  or from index */
1e690 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
1e6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6b0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
1e6c0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1e6d0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74   indexes */.  Ft
1e6e0 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
1e6f0 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
1e700 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
1e710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
1e720 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 68 61 73   /* Allocate has
1e730 68 20 74 61 62 6c 65 73 20 69 66 20 74 68 65 79  h tables if they
1e740 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64   have not alread
1e750 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
1e760 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 70 48   */.  if( p->apH
1e770 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ash==0 ){.    in
1e780 74 20 6e 48 61 73 68 20 3d 20 70 43 6f 6e 66 69  t nHash = pConfi
1e790 67 2d 3e 6e 50 72 65 66 69 78 20 2b 20 31 3b 0a  g->nPrefix + 1;.
1e7a0 20 20 20 20 70 2d 3e 61 70 48 61 73 68 20 3d 20      p->apHash = 
1e7b0 28 46 74 73 35 48 61 73 68 2a 2a 29 66 74 73 35  (Fts5Hash**)fts5
1e7c0 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
1e7d0 65 6f 66 28 46 74 73 35 48 61 73 68 2a 29 20 2a  eof(Fts5Hash*) *
1e7e0 20 6e 48 61 73 68 29 3b 0a 20 20 20 20 66 6f 72   nHash);.    for
1e7f0 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
1e800 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 48 61 73  ITE_OK && i<nHas
1e810 68 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  h; i++){.      p
1e820 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
1e830 73 35 48 61 73 68 4e 65 77 28 26 70 2d 3e 61 70  s5HashNew(&p->ap
1e840 48 61 73 68 5b 69 5d 2c 20 26 70 2d 3e 6e 50 65  Hash[i], &p->nPe
1e850 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 20 20  ndingData);.    
1e860 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  }.  }..  /* Add 
1e870 74 68 65 20 6e 65 77 20 74 6f 6b 65 6e 20 74 6f  the new token to
1e880 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20   the main terms 
1e890 68 61 73 68 20 74 61 62 6c 65 2e 20 41 6e 64 20  hash table. And 
1e8a0 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 20  to each of the. 
1e8b0 20 2a 2a 20 70 72 65 66 69 78 20 68 61 73 68 20   ** prefix hash 
1e8c0 74 61 62 6c 65 73 20 74 68 61 74 20 69 74 20 69  tables that it i
1e8d0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
1e8e0 6f 72 2e 20 2a 2f 0a 20 20 66 74 73 35 41 64 64  or. */.  fts5Add
1e8f0 54 65 72 6d 54 6f 48 61 73 68 28 70 2c 20 30 2c  TermToHash(p, 0,
1e900 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 6f   iCol, iPos, pTo
1e910 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ken, nToken);.  
1e920 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66  for(i=0; i<pConf
1e930 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b  ig->nPrefix; i++
1e940 29 7b 0a 20 20 20 20 69 66 28 20 6e 54 6f 6b 65  ){.    if( nToke
1e950 6e 3e 3d 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  n>=pConfig->aPre
1e960 66 69 78 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  fix[i] ){.      
1e970 66 74 73 35 41 64 64 54 65 72 6d 54 6f 48 61 73  fts5AddTermToHas
1e980 68 28 70 2c 20 69 2b 31 2c 20 69 43 6f 6c 2c 20  h(p, i+1, iCol, 
1e990 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c 20 70 43  iPos, pToken, pC
1e9a0 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69  onfig->aPrefix[i
1e9b0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ]);.    }.  }.. 
1e9c0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
1e9d0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
1e9e0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
1e9f0 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72  iterator to iter
1ea00 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 64  ate though all d
1ea10 6f 63 69 64 73 20 74 68 61 74 20 6d 61 74 63 68  ocids that match
1ea20 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69   the .** specifi
1ea30 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  ed token or toke
1ea40 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74  n prefix..*/.int
1ea50 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
1ea60 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e  xQuery(.  Fts5In
1ea70 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1ea80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1ea90 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20   index to query 
1eaa0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1eab0 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
1eac0 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f  ken, /* Token (o
1ead0 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65  r prefix) to que
1eae0 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
1eaf0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1eb10 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
1eb20 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a  _QUERY_X flags *
1eb30 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
1eb40 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20  r **ppIter      
1eb50 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
1eb60 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
1eb70 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  */.){.  Fts5Inde
1eb80 78 49 74 65 72 20 2a 70 52 65 74 3b 0a 20 20 69  xIter *pRet;.  i
1eb90 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 0a 20 20  nt iIdx = 0;..  
1eba0 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
1ebb0 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
1ebc0 49 58 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  IX ){.    Fts5Co
1ebd0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
1ebe0 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
1ebf0 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78  for(iIdx=1; iIdx
1ec00 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
1ec10 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20  ix; iIdx++){.   
1ec20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
1ec30 61 50 72 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d  aPrefix[iIdx-1]=
1ec40 3d 6e 54 6f 6b 65 6e 20 29 20 62 72 65 61 6b 3b  =nToken ) break;
1ec50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1ec60 49 64 78 3e 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  Idx>pConfig->nPr
1ec70 65 66 69 78 20 29 7b 0a 20 20 20 20 20 20 69 49  efix ){.      iI
1ec80 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  dx = -1;.    }. 
1ec90 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 28 46 74   }..  pRet = (Ft
1eca0 73 35 49 6e 64 65 78 49 74 65 72 2a 29 73 71 6c  s5IndexIter*)sql
1ecb0 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
1ecc0 72 6f 28 26 70 2d 3e 72 63 2c 20 73 69 7a 65 6f  ro(&p->rc, sizeo
1ecd0 66 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 29  f(Fts5IndexIter)
1ece0 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
1ecf0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74  .    memset(pRet
1ed00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1ed10 49 6e 64 65 78 49 74 65 72 29 29 3b 0a 0a 20 20  IndexIter));..  
1ed20 20 20 70 52 65 74 2d 3e 70 49 6e 64 65 78 20 3d    pRet->pIndex =
1ed30 20 70 3b 0a 20 20 20 20 69 66 28 20 69 49 64 78   p;.    if( iIdx
1ed40 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 52 65  >=0 ){.      pRe
1ed50 74 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73  t->pStruct = fts
1ed60 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
1ed70 2c 20 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69  , iIdx);.      i
1ed80 66 28 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74  f( pRet->pStruct
1ed90 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
1eda0 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
1edb0 70 52 65 74 2d 3e 70 53 74 72 75 63 74 2c 20 0a  pRet->pStruct, .
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 69 49 64 78              iIdx
1edd0 2c 20 66 6c 61 67 73 2c 20 28 63 6f 6e 73 74 20  , flags, (const 
1ede0 75 38 2a 29 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  u8*)pToken, nTok
1edf0 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74  en, -1, 0, &pRet
1ee00 2d 3e 70 4d 75 6c 74 69 0a 20 20 20 20 20 20 20  ->pMulti.       
1ee10 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
1ee20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1ee30 20 62 41 73 63 20 3d 20 28 66 6c 61 67 73 20 26   bAsc = (flags &
1ee40 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
1ee50 5f 41 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20  _ASC)!=0;.      
1ee60 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49  fts5SetupPrefixI
1ee70 74 65 72 28 70 2c 20 62 41 73 63 2c 20 28 63 6f  ter(p, bAsc, (co
1ee80 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65 6e 2c 20  nst u8*)pToken, 
1ee90 6e 54 6f 6b 65 6e 2c 20 70 52 65 74 29 3b 0a 20  nToken, pRet);. 
1eea0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1eeb0 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  p->rc ){.    sql
1eec0 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
1eed0 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52 65  e(pRet);.    pRe
1eee0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 70  t = 0;.  }.  *pp
1eef0 49 74 65 72 20 3d 20 70 52 65 74 3b 0a 20 20 72  Iter = pRet;.  r
1ef00 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
1ef10 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
1ef20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1ef30 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
1ef40 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
1ef50 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74  y argument is at
1ef60 20 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   EOF..*/.int sql
1ef70 69 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28  ite3Fts5IterEof(
1ef80 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
1ef90 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
1efa0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
1efb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
1efc0 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44  .  if( pIter->pD
1efd0 6f 63 6c 69 73 74 20 29 7b 20 0a 20 20 20 20 72  oclist ){ .    r
1efe0 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44 6f  eturn pIter->pDo
1eff0 63 6c 69 73 74 2d 3e 61 50 6f 73 6c 69 73 74 3d  clist->aPoslist=
1f000 3d 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  =0; .  }else{.  
1f010 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c    return fts5Mul
1f020 74 69 49 74 65 72 45 6f 66 28 70 49 74 65 72 2d  tiIterEof(pIter-
1f030 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e  >pIndex, pIter->
1f040 70 4d 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  pMulti);.  }.}..
1f050 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
1f060 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
1f070 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  rowid. .*/.int s
1f080 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
1f090 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  xt(Fts5IndexIter
1f0a0 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
1f0b0 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
1f0c0 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
1f0d0 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d   );.  if( pIter-
1f0e0 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  >pDoclist ){.   
1f0f0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
1f100 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 44 6f 63  Next(pIter->pDoc
1f110 6c 69 73 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  list);.  }else{.
1f120 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
1f130 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
1f140 73 74 29 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  st);.    fts5Mul
1f150 74 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  tiIterNext(pIter
1f160 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d  ->pIndex, pIter-
1f170 3e 70 4d 75 6c 74 69 2c 20 30 2c 20 30 29 3b 0a  >pMulti, 0, 0);.
1f180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
1f190 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
1f1a0 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
1f1b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
1f1c0 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
1f1d0 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72  rowid that occur
1f1e0 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d  s at or after iM
1f1f0 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66  atch. The.** def
1f200 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f  inition of "at o
1f210 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73  r after" depends
1f220 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73   on whether this
1f230 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74   iterator iterat
1f240 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  es.** in ascendi
1f250 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67  ng or descending
1f260 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f   rowid order..*/
1f270 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1f280 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73  IterNextFrom(Fts
1f290 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
1f2a0 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a  r, i64 iMatch){.
1f2b0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6f    if( pIter->pDo
1f2c0 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  clist ){.    ass
1f2d0 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 2f 2a  ert( 0 );.    /*
1f2e0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
1f2f0 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e  NextFrom(pIter->
1f300 70 44 6f 63 6c 69 73 74 2c 20 69 4d 61 74 63 68  pDoclist, iMatch
1f310 29 3b 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ); */.  }else{. 
1f320 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1f330 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e  NextFrom(pIter->
1f340 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
1f350 4d 75 6c 74 69 2c 20 69 4d 61 74 63 68 29 3b 0a  Multi, iMatch);.
1f360 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
1f370 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
1f380 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
1f390 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1f3a0 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a   current rowid..
1f3b0 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74  */.i64 sqlite3Ft
1f3c0 73 35 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  s5IterRowid(Fts5
1f3d0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1f3e0 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ){.  if( pIter->
1f3f0 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  pDoclist ){.    
1f400 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44  return pIter->pD
1f410 6f 63 6c 69 73 74 2d 3e 69 52 6f 77 69 64 3b 0a  oclist->iRowid;.
1f420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1f430 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65  urn fts5MultiIte
1f440 72 52 6f 77 69 64 28 70 49 74 65 72 2d 3e 70 4d  rRowid(pIter->pM
1f450 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ulti);.  }.}.../
1f460 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1f470 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
1f480 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63  r containing a c
1f490 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
1f4a0 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20  ion list for.** 
1f4b0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1f4c0 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  y. Output variab
1f4d0 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f  le *pn is set to
1f4e0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f4f0 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62   buffer .** in b
1f500 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75  ytes before retu
1f510 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rning..**.** The
1f520 20 72 65 74 75 72 6e 65 64 20 62 75 66 66 65 72   returned buffer
1f530 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
1f540 65 20 74 68 65 20 30 78 30 30 20 74 65 72 6d 69  e the 0x00 termi
1f550 6e 61 74 6f 72 20 62 79 74 65 20 73 74 6f 72 65  nator byte store
1f560 64 20 6f 6e 0a 2a 2a 20 64 69 73 6b 2e 0a 2a 2f  d on.** disk..*/
1f570 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1f580 49 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35  IterPoslist(Fts5
1f590 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1f5a0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c  , const u8 **pp,
1f5b0 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 61 73 73   int *pn){.  ass
1f5c0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
1f5d0 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
1f5e0 4b 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72  K );.  if( pIter
1f5f0 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  ->pDoclist ){.  
1f600 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70    *pn = pIter->p
1f610 44 6f 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c 69 73  Doclist->nPoslis
1f620 74 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74  t;.    *pp = pIt
1f630 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50  er->pDoclist->aP
1f640 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  oslist;.  }else{
1f650 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
1f660 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
1f670 78 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  x;.    fts5Buffe
1f680 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
1f690 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35  slist);.    fts5
1f6a0 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74  MultiIterPoslist
1f6b0 28 70 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74  (p, pIter->pMult
1f6c0 69 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f  i, 0, &pIter->po
1f6d0 73 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 6e 20  slist);.    *pn 
1f6e0 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
1f6f0 2e 6e 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49  .n;.    *pp = pI
1f700 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
1f710 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
1f720 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
1f730 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
1f740 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69  /*.** Close an i
1f750 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62  terator opened b
1f760 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
1f770 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  l to sqlite3Fts5
1f780 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f  IndexQuery()..*/
1f790 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
1f7a0 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49  5IterClose(Fts5I
1f7b0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
1f7c0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
1f7d0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
1f7e0 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  pDoclist ){.    
1f7f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f800 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e  Iter->pDoclist->
1f810 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
1f820 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 70 44  3_free(pIter->pD
1f830 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  oclist);.    }el
1f840 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  se{.      fts5Mu
1f850 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65  ltiIterFree(pIte
1f860 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
1f870 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  ->pMulti);.     
1f880 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1f890 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74  lease(pIter->pSt
1f8a0 72 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73  ruct);.      fts
1f8b0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
1f8c0 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
1f8d0 20 20 7d 0a 20 20 20 20 66 74 73 35 43 6c 6f 73    }.    fts5Clos
1f8e0 65 52 65 61 64 65 72 28 70 49 74 65 72 2d 3e 70  eReader(pIter->p
1f8f0 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
1f900 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
1f910 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1f920 61 64 20 74 68 65 20 22 61 76 65 72 61 67 65 73  ad the "averages
1f930 22 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  " record into th
1f940 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65  e buffer supplie
1f950 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
1f960 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  .** argument. Re
1f970 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1f980 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
1f990 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1f9a0 20 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65   code.** if an e
1f9b0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
1f9c0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1f9d0 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28  ndexGetAverages(
1f9e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1f9f0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b  s5Buffer *pBuf){
1fa00 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1fa10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1fa20 20 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42   fts5DataReadOrB
1fa30 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46  uffer(p, pBuf, F
1fa40 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
1fa50 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ID);.  return ft
1fa60 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
1fa70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  ;.}../*.** Repla
1fa80 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22  ce the current "
1fa90 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
1faa0 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
1fab0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
1fac0 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73   .** supplied as
1fad0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1fae0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1faf0 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
1fb00 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64  Averages(Fts5Ind
1fb10 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20  ex *p, const u8 
1fb20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
1fb30 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  a){.  assert( p-
1fb40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1fb50 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74  ;.  fts5DataWrit
1fb60 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47  e(p, FTS5_AVERAG
1fb70 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c  ES_ROWID, pData,
1fb80 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72   nData);.  retur
1fb90 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
1fba0 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
1fbb0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
1fbc0 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73  number of blocks
1fbd0 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73   this module has
1fbe0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
1fbf0 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73  _data.** table s
1fc00 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61  ince it was crea
1fc10 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
1fc20 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64  te3Fts5IndexRead
1fc30 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  s(Fts5Index *p){
1fc40 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65  .  return p->nRe
1fc50 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ad;.}../*.** Set
1fc60 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b   the 32-bit cook
1fc70 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ie value stored 
1fc80 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1fc90 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a  all structure .*
1fca0 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  * records to the
1fcb0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
1fcc0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1fcd0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ment..**.** Retu
1fce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1fcf0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1fd00 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1fd10 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
1fd20 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
1fd30 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
1fd40 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35  exSetCookie(Fts5
1fd50 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e  Index *p, int iN
1fd60 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ew){.  int rc = 
1fd70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
1fd80 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1fd90 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
1fda0 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 0a   u8 aCookie[4];.
1fdb0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
1fdc0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
1fdd0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
1fde0 33 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b  3Fts5Put32(aCook
1fdf0 69 65 2c 20 69 4e 65 77 29 3b 0a 20 20 66 6f 72  ie, iNew);.  for
1fe00 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
1fe10 5f 4f 4b 20 26 26 20 69 3c 3d 70 43 6f 6e 66 69  _OK && i<=pConfi
1fe20 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29  g->nPrefix; i++)
1fe30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  {.    sqlite3_bl
1fe40 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 20  ob *pBlob = 0;. 
1fe50 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1fe60 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1fe70 4f 57 49 44 28 69 29 3b 0a 20 20 20 20 72 63 20  OWID(i);.    rc 
1fe80 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
1fe90 70 65 6e 28 0a 20 20 20 20 20 20 20 20 70 43 6f  pen(.        pCo
1fea0 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69  nfig->db, pConfi
1feb0 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
1fec0 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52  Tbl, "block", iR
1fed0 6f 77 69 64 2c 20 31 2c 20 26 70 42 6c 6f 62 0a  owid, 1, &pBlob.
1fee0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
1fef0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ff00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
1ff10 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20  ob_write(pBlob, 
1ff20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a  aCookie, 4, 0);.
1ff30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ff40 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42  e3_blob_close(pB
1ff50 6c 6f 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lob);.    }.  }.
1ff60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ff70 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1ff80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ff90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ffa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ffb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1ffc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ffd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ffe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20000 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
20010 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
20020 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
20030 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
20040 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20  ode() scalar.** 
20050 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a  function only..*
20060 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  /../*.** Decode 
20070 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72  a segment-data r
20080 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  owid from the %_
20090 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73  data table. This
200a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
200b0 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20  the opposite of 
200c0 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45  macro FTS5_SEGME
200d0 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73  NT_ROWID()..*/.s
200e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
200f0 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36  ecodeRowid(.  i6
20100 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
20110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20120 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61   Rowid from %_da
20130 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ta table */.  in
20140 74 20 2a 70 69 49 64 78 2c 20 20 20 20 20 20 20  t *piIdx,       
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20160 20 4f 55 54 3a 20 49 6e 64 65 78 20 2a 2f 0a 20   OUT: Index */. 
20170 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20   int *piSegid,  
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74   /* OUT: Segment
201a0 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69   id */.  int *pi
201b0 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
201c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
201d0 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74   Height */.  int
201e0 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20 20   *piPgno        
201f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20200 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65 72  OUT: Page number
20210 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f   */.){.  *piPgno
20220 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
20230 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
20240 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20  S5_DATA_PAGE_B) 
20250 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  - 1));.  iRowid 
20260 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50 41  >>= FTS5_DATA_PA
20270 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67  GE_B;..  *piHeig
20280 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  ht = (int)(iRowi
20290 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
202a0 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
202b0 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
202c0 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
202d0 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a  A_HEIGHT_B;..  *
202e0 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28  piSegid = (int)(
202f0 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
20300 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
20310 44 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  D_B) - 1));.  iR
20320 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
20330 54 41 5f 49 44 5f 42 3b 0a 0a 20 20 2a 70 69 49  TA_ID_B;..  *piI
20340 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  dx = (int)(iRowi
20350 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
20360 46 54 53 35 5f 44 41 54 41 5f 49 44 58 5f 42 29  FTS5_DATA_IDX_B)
20370 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69   - 1));.}..stati
20380 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
20390 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20  Rowid(int *pRc, 
203a0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
203b0 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69  , i64 iKey){.  i
203c0 6e 74 20 69 49 64 78 2c 69 53 65 67 69 64 2c 69  nt iIdx,iSegid,i
203d0 48 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f  Height,iPgno;  /
203e0 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e  * Rowid compenen
203f0 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f  ts */.  fts5Deco
20400 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69  deRowid(iKey, &i
20410 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20 26 69  Idx, &iSegid, &i
20420 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b  Height, &iPgno);
20430 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d  ..  if( iSegid==
20440 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65  0 ){.    if( iKe
20450 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  y==FTS5_AVERAGES
20460 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
20470 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
20480 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
20490 63 2c 20 70 42 75 66 2c 20 22 28 61 76 65 72 61  c, pBuf, "(avera
204a0 67 65 73 29 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ges) ");.    }el
204b0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
204c0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
204d0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
204e0 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 7b  f, .          "{
204f0 73 74 72 75 63 74 75 72 65 20 69 64 78 3d 25 64  structure idx=%d
20500 7d 22 2c 20 28 69 6e 74 29 28 69 4b 65 79 2d 31  }", (int)(iKey-1
20510 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
20520 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  }.  }.  else if(
20530 20 69 48 65 69 67 68 74 3d 3d 46 54 53 35 5f 53   iHeight==FTS5_S
20540 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48  EGMENT_MAX_HEIGH
20550 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
20560 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
20570 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
20580 2c 20 22 28 64 6c 69 64 78 20 69 64 78 3d 25 64  , "(dlidx idx=%d
20590 20 73 65 67 69 64 3d 25 64 20 70 67 6e 6f 3d 25   segid=%d pgno=%
205a0 64 29 22 2c 0a 20 20 20 20 20 20 20 20 69 49 64  d)",.        iId
205b0 78 2c 20 69 53 65 67 69 64 2c 20 69 50 67 6e 6f  x, iSegid, iPgno
205c0 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
205d0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
205e0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
205f0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28  tf(pRc, pBuf, "(
20600 69 64 78 3d 25 64 20 73 65 67 69 64 3d 25 64 20  idx=%d segid=%d 
20610 68 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a  h=%d pgno=%d)",.
20620 20 20 20 20 20 20 20 20 69 49 64 78 2c 20 69 53          iIdx, iS
20630 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69  egid, iHeight, i
20640 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Pgno.    );.  }.
20650 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
20660 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
20670 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20690 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
206a0 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
206b0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
206c0 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
206d0 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c  e *p.){.  int iL
206e0 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20  vl, iSeg;       
206f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
20700 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
20710 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f  els, segments */
20720 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20  ..  for(iLvl=0; 
20730 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20  iLvl<p->nLevel; 
20740 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73  iLvl++){.    Fts
20750 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
20760 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76  *pLvl = &p->aLev
20770 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71  el[iLvl];.    sq
20780 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
20790 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
207a0 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20   pBuf, .        
207b0 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65  " {lvl=%d nMerge
207c0 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  =%d", iLvl, pLvl
207d0 2d 3e 6e 4d 65 72 67 65 0a 20 20 20 20 29 3b 0a  ->nMerge.    );.
207e0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
207f0 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
20800 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
20810 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
20820 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
20830 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
20840 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
20850 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
20860 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a  ntf(pRc, pBuf, .
20870 20 20 20 20 20 20 20 20 20 20 22 20 7b 69 64 3d            " {id=
20880 25 64 20 68 3d 25 64 20 6c 65 61 76 65 73 3d 25  %d h=%d leaves=%
20890 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67 2d 3e 69  d..%d}", pSeg->i
208a0 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 6e 48 65  Segid, pSeg->nHe
208b0 69 67 68 74 2c 20 0a 20 20 20 20 20 20 20 20 20  ight, .         
208c0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
208d0 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  , pSeg->pgnoLast
208e0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
208f0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
20900 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
20910 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22  f(pRc, pBuf, "}"
20920 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
20930 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
20940 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
20950 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
20960 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
20970 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
20980 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65  tain a serialize
20990 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  d Fts5Structure 
209a0 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20  object. This.** 
209b0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
209c0 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
209d0 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
209e0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a   of the same obj
209f0 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75  ect.** to the bu
20a00 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74  ffer passed as t
20a10 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
20a20 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nt. .*/.static v
20a30 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74  oid fts5DecodeSt
20a40 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a  ructure(.  int *
20a50 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
20a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
20a70 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
20a80 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
20a90 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20   *pBuf,.  const 
20aa0 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  u8 *pBlob, int n
20ab0 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Blob.){.  int rc
20ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
20ae0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
20af0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d  s5Structure *p =
20b00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
20b10 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75   Decoded structu
20b20 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  re object */..  
20b30 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
20b40 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20  reDecode(pBlob, 
20b50 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20  nBlob, 0, &p);. 
20b60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20b70 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  OK ){.    *pRc =
20b80 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
20b90 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75  .  }..  fts5Debu
20ba0 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20  gStructure(pRc, 
20bb0 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35  pBuf, p);.  fts5
20bc0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
20bd0 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75  (p);.}../*.** Bu
20be0 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73  ffer (a/n) is as
20bf0 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
20c00 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61   a list of seria
20c10 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52  lized varints. R
20c20 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69  ead.** each vari
20c30 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74  nt and append it
20c40 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  s string represe
20c50 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65  ntation to buffe
20c60 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a  r pBuf. Return.*
20c70 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20 74  * after either t
20c80 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 20  he input buffer 
20c90 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72 20  is exhausted or 
20ca0 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65 61  a 0 value is rea
20cb0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
20cc0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
20cd0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
20ce0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69   read from the i
20cf0 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  nput buffer..*/.
20d00 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
20d10 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74  ecodePoslist(int
20d20 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65   *pRc, Fts5Buffe
20d30 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75  r *pBuf, const u
20d40 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  8 *a, int n){.  
20d50 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20  int iOff = 0;.  
20d60 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
20d70 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20  .    int iVal;. 
20d80 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
20d90 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
20da0 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   iVal);.    sqli
20db0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
20dc0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
20dd0 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c  Buf, " %d", iVal
20de0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20df0 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
20e00 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66  he start of buff
20e10 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e  er (a/n) contain
20e20 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
20e30 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f   doclist. The do
20e40 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20  clist.** may or 
20e50 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77  may not finish w
20e60 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
20e70 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
20e80 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a  appends a text.*
20e90 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  * representation
20ea0 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20   of the part of 
20eb0 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74  the doclist that
20ec0 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62   is present to b
20ed0 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a  uffer.** pBuf. .
20ee0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
20ef0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
20f00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
20f10 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
20f20 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
20f30 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
20f40 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70  deDoclist(int *p
20f50 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
20f60 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
20f70 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34  a, int n){.  i64
20f80 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74 20 69   iDocid;.  int i
20f90 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Off = 0;..  if( 
20fa0 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 4f  iOff<n ){.    iO
20fb0 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74  ff += sqlite3Get
20fc0 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
20fd0 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b   (u64*)&iDocid);
20fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
20ff0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
21000 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
21010 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f  rowid=%lld", iDo
21020 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  cid);.  }.  whil
21030 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
21040 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69   int nPos;.    i
21050 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
21060 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 50 6f  32(&a[iOff], nPo
21070 73 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  s);.    iOff += 
21080 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
21090 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b  t(pRc, pBuf, &a[
210a0 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66  iOff], MIN(n-iOf
210b0 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69  f, nPos));.    i
210c0 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
210d0 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
210e0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
210f0 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
21100 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
21110 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66  Delta);.      if
21120 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65  ( iDelta==0 ) re
21130 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20 20  turn iOff;.     
21140 20 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c 74   iDocid -= iDelt
21150 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
21160 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
21170 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
21180 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c  , " rowid=%lld",
21190 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a   iDocid);.    }.
211a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f    }..  return iO
211b0 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ff;.}../*.** The
211c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
211d0 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
211e0 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
211f0 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a  fts5_decode()..*
21200 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
21210 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
21220 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
21230 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
21240 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
21250 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
21260 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21290 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
212a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
212b0 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
212c0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
212d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
212e0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
212f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21300 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72    /* Rowid for r
21310 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f  ecord being deco
21320 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ded */.  int iId
21330 78 2c 69 53 65 67 69 64 2c 69 48 65 69 67 68 74  x,iSegid,iHeight
21340 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f 77 69  ,iPgno;  /* Rowi
21350 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a  d components */.
21360 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20 69    const u8 *a; i
21370 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
21380 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64    /* Record to d
21390 65 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42  ecode */.  Fts5B
213a0 75 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20  uffer s;        
213b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
213c0 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72  ild up text to r
213d0 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20  eturn here */.  
213e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
213f0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
21400 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21410 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  /..  assert( nAr
21420 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74  g==2 );.  memset
21430 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
21440 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
21450 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
21460 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61  value_int64(apVa
21470 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  l[0]);.  n = sql
21480 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
21490 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 20  (apVal[1]);.  a 
214a0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
214b0 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  blob(apVal[1]);.
214c0 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
214d0 64 28 69 52 6f 77 69 64 2c 20 26 69 49 64 78 2c  d(iRowid, &iIdx,
214e0 20 26 69 53 65 67 69 64 2c 20 26 69 48 65 69 67   &iSegid, &iHeig
214f0 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
21500 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26  fts5DebugRowid(&
21510 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b  rc, &s, iRowid);
21520 0a 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d  .  if( iHeight==
21530 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58  FTS5_SEGMENT_MAX
21540 5f 48 45 49 47 48 54 20 29 7b 0a 20 20 20 20 69  _HEIGHT ){.    i
21550 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 36  nt i = 0;.    i6
21560 34 20 69 50 72 65 76 3b 0a 20 20 20 20 69 66 28  4 iPrev;.    if(
21570 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 20   n>0 ){.      i 
21580 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69  = getVarint(&a[i
21590 5d 2c 20 28 75 36 34 2a 29 26 69 50 72 65 76 29  ], (u64*)&iPrev)
215a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
215b0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
215c0 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22  rintf(&rc, &s, "
215d0 20 25 6c 6c 64 22 2c 20 69 50 72 65 76 29 3b 0a   %lld", iPrev);.
215e0 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
215f0 20 69 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36   i<n ){.      i6
21600 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 20  4 iVal;.      i 
21610 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b  += getVarint(&a[
21620 69 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29  i], (u64*)&iVal)
21630 3b 0a 20 20 20 20 20 20 69 66 28 20 69 56 61 6c  ;.      if( iVal
21640 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
21650 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
21660 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
21670 2c 20 26 73 2c 20 22 20 78 22 29 3b 0a 20 20 20  , &s, " x");.   
21680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21690 20 20 69 50 72 65 76 20 3d 20 69 50 72 65 76 20    iPrev = iPrev 
216a0 2d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  - iVal;.        
216b0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
216c0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
216d0 63 2c 20 26 73 2c 20 22 20 25 6c 6c 64 22 2c 20  c, &s, " %lld", 
216e0 69 50 72 65 76 29 3b 0a 20 20 20 20 20 20 7d 0a  iPrev);.      }.
216f0 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 0a 20      }..  }else. 
21700 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
21710 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  {.    if( iRowid
21720 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  ==FTS5_AVERAGES_
21730 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  ROWID ){.      /
21740 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 7d 65  * todo */.    }e
21750 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44  lse{.      fts5D
21760 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 26  ecodeStructure(&
21770 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20  rc, &s, a, n);. 
21780 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20     }.  }else{.. 
21790 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65     Fts5Buffer te
217a0 72 6d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  rm;.    memset(&
217b0 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  term, 0, sizeof(
217c0 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20  Fts5Buffer));.. 
217d0 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d     if( iHeight==
217e0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
217f0 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20  TermOff = 0;.   
21800 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
21810 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
21820 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  iOff;.      int 
21830 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20  nKeep = 0;..    
21840 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
21850 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b  s5GetU16(&a[0]);
21860 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20  .      iTermOff 
21870 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
21880 32 5d 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  2]);..      if( 
21890 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20  iRowidOff ){.   
218a0 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77       iOff = iRow
218b0 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  idOff;.      }el
218c0 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 20  se if( iTermOff 
218d0 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
218e0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20  = iTermOff;.    
218f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21900 20 69 4f 66 66 20 3d 20 6e 3b 0a 20 20 20 20 20   iOff = n;.     
21910 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44 65 63   }.      fts5Dec
21920 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20  odePoslist(&rc, 
21930 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d  &s, &a[4], iOff-
21940 34 29 3b 0a 0a 0a 20 20 20 20 20 20 61 73 73 65  4);...      asse
21950 72 74 28 20 69 52 6f 77 69 64 4f 66 66 3d 3d 30  rt( iRowidOff==0
21960 20 7c 7c 20 69 4f 66 66 3d 3d 69 52 6f 77 69 64   || iOff==iRowid
21970 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Off );.      if(
21980 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20   iRowidOff ){.  
21990 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
219a0 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28  s5DecodeDoclist(
219b0 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
219c0 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20  ], n-iOff);.    
219d0 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
219e0 74 28 20 69 54 65 72 6d 4f 66 66 3d 3d 30 20 7c  t( iTermOff==0 |
219f0 7c 20 69 4f 66 66 3d 3d 69 54 65 72 6d 4f 66 66  | iOff==iTermOff
21a00 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   );.      while(
21a10 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
21a20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
21a30 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65        iOff += ge
21a40 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
21a50 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
21a60 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65 65      term.n= nKee
21a70 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  p;.        fts5B
21a80 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
21a90 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74  &rc, &term, nByt
21aa0 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  e, &a[iOff]);.  
21ab0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42        iOff += nB
21ac0 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  yte;..        sq
21ad0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
21ae0 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20  ppendPrintf(.   
21af0 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73           &rc, &s
21b00 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20  , " term=%.*s", 
21b10 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63  term.n, (const c
21b20 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20  har*)term.p.    
21b30 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
21b40 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
21b50 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
21b60 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f  , &a[iOff], n-iO
21b70 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ff);.        if(
21b80 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
21b90 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74       iOff += get
21ba0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
21bb0 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  ], nKeep);.     
21bc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21bd0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
21be0 65 28 26 74 65 72 6d 29 3b 0a 20 20 20 20 7d 65  e(&term);.    }e
21bf0 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 4e  lse{.      Fts5N
21c00 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20  odeIter ss;.    
21c10 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65 49 74    for(fts5NodeIt
21c20 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 73 73  erInit(a, n, &ss
21c30 29 3b 20 73 73 2e 61 44 61 74 61 3b 20 66 74 73  ); ss.aData; fts
21c40 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 72  5NodeIterNext(&r
21c50 63 2c 20 26 73 73 29 29 7b 0a 20 20 20 20 20 20  c, &ss)){.      
21c60 20 20 69 66 28 20 73 73 2e 74 65 72 6d 2e 6e 3d    if( ss.term.n=
21c70 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21c80 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
21c90 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
21ca0 63 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d 25 64  c, &s, " left=%d
21cb0 22 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b 0a 20  ", ss.iChild);. 
21cc0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21cd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
21ce0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
21cf0 72 69 6e 74 66 28 26 72 63 2c 26 73 2c 20 22 20  rintf(&rc,&s, " 
21d00 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20 20 20  \"%.*s\"", .    
21d10 20 20 20 20 20 20 20 20 20 20 73 73 2e 74 65 72            ss.ter
21d20 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 0a 20  m.n, ss.term.p. 
21d30 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
21d40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21d50 28 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b 0a 20  ( ss.nEmpty ){. 
21d60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21d70 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
21d80 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20  Printf(&rc, &s, 
21d90 22 20 65 6d 70 74 79 3d 25 64 25 73 22 2c 20 73  " empty=%d%s", s
21da0 73 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20 20 20  s.nEmpty,.      
21db0 20 20 20 20 20 20 20 20 73 73 2e 62 44 6c 69 64          ss.bDlid
21dc0 78 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20 20 20  x ? "*" : "".   
21dd0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
21de0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
21df0 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72    fts5NodeIterFr
21e00 65 65 28 26 73 73 29 3b 0a 20 20 20 20 7d 0a 20  ee(&ss);.    }. 
21e10 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
21e20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21e30 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
21e40 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73  text(pCtx, (cons
21e50 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e  t char*)s.p, s.n
21e60 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
21e70 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
21e80 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
21e90 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78  _error_code(pCtx
21ea0 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73  , rc);.  }.  fts
21eb0 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b  5BufferFree(&s);
21ec0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
21ed0 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
21ee0 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67  t of registering
21ef0 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65   the FTS5 module
21f00 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a   with database.*
21f10 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
21f20 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65   It registers se
21f30 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e  veral user-defin
21f40 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
21f50 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69  ons useful.** wi
21f60 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49  th FTS5..**.** I
21f70 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
21f80 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
21f90 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
21fa0 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74   occurs, some ot
21fb0 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72  her.** SQLite er
21fc0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
21fd0 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  rned instead..*/
21fe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
21ff0 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65  IndexInit(sqlite
22000 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
22010 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
22020 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20  e_function(.    
22030 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f    db, "fts5_deco
22040 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  de", 2, SQLITE_U
22050 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f  TF8, 0, fts5Deco
22060 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  deFunction, 0, 0
22070 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
22080 63 3b 0a 7d 0a 0a                                c;.}..