/ Hex Artifact Content
Login

Artifact 4e612b2c91a57ec770869b6cc89caeec0f658107:


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 69 6e  se order */.  in
3d30: 74 20 62 53 6b 69 70 45 6d 70 74 79 3b 20 20 20  t bSkipEmpty;   
3d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d50: 20 54 72 75 65 20 74 6f 20 73 6b 69 70 20 64 65   True to skip de
3d60: 6c 65 74 65 64 20 65 6e 74 72 69 65 73 20 2a 2f  leted entries */
3d70: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
3d80: 61 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  aSeg;           
3d90: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
3da0: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
3db0: 20 2a 2f 0a 20 20 75 31 36 20 2a 61 46 69 72 73   */.  u16 *aFirs
3dc0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3dd0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
3de0: 20 6d 65 72 67 65 20 73 74 61 74 65 20 28 73 65   merge state (se
3df0: 65 20 61 62 6f 76 65 29 20 2a 2f 0a 7d 3b 0a 0a  e above) */.};..
3e00: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
3e10: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
3e20: 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  gh a single segm
3e30: 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61  ent, visiting ea
3e40: 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 0a 2a 2a  ch term/docid.**
3e50: 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67   pair in the seg
3e60: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67  ment..**.** pSeg
3e70: 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65  :.**   The segme
3e80: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
3e90: 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  rough..**.** iLe
3ea0: 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72  afPgno:.**   Cur
3eb0: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
3ec0: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67  umber within seg
3ed0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ment..**.** iLea
3ee0: 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79  fOffset:.**   By
3ef0: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
3f00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
3f10: 66 20 74 68 61 74 20 69 73 20 6f 6e 65 20 62 79  f that is one by
3f20: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
3f30: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 72 6f 77 69  of the.**   rowi
3f40: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  d field of the c
3f50: 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73  urrent entry. Us
3f60: 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68  ually this is th
3f70: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e size field of 
3f80: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
3f90: 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65  n list data. The
3fa0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
3fb0: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
3fc0: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
3fd0: 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61   .**   is the la
3fe0: 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20  st thing on the 
3ff0: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
4000: 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66   pLeaf:.**   Buf
4010: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
4020: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
4030: 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55   data. Set to NU
4040: 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  LL at EOF..**.**
4050: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20   iTermLeafPgno, 
4060: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a  iTermLeafOffset:
4070: 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20  .**   Leaf page 
4080: 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e  number containin
4090: 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  g the last term 
40a0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65  read from the se
40b0: 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20  gment. And.**   
40c0: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
40d0: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
40e0: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a   the term data..
40f0: 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20  **.** flags:.** 
4100: 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53    Mask of FTS5_S
4110: 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65  EGITER_XXX value
4120: 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61  s. Interpreted a
4130: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
4140: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
4150: 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20  ONETERM:.**     
4160: 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  If set, set the 
4170: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
4180: 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74  t to EOF after t
4190: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
41a0: 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  st .**     has b
41b0: 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44  een exhausted. D
41c0: 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f  o not proceed to
41d0: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69   the next term i
41e0: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
41f0: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
4200: 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20  TER_REVERSE:.** 
4210: 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73      This flag is
4220: 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69   only ever set i
4230: 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  f FTS5_SEGITER_O
4240: 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73  NETERM is also s
4250: 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74  et. If.**     it
4260: 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65   is set, iterate
4270: 20 74 68 72 6f 75 67 68 20 64 6f 63 69 64 73 20   through docids 
4280: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
4290: 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  er instead of th
42a0: 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c 74  e.**     default
42b0: 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64 65   descending orde
42c0: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
42d0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
42e0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
42f0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
4300: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
4310: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4320: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
4330: 2a 2a 0a 2a 2a 20 20 20 20 20 45 61 63 68 20 74  **.**     Each t
4340: 69 6d 65 20 61 20 6e 65 77 20 70 61 67 65 20 69  ime a new page i
4350: 73 20 6c 6f 61 64 65 64 2c 20 74 68 65 20 69 74  s loaded, the it
4360: 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  erator is set to
4370: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a   point to the.**
4380: 20 20 20 20 20 66 69 6e 61 6c 20 72 6f 77 69 64       final rowid
4390: 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
43a0: 74 68 65 20 61 52 6f 77 69 64 4f 66 66 73 65 74  the aRowidOffset
43b0: 5b 5d 20 61 72 72 61 79 20 69 73 20 70 6f 70 75  [] array is popu
43c0: 6c 61 74 65 64 20 0a 2a 2a 20 20 20 20 20 77 69  lated .**     wi
43d0: 74 68 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  th the byte offs
43e0: 65 74 73 20 6f 66 20 61 6c 6c 20 72 65 6c 65 76  ets of all relev
43f0: 61 6e 74 20 72 6f 77 69 64 20 66 69 65 6c 64 73  ant rowid fields
4400: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 0a 2a   on the page. .*
4410: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67  /.struct Fts5Seg
4420: 49 74 65 72 20 7b 0a 20 20 46 74 73 35 53 74 72  Iter {.  Fts5Str
4430: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
4440: 53 65 67 3b 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg;     /* Segm
4450: 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ent to iterate t
4460: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20  hrough */.  int 
4470: 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
4480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
4490: 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69  yte offset withi
44a0: 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a  n current leaf *
44b0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44d0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
44e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
44f0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
4500: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4510: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4520: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4530: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4540: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4550: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4560: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4570: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
4580: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
4590: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
45a0: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
45b0: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
45c0: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
45d0: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
45e0: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
45f0: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
4600: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
4610: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
4620: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
4630: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
4640: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
4650: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
4660: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
4670: 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  t;..  /* The fol
4680: 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20  lowing are only 
4690: 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35  used if the FTS5
46a0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
46b0: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f   flag is set. */
46c0: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
46d0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
46e0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e     /* Current en
46f0: 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66  try in aRowidOff
4700: 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  set[] */.  int n
4710: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4730: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4740: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
4750: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  rray */.  int *a
4760: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
4780: 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20  ay of offset to 
4790: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a  rowid fields */.
47a0: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
47b0: 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20   *pDlidx;       
47c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
47d0: 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
47e0: 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61  x */..  /* Varia
47f0: 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62  bles populated b
4800: 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20  ased on current 
4810: 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35  entry. */.  Fts5
4820: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
4830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4840: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
4850: 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
4880: 64 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65  d */.};..#define
4890: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
48a0: 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65 66 69  ETERM 0x01.#defi
48b0: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
48c0: 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a 0a 2f  REVERSE 0x02.../
48d0: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
48e0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
48f0: 68 20 70 61 67 69 6e 61 74 65 64 20 64 61 74 61  h paginated data
4900: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
4910: 43 68 75 6e 6b 49 74 65 72 20 7b 0a 20 20 46 74  ChunkIter {.  Ft
4920: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20  s5Data *pLeaf;  
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4940: 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61   Current leaf da
4950: 74 61 2e 20 4e 55 4c 4c 20 2d 3e 20 45 4f 46 2e  ta. NULL -> EOF.
4960: 20 2a 2f 0a 20 20 69 36 34 20 69 4c 65 61 66 52   */.  i64 iLeafR
4970: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
4980: 20 20 20 20 20 20 2f 2a 20 41 62 73 6f 6c 75 74        /* Absolut
4990: 65 20 72 6f 77 69 64 20 6f 66 20 63 75 72 72 65  e rowid of curre
49a0: 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74  nt leaf */.  int
49b0: 20 6e 52 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nRem;          
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49d0: 52 65 6d 61 69 6e 69 6e 67 20 62 79 74 65 73 20  Remaining bytes 
49e0: 6f 66 20 64 61 74 61 20 74 6f 20 72 65 61 64 20  of data to read 
49f0: 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  */..  /* Output 
4a00: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
4a10: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 68  /* Pointer to ch
4a40: 75 6e 6b 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20  unk of data */. 
4a50: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
4a80: 65 72 20 70 20 69 6e 20 62 79 74 65 73 20 2a 2f  er p in bytes */
4a90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  .};../*.** Objec
4aa0: 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20  t for iterating 
4ab0: 74 68 72 6f 75 67 68 20 61 20 73 69 6e 67 6c 65  through a single
4ac0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f   position list o
4ad0: 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 72 75 63  n disk..*/.struc
4ae0: 74 20 46 74 73 35 50 6f 73 49 74 65 72 20 7b 0a  t Fts5PosIter {.
4af0: 20 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20    Fts5ChunkIter 
4b00: 63 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  chunk;          
4b10: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 63 68 75    /* Current chu
4b20: 6e 6b 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  nk of data */.  
4b30: 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b50: 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e  /* Offset within
4b60: 20 63 68 75 6e 6b 20 64 61 74 61 20 2a 2f 0a 0a   chunk data */..
4b70: 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 69 6e    int iCol;.  in
4b80: 74 20 69 50 6f 73 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  t iPos;.};../*.*
4b90: 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65  * Object for ite
4ba0: 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74  rating through t
4bb0: 68 65 20 63 6f 6e 65 6e 74 73 20 6f 66 20 61 20  he conents of a 
4bc0: 73 69 6e 67 6c 65 20 69 6e 74 65 72 6e 61 6c 20  single internal 
4bd0: 6e 6f 64 65 20 69 6e 20 0a 2a 2a 20 6d 65 6d 6f  node in .** memo
4be0: 72 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  ry..*/.struct Ft
4bf0: 73 35 4e 6f 64 65 49 74 65 72 20 7b 0a 20 20 2f  s5NodeIter {.  /
4c00: 2a 20 49 6e 74 65 72 6e 61 6c 2e 20 53 65 74 20  * Internal. Set 
4c10: 61 6e 64 20 6d 61 6e 61 67 65 64 20 62 79 20 66  and managed by f
4c20: 74 73 35 4e 6f 64 65 49 74 65 72 58 58 58 28 29  ts5NodeIterXXX()
4c30: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 45 78 63 65   functions. Exce
4c40: 70 74 2c 20 0a 20 20 2a 2a 20 74 68 65 20 45 4f  pt, .  ** the EO
4c50: 46 20 74 65 73 74 20 66 6f 72 20 74 68 65 20 69  F test for the i
4c60: 74 65 72 61 74 6f 72 20 69 73 20 28 46 74 73 35  terator is (Fts5
4c70: 4e 6f 64 65 49 74 65 72 2e 61 44 61 74 61 3d 3d  NodeIter.aData==
4c80: 30 29 2e 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  0).  */.  const 
4c90: 75 38 20 2a 61 44 61 74 61 3b 0a 20 20 69 6e 74  u8 *aData;.  int
4ca0: 20 6e 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 4f   nData;.  int iO
4cb0: 66 66 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ff;..  /* Output
4cc0: 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a 20 20   variables */.  
4cd0: 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
4ce0: 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b 0a 20  .  int nEmpty;. 
4cf0: 20 69 6e 74 20 69 43 68 69 6c 64 3b 0a 20 20 69   int iChild;.  i
4d00: 6e 74 20 62 44 6c 69 64 78 3b 0a 7d 3b 0a 0a 2f  nt bDlidx;.};../
4d10: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
4d20: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4d30: 67 20 74 79 70 65 20 69 73 20 75 73 65 64 20 74  g type is used t
4d40: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
4d50: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  h the contents.*
4d60: 2a 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2d 69  * of a doclist-i
4d70: 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ndex record..**.
4d80: 2a 2a 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 52  ** pData:.**   R
4d90: 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 69 6e 67  ecord containing
4da0: 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
4db0: 65 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62  ex data..**.** b
4dc0: 45 6f 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f  Eof:.**   Set to
4dd0: 20 74 72 75 65 20 6f 6e 63 65 20 69 74 65 72 61   true once itera
4de0: 74 6f 72 20 68 61 73 20 72 65 61 63 68 65 64 20  tor has reached 
4df0: 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a  EOF..**.** iOff:
4e00: 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 68 65  .**   Set to the
4e10: 20 63 75 72 72 65 6e 74 20 6f 66 66 73 65 74 20   current offset 
4e20: 77 69 74 68 69 6e 20 72 65 63 6f 72 64 20 70 44  within record pD
4e30: 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  ata..*/.struct F
4e40: 74 73 35 44 6c 69 64 78 49 74 65 72 20 7b 0a 20  ts5DlidxIter {. 
4e50: 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
4e60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4e70: 2a 20 44 61 74 61 20 66 6f 72 20 64 6f 63 6c 69  * Data for docli
4e80: 73 74 20 69 6e 64 65 78 2c 20 69 66 20 61 6e 79  st index, if any
4e90: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
4ec0: 66 66 73 65 74 20 69 6e 74 6f 20 70 44 6c 69 64  ffset into pDlid
4ed0: 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b  x */.  int bEof;
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61       /* At EOF a
4f00: 6c 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20  lready */.  int 
4f10: 69 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20  iFirstOff;      
4f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
4f30: 64 20 62 79 20 72 65 76 65 72 73 65 20 69 74 65  d by reverse ite
4f40: 72 61 74 6f 72 73 20 6f 6e 6c 79 20 2a 2f 0a 0a  rators only */..
4f50: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
4f60: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ables */.  int i
4f70: 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20  LeafPgno;       
4f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4f90: 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   number of curre
4fa0: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  nt leaf page */.
4fb0: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 2f 2a 20 46 69 72 73 74 20 72 6f 77 69 64 20 6f  /* First rowid o
4fe0: 6e 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f  n leaf iLeafPgno
4ff0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
5000: 6e 20 46 74 73 35 42 74 72 65 65 49 74 65 72 20  n Fts5BtreeIter 
5010: 6f 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74  object is used t
5020: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
5030: 68 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e  h all entries in
5040: 20 74 68 65 0a 2a 2a 20 62 2d 74 72 65 65 20 68   the.** b-tree h
5050: 69 65 72 61 72 63 68 79 20 62 65 6c 6f 6e 67 69  ierarchy belongi
5060: 6e 67 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 66  ng to a single f
5070: 74 73 35 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20  ts5 segment. In 
5080: 74 68 69 73 20 63 61 73 65 20 74 68 65 0a 2a 2a  this case the.**
5090: 20 22 62 2d 74 72 65 65 20 68 69 65 72 61 72 63   "b-tree hierarc
50a0: 68 79 22 20 69 73 20 61 6c 6c 20 62 2d 74 72 65  hy" is all b-tre
50b0: 65 20 6e 6f 64 65 73 20 65 78 63 65 70 74 20 6c  e nodes except l
50c0: 65 61 76 65 73 2e 20 45 61 63 68 20 65 6e 74 72  eaves. Each entr
50d0: 79 20 69 6e 20 74 68 65 0a 2a 2a 20 62 2d 74 72  y in the.** b-tr
50e0: 65 65 20 68 69 65 72 61 72 63 68 79 20 63 6f 6e  ee hierarchy con
50f0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 66 6f 6c  sists of the fol
5100: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
5110: 69 4c 65 61 66 3a 20 20 54 68 65 20 70 61 67 65  iLeaf:  The page
5120: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6c   number of the l
5130: 65 61 66 20 70 61 67 65 20 74 68 65 20 65 6e 74  eaf page the ent
5140: 72 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ry points to..**
5150: 0a 2a 2a 20 20 20 74 65 72 6d 3a 20 20 20 41 20  .**   term:   A 
5160: 73 70 6c 69 74 2d 6b 65 79 20 74 68 61 74 20 61  split-key that a
5170: 6c 6c 20 74 65 72 6d 73 20 6f 6e 20 6c 65 61 66  ll terms on leaf
5180: 20 70 61 67 65 20 24 69 4c 65 61 66 20 6d 75 73   page $iLeaf mus
5190: 74 20 62 65 20 67 72 65 61 74 65 72 0a 2a 2a 20  t be greater.** 
51a0: 20 20 20 20 20 20 20 20 20 20 74 68 61 6e 20 6f            than o
51b0: 72 20 65 71 75 61 6c 20 74 6f 2e 20 54 68 65 20  r equal to. The 
51c0: 22 74 65 72 6d 22 20 61 73 73 6f 63 69 61 74 65  "term" associate
51d0: 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
51e0: 20 62 2d 74 72 65 65 0a 2a 2a 20 20 20 20 20 20   b-tree.**      
51f0: 20 20 20 20 20 68 69 65 72 61 72 63 68 79 20 65       hierarchy e
5200: 6e 74 72 79 20 28 74 68 65 20 6f 6e 65 20 74 68  ntry (the one th
5210: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 6c 65 61  at points to lea
5220: 66 20 70 61 67 65 20 31 29 20 69 73 20 61 6c 77  f page 1) is alw
5230: 61 79 73 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ays .**         
5240: 20 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e    an empty strin
5250: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 6e 45 6d 70 74  g..**.**   nEmpt
5260: 79 3a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  y: The number of
5270: 20 65 6d 70 74 79 20 28 74 65 72 6d 6c 65 73 73   empty (termless
5280: 29 20 6c 65 61 66 20 70 61 67 65 73 20 74 68 61  ) leaf pages tha
5290: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  t immediately.**
52a0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 6c 6c 6f             follo
52b0: 77 69 6e 67 20 69 4c 65 61 66 2e 0a 2a 2a 0a 2a  wing iLeaf..**.*
52c0: 2a 20 54 68 65 20 46 74 73 35 42 74 72 65 65 49  * The Fts5BtreeI
52d0: 74 65 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 6e  ter object is on
52e0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
52f0: 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  of the integrity
5300: 2d 63 68 65 63 6b 20 63 6f 64 65 2e 0a 2a 2f 0a  -check code..*/.
5310: 73 74 72 75 63 74 20 46 74 73 35 42 74 72 65 65  struct Fts5Btree
5320: 49 74 65 72 4c 65 76 65 6c 20 7b 0a 20 20 46 74  IterLevel {.  Ft
5330: 73 35 4e 6f 64 65 49 74 65 72 20 73 3b 20 20 20  s5NodeIter s;   
5340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5350: 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68   Iterator for th
5360: 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 2a  e current node *
5370: 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  /.  Fts5Data *pD
5380: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
5390: 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
53a0: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
53b0: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
53c0: 73 35 42 74 72 65 65 49 74 65 72 20 7b 0a 20 20  s5BtreeIter {.  
53d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20  Fts5Index *p;   
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53f0: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
5400: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
5410: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
5420: 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 49   *pSeg;     /* I
5430: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
5440: 68 69 73 20 73 65 67 6d 65 6e 74 27 73 20 62 2d  his segment's b-
5450: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49  tree */.  int iI
5460: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
5470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
5480: 65 78 20 70 53 65 67 20 62 65 6c 6f 6e 67 73 20  ex pSeg belongs 
5490: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 76 6c  to */.  int nLvl
54a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
54b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
54c0: 6f 66 20 61 4c 76 6c 5b 5d 20 61 72 72 61 79 20  of aLvl[] array 
54d0: 2a 2f 0a 20 20 46 74 73 35 42 74 72 65 65 49 74  */.  Fts5BtreeIt
54e0: 65 72 4c 65 76 65 6c 20 2a 61 4c 76 6c 3b 20 20  erLevel *aLvl;  
54f0: 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 66 6f       /* Level fo
5500: 72 20 65 61 63 68 20 74 69 65 72 20 6f 66 20 62  r each tier of b
5510: 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  -tree */..  /* O
5520: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
5530: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
5540: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
5550: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
5560: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  term */.  int iL
5570: 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
5580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
5590: 66 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72  f containing ter
55a0: 6d 73 20 3e 3d 20 63 75 72 72 65 6e 74 20 74 65  ms >= current te
55b0: 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70  rm */.  int nEmp
55c0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
55d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
55e0: 72 20 6f 66 20 22 65 6d 70 74 79 22 20 6c 65 61  r of "empty" lea
55f0: 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4c  ves following iL
5600: 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f  eaf */.  int bEo
5610: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
5620: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
5630: 74 6f 20 74 72 75 65 20 61 74 20 45 4f 46 20 2a  to true at EOF *
5640: 2f 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 3b 20  /.  int bDlidx; 
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5670: 68 65 72 65 20 65 78 69 73 74 73 20 61 20 64 6c  here exists a dl
5680: 69 64 78 20 2a 2f 0a 7d 3b 0a 0a 0a 73 74 61 74  idx */.};...stat
5690: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
56a0: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
56b0: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
56c0: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
56d0: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
56e0: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
56f0: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
5700: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5710: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5720: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5730: 49 6e 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  In[1];.}../*.** 
5740: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
5750: 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74 20  urn a buffer at 
5760: 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74 65  least nByte byte
5770: 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
5780: 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
5790: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
57a0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
57b0: 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63   set the error c
57c0: 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74  ode in.** the Ft
57d0: 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70  s5Index handle p
57e0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
57f0: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
5800: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73  static void *fts
5810: 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49  5IdxMalloc(Fts5I
5820: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79  ndex *p, int nBy
5830: 74 65 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  te){.  void *pRe
5840: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  t = 0;.  if( p->
5850: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5860: 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c 69  .    pRet = sqli
5870: 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65  te3_malloc(nByte
5880: 29 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 3d  );.    if( pRet=
5890: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
58a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
58b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
58c0: 20 20 20 6d 65 6d 73 65 74 28 70 52 65 74 2c 20     memset(pRet, 
58d0: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  0, nByte);.    }
58e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
58f0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  et;.}../*.** Com
5900: 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pare the content
5910: 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62  s of the pLeft b
5920: 75 66 66 65 72 20 77 69 74 68 20 74 68 65 20 70  uffer with the p
5930: 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f  Right/nRight blo
5940: 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  b..**.** Return 
5950: 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20  -ve if pLeft is 
5960: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69  smaller than pRi
5970: 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61  ght, 0 if they a
5980: 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b  re equal or.** +
5990: 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20  ve if pRight is 
59a0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65  smaller than pLe
59b0: 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ft. In other wor
59c0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65  ds:.**.**     re
59d0: 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52  s = *pLeft - *pR
59e0: 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ight.*/.static i
59f0: 6e 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  nt fts5BufferCom
5a00: 70 61 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35  pareBlob(.  Fts5
5a10: 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20  Buffer *pLeft,  
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
5a30: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
5a40: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20   comparison */. 
5a50: 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68   const u8 *pRigh
5a60: 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20  t, int nRight   
5a70: 20 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73   /* Right hand s
5a80: 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ide of compariso
5a90: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43  n */.){.  int nC
5aa0: 6d 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e  mp = MIN(pLeft->
5ab0: 6e 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e  n, nRight);.  in
5ac0: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
5ad0: 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c  Left->p, pRight,
5ae0: 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e   nCmp);.  return
5af0: 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66   (res==0 ? (pLef
5b00: 74 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a  t->n - nRight) :
5b10: 20 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a   res);.}..#if 0.
5b20: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 43  static int fts5C
5b30: 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20 63 6f  ompareBlob(.  co
5b40: 6e 73 74 20 75 38 20 2a 70 4c 65 66 74 2c 20 69  nst u8 *pLeft, i
5b50: 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73  nt nLeft,.  cons
5b60: 74 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e  t u8 *pRight, in
5b70: 74 20 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e  t nRight.){.  in
5b80: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65  t nCmp = MIN(nLe
5b90: 66 74 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69  ft, nRight);.  i
5ba0: 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
5bb0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e  pLeft, pRight, n
5bc0: 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cmp);.  return (
5bd0: 72 65 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20  res==0 ? (nLeft 
5be0: 2d 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29  - nRight) : res)
5bf0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
5c00: 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f  * Compare the co
5c10: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 74 77  ntents of the tw
5c20: 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e 67 20  o buffers using 
5c30: 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f 6e 65  memcmp(). If one
5c40: 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20 61 20   buffer.** is a 
5c50: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
5c60: 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e 73 69  her, it is consi
5c70: 64 65 72 65 64 20 74 68 65 20 6c 65 73 73 65 72  dered the lesser
5c80: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 2d  ..**.** Return -
5c90: 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20 73  ve if pLeft is s
5ca0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69 67  maller than pRig
5cb0: 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61 72  ht, 0 if they ar
5cc0: 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76  e equal or.** +v
5cd0: 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20 73  e if pRight is s
5ce0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65 66  maller than pLef
5cf0: 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  t. In other word
5d00: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65 73  s:.**.**     res
5d10: 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52 69   = *pLeft - *pRi
5d20: 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ght.*/.static in
5d30: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
5d40: 61 72 65 28 46 74 73 35 42 75 66 66 65 72 20 2a  are(Fts5Buffer *
5d50: 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66 66 65  pLeft, Fts5Buffe
5d60: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 6e  r *pRight){.  in
5d70: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
5d80: 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d 3e 6e  ft->n, pRight->n
5d90: 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
5da0: 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20  emcmp(pLeft->p, 
5db0: 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d 70 29  pRight->p, nCmp)
5dc0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65 73 3d  ;.  return (res=
5dd0: 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e 20 2d  =0 ? (pLeft->n -
5de0: 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20 72 65   pRight->n) : re
5df0: 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  s);.}.../*.** Cl
5e00: 6f 73 65 20 74 68 65 20 72 65 61 64 2d 6f 6e 6c  ose the read-onl
5e10: 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c 20 69  y blob handle, i
5e20: 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a 2a 2f  f it is open..*/
5e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
5e40: 35 43 6c 6f 73 65 52 65 61 64 65 72 28 46 74 73  5CloseReader(Fts
5e50: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66  5Index *p){.  if
5e60: 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a  ( p->pReader ){.
5e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5e80: 20 2a 70 52 65 61 64 65 72 20 3d 20 70 2d 3e 70   *pReader = p->p
5e90: 52 65 61 64 65 72 3b 0a 20 20 20 20 70 2d 3e 70  Reader;.    p->p
5ea0: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Reader = 0;.    
5eb0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
5ec0: 73 65 28 70 52 65 61 64 65 72 29 3b 0a 20 20 7d  se(pReader);.  }
5ed0: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
5ee0: 61 74 61 20 2a 66 74 73 35 44 61 74 61 52 65 61  ata *fts5DataRea
5ef0: 64 4f 72 42 75 66 66 65 72 28 0a 20 20 46 74 73  dOrBuffer(.  Fts
5f00: 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
5f10: 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
5f20: 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
5f30: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65  .  Fts5Data *pRe
5f40: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  t = 0;.  if( p->
5f50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5f60: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
5f70: 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 20 30 0a  LITE_OK;..#if 0.
5f80: 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20 3d  Fts5Buffer buf =
5f90: 20 7b 30 2c 30 2c 30 7d 3b 0a 66 74 73 35 44 65   {0,0,0};.fts5De
5fa0: 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26 62  bugRowid(&rc, &b
5fb0: 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 66 70 72  uf, iRowid);.fpr
5fc0: 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72 65  intf(stdout, "re
5fd0: 61 64 3a 20 25 73 5c 6e 22 2c 20 62 75 66 2e 70  ad: %s\n", buf.p
5fe0: 29 3b 0a 66 66 6c 75 73 68 28 73 74 64 6f 75 74  );.fflush(stdout
5ff0: 29 3b 0a 73 71 6c 69 74 65 33 5f 66 72 65 65 28  );.sqlite3_free(
6000: 62 75 66 2e 70 29 3b 0a 23 65 6e 64 69 66 0a 20  buf.p);.#endif. 
6010: 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65     if( p->pReade
6020: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  r ){.      /* Th
6030: 69 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75  is call may retu
6040: 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  rn SQLITE_ABORT 
6050: 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
6060: 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20  n a savepoint.  
6070: 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
6080: 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73  since it was las
6090: 74 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20  t used. In this 
60a0: 63 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20  case a new blob 
60b0: 68 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20  handle.      ** 
60c0: 69 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f  is required.  */
60d0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
60e0: 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28  te3_blob_reopen(
60f0: 70 2d 3e 70 52 65 61 64 65 72 2c 20 69 52 6f 77  p->pReader, iRow
6100: 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  id);.      if( r
6110: 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  c==SQLITE_ABORT 
6120: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43  ){.        fts5C
6130: 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
6140: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6150: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
6160: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
6170: 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20  the blob handle 
6180: 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
6190: 20 6f 70 65 6e 20 61 6e 64 20 73 65 65 6b 20 69   open and seek i
61a0: 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  t. Otherwise, us
61b0: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 6c 6f  e.    ** the blo
61c0: 62 5f 72 65 6f 70 65 6e 28 29 20 41 50 49 20 74  b_reopen() API t
61d0: 6f 20 72 65 73 65 65 6b 20 74 68 65 20 65 78 69  o reseek the exi
61e0: 73 74 69 6e 67 20 62 6c 6f 62 20 68 61 6e 64 6c  sting blob handl
61f0: 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  e.  */.    if( p
6200: 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 7b 0a  ->pReader==0 ){.
6210: 20 20 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67        Fts5Config
6220: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
6230: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 20 20 72 63  Config;.      rc
6240: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
6250: 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62  open(pConfig->db
6260: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  , .          pCo
6270: 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44  nfig->zDb, p->zD
6280: 61 74 61 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c  ataTbl, "block",
6290: 20 69 52 6f 77 69 64 2c 20 30 2c 20 26 70 2d 3e   iRowid, 0, &p->
62a0: 70 52 65 61 64 65 72 0a 20 20 20 20 20 20 29 3b  pReader.      );
62b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
62c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
62d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
62e0: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
62f0: 62 79 74 65 73 28 70 2d 3e 70 52 65 61 64 65 72  bytes(p->pReader
6300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 75  );.      if( pBu
6310: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  f ){.        fts
6320: 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66  5BufferZero(pBuf
6330: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  );.        if( S
6340: 51 4c 49 54 45 5f 4f 4b 3d 3d 66 74 73 35 42 75  QLITE_OK==fts5Bu
6350: 66 66 65 72 47 72 6f 77 28 26 72 63 2c 20 70 42  fferGrow(&rc, pB
6360: 75 66 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  uf, nByte) ){.  
6370: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
6380: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
6390: 2d 3e 70 52 65 61 64 65 72 2c 20 70 42 75 66 2d  ->pReader, pBuf-
63a0: 3e 70 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20  >p, nByte, 0);. 
63b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
63c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 42 75  =SQLITE_OK ) pBu
63d0: 66 2d 3e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20  f->n = nByte;.  
63e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
63f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 52 65  lse{.        pRe
6400: 74 20 3d 20 28 46 74 73 35 44 61 74 61 2a 29 66  t = (Fts5Data*)f
6410: 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
6420: 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
6430: 20 2b 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20   + nByte);.     
6440: 20 20 20 69 66 28 20 21 70 52 65 74 20 29 20 72     if( !pRet ) r
6450: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20  eturn 0;..      
6460: 20 20 70 52 65 74 2d 3e 6e 20 3d 20 6e 42 79 74    pRet->n = nByt
6470: 65 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d  e;.        pRet-
6480: 3e 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b  >p = (u8*)&pRet[
6490: 31 5d 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74  1];.        pRet
64a0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
64b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
64c0: 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52  _blob_read(p->pR
64d0: 65 61 64 65 72 2c 20 70 52 65 74 2d 3e 70 2c 20  eader, pRet->p, 
64e0: 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20  nByte, 0);.     
64f0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
6500: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6510: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6520: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ret);.          
6530: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRet = 0;.      
6540: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6550: 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63  }.    p->rc = rc
6560: 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64 2b 2b  ;.    p->nRead++
6570: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
6580: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
6590: 65 74 72 69 65 76 65 20 61 20 72 65 63 6f 72 64  etrieve a record
65a0: 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61   from the %_data
65b0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
65c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
65d0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
65e0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
65f0: 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20  left in the .** 
6600: 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74  Fts5Index object
6610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
6620: 44 61 74 61 20 2a 66 74 73 35 44 61 74 61 52 65  Data *fts5DataRe
6630: 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ad(Fts5Index *p,
6640: 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20   i64 iRowid){.  
6650: 46 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d  Fts5Data *pRet =
6660: 20 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42   fts5DataReadOrB
6670: 75 66 66 65 72 28 70 2c 20 30 2c 20 69 52 6f 77  uffer(p, 0, iRow
6680: 69 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  id);.  assert( (
6690: 70 52 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63  pRet==0)==(p->rc
66a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  !=SQLITE_OK) );.
66b0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
66c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 72  ../*.** Read a r
66d0: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25  ecord from the %
66e0: 5f 64 61 74 61 20 74 61 62 6c 65 20 69 6e 74 6f  _data table into
66f0: 20 74 68 65 20 62 75 66 66 65 72 20 73 75 70 70   the buffer supp
6700: 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 73  lied as the.** s
6710: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
6720: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
6730: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
6740: 6f 72 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68  or is left in th
6750: 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  e Fts5Index obje
6760: 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  ct. If an.** err
6770: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
6780: 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
6790: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
67a0: 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 0a 2a  lled, it is a .*
67b0: 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  * no-op..*/.stat
67c0: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
67d0: 42 75 66 66 65 72 28 46 74 73 35 49 6e 64 65 78  Buffer(Fts5Index
67e0: 20 2a 70 2c 20 46 74 73 35 42 75 66 66 65 72 20   *p, Fts5Buffer 
67f0: 2a 70 42 75 66 2c 20 69 36 34 20 69 52 6f 77 69  *pBuf, i64 iRowi
6800: 64 29 7b 0a 20 20 28 76 6f 69 64 29 66 74 73 35  d){.  (void)fts5
6810: 44 61 74 61 52 65 61 64 4f 72 42 75 66 66 65 72  DataReadOrBuffer
6820: 28 70 2c 20 70 42 75 66 2c 20 69 52 6f 77 69 64  (p, pBuf, iRowid
6830: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
6840: 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
6850: 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64 20 72  to data record r
6860: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6870: 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a  rlier call to.**
6880: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 29 2e   fts5DataRead().
6890: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
68a0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
68b0: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29  Fts5Data *pData)
68c0: 7b 0a 20 20 69 66 28 20 70 44 61 74 61 20 29 7b  {.  if( pData ){
68d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 61  .    assert( pDa
68e0: 74 61 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  ta->nRef>0 );.  
68f0: 20 20 70 44 61 74 61 2d 3e 6e 52 65 66 2d 2d 3b    pData->nRef--;
6900: 0a 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e  .    if( pData->
6910: 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65  nRef==0 ) sqlite
6920: 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20  3_free(pData);. 
6930: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
6940: 64 20 66 74 73 35 44 61 74 61 52 65 66 65 72 65  d fts5DataRefere
6950: 6e 63 65 28 46 74 73 35 44 61 74 61 20 2a 70 44  nce(Fts5Data *pD
6960: 61 74 61 29 7b 0a 20 20 70 44 61 74 61 2d 3e 6e  ata){.  pData->n
6970: 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ref++;.}../*.** 
6980: 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43  INSERT OR REPLAC
6990: 45 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  E a record into 
69a0: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
69b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
69c0: 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46   fts5DataWrite(F
69d0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
69e0: 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75   iRowid, const u
69f0: 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  8 *pData, int nD
6a00: 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ata){.  if( p->r
6a10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
6a20: 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d  eturn;..  if( p-
6a30: 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20  >pWriter==0 ){. 
6a40: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46     int rc;.    F
6a50: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
6a60: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
6a70: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  .    char *zSql 
6a80: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
6a90: 66 28 0a 20 20 20 20 20 20 20 20 22 52 45 50 4c  f(.        "REPL
6aa0: 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 25 51  ACE INTO '%q'.%Q
6ab0: 28 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55  (id, block) VALU
6ac0: 45 53 28 3f 2c 3f 29 22 2c 20 70 43 6f 6e 66 69  ES(?,?)", pConfi
6ad0: 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
6ae0: 54 62 6c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  Tbl.    );.    i
6af0: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
6b00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
6b10: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
6b20: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6b30: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
6b40: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71  pConfig->db, zSq
6b50: 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 57 72 69 74  l, -1, &p->pWrit
6b60: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
6b70: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
6b80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6b90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6ba0: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72  .      p->rc = r
6bb0: 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
6bc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
6bd0: 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
6be0: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20  (p->pWriter, 1, 
6bf0: 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  iRowid);.  sqlit
6c00: 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e  e3_bind_blob(p->
6c10: 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74  pWriter, 2, pDat
6c20: 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45  a, nData, SQLITE
6c30: 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
6c40: 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69  te3_step(p->pWri
6c50: 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ter);.  p->rc = 
6c60: 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
6c70: 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  >pWriter);.}../*
6c80: 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65 20  .** Execute the 
6c90: 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a 2a  following SQL:.*
6ca0: 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  *.**     DELETE 
6cb0: 46 52 4f 4d 20 25 5f 64 61 74 61 20 57 48 45 52  FROM %_data WHER
6cc0: 45 20 69 64 20 42 45 54 57 45 45 4e 20 24 69 46  E id BETWEEN $iF
6cd0: 69 72 73 74 20 41 4e 44 20 24 69 4c 61 73 74 0a  irst AND $iLast.
6ce0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6cf0: 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 46 74  ts5DataDelete(Ft
6d00: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
6d10: 69 46 69 72 73 74 2c 20 69 36 34 20 69 4c 61 73  iFirst, i64 iLas
6d20: 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21  t){.  if( p->rc!
6d30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
6d40: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  urn;..  if( p->p
6d50: 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20 20  Deleter==0 ){.  
6d60: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46 74    int rc;.    Ft
6d70: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
6d80: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
6d90: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d      char *zSql =
6da0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
6db0: 28 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  (.        "DELET
6dc0: 45 20 46 52 4f 4d 20 27 25 71 27 2e 25 51 20 57  E FROM '%q'.%Q W
6dd0: 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69  HERE id>=? AND i
6de0: 64 3c 3d 3f 22 2c 20 70 43 6f 6e 66 69 67 2d 3e  d<=?", pConfig->
6df0: 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
6e00: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
6e10: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zSql==0 ){.     
6e20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6e30: 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
6e40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6e50: 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f  3_prepare_v2(pCo
6e60: 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  nfig->db, zSql, 
6e70: 2d 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72  -1, &p->pDeleter
6e80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6e90: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
6ea0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
6eb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6ec0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
6ed0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
6ee0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
6ef0: 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
6f00: 2d 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  ->pDeleter, 1, i
6f10: 46 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  First);.  sqlite
6f20: 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e  3_bind_int64(p->
6f30: 70 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61  pDeleter, 2, iLa
6f40: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
6f50: 74 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  tep(p->pDeleter)
6f60: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  ;.  p->rc = sqli
6f70: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65  te3_reset(p->pDe
6f80: 6c 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  leter);.}../*.**
6f90: 20 43 6c 6f 73 65 20 74 68 65 20 73 71 6c 69 74   Close the sqlit
6fa0: 65 33 5f 62 6c 6f 62 20 68 61 6e 64 6c 65 20 75  e3_blob handle u
6fb0: 73 65 64 20 74 6f 20 72 65 61 64 20 72 65 63 6f  sed to read reco
6fc0: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  rds from the %_d
6fd0: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 20 41 6e  ata table..** An
6fe0: 64 20 64 69 73 63 61 72 64 20 61 6e 79 20 63 61  d discard any ca
6ff0: 63 68 65 64 20 72 65 61 64 73 2e 20 54 68 69 73  ched reads. This
7000: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
7010: 6c 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  led at the end o
7020: 66 0a 2a 2a 20 61 20 72 65 61 64 20 74 72 61 6e  f.** a read tran
7030: 73 61 63 74 69 6f 6e 20 6f 72 20 77 68 65 6e 20  saction or when 
7040: 61 6e 79 20 73 75 62 2d 74 72 61 6e 73 61 63 74  any sub-transact
7050: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
7060: 63 6b 2e 0a 2a 2f 0a 23 69 66 20 30 0a 73 74 61  ck..*/.#if 0.sta
7070: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
7080: 61 52 65 73 65 74 28 46 74 73 35 49 6e 64 65 78  aReset(Fts5Index
7090: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
70a0: 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71  Reader ){.    sq
70b0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
70c0: 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20  (p->pReader);.  
70d0: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30    p->pReader = 0
70e0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
70f0: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c  /*.** Remove all
7100: 20 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69 61   records associa
7110: 74 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e 74  ted with segment
7120: 20 69 53 65 67 69 64 20 69 6e 20 69 6e 64 65 78   iSegid in index
7130: 20 69 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63   iIdx..*/.static
7140: 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 52 65   void fts5DataRe
7150: 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46 74 73 35  moveSegment(Fts5
7160: 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 49  Index *p, int iI
7170: 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  dx, int iSegid){
7180: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
7190: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
71a0: 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c  ID(iIdx, iSegid,
71b0: 20 30 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c   0, 0);.  i64 iL
71c0: 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  ast = FTS5_SEGME
71d0: 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 69  NT_ROWID(iIdx, i
71e0: 53 65 67 69 64 2b 31 2c 20 30 2c 20 30 29 2d 31  Segid+1, 0, 0)-1
71f0: 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65  ;.  fts5DataDele
7200: 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c  te(p, iFirst, iL
7210: 61 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ast);.}../*.** R
7220: 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e  elease a referen
7230: 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74 72  ce to an Fts5Str
7240: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72 65  ucture object re
7250: 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61 72  turned by an ear
7260: 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74 6f  lier .** call to
7270: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7280: 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72 75  ad() or fts5Stru
7290: 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a 2a  ctureDecode()..*
72a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
72b0: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
72c0: 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65  se(Fts5Structure
72d0: 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66   *pStruct){.  if
72e0: 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
72f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
7300: 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e  i=0; i<pStruct->
7310: 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  nLevel; i++){.  
7320: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7330: 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
7340: 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20 7d  [i].aSeg);.    }
7350: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7360: 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  e(pStruct);.  }.
7370: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
7380: 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20  lize and return 
7390: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  the structure re
73a0: 63 6f 72 64 20 63 75 72 72 65 6e 74 6c 79 20 73  cord currently s
73b0: 74 6f 72 65 64 20 69 6e 20 73 65 72 69 61 6c 69  tored in seriali
73c0: 7a 65 64 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68  zed.** form with
73d0: 69 6e 20 62 75 66 66 65 72 20 70 44 61 74 61 2f  in buffer pData/
73e0: 6e 44 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nData..**.** The
73f0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61   Fts5Structure.a
7400: 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68  Level[] and each
7410: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
7420: 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79  vel.aSeg[] array
7430: 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c  .** are over-all
7440: 6f 63 61 74 65 64 20 62 79 20 6f 6e 65 20 73 6c  ocated by one sl
7450: 6f 74 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ot. This allows 
7460: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  the structure co
7470: 6e 74 65 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20  ntents.** to be 
7480: 6d 6f 72 65 20 65 61 73 69 6c 79 20 65 64 69 74  more easily edit
7490: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
74a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
74b0: 70 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 4e  pOut is set to N
74c0: 55 4c 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74  ULL and an SQLit
74d0: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
74e0: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
74f0: 69 73 65 2c 20 2a 70 70 4f 75 74 20 69 73 20 73  ise, *ppOut is s
7500: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
7510: 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e  he new object an
7520: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
7530: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
7540: 69 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63  ic int fts5Struc
7550: 74 75 72 65 44 65 63 6f 64 65 28 0a 20 20 63 6f  tureDecode(.  co
7560: 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 20  nst u8 *pData,  
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7580: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
7590: 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 73 74  ng serialized st
75a0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
75b0: 20 6e 44 61 74 61 2c 20 20 20 20 20 20 20 20 20   nData,         
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
75d0: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
75e0: 44 61 74 61 20 69 6e 20 62 79 74 65 73 20 2a 2f  Data in bytes */
75f0: 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65  .  int *piCookie
7600: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7610: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
7620: 69 6f 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  ion cookie value
7630: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
7640: 75 72 65 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ure **ppOut     
7650: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65        /* OUT: De
7660: 73 65 72 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63  serialized objec
7670: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
7680: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7690: 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
76a0: 20 69 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65   iLvl;.  int nLe
76b0: 76 65 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vel = 0;.  int n
76c0: 53 65 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69  Segment = 0;.  i
76d0: 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
76f0: 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65  * Bytes of space
7700: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 74 20   to allocate at 
7710: 70 52 65 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  pRet */.  Fts5St
7720: 72 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20  ructure *pRet = 
7730: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  0;        /* Str
7740: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 74 6f  ucture object to
7750: 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
7760: 20 47 72 61 62 20 74 68 65 20 63 6f 6f 6b 69 65   Grab the cookie
7770: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20   value */.  if( 
7780: 70 69 43 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f  piCookie ) *piCo
7790: 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 46 74  okie = sqlite3Ft
77a0: 73 35 47 65 74 33 32 28 70 44 61 74 61 29 3b 0a  s5Get32(pData);.
77b0: 20 20 69 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52    i = 4;..  /* R
77c0: 65 61 64 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  ead the total nu
77d0: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 61  mber of levels a
77e0: 6e 64 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nd segments from
77f0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
7800: 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
7810: 20 72 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69   record.  */.  i
7820: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7830: 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76 65  &pData[i], nLeve
7840: 6c 29 3b 0a 20 20 69 20 2b 3d 20 67 65 74 56 61  l);.  i += getVa
7850: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
7860: 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e  , nSegment);.  n
7870: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73  Byte = (.      s
7880: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7890: 75 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20  ure) +          
78a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
78b0: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
78c0: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
78d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20  StructureLevel) 
78e0: 2a 20 28 6e 4c 65 76 65 6c 29 20 20 20 20 20 20  * (nLevel)      
78f0: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7900: 79 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74  y */.  );.  pRet
7910: 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
7920: 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
7930: 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42  llocZero(&rc, nB
7940: 79 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65  yte);..  if( pRe
7950: 74 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e  t ){.    pRet->n
7960: 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a  Level = nLevel;.
7970: 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
7980: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
7990: 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69  [i], &pRet->nWri
79a0: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  teCounter);..   
79b0: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63 3d   for(iLvl=0; rc=
79c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
79d0: 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  vl<nLevel; iLvl+
79e0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
79f0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
7a00: 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76  vl = &pRet->aLev
7a10: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
7a20: 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20  int nTotal;.    
7a30: 20 20 69 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20    int iSeg;..   
7a40: 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69 6e     i += getVarin
7a50: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
7a60: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20  Lvl->nMerge);.  
7a70: 20 20 20 20 69 20 2b 3d 20 67 65 74 56 61 72 69      i += getVari
7a80: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7a90: 6e 54 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61  nTotal);.      a
7aa0: 73 73 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70  ssert( nTotal>=p
7ab0: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20  Lvl->nMerge );. 
7ac0: 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20       pLvl->aSeg 
7ad0: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
7ae0: 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33  Segment*)sqlite3
7af0: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
7b00: 72 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e  rc, .          n
7b10: 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46  Total * sizeof(F
7b20: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7b30: 65 6e 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20  ent).      );.. 
7b40: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
7b50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
7b60: 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e    pLvl->nSeg = n
7b70: 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66  Total;.        f
7b80: 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
7b90: 6e 54 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b  nTotal; iSeg++){
7ba0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7bb0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  getVarint32(&pDa
7bc0: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7bd0: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
7be0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7bf0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  getVarint32(&pDa
7c00: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7c10: 67 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74 29  g[iSeg].nHeight)
7c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
7c30: 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 44   getVarint32(&pD
7c40: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
7c50: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
7c60: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  st);.          i
7c70: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
7c80: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7c90: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
7ca0: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Last);.        }
7cb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7cc0: 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
7cd0: 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29  ureRelease(pRet)
7ce0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
7cf0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7d00: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20  }.  }..  *ppOut 
7d10: 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e  = pRet;.  return
7d20: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f   rc;.}../*.**.*/
7d30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7d40: 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
7d50: 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  el(int *pRc, Fts
7d60: 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
7d70: 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70  truct){.  if( *p
7d80: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
7d90: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7da0: 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
7db0: 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74  pStruct;.    int
7dc0: 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63   nLevel = pStruc
7dd0: 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69  t->nLevel;.    i
7de0: 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20  nt nByte = (.   
7df0: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7e00: 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20  Structure) +    
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e20: 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20   Main structure 
7e30: 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f  */.        sizeo
7e40: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7e50: 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b  evel) * (nLevel+
7e60: 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20  1)  /* aLevel[] 
7e70: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a  array */.    );.
7e80: 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 73  .    pStruct = s
7e90: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
7ea0: 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a  Struct, nByte);.
7eb0: 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20      if( pStruct 
7ec0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
7ed0: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
7ee0: 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a  [nLevel], 0, siz
7ef0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
7f00: 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20  eLevel));.      
7f10: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
7f20: 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75  +;.      *ppStru
7f30: 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20  ct = pStruct;.  
7f40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
7f50: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
7f60: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  EM;.    }.  }.}.
7f70: 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65  ./*.** Extend le
7f80: 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74  vel iLvl so that
7f90: 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66   there is room f
7fa0: 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74  or at least nExt
7fb0: 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65  ra more.** segme
7fc0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
7fd0: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
7fe0: 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20  eExtendLevel(.  
7ff0: 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73  int *pRc, .  Fts
8000: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
8010: 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c  uct, .  int iLvl
8020: 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  , .  int nExtra,
8030: 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a   .  int bInsert.
8040: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
8050: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8060: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
8070: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
8080: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
8090: 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ];.    Fts5Struc
80a0: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65  tureSegment *aNe
80b0: 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  w;.    int nByte
80c0: 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ;..    nByte = (
80d0: 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78  pLvl->nSeg + nEx
80e0: 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  tra) * sizeof(Ft
80f0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
8100: 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  nt);.    aNew = 
8110: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
8120: 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74  pLvl->aSeg, nByt
8130: 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  e);.    if( aNew
8140: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49   ){.      if( bI
8150: 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nsert==0 ){.    
8160: 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
8170: 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c  [pLvl->nSeg], 0,
8180: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
8190: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20  ctureSegment) * 
81a0: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
81b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
81c0: 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e  t nMove = pLvl->
81d0: 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74  nSeg * sizeof(Ft
81e0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
81f0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  nt);.        mem
8200: 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72  move(&aNew[nExtr
8210: 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29  a], aNew, nMove)
8220: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
8230: 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (aNew, 0, sizeof
8240: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
8250: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
8260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8270: 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65  pLvl->aSeg = aNe
8280: 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  w;.    }else{.  
8290: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
82a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
82b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
82c0: 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e  , deserialize an
82d0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72  d return the str
82e0: 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 66 6f  ucture record fo
82f0: 72 20 69 6e 64 65 78 20 69 49 64 78 2e 0a 2a 2a  r index iIdx..**
8300: 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75  .** The Fts5Stru
8310: 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61  cture.aLevel[] a
8320: 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75  nd each Fts5Stru
8330: 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b  ctureLevel.aSeg[
8340: 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f  ] array.** are o
8350: 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73  ver-allocated as
8360: 20 64 65 73 63 72 69 62 65 64 20 66 6f 72 20 66   described for f
8370: 75 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75  unction fts5Stru
8380: 63 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a  ctureDecode() .*
8390: 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49  * above..**.** I
83a0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
83b0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
83c0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
83d0: 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68   code left in th
83e0: 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68  e.** Fts5Index h
83f0: 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72  andle. If an err
8400: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
8410: 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
8420: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
8430: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
8440: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
8450: 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  c Fts5Structure 
8460: 2a 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65  *fts5StructureRe
8470: 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ad(Fts5Index *p,
8480: 20 69 6e 74 20 69 49 64 78 29 7b 0a 20 20 46 74   int iIdx){.  Ft
8490: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
84a0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
84b0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
84c0: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
84d0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72    /* Object to r
84e0: 65 74 75 72 6e 20 2a 2f 0a 20 20 46 74 73 35 44  eturn */.  Fts5D
84f0: 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20  ata *pData;     
8500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 25 5f             /* %_
8510: 64 61 74 61 20 65 6e 74 72 79 20 63 6f 6e 74 61  data entry conta
8520: 69 6e 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  ining structure 
8530: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
8540: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
8550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
8560: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f  onfiguration coo
8570: 6b 69 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  kie */..  assert
8580: 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ( iIdx<=pConfig-
8590: 3e 6e 50 72 65 66 69 78 20 29 3b 0a 20 20 70 44  >nPrefix );.  pD
85a0: 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
85b0: 61 64 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43  ad(p, FTS5_STRUC
85c0: 54 55 52 45 5f 52 4f 57 49 44 28 69 49 64 78 29  TURE_ROWID(iIdx)
85d0: 29 3b 0a 20 20 69 66 28 20 21 70 44 61 74 61 20  );.  if( !pData 
85e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d  ) return 0;.  p-
85f0: 3e 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74  >rc = fts5Struct
8600: 75 72 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d  ureDecode(pData-
8610: 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 2c 20 26 69  >p, pData->n, &i
8620: 43 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a  Cookie, &pRet);.
8630: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
8640: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43  LITE_OK && p->pC
8650: 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d  onfig->iCookie!=
8660: 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 70  iCookie ){.    p
8670: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
8680: 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 2d 3e  s5ConfigLoad(p->
8690: 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65  pConfig, iCookie
86a0: 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61  );.  }..  fts5Da
86b0: 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
86c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ;.  if( p->rc!=S
86d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
86e0: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
86f0: 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20  ease(pRet);.    
8700: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
8710: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
8720: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8730: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
8740: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64   segments in ind
8750: 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74  ex structure pSt
8760: 72 75 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ruct..*/.static 
8770: 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72  int fts5Structur
8780: 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46  eCountSegments(F
8790: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
87a0: 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53  truct){.  int nS
87b0: 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  egment = 0;     
87c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
87d0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  al number of seg
87e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ments */.  int i
87f0: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
8800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
8810: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
8820: 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
8830: 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69  .  for(iLvl=0; i
8840: 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
8850: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
8860: 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20 70 53    nSegment += pS
8870: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
8880: 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 7d 0a 0a 20  vl].nSeg;.  }.. 
8890: 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e 74   return nSegment
88a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61  ;.}../*.** Seria
88b0: 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74  lize and store t
88c0: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
88d0: 65 63 6f 72 64 20 66 6f 72 20 69 6e 64 65 78 20  ecord for index 
88e0: 69 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iIdx..**.** If a
88f0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8900: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
8910: 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49  ode in the Fts5I
8920: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20  ndex object. If 
8930: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20  an.** error has 
8940: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
8950: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
8960: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
8970: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
8980: 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74  tructureWrite(Ft
8990: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
89a0: 69 49 64 78 2c 20 46 74 73 35 53 74 72 75 63 74  iIdx, Fts5Struct
89b0: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
89c0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
89d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
89e0: 20 6e 53 65 67 6d 65 6e 74 3b 20 20 20 20 20 20   nSegment;      
89f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
8a00: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
8a10: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 46 74  gments */.    Ft
8a20: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
8a40: 75 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69  uffer to seriali
8a50: 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a  ze record into *
8a60: 2f 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  /.    int iLvl; 
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
8a90: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
8aa0: 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74  evels */.    int
8ab0: 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20   iCookie;       
8ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
8ad0: 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74  okie value to st
8ae0: 6f 72 65 20 2a 2f 0a 0a 20 20 20 20 6e 53 65 67  ore */..    nSeg
8af0: 6d 65 6e 74 20 3d 20 66 74 73 35 53 74 72 75 63  ment = fts5Struc
8b00: 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
8b10: 73 28 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  s(pStruct);.    
8b20: 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
8b30: 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
8b40: 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  r));..    /* App
8b50: 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  end the current 
8b60: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f  configuration co
8b70: 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f  okie */.    iCoo
8b80: 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  kie = p->pConfig
8b90: 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69  ->iCookie;.    i
8ba0: 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69  f( iCookie<0 ) i
8bb0: 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 20 20  Cookie = 0;.    
8bc0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8bd0: 33 32 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  32(&p->rc, &buf,
8be0: 20 69 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20 20 20   iCookie);..    
8bf0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8c00: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8c10: 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  buf, pStruct->nL
8c20: 65 76 65 6c 29 3b 0a 20 20 20 20 66 74 73 35 42  evel);.    fts5B
8c30: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
8c40: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
8c50: 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 66  nSegment);.    f
8c60: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8c70: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8c80: 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74  uf, (i64)pStruct
8c90: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
8ca0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  ;..    for(iLvl=
8cb0: 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
8cc0: 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
8cd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  {.      int iSeg
8ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8cf0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
8d00: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
8d10: 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
8d20: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
8d30: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
8d40: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8d50: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  Lvl];.      fts5
8d60: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8d70: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8d80: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a   pLvl->nMerge);.
8d90: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
8da0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
8db0: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
8dc0: 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73  >nSeg);.      as
8dd0: 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72  sert( pLvl->nMer
8de0: 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29  ge<=pLvl->nSeg )
8df0: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ;..      for(iSe
8e00: 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e  g=0; iSeg<pLvl->
8e10: 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
8e20: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
8e30: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8e40: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8e50: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ->aSeg[iSeg].iSe
8e60: 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  gid);.        ft
8e70: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
8e80: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
8e90: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
8ea0: 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20  eg].nHeight);.  
8eb0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
8ec0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
8ed0: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
8ee0: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
8ef0: 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
8f00: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8f10: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8f20: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
8f30: 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b  iSeg].pgnoLast);
8f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8f50: 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
8f60: 65 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54  e(p, FTS5_STRUCT
8f70: 55 52 45 5f 52 4f 57 49 44 28 69 49 64 78 29 2c  URE_ROWID(iIdx),
8f80: 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a   buf.p, buf.n);.
8f90: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
8fa0: 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a  ee(&buf);.  }.}.
8fb0: 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 76 6f  .#if 0.static vo
8fc0: 69 64 20 66 74 73 35 50 72 69 6e 74 53 74 72 75  id fts5PrintStru
8fd0: 63 74 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72  cture(const char
8fe0: 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73 35   *zCaption, Fts5
8ff0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
9000: 63 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ct){.  int rc = 
9010: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
9020: 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d  5Buffer buf;.  m
9030: 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
9040: 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20 20 66  izeof(buf));.  f
9050: 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
9060: 65 28 26 72 63 2c 20 26 62 75 66 2c 20 70 53 74  e(&rc, &buf, pSt
9070: 72 75 63 74 29 3b 0a 20 20 66 70 72 69 6e 74 66  ruct);.  fprintf
9080: 28 73 74 64 6f 75 74 2c 20 22 25 73 3a 20 25 73  (stdout, "%s: %s
9090: 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62  \n", zCaption, b
90a0: 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68 28  uf.p);.  fflush(
90b0: 73 74 64 6f 75 74 29 3b 0a 20 20 66 74 73 35 42  stdout);.  fts5B
90c0: 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
90d0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
90e0: 65 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63  e fts5PrintStruc
90f0: 74 75 72 65 28 78 2c 79 29 0a 23 65 6e 64 69 66  ture(x,y).#endif
9100: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
9110: 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 46 74 73  5SegmentSize(Fts
9120: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
9130: 74 20 2a 70 53 65 67 29 7b 0a 20 20 72 65 74 75  t *pSeg){.  retu
9140: 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e  rn 1 + pSeg->pgn
9150: 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67  oLast - pSeg->pg
9160: 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  noFirst;.}../*.*
9170: 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20  * Return a copy 
9180: 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  of index structu
9190: 72 65 20 70 53 74 72 75 63 74 2e 20 45 78 63 65  re pStruct. Exce
91a0: 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d  pt, promote as m
91b0: 61 6e 79 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20  any segments.** 
91c0: 61 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c  as possible to l
91d0: 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49  evel iPromote. I
91e0: 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c  f an OOM occurs,
91f0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
9200: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
9210: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50  d fts5StructureP
9220: 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35  romoteTo(.  Fts5
9230: 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20  Index *p,.  int 
9240: 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20  iPromote,.  int 
9250: 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73  szPromote,.  Fts
9260: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
9270: 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c  uct.){.  int il,
9280: 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63   is;.  Fts5Struc
9290: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20  tureLevel *pOut 
92a0: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
92b0: 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20  el[iPromote];.. 
92c0: 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65   for(il=iPromote
92d0: 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e  +1; il<pStruct->
92e0: 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20  nLevel; il++){. 
92f0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
9300: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
9310: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9320: 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69 73 3d 70  l];.    for(is=p
9330: 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e  Lvl->nSeg-1; is>
9340: 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20  =0; is--){.     
9350: 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65   int sz = fts5Se
9360: 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d  gmentSize(&pLvl-
9370: 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20  >aSeg[is]);.    
9380: 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f    if( sz>szPromo
9390: 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  te ) return;.   
93a0: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
93b0: 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
93c0: 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72  rc, pStruct, iPr
93d0: 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  omote, 1, 1);.  
93e0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
93f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 6d 65  return;.      me
9400: 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c  mcpy(pOut->aSeg,
9410: 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d   &pLvl->aSeg[is]
9420: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
9430: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29 3b  uctureSegment));
9440: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65  .      pOut->nSe
9450: 67 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  g++;.      pLvl-
9460: 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20  >nSeg--;.    }. 
9470: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65   }.}../*.** A ne
9480: 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75  w segment has ju
9490: 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  st been written 
94a0: 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66  to level iLvl of
94b0: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
94c0: 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69  .** pStruct. Thi
94d0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
94e0: 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67  mines if any seg
94f0: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
9500: 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61  promoted.** as a
9510: 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74   result. Segment
9520: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69  s are promoted i
9530: 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
9540: 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74  .**.**   a) If t
9550: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
9560: 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c  written is small
9570: 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d  er than one or m
9580: 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20  ore segments.** 
9590: 20 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20       within the 
95a0: 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74  previous populat
95b0: 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20  ed level, it is 
95c0: 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20  promoted to the 
95d0: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20  previous.**     
95e0: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
95f0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20  ..**.**   b) If 
9600: 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74  the segment just
9610: 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67   written is larg
9620: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65  er than the newe
9630: 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a  st segment on.**
9640: 20 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70        the next p
9650: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20  opulated level, 
9660: 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e  then that segmen
9670: 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  t, and any other
9680: 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20   adjacent.**    
9690: 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20    segments that 
96a0: 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72  are also smaller
96b0: 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75   than the one ju
96c0: 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20  st written, are 
96d0: 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65  .**      promote
96e0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  d. .**.** If one
96f0: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
9700: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20  s are promoted, 
9710: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62  the structure ob
9720: 6a 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a  ject is updated.
9730: 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ** to reflect th
9740: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  is..*/.static vo
9750: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
9760: 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49  Promote(.  Fts5I
9770: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
9780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
9790: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
97a0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  t */.  int iLvl,
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
97d0: 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74  level just updat
97e0: 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ed */.  Fts5Stru
97f0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20  cture *pStruct  
9800: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9810: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
9820: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9830: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
9840: 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74  nt iTst;.    int
9850: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a   iPromote = -1;.
9860: 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74      int szPromot
9870: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9880: 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79    /* Promote any
9890: 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20  thing this size 
98a0: 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  or smaller */.  
98b0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
98c0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
98d0: 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20  /* Segment just 
98e0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 46  written */.    F
98f0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
9900: 6c 20 2a 70 54 73 74 3b 0a 20 20 20 20 69 6e 74  l *pTst;.    int
9910: 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20   szSeg;         
9920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9930: 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75  ze of segment ju
9940: 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 0a 0a  st written */...
9950: 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74 72      pSeg = &pStr
9960: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
9970: 5d 2e 61 53 65 67 5b 70 53 74 72 75 63 74 2d 3e  ].aSeg[pStruct->
9980: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
9990: 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53 65 67 20  g-1];.    szSeg 
99a0: 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e  = (1 + pSeg->pgn
99b0: 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67  oLast - pSeg->pg
99c0: 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20 20 20 2f  noFirst);..    /
99d0: 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 64  * Check for cond
99e0: 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a 20 20 20  ition (a) */.   
99f0: 20 66 6f 72 28 69 54 73 74 3d 69 4c 76 6c 2d 31   for(iTst=iLvl-1
9a00: 3b 20 69 54 73 74 3e 3d 30 20 26 26 20 70 53 74  ; iTst>=0 && pSt
9a10: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73  ruct->aLevel[iTs
9a20: 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69 54 73 74  t].nSeg==0; iTst
9a30: 2d 2d 29 3b 0a 20 20 20 20 70 54 73 74 20 3d 20  --);.    pTst = 
9a40: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
9a50: 5b 69 54 73 74 5d 3b 0a 20 20 20 20 69 66 28 20  [iTst];.    if( 
9a60: 69 54 73 74 3e 3d 30 20 26 26 20 70 54 73 74 2d  iTst>=0 && pTst-
9a70: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  >nMerge==0 ){.  
9a80: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
9a90: 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a   int szMax = 0;.
9aa0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9ab0: 3c 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b  <pTst->nSeg; i++
9ac0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
9ad0: 7a 20 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69  z = pTst->aSeg[i
9ae0: 5d 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73  ].pgnoLast - pTs
9af0: 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46  t->aSeg[i].pgnoF
9b00: 69 72 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20  irst + 1;.      
9b10: 20 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29    if( sz>szMax )
9b20: 20 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20   szMax = sz;.   
9b30: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
9b40: 7a 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20  zMax>=szSeg ){. 
9b50: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74         /* Condit
9b60: 69 6f 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e  ion (a) is true.
9b70: 20 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77   Promote the new
9b80: 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c  est segment on l
9b90: 65 76 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a  evel .        **
9ba0: 20 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69   iLvl to level i
9bb0: 54 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  Tst.  */.       
9bc0: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74   iPromote = iTst
9bd0: 3b 0a 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d  ;.        szProm
9be0: 6f 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20  ote = szMax;.   
9bf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
9c00: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e  /* Check for con
9c10: 64 69 74 69 6f 6e 20 28 62 29 20 2a 2f 0a 20 20  dition (b) */.  
9c20: 20 20 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30    if( iPromote<0
9c30: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74   ){.      Fts5St
9c40: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54  ructureLevel *pT
9c50: 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 54  st;.      for(iT
9c60: 73 74 3d 69 4c 76 6c 2b 31 3b 20 69 54 73 74 3c  st=iLvl+1; iTst<
9c70: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
9c80: 20 69 54 73 74 2b 2b 29 7b 0a 20 20 20 20 20 20   iTst++){.      
9c90: 20 20 70 54 73 74 20 3d 20 26 70 53 74 72 75 63    pTst = &pStruc
9ca0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b  t->aLevel[iTst];
9cb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 73  .        if( pTs
9cc0: 74 2d 3e 6e 53 65 67 20 29 20 62 72 65 61 6b 3b  t->nSeg ) break;
9cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
9ce0: 66 28 20 69 54 73 74 3c 70 53 74 72 75 63 74 2d  f( iTst<pStruct-
9cf0: 3e 6e 4c 65 76 65 6c 20 26 26 20 70 54 73 74 2d  >nLevel && pTst-
9d00: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  >nMerge==0 ){.  
9d10: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
9d20: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
9d30: 32 20 3d 20 26 70 54 73 74 2d 3e 61 53 65 67 5b  2 = &pTst->aSeg[
9d40: 70 54 73 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20  pTst->nSeg-1];. 
9d50: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
9d60: 70 53 65 67 32 2d 3e 70 67 6e 6f 4c 61 73 74 20  pSeg2->pgnoLast 
9d70: 2d 20 70 53 65 67 32 2d 3e 70 67 6e 6f 46 69 72  - pSeg2->pgnoFir
9d80: 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  st + 1;.        
9d90: 69 66 28 20 73 7a 3c 3d 73 7a 53 65 67 20 29 7b  if( sz<=szSeg ){
9da0: 0a 20 20 20 20 20 20 20 20 20 20 69 50 72 6f 6d  .          iProm
9db0: 6f 74 65 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  ote = iLvl;.    
9dc0: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
9dd0: 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 20 20 20  = szSeg;.       
9de0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9df0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 72 6f  ..    /* If iPro
9e00: 6d 6f 74 65 20 69 73 20 67 72 65 61 74 65 72 20  mote is greater 
9e10: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9e20: 20 7a 65 72 6f 20 61 74 20 74 68 69 73 20 70 6f   zero at this po
9e30: 69 6e 74 2c 20 74 68 65 6e 20 69 74 0a 20 20 20  int, then it.   
9e40: 20 2a 2a 20 69 73 20 74 68 65 20 6c 65 76 65 6c   ** is the level
9e50: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 6c 65 76   number of a lev
9e60: 65 6c 20 74 6f 20 77 68 69 63 68 20 73 65 67 6d  el to which segm
9e70: 65 6e 74 73 20 74 68 61 74 20 63 6f 6e 73 69 73  ents that consis
9e80: 74 20 6f 66 0a 20 20 20 20 2a 2a 20 73 7a 50 72  t of.    ** szPr
9e90: 6f 6d 6f 74 65 20 6f 72 20 66 65 77 65 72 20 70  omote or fewer p
9ea0: 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ages should be p
9eb0: 72 6f 6d 6f 74 65 64 2e 20 2a 2f 20 0a 20 20 20  romoted. */ .   
9ec0: 20 69 66 28 20 69 50 72 6f 6d 6f 74 65 3e 3d 30   if( iPromote>=0
9ed0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 72   ){.      fts5Pr
9ee0: 69 6e 74 53 74 72 75 63 74 75 72 65 28 22 42 45  intStructure("BE
9ef0: 46 4f 52 45 22 2c 20 70 53 74 72 75 63 74 29 3b  FORE", pStruct);
9f00: 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
9f10: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c  turePromoteTo(p,
9f20: 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f   iPromote, szPro
9f30: 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a  mote, pStruct);.
9f40: 20 20 20 20 20 20 66 74 73 35 50 72 69 6e 74 53        fts5PrintS
9f50: 74 72 75 63 74 75 72 65 28 22 41 46 54 45 52 22  tructure("AFTER"
9f60: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20  , pStruct);.    
9f70: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
9f80: 49 66 20 74 68 65 20 70 49 74 65 72 2d 3e 69 4f  If the pIter->iO
9f90: 66 66 20 6f 66 66 73 65 74 20 63 75 72 72 65 6e  ff offset curren
9fa0: 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  tly points to an
9fb0: 20 65 6e 74 72 79 20 69 6e 64 69 63 61 74 69 6e   entry indicatin
9fc0: 67 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65  g one.** or more
9fd0: 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73   term-less nodes
9fe0: 2c 20 61 64 76 61 6e 63 65 20 70 61 73 74 20 69  , advance past i
9ff0: 74 20 61 6e 64 20 73 65 74 20 70 49 74 65 72 2d  t and set pIter-
a000: 3e 6e 45 6d 70 74 79 20 74 6f 0a 2a 2a 20 74 68  >nEmpty to.** th
a010: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6d 70 74  e number of empt
a020: 79 20 63 68 69 6c 64 20 6e 6f 64 65 73 2e 0a 2a  y child nodes..*
a030: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
a040: 73 35 4e 6f 64 65 49 74 65 72 47 6f 62 62 6c 65  s5NodeIterGobble
a050: 4e 45 6d 70 74 79 28 46 74 73 35 4e 6f 64 65 49  NEmpty(Fts5NodeI
a060: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
a070: 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c 70  f( pIter->iOff<p
a080: 49 74 65 72 2d 3e 6e 44 61 74 61 20 26 26 20 30  Iter->nData && 0
a090: 3d 3d 28 70 49 74 65 72 2d 3e 61 44 61 74 61 5b  ==(pIter->aData[
a0a0: 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20 26 20 30  pIter->iOff] & 0
a0b0: 78 66 65 29 20 29 7b 0a 20 20 20 20 70 49 74 65  xfe) ){.    pIte
a0c0: 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65  r->bDlidx = pIte
a0d0: 72 2d 3e 61 44 61 74 61 5b 70 49 74 65 72 2d 3e  r->aData[pIter->
a0e0: 69 4f 66 66 5d 20 26 20 30 78 30 31 3b 0a 20 20  iOff] & 0x01;.  
a0f0: 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 2b 2b 3b    pIter->iOff++;
a100: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
a110: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
a120: 26 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49  &pIter->aData[pI
a130: 74 65 72 2d 3e 69 4f 66 66 5d 2c 20 70 49 74 65  ter->iOff], pIte
a140: 72 2d 3e 6e 45 6d 70 74 79 29 3b 0a 20 20 7d 65  r->nEmpty);.  }e
a150: 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  lse{.    pIter->
a160: 6e 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 20 20  nEmpty = 0;.    
a170: 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20  pIter->bDlidx = 
a180: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
a190: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
a1a0: 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 69 6e  ext entry within
a1b0: 20 74 68 65 20 6e 6f 64 65 2e 0a 2a 2f 0a 73 74   the node..*/.st
a1c0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 6f  atic void fts5No
a1d0: 64 65 49 74 65 72 4e 65 78 74 28 69 6e 74 20 2a  deIterNext(int *
a1e0: 70 52 63 2c 20 46 74 73 35 4e 6f 64 65 49 74 65  pRc, Fts5NodeIte
a1f0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
a200: 20 70 49 74 65 72 2d 3e 69 4f 66 66 3e 3d 70 49   pIter->iOff>=pI
a210: 74 65 72 2d 3e 6e 44 61 74 61 20 29 7b 0a 20 20  ter->nData ){.  
a220: 20 20 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d    pIter->aData =
a230: 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   0;.    pIter->i
a240: 43 68 69 6c 64 20 2b 3d 20 70 49 74 65 72 2d 3e  Child += pIter->
a250: 6e 45 6d 70 74 79 3b 0a 20 20 7d 65 6c 73 65 7b  nEmpty;.  }else{
a260: 0a 20 20 20 20 69 6e 74 20 6e 50 72 65 2c 20 6e  .    int nPre, n
a270: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
a280: 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e  iOff += getVarin
a290: 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61 74  t32(&pIter->aDat
a2a0: 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c 20  a[pIter->iOff], 
a2b0: 6e 50 72 65 29 3b 0a 20 20 20 20 70 49 74 65 72  nPre);.    pIter
a2c0: 2d 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72  ->iOff += getVar
a2d0: 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44  int32(&pIter->aD
a2e0: 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d  ata[pIter->iOff]
a2f0: 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 49 74  , nNew);.    pIt
a300: 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50 72  er->term.n = nPr
a310: 65 2d 32 3b 0a 20 20 20 20 66 74 73 35 42 75 66  e-2;.    fts5Buf
a320: 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52  ferAppendBlob(pR
a330: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
a340: 20 6e 4e 65 77 2c 20 70 49 74 65 72 2d 3e 61 44   nNew, pIter->aD
a350: 61 74 61 2b 70 49 74 65 72 2d 3e 69 4f 66 66 29  ata+pIter->iOff)
a360: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66  ;.    pIter->iOf
a370: 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70  f += nNew;.    p
a380: 49 74 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20  Iter->iChild += 
a390: 28 31 20 2b 20 70 49 74 65 72 2d 3e 6e 45 6d 70  (1 + pIter->nEmp
a3a0: 74 79 29 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64  ty);.    fts5Nod
a3b0: 65 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74  eIterGobbleNEmpt
a3c0: 79 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  y(pIter);.    if
a3d0: 28 20 2a 70 52 63 20 29 20 70 49 74 65 72 2d 3e  ( *pRc ) pIter->
a3e0: 61 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d  aData = 0;.  }.}
a3f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  .../*.** Initial
a400: 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ize the iterator
a410: 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
a420: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
a430: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
a440: 20 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 69 6e   segment node in
a450: 20 70 44 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69   pData..*/.stati
a460: 63 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49  c void fts5NodeI
a470: 74 65 72 49 6e 69 74 28 63 6f 6e 73 74 20 75 38  terInit(const u8
a480: 20 2a 61 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *aData, int nDa
a490: 74 61 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72  ta, Fts5NodeIter
a4a0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 6d 65 6d 73   *pIter){.  mems
a4b0: 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
a4c0: 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
a4d0: 70 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 61  pIter->aData = a
a4e0: 44 61 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 6e  Data;.  pIter->n
a4f0: 44 61 74 61 20 3d 20 6e 44 61 74 61 3b 0a 20 20  Data = nData;.  
a500: 70 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 67 65  pIter->iOff = ge
a510: 74 56 61 72 69 6e 74 33 32 28 61 44 61 74 61 2c  tVarint32(aData,
a520: 20 70 49 74 65 72 2d 3e 69 43 68 69 6c 64 29 3b   pIter->iChild);
a530: 0a 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47  .  fts5NodeIterG
a540: 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70 49 74 65  obbleNEmpty(pIte
a550: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  r);.}../*.** Fre
a560: 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20 61 6c 6c  e any memory all
a570: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 69 74  ocated by the it
a580: 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a  erator object..*
a590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
a5a0: 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 46  s5NodeIterFree(F
a5b0: 74 73 35 4e 6f 64 65 49 74 65 72 20 2a 70 49 74  ts5NodeIter *pIt
a5c0: 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  er){.  fts5Buffe
a5d0: 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65  rFree(&pIter->te
a5e0: 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  rm);.}../*.** Th
a5f0: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
a600: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
a610: 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20  rgument has the 
a620: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
a630: 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f   set.** as follo
a640: 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ws. This functio
a650: 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72 65  n sets up the re
a660: 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  st of the iterat
a670: 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  or so that it.**
a680: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
a690: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
a6a0: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  e doclist-index.
a6b0: 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 20  .**.**   pData: 
a6c0: 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69  pointer to docli
a6d0: 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2c  st-index record,
a6e0: 20 0a 2a 2a 20 20 20 69 4c 65 61 66 50 67 6e 6f   .**   iLeafPgno
a6f0: 3a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  : page number th
a700: 61 74 20 74 68 69 73 20 64 6f 63 6c 69 73 74 2d  at this doclist-
a710: 69 6e 64 65 78 20 69 73 20 61 73 73 6f 63 69 61  index is associa
a720: 74 65 64 20 77 69 74 68 2e 0a 2a 2f 0a 73 74 61  ted with..*/.sta
a730: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a740: 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44  xIterFirst(Fts5D
a750: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
a760: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44  {.  Fts5Data *pD
a770: 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 44 61  ata = pIter->pDa
a780: 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ta;.  int i;..  
a790: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
a7a0: 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
a7b0: 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  ( pIter->iLeafPg
a7c0: 6e 6f 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  no>0 );..  /* Co
a7d0: 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
a7e0: 66 20 6c 65 61 64 69 6e 67 20 30 78 30 30 20 62  f leading 0x00 b
a7f0: 79 74 65 73 2e 20 54 68 65 6e 20 73 65 74 20 69  ytes. Then set i
a800: 4c 65 61 66 50 67 6e 6f 2e 20 2a 2f 0a 20 20 66  LeafPgno. */.  f
a810: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 61 74 61 2d  or(i=0; i<pData-
a820: 3e 6e 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 69  >n; i++){ .    i
a830: 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 5d 20 29  f( pData->p[i] )
a840: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 70 49   break;.  }.  pI
a850: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b  ter->iLeafPgno +
a860: 3d 20 28 69 2b 31 29 3b 0a 20 20 70 49 74 65 72  = (i+1);.  pIter
a870: 2d 3e 69 4f 66 66 20 3d 20 69 3b 0a 0a 20 20 2f  ->iOff = i;..  /
a880: 2a 20 55 6e 6c 65 73 73 20 77 65 20 61 72 65 20  * Unless we are 
a890: 61 6c 72 65 61 64 79 20 61 74 20 74 68 65 20 65  already at the e
a8a0: 6e 64 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73  nd of the doclis
a8b0: 74 2d 69 6e 64 65 78 2c 20 6c 6f 61 64 20 74 68  t-index, load th
a8c0: 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 72 6f 77  e first.  ** row
a8d0: 69 64 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  id value.  */.  
a8e0: 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66 66 3c  if( pIter->iOff<
a8f0: 70 44 61 74 61 2d 3e 6e 20 29 7b 0a 20 20 20 20  pData->n ){.    
a900: 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 67  pIter->iOff += g
a910: 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
a920: 3e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c  >p[pIter->iOff],
a930: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
a940: 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  Rowid);.  }else{
a950: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
a960: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 49 74 65   = 1;.  }.  pIte
a970: 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70  r->iFirstOff = p
a980: 49 74 65 72 2d 3e 69 4f 66 66 3b 0a 20 20 72 65  Iter->iOff;.  re
a990: 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66  turn pIter->bEof
a9a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
a9b0: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a9c0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a9d0: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
a9e0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
a9f0: 6c 69 64 78 49 74 65 72 4e 65 78 74 28 46 74 73  lidxIterNext(Fts
aa00: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
aa10: 72 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a  r){.  Fts5Data *
aa20: 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70  pData = pIter->p
aa30: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Data;.  int iOff
aa40: 3b 0a 0a 20 20 66 6f 72 28 69 4f 66 66 3d 70 49  ;..  for(iOff=pI
aa50: 74 65 72 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c  ter->iOff; iOff<
aa60: 70 44 61 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b  pData->n; iOff++
aa70: 29 7b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  ){.    if( pData
aa80: 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61  ->p[iOff] ) brea
aa90: 6b 3b 20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  k; .  }..  if( i
aaa0: 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 20 29 7b 0a  Off<pData->n ){.
aab0: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
aac0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
aad0: 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20 70 49  no += (iOff - pI
aae0: 74 65 72 2d 3e 69 4f 66 66 29 20 2b 20 31 3b 0a  ter->iOff) + 1;.
aaf0: 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56      iOff += getV
ab00: 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
ab10: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56  iOff], (u64*)&iV
ab20: 61 6c 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  al);.    pIter->
ab30: 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a  iRowid -= iVal;.
ab40: 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66 20      pIter->iOff 
ab50: 3d 20 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  = iOff;.  }else{
ab60: 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
ab70: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 1;.  }..  ret
ab80: 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b  urn pIter->bEof;
ab90: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
aba0: 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
abb0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
abc0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
abd0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70  er){.  return (p
abe0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
abf0: 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b  || pIter->bEof);
ac00: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
ac10: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73  fts5DlidxIterLas
ac20: 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t(Fts5DlidxIter 
ac30: 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 66  *pIter){.  if( f
ac40: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
ac50: 74 28 70 49 74 65 72 29 3d 3d 30 20 29 7b 0a 20  t(pIter)==0 ){. 
ac60: 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 66 74 73     while( 0==fts
ac70: 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70  5DlidxIterNext(p
ac80: 49 74 65 72 29 20 29 3b 0a 20 20 20 20 70 49 74  Iter) );.    pIt
ac90: 65 72 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20  er->bEof = 0;.  
aca0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  }.}..static int 
acb0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
acc0: 76 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  v(Fts5DlidxIter 
acd0: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
ace0: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4f 66  Off = pIter->iOf
acf0: 66 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  f;..  assert( pI
ad00: 74 65 72 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a  ter->bEof==0 );.
ad10: 20 20 69 66 28 20 69 4f 66 66 3c 3d 70 49 74 65    if( iOff<=pIte
ad20: 72 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a  r->iFirstOff ){.
ad30: 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20      pIter->bEof 
ad40: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
ad50: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
ad60: 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20 69  >pData->p;.    i
ad70: 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e 74  64 iVal;.    int
ad80: 20 69 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 2f 2a   iLimit;..    /*
ad90: 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20   Currently iOff 
ada0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
adb0: 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61  rst byte of a va
adc0: 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  rint. This block
add0: 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65   .    ** decreme
ade0: 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69  nts iOff until i
adf0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
ae00: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
ae10: 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20  e previous .    
ae20: 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e  ** varint. Takin
ae30: 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65  g care not to re
ae40: 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f  ad any memory lo
ae50: 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63  cations that occ
ae60: 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ur.    ** before
ae70: 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d   the buffer in m
ae80: 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69  emory.  */.    i
ae90: 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20  Limit = (iOff>9 
aea0: 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20  ? iOff-9 : 0);. 
aeb0: 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69     for(iOff--; i
aec0: 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66  Off>iLimit; iOff
aed0: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
aee0: 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30  a[iOff-1] & 0x80
aef0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
af00: 20 20 7d 0a 0a 20 20 20 20 67 65 74 56 61 72 69    }..    getVari
af10: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
af20: 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20 70  4*)&iVal);.    p
af30: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
af40: 69 56 61 6c 3b 0a 20 20 20 20 70 49 74 65 72 2d  iVal;.    pIter-
af50: 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 0a 20  >iLeafPgno--;.. 
af60: 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3e 70     while( iOff>p
af70: 49 74 65 72 2d 3e 69 46 69 72 73 74 4f 66 66 20  Iter->iFirstOff 
af80: 0a 20 20 20 20 20 20 20 20 26 26 20 61 5b 69 4f  .        && a[iO
af90: 66 66 2d 31 5d 3d 3d 30 78 30 30 20 26 26 20 28  ff-1]==0x00 && (
afa0: 61 5b 69 4f 66 66 2d 32 5d 20 26 20 30 78 38 30  a[iOff-2] & 0x80
afb0: 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )==0 .    ){.   
afc0: 20 20 20 69 4f 66 66 2d 2d 3b 0a 20 20 20 20 20     iOff--;.     
afd0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
afe0: 6f 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  o--;.    }.    p
aff0: 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 69 4f 66  Iter->iOff = iOf
b000: 66 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  f;.  }..  return
b010: 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a   pIter->bEof;.}.
b020: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
b030: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a  5DlidxIterInit(.
b040: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e    /* Fts5 Backen
b070: 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
b080: 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  hin */.  int bRe
b090: 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
b0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
b0b0: 20 66 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53   for ORDER BY AS
b0c0: 43 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  C */.  int iIdx,
b0d0: 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
b0e0: 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
b0f0: 74 20 69 53 65 67 69 64 20 77 69 74 68 69 6e 20  t iSegid within 
b100: 69 6e 64 65 78 20 69 49 64 78 20 2a 2f 0a 20 20  index iIdx */.  
b110: 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 2c 20 20  int iLeafPgno,  
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d  /* Leaf page num
b140: 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64  ber to load dlid
b150: 78 20 66 6f 72 20 2a 2f 0a 20 20 46 74 73 35 44  x for */.  Fts5D
b160: 6c 69 64 78 49 74 65 72 20 2a 2a 70 70 49 74 65  lidxIter **ppIte
b170: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
b180: 54 3a 20 50 6f 70 75 6c 61 74 65 64 20 69 74 65  T: Populated ite
b190: 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74  rator */.){.  Ft
b1a0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b1b0: 65 72 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  er = *ppIter;.  
b1c0: 46 74 73 35 44 61 74 61 20 2a 70 44 6c 69 64 78  Fts5Data *pDlidx
b1d0: 3b 0a 0a 20 20 70 44 6c 69 64 78 20 3d 20 66 74  ;..  pDlidx = ft
b1e0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
b1f0: 53 35 5f 44 4f 43 4c 49 53 54 5f 49 44 58 5f 52  S5_DOCLIST_IDX_R
b200: 4f 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69  OWID(iIdx, iSegi
b210: 64 2c 20 69 4c 65 61 66 50 67 6e 6f 29 29 3b 0a  d, iLeafPgno));.
b220: 20 20 69 66 28 20 70 44 6c 69 64 78 3d 3d 30 20    if( pDlidx==0 
b230: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
b240: 70 49 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  pIter==0 ){.    
b250: 2a 70 70 49 74 65 72 20 3d 20 70 49 74 65 72 20  *ppIter = pIter 
b260: 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  = (Fts5DlidxIter
b270: 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
b280: 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  p, sizeof(Fts5Dl
b290: 69 64 78 49 74 65 72 29 29 3b 0a 20 20 20 20 69  idxIter));.    i
b2a0: 66 28 20 70 49 74 65 72 3d 3d 30 20 29 7b 20 0a  f( pIter==0 ){ .
b2b0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
b2c0: 6c 65 61 73 65 28 70 44 6c 69 64 78 29 3b 0a 20  lease(pDlidx);. 
b2d0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
b2e0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
b2f0: 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
b300: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
b310: 78 49 74 65 72 29 29 3b 0a 20 20 7d 0a 0a 20 20  xIter));.  }..  
b320: 70 49 74 65 72 2d 3e 70 44 61 74 61 20 3d 20 70  pIter->pData = p
b330: 44 6c 69 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e  Dlidx;.  pIter->
b340: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61  iLeafPgno = iLea
b350: 66 50 67 6e 6f 3b 0a 20 20 69 66 28 20 62 52 65  fPgno;.  if( bRe
b360: 76 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  v==0 ){.    fts5
b370: 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 70  DlidxIterFirst(p
b380: 49 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Iter);.  }else{.
b390: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
b3a0: 72 4c 61 73 74 28 70 49 74 65 72 29 3b 0a 20 20  rLast(pIter);.  
b3b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
b3c0: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
b3d0: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
b3e0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 74 73  allocated by fts
b3f0: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 29  5DlidxIterInit()
b400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b410: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
b420: 65 65 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  ee(Fts5DlidxIter
b430: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
b440: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 66 74 73  pIter ){.    fts
b450: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
b460: 65 72 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  er->pData);.    
b470: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74  sqlite3_free(pIt
b480: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
b490: 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20  * Load the next 
b4a0: 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74  leaf page into t
b4b0: 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61  he segment itera
b4c0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
b4d0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
b4e0: 65 78 74 50 61 67 65 28 0a 20 20 46 74 73 35 49  extPage(.  Fts5I
b4f0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
b500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
b510: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
b520: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
b530: 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
b540: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
b550: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f  or to advance to
b560: 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b   next page */.){
b570: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
b580: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
b590: 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 69  pIter->pSeg;.  i
b5a0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
b5b0: 29 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73  ) fts5DataReleas
b5c0: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
b5d0: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  .  pIter->iLeafP
b5e0: 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74  gno++;.  if( pIt
b5f0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70  er->iLeafPgno<=p
b600: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
b610: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
b620: 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
b630: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54 53  (p, .        FTS
b640: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
b650: 70 49 74 65 72 2d 3e 69 49 64 78 2c 20 70 53 65  pIter->iIdx, pSe
b660: 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49  g->iSegid, 0, pI
b670: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a  ter->iLeafPgno).
b680: 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a      );.  }else{.
b690: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
b6a0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
b6b0: 2a 2a 20 4c 65 61 76 65 20 70 49 74 65 72 2d 3e  ** Leave pIter->
b6c0: 69 4c 65 61 66 4f 66 66 73 65 74 20 61 73 20 74  iLeafOffset as t
b6d0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
b6e0: 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74   size field of t
b6f0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 70 6f 73 69  he first.** posi
b700: 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70  tion list. The p
b710: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c  osition list bel
b720: 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65  onging to docume
b730: 6e 74 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  nt pIter->iRowid
b740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b750: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
b760: 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 20 2a  Term(Fts5Index *
b770: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
b780: 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70  pIter, int nKeep
b790: 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  ){.  u8 *a = pIt
b7a0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20  er->pLeaf->p;   
b7b0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
b7c0: 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d  o read data from
b7d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d   */.  int iOff =
b7e0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
b7f0: 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20  set;  /* Offset 
b800: 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20  to read at */.  
b810: 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e 65 77 20  /* Bytes of new 
b840: 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20  data */..  iOff 
b850: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
b860: 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a  a[iOff], nNew);.
b870: 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20    pIter->term.n 
b880: 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42  = nKeep;.  fts5B
b890: 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
b8a0: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
b8b0: 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69  term, nNew, &a[i
b8c0: 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  Off]);.  iOff +=
b8d0: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
b8e0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
b8f0: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
b900: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
b910: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b920: 6f 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  o;.  if( iOff>=p
b930: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29  Iter->pLeaf->n )
b940: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
b950: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
b960: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
b970: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  er->pLeaf==0 ){.
b980: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
b990: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
b9a0: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
b9b0: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  T;.      return;
b9c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20  .    }.    iOff 
b9d0: 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74  = 4;.    a = pIt
b9e0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
b9f0: 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69  }.  iOff += sqli
ba00: 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61 5b  te3GetVarint(&a[
ba10: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
ba20: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
ba30: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ba40: 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  et = iOff;.}../*
ba50: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
ba60: 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  he iterator obje
ba70: 63 74 20 70 49 74 65 72 20 74 6f 20 69 74 65 72  ct pIter to iter
ba80: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
ba90: 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65  entries in.** se
baa0: 67 6d 65 6e 74 20 70 53 65 67 20 77 69 74 68 69  gment pSeg withi
bab0: 6e 20 69 6e 64 65 78 20 69 49 64 78 2e 20 54 68  n index iIdx. Th
bac0: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
bad0: 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ft pointing to t
bae0: 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 65 6e 74  he .** first ent
baf0: 72 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ry when this fun
bb00: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
bb10: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
bb20: 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
bb30: 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
bb40: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
bb50: 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
bb60: 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
bb70: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
bb80: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
bb90: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
bba0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
bbb0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
bbc0: 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20 46  SegIterInit(.  F
bbd0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
bbe0: 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 49 64        .  int iId
bbf0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
bc00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
bc10: 69 67 2e 61 48 61 73 68 5b 5d 20 69 6e 64 65 78  ig.aHash[] index
bc20: 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 2a 2f   of FTS index */
bc30: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
bc40: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20  Segment *pSeg,  
bc50: 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
bc60: 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  n of segment */.
bc70: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
bc80: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
bc90: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70    /* Object to p
bca0: 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opulate */.){.  
bcb0: 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69  if( pSeg->pgnoFi
bcc0: 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  rst==0 ){.    /*
bcd0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66   This happens if
bce0: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73 20   the segment is 
bcf0: 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61 6e  being used as an
bd00: 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e 63   input to an inc
bd10: 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a 20  remental.    ** 
bd20: 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64 61  merge and all da
bd30: 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ta has already b
bd40: 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20 53  een "trimmed". S
bd50: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
bd60: 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  ** fts5TrimSegme
bd70: 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nts() for detail
bd80: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
bd90: 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61 74  leave the iterat
bda0: 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a 2a  or empty..    **
bdb0: 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
bdc0: 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72 2d   see the (pIter-
bdd0: 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20 61  >pLeaf==0) and a
bde0: 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61 74  ssume the iterat
bdf0: 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74 20  or is.    ** at 
be00: 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f 0a  EOF already. */.
be10: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
be20: 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  r->pLeaf==0 );. 
be30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
be40: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
be50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 65  ITE_OK ){.    me
be60: 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
be70: 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a  izeof(*pIter));.
be80: 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20      pIter->pSeg 
be90: 3d 20 70 53 65 67 3b 0a 20 20 20 20 70 49 74 65  = pSeg;.    pIte
bea0: 72 2d 3e 69 49 64 78 20 3d 20 69 49 64 78 3b 0a  r->iIdx = iIdx;.
beb0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
bec0: 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Pgno = pSeg->pgn
bed0: 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74  oFirst-1;.    ft
bee0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
bef0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
bf00: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
bf10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bf20: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
bf30: 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49 74  Leaf->p;.    pIt
bf40: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
bf50: 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
bf60: 32 5d 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67  2]);.    fts5Seg
bf70: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20  IterLoadTerm(p, 
bf80: 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d  pIter, 0);.  }.}
bf90: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
bfa0: 73 35 4c 65 61 66 48 65 61 64 65 72 28 46 74 73  s5LeafHeader(Fts
bfb0: 35 44 61 74 61 20 2a 70 4c 65 61 66 2c 20 69 6e  5Data *pLeaf, in
bfc0: 74 20 2a 70 69 52 6f 77 69 64 2c 20 69 6e 74 20  t *piRowid, int 
bfd0: 2a 70 69 54 65 72 6d 29 7b 0a 20 20 2a 70 69 52  *piTerm){.  *piR
bfe0: 6f 77 69 64 20 3d 20 28 69 6e 74 29 66 74 73 35  owid = (int)fts5
bff0: 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
c000: 5b 30 5d 29 3b 0a 20 20 2a 70 69 54 65 72 6d 20  [0]);.  *piTerm 
c010: 3d 20 28 69 6e 74 29 66 74 73 35 47 65 74 55 31  = (int)fts5GetU1
c020: 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b  6(&pLeaf->p[2]);
c030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c040: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
c050: 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69  ever called on i
c060: 74 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64  terators created
c070: 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20   by calls to.** 
c080: 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
c090: 20 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e   with the FTS5IN
c0a0: 44 45 58 5f 51 55 45 52 59 5f 41 53 43 20 66 6c  DEX_QUERY_ASC fl
c0b0: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  ag set..**.** Wh
c0c0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
c0d0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 65 72   is called, iter
c0e0: 61 74 6f 72 20 70 49 74 65 72 20 70 6f 69 6e 74  ator pIter point
c0f0: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
c100: 6f 77 69 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 63  owid.** on the c
c110: 75 72 72 65 6e 74 20 6c 65 61 66 20 61 73 73 6f  urrent leaf asso
c120: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
c130: 74 65 72 6d 20 62 65 69 6e 67 20 71 75 65 72 69  term being queri
c140: 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
c150: 6e 0a 2a 2a 20 61 64 76 61 6e 63 65 73 20 69 74  n.** advances it
c160: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
c170: 20 6c 61 73 74 20 73 75 63 68 20 72 6f 77 69 64   last such rowid
c180: 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
c190: 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73 0a  ry, initializes.
c1a0: 2a 2a 20 74 68 65 20 61 52 6f 77 69 64 4f 66 66  ** the aRowidOff
c1b0: 73 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77 69 64  set[] and iRowid
c1c0: 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c 65 73  Offset variables
c1d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c1e0: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
c1f0: 72 73 65 49 6e 69 74 50 61 67 65 28 46 74 73 35  rseInitPage(Fts5
c200: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
c210: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
c220: 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
c230: 70 4c 65 61 66 2d 3e 6e 3b 0a 20 20 69 6e 74 20  pLeaf->n;.  int 
c240: 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  i = pIter->iLeaf
c250: 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20  Offset;.  u8 *a 
c260: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c270: 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f  p;.  int iRowidO
c280: 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 77 68  ffset = 0;..  wh
c290: 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
c2a0: 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 20 29 7b 0a  TE_OK && i<n ){.
c2b0: 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d      i64 iDelta =
c2c0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   0;.    int nPos
c2d0: 3b 0a 0a 20 20 20 20 69 20 2b 3d 20 67 65 74 56  ;..    i += getV
c2e0: 61 72 69 6e 74 33 32 28 26 61 5b 69 5d 2c 20 6e  arint32(&a[i], n
c2f0: 50 6f 73 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e  Pos);.    i += n
c300: 50 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d  Pos;.    if( i>=
c310: 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  n ) break;.    i
c320: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61   += getVarint(&a
c330: 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  [i], (u64*)&iDel
c340: 74 61 29 3b 0a 20 20 20 20 69 66 28 20 69 44 65  ta);.    if( iDe
c350: 6c 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  lta==0 ) break;.
c360: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
c370: 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20  d -= iDelta;..  
c380: 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73    if( iRowidOffs
c390: 65 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69  et>=pIter->nRowi
c3a0: 64 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  dOffset ){.     
c3b0: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65   int nNew = pIte
c3c0: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
c3d0: 2b 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  + 8;.      int *
c3e0: 61 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c  aNew = (int*)sql
c3f0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74  ite3_realloc(pIt
c400: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
c410: 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e  , nNew*sizeof(in
c420: 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  t));.      if( a
c430: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
c440: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c450: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
c460: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c470: 20 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77       pIter->aRow
c480: 69 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b  idOffset = aNew;
c490: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52  .      pIter->nR
c4a0: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65  owidOffset = nNe
c4b0: 77 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49  w;.    }..    pI
c4c0: 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65  ter->aRowidOffse
c4d0: 74 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b  t[iRowidOffset++
c4e0: 5d 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ] = pIter->iLeaf
c4f0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65  Offset;.    pIte
c500: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
c510: 20 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d   i;.  }.  pIter-
c520: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20  >iRowidOffset = 
c530: 69 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 7d 0a  iRowidOffset;.}.
c540: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
c550: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
c560: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
c570: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
c580: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
c590: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
c5a0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
c5b0: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
c5c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
c5d0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
c5e0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
c5f0: 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61  M );..  fts5Data
c600: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
c610: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
c620: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69  pLeaf = 0;.  whi
c630: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
c640: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69  E_OK && pIter->i
c650: 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
c660: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
c670: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
c680: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
c690: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
c6a0: 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61   pNew = fts5Data
c6b0: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
c6c0: 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20  MENT_ROWID(.    
c6d0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 49 64        pIter->iId
c6e0: 78 2c 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e  x, pIter->pSeg->
c6f0: 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72  iSegid, 0, pIter
c700: 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20 20  ->iLeafPgno.    
c710: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  ));.    if( pNew
c720: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
c730: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d  ter->iLeafPgno==
c740: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
c750: 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
c760: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  if( pIter->iTerm
c770: 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d  LeafOffset<pNew-
c780: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
c790: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
c7a0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70  New;.          p
c7b0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c7c0: 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  t = pIter->iTerm
c7d0: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20  LeafOffset;.    
c7e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
c7f0: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
c800: 52 6f 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79 3b  RowidOff, dummy;
c810: 0a 20 20 20 20 20 20 20 20 66 74 73 35 4c 65 61  .        fts5Lea
c820: 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69  fHeader(pNew, &i
c830: 52 6f 77 69 64 4f 66 66 2c 20 26 64 75 6d 6d 79  RowidOff, &dummy
c840: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
c850: 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20 20  RowidOff ){.    
c860: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
c870: 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  af = pNew;.     
c880: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
c890: 66 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64  fOffset = iRowid
c8a0: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Off;.        }. 
c8b0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
c8c0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
c8d0: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20  {.        u8 *a 
c8e0: 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  = &pIter->pLeaf-
c8f0: 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  >p[pIter->iLeafO
c900: 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20  ffset];.        
c910: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c920: 65 74 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28  et += getVarint(
c930: 61 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  a, (u64*)&pIter-
c940: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
c950: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
c960: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
c970: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e  s5DataRelease(pN
c980: 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ew);.      }.   
c990: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
c9a0: 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
c9b0: 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
c9c0: 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20  erseInitPage(p, 
c9d0: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
c9e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
c9f0: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
ca00: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
ca10: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
ca20: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
ca30: 74 73 20 74 6f 20 61 20 64 65 6c 65 74 65 20 6d  ts to a delete m
ca40: 61 72 6b 65 72 2e 20 41 20 64 65 6c 65 74 65 20  arker. A delete 
ca50: 6d 61 72 6b 65 72 20 69 73 20 61 6e 20 65 6e 74  marker is an ent
ca60: 72 79 20 77 69 74 68 20 61 20 30 20 62 79 74 65  ry with a 0 byte
ca70: 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  .** position-lis
ca80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
ca90: 20 66 74 73 35 53 65 67 49 74 65 72 49 73 44 65   fts5SegIterIsDe
caa0: 6c 65 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  lete(.  Fts5Inde
cab0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
cac0: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
cad0: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
cae0: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
caf0: 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
cb00: 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
cb10: 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 29 7b  to advance */.){
cb20: 0a 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30 3b  .  int bRet = 0;
cb30: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
cb40: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
cb50: 66 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  f;.  if( p->rc==
cb60: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 65  SQLITE_OK && pLe
cb70: 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  af ){.    if( pI
cb80: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
cb90: 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  <pLeaf->n ){.   
cba0: 20 20 20 62 52 65 74 20 3d 20 28 70 4c 65 61 66     bRet = (pLeaf
cbb0: 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66  ->p[pIter->iLeaf
cbc0: 4f 66 66 73 65 74 5d 3d 3d 30 78 30 30 29 3b 0a  Offset]==0x00);.
cbd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cbe0: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20   Fts5Data *pNew 
cbf0: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
cc00: 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
cc10: 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20  OWID(.          
cc20: 20 20 70 49 74 65 72 2d 3e 69 49 64 78 2c 20 70    pIter->iIdx, p
cc30: 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67  Iter->pSeg->iSeg
cc40: 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e 69 4c  id, 0, pIter->iL
cc50: 65 61 66 50 67 6e 6f 0a 20 20 20 20 20 20 29 29  eafPgno.      ))
cc60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
cc70: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 52 65 74   ){.        bRet
cc80: 20 3d 20 28 70 4e 65 77 2d 3e 70 5b 34 5d 3d 3d   = (pNew->p[4]==
cc90: 30 78 30 30 29 3b 0a 20 20 20 20 20 20 20 20 66  0x00);.        f
cca0: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
ccb0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  New);.      }.  
ccc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
ccd0: 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   bRet;.}../*.** 
cce0: 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
ccf0: 20 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65   pIter to the ne
cd00: 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
cd10: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
cd20: 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
cd30: 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
cd40: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
cd50: 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73   code. It .** is
cd60: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20   not considered 
cd70: 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
cd80: 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73  iterator reaches
cd90: 20 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f   EOF. If an erro
cda0: 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
cdb0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
cdc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
cdd0: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
cde0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
cdf0: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
ce00: 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e  erNext(.  Fts5In
ce10: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
ce20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
ce30: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
ce40: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
ce50: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
ce60: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
ce70: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
ce80: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
ce90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cea0: 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67   if( pIter->flag
ceb0: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
cec0: 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20 20 20  _REVERSE ){.    
ced0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52 6f    if( pIter->iRo
cee0: 77 69 64 4f 66 66 73 65 74 3e 30 20 29 7b 0a 20  widOffset>0 ){. 
cef0: 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70         u8 *a = p
cf00: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
cf10: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
cf20: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50  ;.        int nP
cf30: 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  os;.        i64 
cf40: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
cf50: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
cf60: 73 65 74 2d 2d 3b 0a 0a 20 20 20 20 20 20 20 20  set--;..        
cf70: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
cf80: 65 74 20 3d 20 69 4f 66 66 20 3d 20 70 49 74 65  et = iOff = pIte
cf90: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  r->aRowidOffset[
cfa0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66  pIter->iRowidOff
cfb0: 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 4f  set];.        iO
cfc0: 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  ff += getVarint3
cfd0: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73  2(&a[iOff], nPos
cfe0: 29 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  );.        iOff 
cff0: 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  += nPos;.       
d000: 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f   getVarint(&a[iO
d010: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
d020: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  ta);.        pIt
d030: 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
d040: 65 6c 74 61 3b 0a 20 20 20 20 20 20 7d 65 6c 73  elta;.      }els
d050: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  e{.        fts5S
d060: 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
d070: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
d080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d090: 65 7b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74  e{.      Fts5Dat
d0a0: 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
d0b0: 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 69  ->pLeaf;.      i
d0c0: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 69  nt iOff;.      i
d0d0: 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b  nt bNewTerm = 0;
d0e0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65 70  .      int nKeep
d0f0: 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20   = 0;..      /* 
d100: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 65  Search for the e
d110: 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  nd of the positi
d120: 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20 74  on list within t
d130: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
d140: 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 61 20   */.      u8 *a 
d150: 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  = pLeaf->p;.    
d160: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65 61 66 2d    int n = pLeaf-
d170: 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66 20  >n;..      iOff 
d180: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
d190: 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20  fset;.      if( 
d1a0: 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  iOff<n ){.      
d1b0: 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a    int nPoslist;.
d1c0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
d1d0: 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  getVarint32(&a[i
d1e0: 4f 66 66 5d 2c 20 6e 50 6f 73 6c 69 73 74 29 3b  Off], nPoslist);
d1f0: 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
d200: 20 6e 50 6f 73 6c 69 73 74 3b 0a 20 20 20 20 20   nPoslist;.     
d210: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69 4f   }..      if( iO
d220: 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff<n ){.        
d230: 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72  /* The next entr
d240: 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72  y is on the curr
d250: 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ent page */.    
d260: 20 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a      u64 iDelta;.
d270: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
d280: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
d290: 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c  (&a[iOff], &iDel
d2a0: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74  ta);.        pIt
d2b0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d2c0: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
d2d0: 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 7b  if( iDelta==0 ){
d2e0: 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65 77 54  .          bNewT
d2f0: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
d300: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29     if( iOff>=n )
d310: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
d320: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
d330: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
d340: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
d350: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34 3b  iLeafOffset = 4;
d360: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
d370: 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35 47   if( iOff!=fts5G
d380: 65 74 55 31 36 28 26 61 5b 32 5d 29 20 29 7b 0a  etU16(&a[2]) ){.
d390: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
d3a0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
d3b0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
d3c0: 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a  [iOff], nKeep);.
d3d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d3f0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77       pIter->iRow
d400: 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id -= iDelta;.  
d410: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
d420: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  lse{.        iOf
d430: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f  f = 0;.        /
d440: 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20  * Next entry is 
d450: 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  not on the curre
d460: 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  nt page */.     
d470: 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d     while( iOff==
d480: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
d490: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
d4a0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
d4b0: 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
d4c0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20  pIter->pLeaf;.  
d4d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
d4e0: 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  f==0 ) break;.  
d4f0: 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
d500: 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26  f = fts5GetU16(&
d510: 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20 29 7b  pLeaf->p[0])) ){
d520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
d530: 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74 56  f += sqlite3GetV
d540: 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b  arint(&pLeaf->p[
d550: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
d560: 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
d570: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
d580: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
d590: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  Off;.          }
d5a0: 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20  .          else 
d5b0: 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35  if( (iOff = fts5
d5c0: 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70  GetU16(&pLeaf->p
d5d0: 5b 32 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20  [2])) ){.       
d5e0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
d5f0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
d600: 20 20 20 20 20 20 20 20 20 20 20 20 62 4e 65 77              bNew
d610: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
d620: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d630: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
d640: 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 69  * Check if the i
d650: 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61  terator is now a
d660: 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65  t EOF. If so, re
d670: 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20  turn early. */. 
d680: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
d690: 70 4c 65 61 66 20 26 26 20 62 4e 65 77 54 65 72  pLeaf && bNewTer
d6a0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  m ){.        if(
d6b0: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
d6c0: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
d6d0: 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  TERM ){.        
d6e0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
d6f0: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
d700: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
d710: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
d720: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d730: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
d740: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
d750: 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  er, nKeep);.    
d760: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d770: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d780: 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
d790: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
d7a0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f   to the first ro
d7b0: 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74  wid in a doclist
d7c0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
d7d0: 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74 65 72  on sets the iter
d7e0: 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20  ator up so that 
d7f0: 69 74 65 72 61 74 65 73 20 69 6e 20 72 65 76 65  iterates in reve
d800: 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67  rse order throug
d810: 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74  h.** the doclist
d820: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d830: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
d840: 72 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  rse(Fts5Index *p
d850: 2c 20 69 6e 74 20 69 49 64 78 2c 20 46 74 73 35  , int iIdx, Fts5
d860: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
d870: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
d880: 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
d890: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
d8a0: 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  af data */.  int
d8b0: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
d8c0: 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20  LeafOffset;  /* 
d8d0: 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68  Byte offset with
d8e0: 69 6e 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  in current leaf 
d8f0: 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
d900: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Last = 0;.  int 
d910: 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20  pgnoLast = 0;.. 
d920: 20 2f 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20   /* Move to the 
d930: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
d940: 6e 73 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69  ns the last rowi
d950: 64 20 69 6e 20 74 68 69 73 20 64 6f 63 6c 69 73  d in this doclis
d960: 74 2e 20 2a 2f 0a 20 20 70 4c 65 61 66 20 3d 20  t. */.  pLeaf = 
d970: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20  pIter->pLeaf;.. 
d980: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 44 6c 69   if( pIter->pDli
d990: 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53  dx ){.    int iS
d9a0: 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53  egid = pIter->pS
d9b0: 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
d9c0: 70 67 6e 6f 4c 61 73 74 20 3d 20 70 49 74 65 72  pgnoLast = pIter
d9d0: 2d 3e 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50  ->pDlidx->iLeafP
d9e0: 67 6e 6f 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d  gno;.    pLast =
d9f0: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
da00: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
da10: 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
da20: 2c 20 30 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b  , 0, pgnoLast));
da30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
da40: 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d  ile( iOff<pLeaf-
da50: 3e 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >n ){.      int 
da60: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 36 34 20  nPos;.      i64 
da70: 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 20 20 2f  iDelta;..      /
da80: 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  * Position list 
da90: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  size in bytes */
daa0: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
dab0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
dac0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 50 6f 73  f->p[iOff], nPos
dad0: 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  );.      iOff +=
dae0: 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 66 28   nPos;.      if(
daf0: 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20   iOff>=pLeaf->n 
db00: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
db10: 2f 2a 20 52 6f 77 69 64 20 64 65 6c 74 61 2e 20  /* Rowid delta. 
db20: 4f 72 2c 20 69 66 20 30 78 30 30 2c 20 74 68 65  Or, if 0x00, the
db30: 20 65 6e 64 20 6f 66 20 64 6f 63 6c 69 73 74 20   end of doclist 
db40: 6d 61 72 6b 65 72 2e 20 2a 2f 0a 20 20 20 20 20  marker. */.     
db50: 20 6e 50 6f 73 20 3d 20 67 65 74 56 61 72 69 6e   nPos = getVarin
db60: 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  t(&pLeaf->p[iOff
db70: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
db80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 44 65  );.      if( iDe
db90: 6c 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  lta==0 ) break;.
dba0: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50        iOff += nP
dbb0: 6f 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  os;.    }..    i
dbc0: 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e  f( iOff>=pLeaf->
dbd0: 6e 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  n ){.      Fts5S
dbe0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
dbf0: 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70  *pSeg = pIter->p
dc00: 53 65 67 3b 0a 20 20 20 20 20 20 69 36 34 20 69  Seg;.      i64 i
dc10: 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  Abs = FTS5_SEGME
dc20: 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70  NT_ROWID(iIdx, p
dc30: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20  Seg->iSegid, 0, 
dc40: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
dc50: 29 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4c 61  );.      i64 iLa
dc60: 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  st = FTS5_SEGMEN
dc70: 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70 53  T_ROWID(iIdx, pS
dc80: 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  eg->iSegid, 0, p
dc90: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg->pgnoLast);.
dca0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61  .      /* The la
dcb0: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
dcc0: 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20  doclist may not 
dcd0: 62 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  be on the curren
dce0: 74 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a 20  t page. Search. 
dcf0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64        ** forward
dd00: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70 61 67   to find the pag
dd10: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
dd20: 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f   last rowid.  */
dd30: 0a 20 20 20 20 20 20 66 6f 72 28 69 41 62 73 2b  .      for(iAbs+
dd40: 2b 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  +; p->rc==SQLITE
dd50: 5f 4f 4b 20 26 26 20 69 41 62 73 3c 3d 69 4c 61  _OK && iAbs<=iLa
dd60: 73 74 3b 20 69 41 62 73 2b 2b 29 7b 0a 20 20 20  st; iAbs++){.   
dd70: 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
dd80: 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65  New = fts5DataRe
dd90: 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20 20  ad(p, iAbs);.   
dda0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
ddb0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
ddc0: 52 6f 77 69 64 2c 20 69 54 65 72 6d 3b 0a 20 20  Rowid, iTerm;.  
ddd0: 20 20 20 20 20 20 20 20 66 74 73 35 4c 65 61 66          fts5Leaf
dde0: 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69 52  Header(pNew, &iR
ddf0: 6f 77 69 64 2c 20 26 69 54 65 72 6d 29 3b 0a 20  owid, &iTerm);. 
de00: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
de10: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
de20: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 54 6d     Fts5Data *pTm
de30: 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20 20  p = pLast;.     
de40: 20 20 20 20 20 20 20 70 4c 61 73 74 20 3d 20 70         pLast = p
de50: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20  New;.           
de60: 20 70 4e 65 77 20 3d 20 70 54 6d 70 3b 0a 20 20   pNew = pTmp;.  
de70: 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61            pgnoLa
de80: 73 74 20 3d 20 69 41 62 73 20 26 20 28 28 28 69  st = iAbs & (((i
de90: 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
dea0: 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 3b 0a  A_PAGE_B) - 1);.
deb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dec0: 20 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 20        if( iTerm 
ded0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
dee0: 41 62 73 20 3d 20 69 4c 61 73 74 3b 0a 20 20 20  Abs = iLast;.   
def0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
df00: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
df10: 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  se(pNew);.      
df20: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
df30: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
df40: 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74 20  Last is NULL at 
df50: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
df60: 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 20   the last rowid 
df70: 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73 74  for this doclist
df80: 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68  .  ** lies on th
df90: 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79  e page currently
dfa0: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
dfb0: 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20 74  e iterator. In t
dfc0: 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20 69  his case .  ** i
dfd0: 4c 61 73 74 4f 66 66 20 69 73 20 73 65 74 20 74  LastOff is set t
dfe0: 6f 20 74 68 65 20 76 61 6c 75 65 20 74 68 61 74  o the value that
dff0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e000: 73 65 74 20 77 69 6c 6c 20 74 61 6b 65 20 77 68  set will take wh
e010: 65 6e 0a 20 20 2a 2a 20 74 68 65 20 69 74 65 72  en.  ** the iter
e020: 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ator points to t
e030: 68 61 74 20 72 6f 77 69 64 2e 0a 20 20 2a 2a 0a  hat rowid..  **.
e040: 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73    ** Or, if pLas
e050: 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
e060: 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 70 61  hen it is the pa
e070: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
e080: 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72   the last.  ** r
e090: 6f 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  owid..  */.  if(
e0a0: 20 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e   pLast ){.    in
e0b0: 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20 66 74 73  t dummy;.    fts
e0c0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
e0d0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20  er->pLeaf);.    
e0e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
e0f0: 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  Last;.    pIter-
e100: 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e  >iLeafPgno = pgn
e110: 6f 4c 61 73 74 3b 0a 20 20 20 20 66 74 73 35 4c  oLast;.    fts5L
e120: 65 61 66 48 65 61 64 65 72 28 70 4c 61 73 74 2c  eafHeader(pLast,
e130: 20 26 69 4f 66 66 2c 20 26 64 75 6d 6d 79 29 3b   &iOff, &dummy);
e140: 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74  .    iOff += get
e150: 56 61 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70  Varint(&pLast->p
e160: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
e170: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
e180: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e190: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
e1a0: 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  }..  fts5SegIter
e1b0: 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28  ReverseInitPage(
e1c0: 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
e1d0: 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
e1e0: 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
e1f0: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
e200: 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63 6c   rowid of a docl
e210: 69 73 74 20 77 69 74 68 69 6e 0a 2a 2a 20 69 6e  ist within.** in
e220: 64 65 78 20 69 49 64 78 2e 20 54 68 65 72 65 20  dex iIdx. There 
e230: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
e240: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
e250: 74 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72  th the final ter
e260: 6d 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  m on.** the curr
e270: 65 6e 74 20 70 61 67 65 2e 20 49 66 20 74 68 65  ent page. If the
e280: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
e290: 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f   the last term o
e2a0: 6e 20 74 68 65 20 70 61 67 65 2c 20 0a 2a 2a 20  n the page, .** 
e2b0: 6c 6f 61 64 20 74 68 65 20 64 6f 63 6c 69 73 74  load the doclist
e2c0: 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b  -index from disk
e2d0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
e2e0: 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20 0a  an iterator at .
e2f0: 2a 2a 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64  ** (pIter->pDlid
e300: 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  x)..*/.static vo
e310: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
e320: 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65  adDlidx(Fts5Inde
e330: 78 20 2a 70 2c 20 69 6e 74 20 69 49 64 78 2c 20  x *p, int iIdx, 
e340: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
e350: 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69  er){.  int iSegi
e360: 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  d = pIter->pSeg-
e370: 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62  >iSegid;.  int b
e380: 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
e390: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e3a0: 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
e3b0: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
e3c0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f   pIter->pLeaf; /
e3d0: 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
e3e0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  ata */.  int iOf
e3f0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
e400: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 42 79 74 65  Offset;  /* Byte
e410: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 63   offset within c
e420: 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a  urrent leaf */..
e430: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
e440: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e450: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b  GITER_ONETERM );
e460: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
e470: 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a  ->pDlidx==0 );..
e480: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
e490: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
e4a0: 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20 70  t ends on this p
e4b0: 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  age. If it does,
e4c0: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72   return.  ** ear
e4d0: 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64 69  ly without loadi
e4e0: 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  ng the doclist-i
e4f0: 6e 64 65 78 20 28 61 73 20 69 74 20 62 65 6c 6f  ndex (as it belo
e500: 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65 72 65  ngs to a differe
e510: 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f  nt.  ** term. */
e520: 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70  .  while( iOff<p
e530: 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  Leaf->n ){.    i
e540: 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 69  64 iDelta;.    i
e550: 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a 0a 20 20  nt nPoslist;..  
e560: 20 20 2f 2a 20 69 4f 66 66 20 69 73 20 63 75 72    /* iOff is cur
e570: 72 65 6e 74 6c 79 20 74 68 65 20 6f 66 66 73 65  rently the offse
e580: 74 20 6f 66 20 74 68 65 20 73 69 7a 65 20 66 69  t of the size fi
e590: 65 6c 64 20 6f 66 20 61 20 70 6f 73 69 74 69 6f  eld of a positio
e5a0: 6e 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69  n list. */.    i
e5b0: 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
e5c0: 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
e5d0: 66 5d 2c 20 6e 50 6f 73 6c 69 73 74 29 3b 0a 20  f], nPoslist);. 
e5e0: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 6c     iOff += nPosl
e5f0: 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f  ist;..    if( iO
e600: 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  ff<pLeaf->n ){. 
e610: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74       iOff += get
e620: 56 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70  Varint(&pLeaf->p
e630: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
e640: 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66  Delta);.      if
e650: 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65  ( iDelta==0 ) re
e660: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
e670: 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
e680: 49 6e 69 74 28 70 2c 20 62 52 65 76 2c 20 69 49  Init(p, bRev, iI
e690: 64 78 2c 20 69 53 65 67 69 64 2c 20 70 49 74 65  dx, iSegid, pIte
e6a0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2c 20 26 70  r->iLeafPgno, &p
e6b0: 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a 7d  Iter->pDlidx);.}
e6c0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
e6d0: 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49  ze the object pI
e6e0: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ter to point to 
e6f0: 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
e700: 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74 0a   within segment.
e710: 2a 2a 20 70 53 65 67 2c 20 69 6e 64 65 78 20 69  ** pSeg, index i
e720: 49 64 78 2e 20 49 66 20 74 68 65 72 65 20 69 73  Idx. If there is
e730: 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e   no such term in
e740: 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20   the index, the 
e750: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 73  iterator.** is s
e760: 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
e770: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
e780: 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
e790: 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
e7a0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
e7b0: 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
e7c0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
e7d0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
e7e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
e7f0: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
e800: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
e810: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
e820: 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20 20 46  terSeekInit(.  F
e830: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e850: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
e860: 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20  /.  int iIdx,   
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61 48      /* Config.aH
e890: 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20 46  ash[] index of F
e8a0: 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  TS index */.  co
e8b0: 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
e8c0: 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
e8d0: 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
e8e0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
e910: 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66   FTS5INDEX_XXX f
e920: 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74  lags */.  Fts5St
e930: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
e940: 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73  pSeg,     /* Des
e950: 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d  cription of segm
e960: 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ent */.  Fts5Seg
e970: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
e980: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
e990: 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
e9a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d  /.){.  int iPg =
e9b0: 20 31 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69   1;.  int h;.  i
e9c0: 6e 74 20 62 47 65 20 3d 20 28 28 66 6c 61 67 73  nt bGe = ((flags
e9d0: 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
e9e0: 52 59 5f 50 52 45 46 49 58 29 20 26 26 20 69 49  RY_PREFIX) && iI
e9f0: 64 78 3d 3d 30 29 3b 0a 20 20 69 6e 74 20 62 44  dx==0);.  int bD
ea00: 6c 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 20  lidx = 0;       
ea10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
ea20: 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
ea30: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f  doclist-index */
ea40: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 47 65 3d  ..  assert( bGe=
ea50: 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46  =0 || (flags & F
ea60: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 41  TS5INDEX_QUERY_A
ea70: 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  SC)==0 );.  asse
ea80: 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65  rt( pTerm && nTe
ea90: 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  rm );.  memset(p
eaa0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
eab0: 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
eac0: 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a  r->pSeg = pSeg;.
ead0: 20 20 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20    pIter->iIdx = 
eae0: 69 49 64 78 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  iIdx;..  /* This
eaf0: 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74 61 63   block sets stac
eb00: 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67 20 74  k variable iPg t
eb10: 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  o the leaf page 
eb20: 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61 79 0a  number that may.
eb30: 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72    ** contain ter
eb40: 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
eb50: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
eb60: 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  t in the segment
eb70: 2e 20 2a 2f 0a 20 20 66 6f 72 28 68 3d 70 53 65  . */.  for(h=pSe
eb80: 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20 68 3e  g->nHeight-1; h>
eb90: 30 3b 20 68 2d 2d 29 7b 0a 20 20 20 20 46 74 73  0; h--){.    Fts
eba0: 35 4e 6f 64 65 49 74 65 72 20 6e 6f 64 65 3b 20  5NodeIter node; 
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ebc0: 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
ebd0: 72 6f 75 67 68 20 69 6e 74 65 72 6e 61 6c 20 6e  rough internal n
ebe0: 6f 64 65 73 20 2a 2f 0a 20 20 20 20 69 36 34 20  odes */.    i64 
ebf0: 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
ec00: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
ec10: 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
ec20: 68 2c 20 69 50 67 29 3b 0a 20 20 20 20 46 74 73  h, iPg);.    Fts
ec30: 35 44 61 74 61 20 2a 70 4e 6f 64 65 20 3d 20 66  5Data *pNode = f
ec40: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
ec50: 52 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20  Rowid);.    if( 
ec60: 70 4e 6f 64 65 3d 3d 30 20 29 20 62 72 65 61 6b  pNode==0 ) break
ec70: 3b 0a 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49  ;..    fts5NodeI
ec80: 74 65 72 49 6e 69 74 28 70 4e 6f 64 65 2d 3e 70  terInit(pNode->p
ec90: 2c 20 70 4e 6f 64 65 2d 3e 6e 2c 20 26 6e 6f 64  , pNode->n, &nod
eca0: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
ecb0: 6e 6f 64 65 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29  node.term.n==0 )
ecc0: 3b 0a 0a 20 20 20 20 69 50 67 20 3d 20 6e 6f 64  ;..    iPg = nod
ecd0: 65 2e 69 43 68 69 6c 64 3b 0a 20 20 20 20 62 44  e.iChild;.    bD
ece0: 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44 6c 69  lidx = node.bDli
ecf0: 64 78 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35  dx;.    for(fts5
ed00: 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 70 2d  NodeIterNext(&p-
ed10: 3e 72 63 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20  >rc, &node);.   
ed20: 20 20 20 20 20 6e 6f 64 65 2e 61 44 61 74 61 20       node.aData 
ed30: 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  && fts5BufferCom
ed40: 70 61 72 65 42 6c 6f 62 28 26 6e 6f 64 65 2e 74  pareBlob(&node.t
ed50: 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  erm, pTerm, nTer
ed60: 6d 29 3c 3d 30 3b 0a 20 20 20 20 20 20 20 20 66  m)<=0;.        f
ed70: 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28  ts5NodeIterNext(
ed80: 26 70 2d 3e 72 63 2c 20 26 6e 6f 64 65 29 0a 20  &p->rc, &node). 
ed90: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 50 67 20     ){.      iPg 
eda0: 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20  = node.iChild;. 
edb0: 20 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f       bDlidx = no
edc0: 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 20 20 7d  de.bDlidx;.    }
edd0: 0a 20 20 20 20 66 74 73 35 4e 6f 64 65 49 74 65  .    fts5NodeIte
ede0: 72 46 72 65 65 28 26 6e 6f 64 65 29 3b 0a 20 20  rFree(&node);.  
edf0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
ee00: 65 28 70 4e 6f 64 65 29 3b 0a 20 20 7d 0a 0a 20  e(pNode);.  }.. 
ee10: 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e 70   if( iPg<pSeg->p
ee20: 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20  gnoFirst ){.    
ee30: 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  iPg = pSeg->pgno
ee40: 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69 64  First;.    bDlid
ee50: 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 49  x = 0;.  }..  pI
ee60: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
ee70: 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73 35   iPg - 1;.  fts5
ee80: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
ee90: 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69 66  p, pIter);..  if
eea0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
eeb0: 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20  {.    int res;. 
eec0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
eed0: 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 55  ffset = fts5GetU
eee0: 31 36 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66  16(&pIter->pLeaf
eef0: 2d 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 66 74 73  ->p[2]);.    fts
ef00: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
ef10: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
ef20: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 65     do {.      re
ef30: 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f  s = fts5BufferCo
ef40: 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72  mpareBlob(&pIter
ef50: 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  ->term, pTerm, n
ef60: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  Term);.      if(
ef70: 20 72 65 73 3e 3d 30 20 29 20 62 72 65 61 6b 3b   res>=0 ) break;
ef80: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
ef90: 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29  erNext(p, pIter)
efa0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49  ;.    }while( pI
efb0: 74 65 72 2d 3e 70 4c 65 61 66 20 26 26 20 70 2d  ter->pLeaf && p-
efc0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
efd0: 3b 0a 0a 20 20 20 20 69 66 28 20 62 47 65 3d 3d  ;..    if( bGe==
efe0: 30 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  0 && res ){.    
eff0: 20 20 2f 2a 20 53 65 74 20 69 74 65 72 61 74 6f    /* Set iterato
f000: 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 45 4f  r to point to EO
f010: 46 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44  F */.      fts5D
f020: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
f030: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  ->pLeaf);.      
f040: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30  pIter->pLeaf = 0
f050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
f060: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
f070: 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29 7b  _OK && bGe==0 ){
f080: 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
f090: 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
f0a0: 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69  R_ONETERM;.    i
f0b0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
f0c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61  ){.      if( fla
f0d0: 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
f0e0: 55 45 52 59 5f 41 53 43 20 29 7b 0a 20 20 20 20  UERY_ASC ){.    
f0f0: 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
f100: 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
f110: 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
f120: 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44 6c 69  }.      if( bDli
f130: 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  dx ){.        ft
f140: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69  s5SegIterLoadDli
f150: 64 78 28 70 2c 20 69 49 64 78 2c 20 70 49 74 65  dx(p, iIdx, pIte
f160: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
f170: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
f180: 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 41 53  S5INDEX_QUERY_AS
f190: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  C ){.        fts
f1a0: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
f1b0: 70 2c 20 69 49 64 78 2c 20 70 49 74 65 72 29 3b  p, iIdx, pIter);
f1c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f1d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f   }.}../*.** Zero
f1e0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
f1f0: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
f200: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
f210: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
f220: 67 49 74 65 72 43 6c 65 61 72 28 46 74 73 35 53  gIterClear(Fts5S
f230: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
f240: 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
f250: 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
f260: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f270: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f280: 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
f290: 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69  Free(pIter->pDli
f2a0: 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  dx);.  sqlite3_f
f2b0: 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69  ree(pIter->aRowi
f2c0: 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73  dOffset);.  mems
f2d0: 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
f2e0: 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29  eof(Fts5SegIter)
f2f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 74  );.}../*.** Do t
f300: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e 65  he comparison ne
f310: 63 65 73 73 61 72 79 20 74 6f 20 70 6f 70 75 6c  cessary to popul
f320: 61 74 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73  ate pIter->aFirs
f330: 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49  t[iOut]..**.** I
f340: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
f350: 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  alue is non-zero
f360: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
f370: 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e 74   index of an ent
f380: 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49 74  ry.** in the pIt
f390: 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  er->aSeg[] array
f3a0: 20 74 68 61 74 20 69 73 20 28 61 29 20 6e 6f 74   that is (a) not
f3b0: 20 61 74 20 45 4f 46 2c 20 61 6e 64 20 28 62 29   at EOF, and (b)
f3c0: 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
f3d0: 61 20 6b 65 79 20 74 68 61 74 20 69 73 20 61 20  a key that is a 
f3e0: 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e 6f  duplicate of ano
f3f0: 74 68 65 72 2c 20 68 69 67 68 65 72 20 70 72 69  ther, higher pri
f400: 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d 65  ority, .** segme
f410: 6e 74 2d 69 74 65 72 61 74 6f 72 20 69 6e 20 74  nt-iterator in t
f420: 68 65 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d 20  he pSeg->aSeg[] 
f430: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
f440: 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74   int fts5MultiIt
f450: 65 72 44 6f 43 6f 6d 70 61 72 65 28 46 74 73 35  erDoCompare(Fts5
f460: 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
f470: 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a  ter, int iOut){.
f480: 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20    int i1;       
f490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4a0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65    /* Index of le
f4b0: 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ft-hand Fts5SegI
f4c0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b  ter */.  int i2;
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
f4f0: 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  x of right-hand 
f500: 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
f510: 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73   int iRes;.  Fts
f520: 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20  5SegIter *p1;   
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f540: 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65  Left-hand Fts5Se
f550: 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53  gIter */.  Fts5S
f560: 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20  egIter *p2;     
f570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
f580: 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  ght-hand Fts5Seg
f590: 49 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  Iter */..  asser
f5a0: 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e  t( iOut<pIter->n
f5b0: 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b  Seg && iOut>0 );
f5c0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
f5d0: 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74  ->bRev==0 || pIt
f5e0: 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a  er->bRev==1 );..
f5f0: 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74    if( iOut>=(pIt
f600: 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20  er->nSeg/2) ){. 
f610: 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20     i1 = (iOut - 
f620: 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a  pIter->nSeg/2) *
f630: 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20   2;.    i2 = i1 
f640: 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  + 1;.  }else{.  
f650: 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46    i1 = pIter->aF
f660: 69 72 73 74 5b 69 4f 75 74 2a 32 5d 3b 0a 20 20  irst[iOut*2];.  
f670: 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61 46    i2 = pIter->aF
f680: 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 3b 0a  irst[iOut*2+1];.
f690: 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65    }.  p1 = &pIte
f6a0: 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70  r->aSeg[i1];.  p
f6b0: 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  2 = &pIter->aSeg
f6c0: 5b 69 32 5d 3b 0a 0a 20 20 69 66 28 20 70 31 2d  [i2];..  if( p1-
f6d0: 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20  >pLeaf==0 ){    
f6e0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20         /* If p1 
f6f0: 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20  is at EOF */.   
f700: 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65   iRes = i2;.  }e
f710: 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61  lse if( p2->pLea
f720: 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49  f==0 ){     /* I
f730: 66 20 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a  f p2 is at EOF *
f740: 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b  /.    iRes = i1;
f750: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
f760: 74 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66  t res = fts5Buff
f770: 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74  erCompare(&p1->t
f780: 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b  erm, &p2->term);
f790: 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
f7a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
f7b0: 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20   i2>i1 );.      
f7c0: 61 73 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b  assert( i2!=0 );
f7d0: 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69  .      if( p1->i
f7e0: 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69  Rowid==p2->iRowi
f7f0: 64 20 29 20 72 65 74 75 72 6e 20 69 32 3b 0a 20  d ) return i2;. 
f800: 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
f810: 3e 69 52 6f 77 69 64 20 3c 20 70 32 2d 3e 69 52  >iRowid < p2->iR
f820: 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
f830: 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20  ev) ? -1 : +1;. 
f840: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
f850: 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69   res!=0 );.    i
f860: 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
f870: 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20    iRes = i1;.   
f880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
f890: 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20  es = i2;.    }. 
f8a0: 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 61 46 69   }..  pIter->aFi
f8b0: 72 73 74 5b 69 4f 75 74 5d 20 3d 20 69 52 65 73  rst[iOut] = iRes
f8c0: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
f8d0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
f8e0: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
f8f0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
f900: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
f910: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
f920: 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
f930: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
f940: 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
f950: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
f960: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ter ){.    int i
f970: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
f980: 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
f990: 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  +){.      fts5Se
f9a0: 67 49 74 65 72 43 6c 65 61 72 28 26 70 49 74 65  gIterClear(&pIte
f9b0: 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20  r->aSeg[i]);.   
f9c0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
f9d0: 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ree(pIter);.  }.
f9e0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
f9f0: 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
fa00: 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e 64 65  nced(.  Fts5Inde
fa10: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
fa20: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
fa30: 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
fa40: 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
fa50: 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
fa60: 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 2f  *pIter,        /
fa70: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70  * Iterator to up
fa80: 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72  date aFirst[] ar
fa90: 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  ray for */.  int
faa0: 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20   iChanged,      
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fac0: 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65  Index of sub-ite
fad0: 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e  rator just advan
fae0: 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69  ced */.  int iMi
faf0: 6e 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  nset            
fb00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69           /* Mini
fb10: 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61 46 69  mum entry in aFi
fb20: 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a  rst[] to set */.
fb30: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
fb40: 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67  r(i=(pIter->nSeg
fb50: 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e  +iChanged)/2; i>
fb60: 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e 72  =iMinset && p->r
fb70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d  c==SQLITE_OK; i=
fb80: 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 45  i/2){.    int iE
fb90: 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45 71 20  q;.    if( (iEq 
fba0: 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44  = fts5MultiIterD
fbb0: 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2c 20  oCompare(pIter, 
fbc0: 69 29 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73  i)) ){.      fts
fbd0: 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20  5SegIterNext(p, 
fbe0: 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71  &pIter->aSeg[iEq
fbf0: 5d 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49  ]);.      i = pI
fc00: 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b  ter->nSeg + iEq;
fc10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
fc20: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67  .** Move the seg
fc30: 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20 69 74  -iter so that it
fc40: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
fc50: 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61  irst rowid on pa
fc60: 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a  ge iLeafPgno..**
fc70: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
fc80: 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e  if leaf iLeafPgn
fc90: 6f 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  o contains no ro
fca0: 77 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  wid..*/.static v
fcb0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47  oid fts5SegIterG
fcc0: 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49  otoPage(.  Fts5I
fcd0: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
fce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
fcf0: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
fd00: 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
fd10: 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
fd20: 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
fd30: 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
fd40: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
fd50: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c  .){.  assert( iL
fd60: 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
fd70: 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 69 66  LeafPgno );.  if
fd80: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
fd90: 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  OK ){.    pIter-
fda0: 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
fdb0: 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74  afPgno-1;.    ft
fdc0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
fdd0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
fde0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
fdf0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
fe00: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69  er->iLeafPgno==i
fe10: 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 20 20 7d 0a  LeafPgno );.  }.
fe20: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
fe30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
fe40: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 75 38 20  nt iOff;.    u8 
fe50: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
fe60: 66 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 6e 20  f->p;.    int n 
fe70: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
fe80: 6e 3b 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20 66  n;..    iOff = f
fe90: 74 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29  ts5GetU16(&a[0])
fea0: 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34  ;.    if( iOff<4
feb0: 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20   || iOff>=n ){. 
fec0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
fed0: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
fee0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66  else{.      iOff
fef0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61   += getVarint(&a
ff00: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
ff10: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
ff20: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
ff30: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
ff40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
ff50: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
ff60: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
ff70: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
ff80: 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 69  ument until it i
ff90: 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74  s at or .** past
ffa0: 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52 65   rowid iFrom. Re
ffb0: 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20  gardless of the 
ffc0: 76 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20  value of iFrom, 
ffd0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a  the iterator is.
ffe0: 2a 2a 20 61 6c 77 61 79 73 20 61 64 76 61 6e 63  ** always advanc
fff0: 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  ed at least once
10000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
10010 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
10020 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  From(.  Fts5Inde
10030 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
10040 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
10050 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
10060 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
10070 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
10080 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
10090 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
100a0 69 36 34 20 69 4d 61 74 63 68 20 20 20 20 20 20  i64 iMatch      
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61  /* Advance itera
100d0 74 6f 72 20 61 74 20 6c 65 61 73 74 20 74 68 69  tor at least thi
100e0 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  s far */.){.  in
100f0 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d  t bRev = (pIter-
10100 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
10110 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a  GITER_REVERSE);.
10120 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
10130 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  *pDlidx = pIter-
10140 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69  >pDlidx;.  int i
10150 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
10160 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69  ->iLeafPgno;.  i
10170 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20  nt bMove = 1;.. 
10180 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
10190 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
101a0 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
101b0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
101c0 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73 73  >pDlidx );.  ass
101d0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
101e0 66 20 29 3b 0a 0a 20 20 69 66 28 20 62 52 65 76  f );..  if( bRev
101f0 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  ==0 ){.    while
10200 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  ( fts5DlidxIterE
10210 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
10220 20 26 26 20 69 4d 61 74 63 68 3c 70 44 6c 69 64   && iMatch<pDlid
10230 78 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  x->iRowid ){.   
10240 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70     iLeafPgno = p
10250 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f  Dlidx->iLeafPgno
10260 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
10270 78 49 74 65 72 4e 65 78 74 28 70 44 6c 69 64 78  xIterNext(pDlidx
10280 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
10290 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d  ert( iLeafPgno>=
102a0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
102b0 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20   || p->rc );.   
102c0 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70   if( iLeafPgno>p
102d0 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
102e0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
102f0 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20  IterGotoPage(p, 
10300 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f  pIter, iLeafPgno
10310 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d  );.      bMove =
10320 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
10330 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  e{.    assert( i
10340 4d 61 74 63 68 3e 70 49 74 65 72 2d 3e 69 52 6f  Match>pIter->iRo
10350 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  wid );.    while
10360 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  ( fts5DlidxIterE
10370 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
10380 20 26 26 20 69 4d 61 74 63 68 3e 70 44 6c 69 64   && iMatch>pDlid
10390 78 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  x->iRowid ){.   
103a0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
103b0 50 72 65 76 28 70 44 6c 69 64 78 29 3b 0a 20 20  Prev(pDlidx);.  
103c0 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e    }.    iLeafPgn
103d0 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61  o = pDlidx->iLea
103e0 66 50 67 6e 6f 3b 0a 0a 20 20 20 20 61 73 73 65  fPgno;..    asse
103f0 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65  rt( fts5DlidxIte
10400 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20  rEof(p, pDlidx) 
10410 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49  || iLeafPgno<=pI
10420 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
10430 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66  ;..    if( iLeaf
10440 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno<pIter->iLea
10450 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70  fPgno ){.      p
10460 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
10470 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20  = iLeafPgno+1;. 
10480 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
10490 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 70  ReverseNewPage(p
104a0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
104b0 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  bMove = 0;.    }
104c0 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
104d0 20 29 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76   ){.    if( bMov
104e0 65 20 29 20 66 74 73 35 53 65 67 49 74 65 72 4e  e ) fts5SegIterN
104f0 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ext(p, pIter);. 
10500 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
10510 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
10520 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20      if( bRev==0 
10530 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  && pIter->iRowid
10540 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  <=iMatch ) break
10550 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 21 3d  ;.    if( bRev!=
10560 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77  0 && pIter->iRow
10570 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65  id>=iMatch ) bre
10580 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20  ak;.    bMove = 
10590 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
105a0 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
105b0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
105c0 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  try. .**.** If a
105d0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
105e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
105f0 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64   left in Fts5Ind
10600 65 78 2e 72 63 2e 20 49 74 20 69 73 20 6e 6f 74  ex.rc. It is not
10610 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
10620 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
10630 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73  iterator reaches
10640 20 45 4f 46 2c 20 6f 72 20 69 66 20 69 74 20 69   EOF, or if it i
10650 73 20 61 6c 72 65 61 64 79 20 61 74 20 0a 2a 2a  s already at .**
10660 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66   EOF when this f
10670 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
10680 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
10690 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
106a0 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ext(.  Fts5Index
106b0 20 2a 70 2c 20 0a 20 20 46 74 73 35 4d 75 6c 74   *p, .  Fts5Mult
106c0 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  iSegIter *pIter,
106d0 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20  .  int bFrom,   
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 72     /* True if ar
10700 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73 20  gument iFrom is 
10710 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 69  valid */.  i64 i
10720 46 72 6f 6d 20 20 20 20 20 20 20 20 20 20 20 20  From            
10730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
10740 76 61 6e 63 65 20 61 74 20 6c 65 61 73 74 20 61  vance at least a
10750 73 20 66 61 72 20 61 73 20 74 68 69 73 20 2a 2f  s far as this */
10760 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
10770 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10780 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20 3d    int bUseFrom =
10790 20 62 46 72 6f 6d 3b 0a 20 20 20 20 64 6f 20 7b   bFrom;.    do {
107a0 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69 72 73  .      int iFirs
107b0 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  t = pIter->aFirs
107c0 74 5b 31 5d 3b 0a 20 20 20 20 20 20 46 74 73 35  t[1];.      Fts5
107d0 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
107e0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69  &pIter->aSeg[iFi
107f0 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  rst];.      if( 
10800 62 55 73 65 46 72 6f 6d 20 26 26 20 70 53 65 67  bUseFrom && pSeg
10810 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ->pDlidx ){.    
10820 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
10830 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65 67 2c  extFrom(p, pSeg,
10840 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 7d   iFrom);.      }
10850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
10860 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
10870 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   pSeg);.      }.
10880 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
10890 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
108a0 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29  Iter, iFirst, 1)
108b0 3b 0a 20 20 20 20 20 20 62 55 73 65 46 72 6f 6d  ;.      bUseFrom
108c0 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65   = 0;.    }while
108d0 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
108e0 70 74 79 20 0a 20 20 20 20 20 20 20 20 20 26 26  pty .         &&
108f0 20 66 74 73 35 53 65 67 49 74 65 72 49 73 44 65   fts5SegIterIsDe
10900 6c 65 74 65 28 70 2c 20 26 70 49 74 65 72 2d 3e  lete(p, &pIter->
10910 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
10920 73 74 5b 31 5d 5d 29 0a 20 20 20 20 29 3b 0a 20  st[1]]).    );. 
10930 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
10940 63 61 74 65 20 61 20 6e 65 77 20 46 74 73 35 4d  cate a new Fts5M
10950 75 6c 74 69 53 65 67 49 74 65 72 20 6f 62 6a 65  ultiSegIter obje
10960 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ct..**.** The ne
10970 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  w object will be
10980 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
10990 20 74 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e   through data in
109a0 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
109b0 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c  ct..** If iLevel
109c0 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c   is -ve, then al
109d0 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65  l data in all se
109e0 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64  gments is merged
109f0 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a  . Or, if iLevel.
10a00 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72  ** is zero or gr
10a10 65 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d  eater, data from
10a20 20 74 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d   the first nSegm
10a30 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20  ent segments on 
10a40 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20  level iLevel.** 
10a50 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a  is merged..**.**
10a60 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e   The iterator in
10a70 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  itially points t
10a80 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  o the first term
10a90 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20  /rowid entry in 
10aa0 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64  the .** iterated
10ab0 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
10ac0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
10ad0 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e  terNew(.  Fts5In
10ae0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
10af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
10b00 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
10b10 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
10b20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
10b30 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20  pStruct,        
10b40 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66   /* Structure of
10b50 20 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20   specific index 
10b60 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20  */.  int iIdx,  
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 2e 61       /* Config.a
10b90 48 61 73 68 5b 5d 20 69 6e 64 65 78 20 6f 66 20  Hash[] index of 
10ba0 46 54 53 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  FTS index */.  i
10bb0 6e 74 20 62 53 6b 69 70 45 6d 70 74 79 2c 0a 20  nt bSkipEmpty,. 
10bc0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10be0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 3e 3d 20   /* True for >= 
10bf0 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
10c00 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
10c10 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
10c20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c  seek to (or NULL
10c30 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  /0) */.  int iLe
10c40 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
10c50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
10c60 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d 31  l to iterate (-1
10c70 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69   for all) */.  i
10c80 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20  nt nSegment,    
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10ca0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
10cb0 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28 69  ents to merge (i
10cc0 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46  Level>=0) */.  F
10cd0 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20  ts5MultiSegIter 
10ce0 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 2f  **ppOut        /
10cf0 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
10d00 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20  ){.  int nSeg;  
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10d30 66 20 73 65 67 6d 65 6e 74 73 20 6d 65 72 67 65  f segments merge
10d40 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  d */.  int nSlot
10d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10d60 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20         /* Power 
10d70 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a  of two >= nSeg *
10d80 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20  /.  int iIter = 
10d90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10da0 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20      /* */.  int 
10db0 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
10dd0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
10de0 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20  hrough segments 
10df0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
10e00 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
10e10 20 46 74 73 35 4d 75 6c 74 69 53 65 67 49 74 65   Fts5MultiSegIte
10e20 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73 65  r *pNew;..  asse
10e30 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20 26 26  rt( (pTerm==0 &&
10e40 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c   nTerm==0) || iL
10e50 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20  evel<0 );..  /* 
10e60 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
10e70 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c 74 69  or the new multi
10e80 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e 20 2a  -seg-iterator. *
10e90 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30  /.  if( iLevel<0
10ea0 20 29 7b 0a 20 20 20 20 6e 53 65 67 20 3d 20 66   ){.    nSeg = f
10eb0 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
10ec0 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
10ed0 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
10ee0 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72   nSeg = MIN(pStr
10ef0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
10f00 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65  el].nSeg, nSegme
10f10 6e 74 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e  nt);.  }.  for(n
10f20 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53  Slot=2; nSlot<nS
10f30 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a  eg; nSlot=nSlot*
10f40 32 29 3b 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70  2);.  *ppOut = p
10f50 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  New = fts5IdxMal
10f60 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73 69  loc(p, .      si
10f70 7a 65 6f 66 28 46 74 73 35 4d 75 6c 74 69 53 65  zeof(Fts5MultiSe
10f80 67 49 74 65 72 29 20 2b 20 20 20 20 20 20 20 20  gIter) +        
10f90 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20    /* pNew */.   
10fa0 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65     sizeof(Fts5Se
10fb0 67 49 74 65 72 29 20 2a 20 6e 53 6c 6f 74 20 2b  gIter) * nSlot +
10fc0 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e         /* pNew->
10fd0 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20  aSeg[] */.      
10fe0 73 69 7a 65 6f 66 28 75 31 36 29 20 2a 20 6e 53  sizeof(u16) * nS
10ff0 6c 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  lot             
11000 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69      /* pNew->aFi
11010 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20  rst[] */.  );.  
11020 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
11030 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  turn;.  pNew->nS
11040 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 70 4e  eg = nSlot;.  pN
11050 65 77 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35  ew->aSeg = (Fts5
11060 53 65 67 49 74 65 72 2a 29 26 70 4e 65 77 5b 31  SegIter*)&pNew[1
11070 5d 3b 0a 20 20 70 4e 65 77 2d 3e 61 46 69 72 73  ];.  pNew->aFirs
11080 74 20 3d 20 28 75 31 36 2a 29 26 70 4e 65 77 2d  t = (u16*)&pNew-
11090 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20  >aSeg[nSlot];.  
110a0 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21  pNew->bRev = (0!
110b0 3d 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  =(flags & FTS5IN
110c0 44 45 58 5f 51 55 45 52 59 5f 41 53 43 29 29 3b  DEX_QUERY_ASC));
110d0 0a 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  .  pNew->bSkipEm
110e0 70 74 79 20 3d 20 62 53 6b 69 70 45 6d 70 74 79  pty = bSkipEmpty
110f0 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
11100 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  ze each of the c
11110 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74  omponent segment
11120 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20   iterators. */. 
11130 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
11140 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
11150 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20  reLevel *pEnd = 
11160 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
11170 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
11180 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d  ];.    for(pLvl=
11190 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
111a0 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20  [0]; pLvl<pEnd; 
111b0 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66  pLvl++){.      f
111c0 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53  or(iSeg=pLvl->nS
111d0 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69  eg-1; iSeg>=0; i
111e0 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20  Seg--){.        
111f0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
11200 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
11210 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
11220 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
11230 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
11240 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
11250 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
11260 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Term==0 ){.     
11270 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
11280 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20 70 53  Init(p, iIdx, pS
11290 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
112a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
112b0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
112c0 53 65 65 6b 49 6e 69 74 28 70 2c 20 69 49 64 78  SeekInit(p, iIdx
112d0 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , pTerm, nTerm, 
112e0 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74  flags, pSeg, pIt
112f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
11300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11310 65 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c 20 3d  else{.    pLvl =
11320 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
11330 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66  l[iLevel];.    f
11340 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20  or(iSeg=nSeg-1; 
11350 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29  iSeg>=0; iSeg--)
11360 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  {.      fts5SegI
11370 74 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78 2c  terInit(p, iIdx,
11380 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65   &pLvl->aSeg[iSe
11390 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  g], &pNew->aSeg[
113a0 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d  iIter++]);.    }
113b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69  .  }.  assert( i
113c0 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20  Iter==nSeg );.. 
113d0 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
113e0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c   was successful,
113f0 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20   each component 
11400 69 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f  iterators now po
11410 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68  ints .  ** to th
11420 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
11430 20 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e   its segment. In
11440 20 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69   this case initi
11450 61 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20  alize the .  ** 
11460 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20  aFirst[] array. 
11470 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
11480 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72  has occurred, fr
11490 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a  ee the iterator.
114a0 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20    ** object and 
114b0 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  set the output v
114c0 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e  ariable to NULL.
114d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63    */.  if( p->rc
114e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
114f0 20 20 20 66 6f 72 28 69 49 74 65 72 3d 6e 53 6c     for(iIter=nSl
11500 6f 74 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69  ot-1; iIter>0; i
11510 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69  Iter--){.      i
11520 6e 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66  nt iEq;.      if
11530 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c  ( (iEq = fts5Mul
11540 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
11550 70 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b  pNew, iIter)) ){
11560 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
11570 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70 4e 65  IterNext(p, &pNe
11580 77 2d 3e 61 53 65 67 5b 69 45 71 5d 29 3b 0a 20  w->aSeg[iEq]);. 
11590 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
115a0 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20  IterAdvanced(p, 
115b0 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72  pNew, iEq, iIter
115c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
115d0 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e  ..    if( pNew->
115e0 62 53 6b 69 70 45 6d 70 74 79 20 0a 20 20 20 20  bSkipEmpty .    
115f0 20 26 26 20 66 74 73 35 53 65 67 49 74 65 72 49   && fts5SegIterI
11600 73 44 65 6c 65 74 65 28 70 2c 20 26 70 4e 65 77  sDelete(p, &pNew
11610 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69  ->aSeg[pNew->aFi
11620 72 73 74 5b 31 5d 5d 29 20 0a 20 20 20 20 29 7b  rst[1]]) .    ){
11630 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
11640 49 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65 77  IterNext(p, pNew
11650 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
11660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
11670 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c  MultiIterFree(p,
11680 20 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f   pNew);.    *ppO
11690 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ut = 0;.  }.}../
116a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
116b0 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
116c0 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20 69 66   is at EOF or if
116d0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
116e0 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73  curred. .** Fals
116f0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
11700 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
11710 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74 73 35  ultiIterEof(Fts5
11720 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75  Index *p, Fts5Mu
11730 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
11740 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  r){.  return (p-
11750 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 61 53  >rc || pIter->aS
11760 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
11770 74 5b 31 5d 20 5d 2e 70 4c 65 61 66 3d 3d 30 29  t[1] ].pLeaf==0)
11780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11790 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  n the rowid of t
117a0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
117b0 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65  e iterator curre
117c0 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74  ntly points.** t
117d0 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61 74  o. If the iterat
117e0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46  or points to EOF
117f0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
11800 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
11810 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65  e.** results are
11820 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
11830 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d 75  tatic i64 fts5Mu
11840 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74 73  ltiIterRowid(Fts
11850 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
11860 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  Iter){.  assert(
11870 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
11880 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d  ter->aFirst[1] ]
11890 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75  .pLeaf );.  retu
118a0 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  rn pIter->aSeg[ 
118b0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
118c0 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a   ].iRowid;.}../*
118d0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
118e0 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  rator to the nex
118f0 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66 6f  t entry at or fo
11900 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e 0a  llowing iMatch..
11910 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11920 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
11930 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  From(.  Fts5Inde
11940 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 4d 75 6c  x *p, .  Fts5Mul
11950 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  tiSegIter *pIter
11960 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a  , .  i64 iMatch.
11970 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ){.  while( 1 ){
11980 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b  .    i64 iRowid;
11990 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
119a0 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
119b0 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20   1, iMatch);.   
119c0 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74   if( fts5MultiIt
119d0 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20  erEof(p, pIter) 
119e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f  ) break;.    iRo
119f0 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  wid = fts5MultiI
11a00 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b  terRowid(pIter);
11a10 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
11a20 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69  bRev==0 && iRowi
11a30 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d<=iMatch ) brea
11a40 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  k;.    if( pIter
11a50 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f  ->bRev!=0 && iRo
11a60 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
11a70 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  eak;.  }.}../*.*
11a80 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
11a90 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  er to a buffer c
11aa0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65  ontaining the te
11ab0 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rm associated wi
11ac0 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79  th the .** entry
11ad0 20 74 68 61 74 20 74 68 65 20 69 74 65 72 61 74   that the iterat
11ae0 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
11af0 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  nts to..*/.stati
11b00 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35  c const u8 *fts5
11b10 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74  MultiIterTerm(Ft
11b20 73 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a  s5MultiSegIter *
11b30 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b  pIter, int *pn){
11b40 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
11b50 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  p = &pIter->aSeg
11b60 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
11b70 31 5d 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d  1] ];.  *pn = p-
11b80 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72  >term.n;.  retur
11b90 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a  n p->term.p;.}..
11ba0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
11bb0 65 20 69 66 20 74 68 65 20 63 68 75 6e 6b 20 69  e if the chunk i
11bc0 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
11bd0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
11be0 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 61 74 20 45  ument is.** at E
11bf0 4f 46 2e 20 4f 72 20 69 66 20 61 6e 20 65 72 72  OF. Or if an err
11c00 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
11c10 63 63 75 72 72 65 64 2e 20 4f 74 68 65 72 77 69  ccurred. Otherwi
11c20 73 65 2c 20 72 65 74 75 72 6e 20 66 61 6c 73 65  se, return false
11c30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11c40 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f 66  fts5ChunkIterEof
11c50 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
11c60 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a 70 49  ts5ChunkIter *pI
11c70 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  ter){.  return (
11c80 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e  p->rc || pIter->
11c90 70 4c 65 61 66 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a  pLeaf==0);.}../*
11ca0 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
11cb0 63 68 75 6e 6b 2d 69 74 65 72 61 74 6f 72 20 74  chunk-iterator t
11cc0 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b  o the next chunk
11cd0 20 6f 66 20 64 61 74 61 20 74 6f 20 72 65 61 64   of data to read
11ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11cf0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e 65   fts5ChunkIterNe
11d00 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
11d10 20 46 74 73 35 43 68 75 6e 6b 49 74 65 72 20 2a   Fts5ChunkIter *
11d20 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
11d30 28 20 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 3d 70  ( pIter->nRem>=p
11d40 49 74 65 72 2d 3e 6e 20 29 3b 0a 20 20 70 49 74  Iter->n );.  pIt
11d50 65 72 2d 3e 6e 52 65 6d 20 2d 3d 20 70 49 74 65  er->nRem -= pIte
11d60 72 2d 3e 6e 3b 0a 20 20 66 74 73 35 44 61 74 61  r->n;.  fts5Data
11d70 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
11d80 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
11d90 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 70 49 74  pLeaf = 0;.  pIt
11da0 65 72 2d 3e 70 20 3d 20 30 3b 0a 20 20 69 66 28  er->p = 0;.  if(
11db0 20 70 49 74 65 72 2d 3e 6e 52 65 6d 3e 30 20 29   pIter->nRem>0 )
11dc0 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
11dd0 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  pLeaf;.    pIter
11de0 2d 3e 69 4c 65 61 66 52 6f 77 69 64 2b 2b 3b 0a  ->iLeafRowid++;.
11df0 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65      pLeaf = pIte
11e00 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 44  r->pLeaf = fts5D
11e10 61 74 61 52 65 61 64 28 70 2c 20 70 49 74 65 72  ataRead(p, pIter
11e20 2d 3e 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20  ->iLeafRowid);. 
11e30 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a     if( pLeaf ){.
11e40 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 20 3d        pIter->n =
11e50 20 4d 49 4e 28 70 49 74 65 72 2d 3e 6e 52 65 6d   MIN(pIter->nRem
11e60 2c 20 70 4c 65 61 66 2d 3e 6e 2d 34 29 3b 0a 20  , pLeaf->n-4);. 
11e70 20 20 20 20 20 70 49 74 65 72 2d 3e 70 20 3d 20       pIter->p = 
11e80 70 4c 65 61 66 2d 3e 70 2b 34 3b 0a 20 20 20 20  pLeaf->p+4;.    
11e90 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
11ea0 6e 74 69 61 6c 69 7a 65 20 74 68 65 20 63 68 75  ntialize the chu
11eb0 6e 6b 20 69 74 65 72 61 74 6f 72 20 74 6f 20 72  nk iterator to r
11ec0 65 61 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ead the position
11ed0 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20 77   list data for w
11ee0 68 69 63 68 20 0a 2a 2a 20 74 68 65 20 73 69 7a  hich .** the siz
11ef0 65 20 66 69 65 6c 64 20 69 73 20 61 74 20 6f 66  e field is at of
11f00 66 73 65 74 20 69 4f 66 66 20 6f 66 20 6c 65 61  fset iOff of lea
11f10 66 20 70 4c 65 61 66 2e 20 0a 2a 2f 0a 73 74 61  f pLeaf. .*/.sta
11f20 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
11f30 6e 6b 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  nkIterInit(.  Ft
11f40 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
11f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11f60 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
11f70 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
11f80 67 49 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20  gIter *pSeg,    
11f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67            /* Seg
11fa0 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20 74 6f  ment iterator to
11fb0 20 72 65 61 64 20 70 6f 73 6c 69 73 74 20 66 72   read poslist fr
11fc0 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 43 68 75 6e  om */.  Fts5Chun
11fd0 6b 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  kIter *pIter    
11fe0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
11ff0 61 6c 69 7a 65 20 74 68 69 73 20 6f 62 6a 65 63  alize this objec
12000 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 49  t */.){.  int iI
12010 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e  d = pSeg->pSeg->
12020 69 53 65 67 69 64 3b 0a 20 20 69 36 34 20 72 6f  iSegid;.  i64 ro
12030 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
12040 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69  NT_ROWID(pSeg->i
12050 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 70 53 65  Idx, iId, 0, pSe
12060 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20  g->iLeafPgno);. 
12070 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
12080 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 3b 0a   = pSeg->pLeaf;.
12090 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65    int iOff = pSe
120a0 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  g->iLeafOffset;.
120b0 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c  .  memset(pIter,
120c0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65   0, sizeof(*pIte
120d0 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c  r));.  pIter->iL
120e0 65 61 66 52 6f 77 69 64 20 3d 20 72 6f 77 69 64  eafRowid = rowid
120f0 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 70 4c 65  ;.  if( iOff<pLe
12100 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 66 74 73  af->n ){.    fts
12110 35 44 61 74 61 52 65 66 65 72 65 6e 63 65 28 70  5DataReference(p
12120 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72  Leaf);.    pIter
12130 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b  ->pLeaf = pLeaf;
12140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
12150 74 65 72 2d 3e 6e 52 65 6d 20 3d 20 31 3b 0a 20  ter->nRem = 1;. 
12160 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72     fts5ChunkIter
12170 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a  Next(p, pIter);.
12180 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
12190 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 4f 66 66  return;.    iOff
121a0 20 3d 20 34 3b 0a 20 20 20 20 70 4c 65 61 66 20   = 4;.    pLeaf 
121b0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a  = pIter->pLeaf;.
121c0 20 20 7d 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 67    }..  iOff += g
121d0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
121e0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 70 49 74 65  f->p[iOff], pIte
121f0 72 2d 3e 6e 52 65 6d 29 3b 0a 20 20 70 49 74 65  r->nRem);.  pIte
12200 72 2d 3e 6e 20 3d 20 4d 49 4e 28 70 4c 65 61 66  r->n = MIN(pLeaf
12210 2d 3e 6e 20 2d 20 69 4f 66 66 2c 20 70 49 74 65  ->n - iOff, pIte
12220 72 2d 3e 6e 52 65 6d 29 3b 0a 20 20 70 49 74 65  r->nRem);.  pIte
12230 72 2d 3e 70 20 3d 20 70 4c 65 61 66 2d 3e 70 20  r->p = pLeaf->p 
12240 2b 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70  + iOff;..  if( p
12250 49 74 65 72 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Iter->n==0 ){.  
12260 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 4e    fts5ChunkIterN
12270 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ext(p, pIter);. 
12280 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
12290 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 52  d fts5ChunkIterR
122a0 65 6c 65 61 73 65 28 46 74 73 35 43 68 75 6e 6b  elease(Fts5Chunk
122b0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
122c0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
122d0 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
122e0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
122f0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  0;.}../*.** Read
12300 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
12310 6e 65 78 74 20 33 32 2d 62 69 74 20 76 61 72 69  next 32-bit vari
12320 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  nt from the posi
12330 74 69 6f 6e 2d 6c 69 73 74 20 69 74 65 72 61 74  tion-list iterat
12340 6f 72 20 0a 2a 2a 20 70 61 73 73 65 64 20 61 73  or .** passed as
12350 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
12360 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
12370 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12380 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
12390 20 61 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   an an error cod
123a0 65 20 6c 65 66 74 20 69 6e 20 0a 2a 2a 20 46 74  e left in .** Ft
123b0 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20 61  s5Index.rc. If a
123c0 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
123d0 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
123e0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
123f0 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 2c 20 69 74  is.** called, it
12400 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12410 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
12420 6f 73 49 74 65 72 52 65 61 64 56 61 72 69 6e 74  osIterReadVarint
12430 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
12440 74 73 35 50 6f 73 49 74 65 72 20 2a 70 49 74 65  ts5PosIter *pIte
12450 72 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 20 3d  r){.  int iVal =
12460 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   0;.  if( p->rc=
12470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12480 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66    if( pIter->iOf
12490 66 3e 3d 70 49 74 65 72 2d 3e 63 68 75 6e 6b 2e  f>=pIter->chunk.
124a0 6e 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 43  n ){.      fts5C
124b0 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70 2c 20  hunkIterNext(p, 
124c0 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3b 0a  &pIter->chunk);.
124d0 20 20 20 20 20 20 69 66 28 20 66 74 73 35 43 68        if( fts5Ch
124e0 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c 20 26 70  unkIterEof(p, &p
124f0 49 74 65 72 2d 3e 63 68 75 6e 6b 29 20 29 20 72  Iter->chunk) ) r
12500 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 70  eturn 0;.      p
12510 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 30 3b 0a  Iter->iOff = 0;.
12520 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65 72 2d      }.    pIter-
12530 3e 69 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69  >iOff += getVari
12540 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 63 68 75  nt32(&pIter->chu
12550 6e 6b 2e 70 5b 70 49 74 65 72 2d 3e 69 4f 66 66  nk.p[pIter->iOff
12560 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20  ], iVal);.  }.  
12570 72 65 74 75 72 6e 20 69 56 61 6c 3b 0a 7d 0a 0a  return iVal;.}..
12580 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
12590 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
125a0 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20  iterator to the 
125b0 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  next entry..*/.s
125c0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
125d0 6f 73 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  osIterNext(Fts5I
125e0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 50 6f 73  ndex *p, Fts5Pos
125f0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
12600 69 6e 74 20 69 56 61 6c 3b 0a 20 20 61 73 73 65  int iVal;.  asse
12610 72 74 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65  rt( fts5ChunkIte
12620 72 45 6f 66 28 70 2c 20 26 70 49 74 65 72 2d 3e  rEof(p, &pIter->
12630 63 68 75 6e 6b 29 3d 3d 30 20 29 3b 0a 20 20 69  chunk)==0 );.  i
12640 56 61 6c 20 3d 20 66 74 73 35 50 6f 73 49 74 65  Val = fts5PosIte
12650 72 52 65 61 64 56 61 72 69 6e 74 28 70 2c 20 70  rReadVarint(p, p
12660 49 74 65 72 29 3b 0a 20 20 69 66 28 20 66 74 73  Iter);.  if( fts
12670 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c  5ChunkIterEof(p,
12680 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d   &pIter->chunk)=
12690 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 56  =0 ){.    if( iV
126a0 61 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  al==1 ){.      p
126b0 49 74 65 72 2d 3e 69 43 6f 6c 20 3d 20 66 74 73  Iter->iCol = fts
126c0 35 50 6f 73 49 74 65 72 52 65 61 64 56 61 72 69  5PosIterReadVari
126d0 6e 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  nt(p, pIter);.  
126e0 20 20 20 20 70 49 74 65 72 2d 3e 69 50 6f 73 20      pIter->iPos 
126f0 3d 20 66 74 73 35 50 6f 73 49 74 65 72 52 65 61  = fts5PosIterRea
12700 64 56 61 72 69 6e 74 28 70 2c 20 70 49 74 65 72  dVarint(p, pIter
12710 29 20 2d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65  ) - 2;.    }else
12720 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
12730 50 6f 73 20 2b 3d 20 28 69 56 61 6c 20 2d 20 32  Pos += (iVal - 2
12740 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
12750 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
12760 20 74 68 65 20 46 74 73 35 50 6f 73 49 74 65 72   the Fts5PosIter
12770 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
12780 73 20 74 68 65 20 66 69 6e 61 6c 20 61 72 67 75  s the final argu
12790 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 0a  ment to iterate.
127a0 2a 2a 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  ** through the p
127b0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 61 73 73  osition-list ass
127c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
127d0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
127e0 74 20 69 74 65 72 61 74 6f 72 20 0a 2a 2a 20 70  t iterator .** p
127f0 4d 75 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20  Multi currently 
12800 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74  points to..*/.st
12810 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
12820 73 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  sIterInit(.  Fts
12830 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12850 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
12860 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 4d 75 6c  ect */.  Fts5Mul
12870 74 69 53 65 67 49 74 65 72 20 2a 70 4d 75 6c 74  tiSegIter *pMult
12880 69 2c 20 20 20 20 20 20 20 2f 2a 20 4d 75 6c 74  i,       /* Mult
12890 69 2d 73 65 67 20 69 74 65 72 61 74 6f 72 20 74  i-seg iterator t
128a0 6f 20 72 65 61 64 20 70 6f 73 2d 6c 69 73 74 20  o read pos-list 
128b0 66 72 6f 6d 20 2a 2f 0a 20 20 46 74 73 35 50 6f  from */.  Fts5Po
128c0 73 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  sIter *pIter    
128d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
128e0 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6f 62 6a  tialize this obj
128f0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ect */.){.  if( 
12900 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12910 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
12920 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75  ter *pSeg = &pMu
12930 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74  lti->aSeg[ pMult
12940 69 2d 3e 61 46 69 72 73 74 5b 31 5d 20 5d 3b 0a  i->aFirst[1] ];.
12950 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72      memset(pIter
12960 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
12970 65 72 29 29 3b 0a 20 20 20 20 66 74 73 35 43 68  er));.    fts5Ch
12980 75 6e 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70  unkIterInit(p, p
12990 53 65 67 2c 20 26 70 49 74 65 72 2d 3e 63 68 75  Seg, &pIter->chu
129a0 6e 6b 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73  nk);.    if( fts
129b0 35 43 68 75 6e 6b 49 74 65 72 45 6f 66 28 70 2c  5ChunkIterEof(p,
129c0 20 26 70 49 74 65 72 2d 3e 63 68 75 6e 6b 29 3d   &pIter->chunk)=
129d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
129e0 50 6f 73 49 74 65 72 4e 65 78 74 28 70 2c 20 70  PosIterNext(p, p
129f0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Iter);.    }.  }
12a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12a10 20 74 72 75 65 20 69 66 20 74 68 65 20 70 6f 73   true if the pos
12a20 69 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 20 70  ition iterator p
12a30 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
12a40 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 0a  ond argument is.
12a50 2a 2a 20 61 74 20 45 4f 46 2e 20 4f 72 20 69 66  ** at EOF. Or if
12a60 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c   an error has al
12a70 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2e 20  ready occurred. 
12a80 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
12a90 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74 61 74  n false..*/.stat
12aa0 69 63 20 69 6e 74 20 66 74 73 35 50 6f 73 49 74  ic int fts5PosIt
12ab0 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20  erEof(Fts5Index 
12ac0 2a 70 2c 20 46 74 73 35 50 6f 73 49 74 65 72 20  *p, Fts5PosIter 
12ad0 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
12ae0 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65  n (p->rc || pIte
12af0 72 2d 3e 63 68 75 6e 6b 2e 70 4c 65 61 66 3d 3d  r->chunk.pLeaf==
12b00 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  0);.}../*.** Add
12b10 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 28 69   an entry for (i
12b20 52 6f 77 69 64 2f 69 43 6f 6c 2f 69 50 6f 73 29  Rowid/iCol/iPos)
12b30 20 74 6f 20 74 68 65 20 64 6f 63 6c 69 73 74 20   to the doclist 
12b40 66 6f 72 20 28 70 54 6f 6b 65 6e 2f 6e 54 6f 6b  for (pToken/nTok
12b50 65 6e 29 0a 2a 2a 20 69 6e 20 68 61 73 68 20 74  en).** in hash t
12b60 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 20 69  able for index i
12b70 49 64 78 2e 20 49 66 20 69 49 64 78 20 69 73 20  Idx. If iIdx is 
12b80 7a 65 72 6f 2c 20 74 68 69 73 20 69 73 20 74 68  zero, this is th
12b90 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 0a 2a 2a  e main terms .**
12ba0 20 69 6e 64 65 78 2e 20 56 61 6c 75 65 73 20 6f   index. Values o
12bb0 66 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 20  f 1 and greater 
12bc0 66 6f 72 20 69 49 64 78 20 61 72 65 20 70 72 65  for iIdx are pre
12bd0 66 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 0a  fix indexes..**.
12be0 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
12bf0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
12c00 64 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49  d, set the Fts5I
12c10 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f  ndex.rc error co
12c20 64 65 20 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  de .** according
12c30 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
12c40 69 64 20 66 74 73 35 41 64 64 54 65 72 6d 54 6f  id fts5AddTermTo
12c50 48 61 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  Hash(.  Fts5Inde
12c60 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
12c70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12c80 20 6f 62 6a 65 63 74 20 74 6f 20 77 72 69 74 65   object to write
12c90 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64   to */.  int iId
12ca0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
12cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 74 72           /* Entr
12cc0 79 20 69 6e 20 70 2d 3e 61 48 61 73 68 5b 5d 20  y in p->aHash[] 
12cd0 74 6f 20 75 70 64 61 74 65 20 2a 2f 0a 20 20 69  to update */.  i
12ce0 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d00 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
12d10 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
12d20 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
12d30 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12d50 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
12d60 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
12d70 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
12d80 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
12d90 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
12da0 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
12db0 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
12dc0 78 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  x */.){.  if( p-
12dd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
12de0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
12df0 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
12e00 74 65 28 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  te(.        p->a
12e10 70 48 61 73 68 5b 69 49 64 78 5d 2c 20 70 2d 3e  pHash[iIdx], p->
12e20 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f  iWriteRowid, iCo
12e30 6c 2c 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e 2c  l, iPos, pToken,
12e40 20 6e 54 6f 6b 65 6e 0a 20 20 20 20 29 3b 0a 20   nToken.    );. 
12e50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
12e60 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  cate a new segme
12e70 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73 74  nt-id for the st
12e80 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
12e90 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
12ea0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
12eb0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
12ec0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
12ed0 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75  p. 0 is .** retu
12ee0 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  rned in this cas
12ef0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12f00 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
12f10 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  id(Fts5Index *p,
12f20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
12f30 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
12f40 69 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  i;.  if( p->rc!=
12f50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
12f60 72 6e 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  rn 0;..  for(i=0
12f70 3b 20 69 3c 31 30 30 3b 20 69 2b 2b 29 7b 0a 20  ; i<100; i++){. 
12f80 20 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20     int iSegid;. 
12f90 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
12fa0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 6e 74  mness(sizeof(int
12fb0 29 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69  ), (void*)&iSegi
12fc0 64 29 3b 0a 20 20 20 20 69 53 65 67 69 64 20 3d  d);.    iSegid =
12fd0 20 69 53 65 67 69 64 20 26 20 28 28 31 20 3c 3c   iSegid & ((1 <<
12fe0 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29   FTS5_DATA_ID_B)
12ff0 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65  -1);.    if( iSe
13000 67 69 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  gid ){.      int
13010 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
13020 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
13030 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
13040 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
13050 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
13060 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
13070 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
13080 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
13090 20 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64        if( iSegid
130a0 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ==pStruct->aLeve
130b0 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
130c0 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20  g].iSegid ){.   
130d0 20 20 20 20 20 20 20 20 20 69 53 65 67 69 64 20           iSegid 
130e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
130f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13100 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13110 20 69 53 65 67 69 64 20 29 20 72 65 74 75 72 6e   iSegid ) return
13120 20 69 53 65 67 69 64 3b 0a 20 20 7d 0a 0a 20 20   iSegid;.  }..  
13130 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  p->rc = SQLITE_E
13140 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 30  RROR;.  return 0
13150 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61  ;.}../*.** Disca
13160 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72  rd all data curr
13170 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20  ently cached in 
13180 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e  the hash-tables.
13190 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
131a0 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
131b0 44 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a  Data(Fts5Index *
131c0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
131d0 3e 61 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50  >apHash || p->nP
131e0 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b  endingData==0 );
131f0 0a 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68  .  if( p->apHash
13200 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
13210 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
13220 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69 6e  >pConfig;.    in
13230 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
13240 3b 20 69 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  ; i<=pConfig->nP
13250 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  refix; i++){.   
13260 20 20 20 69 66 28 20 70 2d 3e 61 70 48 61 73 68     if( p->apHash
13270 5b 69 5d 20 29 20 73 71 6c 69 74 65 33 46 74 73  [i] ) sqlite3Fts
13280 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 61 70  5HashClear(p->ap
13290 48 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Hash[i]);.    }.
132a0 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
132b0 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ata = 0;.  }.}..
132c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
132d0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65   size of the pre
132e0 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74  fix, in bytes, t
132f0 68 61 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77  hat buffer (nNew
13300 2f 70 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a  /pNew) shares.**
13310 20 77 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f   with buffer (nO
13320 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61  ld/pOld)..*/.sta
13330 74 69 63 20 69 6e 74 20 66 74 73 35 50 72 65 66  tic int fts5Pref
13340 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e  ixCompress(.  in
13350 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38  t nOld, const u8
13360 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e   *pOld,.  int nN
13370 65 77 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e  ew, const u8 *pN
13380 65 77 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ew.){.  int i;. 
13390 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
133a0 20 26 26 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29   && i<nOld; i++)
133b0 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69  {.    if( pOld[i
133c0 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65  ]!=pNew[i] ) bre
133d0 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
133e0 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   i;.}../*.** If 
133f0 61 6e 20 22 6e 45 6d 70 74 79 22 20 72 65 63 6f  an "nEmpty" reco
13400 72 64 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  rd must be writt
13410 65 6e 20 74 6f 20 74 68 65 20 62 2d 74 72 65 65  en to the b-tree
13420 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65 78 74   before the next
13430 0a 2a 2a 20 74 65 72 6d 2c 20 77 72 69 74 65 20  .** term, write 
13440 69 74 20 6e 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  it now..*/.stati
13450 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
13460 42 74 72 65 65 4e 45 6d 70 74 79 28 46 74 73 35  BtreeNEmpty(Fts5
13470 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
13480 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
13490 29 7b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  ){.  if( pWriter
134a0 2d 3e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20  ->nEmpty ){.    
134b0 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 20  int bFlag = 0;. 
134c0 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65     Fts5PageWrite
134d0 72 20 2a 70 50 67 3b 0a 20 20 20 20 70 50 67 20  r *pPg;.    pPg 
134e0 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69  = &pWriter->aWri
134f0 74 65 72 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20  ter[1];.    if( 
13500 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e  pWriter->nEmpty>
13510 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f  =FTS5_MIN_DLIDX_
13520 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 69 36  SIZE ){.      i6
13530 34 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 44 4f  4 iKey = FTS5_DO
13540 43 4c 49 53 54 5f 49 44 58 5f 52 4f 57 49 44 28  CLIST_IDX_ROWID(
13550 0a 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74  .          pWrit
13560 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65  er->iIdx, pWrite
13570 72 2d 3e 69 53 65 67 69 64 2c 20 0a 20 20 20 20  r->iSegid, .    
13580 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61        pWriter->a
13590 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 2d  Writer[0].pgno -
135a0 20 31 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e 45   1 - pWriter->nE
135b0 6d 70 74 79 0a 20 20 20 20 20 20 29 3b 0a 20 20  mpty.      );.  
135c0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 72 69      assert( pWri
135d0 74 65 72 2d 3e 64 6c 69 64 78 2e 6e 3e 30 20 29  ter->dlidx.n>0 )
135e0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
135f0 57 72 69 74 65 28 70 2c 20 69 4b 65 79 2c 20 70  Write(p, iKey, p
13600 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2e 70 2c  Writer->dlidx.p,
13610 20 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 2e   pWriter->dlidx.
13620 6e 29 3b 0a 20 20 20 20 20 20 62 46 6c 61 67 20  n);.      bFlag 
13630 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 1;.    }.    f
13640 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
13650 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
13660 50 67 2d 3e 62 75 66 2c 20 62 46 6c 61 67 29 3b  Pg->buf, bFlag);
13670 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
13680 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
13690 72 63 2c 20 26 70 50 67 2d 3e 62 75 66 2c 20 70  rc, &pPg->buf, p
136a0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3b  Writer->nEmpty);
136b0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 6e 45  .    pWriter->nE
136c0 6d 70 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  mpty = 0;.  }.. 
136d0 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e   /* Whether or n
136e0 6f 74 20 69 74 20 77 61 73 20 77 72 69 74 74 65  ot it was writte
136f0 6e 20 74 6f 20 64 69 73 6b 2c 20 7a 65 72 6f 20  n to disk, zero 
13700 74 68 65 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  the doclist inde
13710 78 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70  x at this.  ** p
13720 6f 69 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  oint */.  sqlite
13730 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28  3Fts5BufferZero(
13740 26 70 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 29  &pWriter->dlidx)
13750 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 44 6c  ;.  pWriter->bDl
13760 69 64 78 50 72 65 76 56 61 6c 69 64 20 3d 20 30  idxPrevValid = 0
13770 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
13780 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 47   fts5WriteBtreeG
13790 72 6f 77 28 46 74 73 35 49 6e 64 65 78 20 2a 70  row(Fts5Index *p
137a0 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
137b0 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 46 74 73  *pWriter){.  Fts
137c0 35 50 61 67 65 57 72 69 74 65 72 20 2a 61 4e 65  5PageWriter *aNe
137d0 77 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  w;.  Fts5PageWri
137e0 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ter *pNew;.  int
137f0 20 6e 4e 65 77 20 3d 20 73 69 7a 65 6f 66 28 46   nNew = sizeof(F
13800 74 73 35 50 61 67 65 57 72 69 74 65 72 29 20 2a  ts5PageWriter) *
13810 20 28 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74   (pWriter->nWrit
13820 65 72 2b 31 29 3b 0a 0a 20 20 61 4e 65 77 20 3d  er+1);..  aNew =
13830 20 28 46 74 73 35 50 61 67 65 57 72 69 74 65 72   (Fts5PageWriter
13840 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
13850 63 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74  c(pWriter->aWrit
13860 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 69 66 28  er, nNew);.  if(
13870 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
13880 6e 3b 0a 0a 20 20 70 4e 65 77 20 3d 20 26 61 4e  n;..  pNew = &aN
13890 65 77 5b 70 57 72 69 74 65 72 2d 3e 6e 57 72 69  ew[pWriter->nWri
138a0 74 65 72 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  ter];.  memset(p
138b0 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  New, 0, sizeof(F
138c0 74 73 35 50 61 67 65 57 72 69 74 65 72 29 29 3b  ts5PageWriter));
138d0 0a 20 20 70 4e 65 77 2d 3e 70 67 6e 6f 20 3d 20  .  pNew->pgno = 
138e0 31 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  1;.  fts5BufferA
138f0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
13900 72 63 2c 20 26 70 4e 65 77 2d 3e 62 75 66 2c 20  rc, &pNew->buf, 
13910 31 29 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e  1);..  pWriter->
13920 6e 57 72 69 74 65 72 2b 2b 3b 0a 20 20 70 57 72  nWriter++;.  pWr
13930 69 74 65 72 2d 3e 61 57 72 69 74 65 72 20 3d 20  iter->aWriter = 
13940 61 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  aNew;.}../*.** T
13950 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  his is called on
13960 63 65 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66  ce for each leaf
13970 20 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65   page except the
13980 20 66 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74   first that cont
13990 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74  ains.** at least
139a0 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d   one term. Argum
139b0 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d  ent (nTerm/pTerm
139c0 29 20 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b  ) is the split-k
139d0 65 79 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74  ey - a term that
139e0 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68  .** is larger th
139f0 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69  an all terms wri
13a00 74 74 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20  tten to earlier 
13a10 6c 65 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61  leaves, and equa
13a20 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c  l to or.** small
13a30 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73  er than the firs
13a40 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65  t term on the ne
13a50 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66  w leaf..**.** If
13a60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
13a70 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
13a80 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49  is left in Fts5I
13a90 6e 64 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65  ndex.rc. If an e
13aa0 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65  rror.** has alre
13ab0 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
13ac0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
13ad0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
13ae0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
13af0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
13b00 74 65 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46  teBtreeTerm(.  F
13b10 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13b30 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
13b40 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
13b50 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
13b60 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r,         /* Wr
13b70 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
13b80 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73   int nTerm, cons
13b90 74 20 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20  t u8 *pTerm     
13ba0 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f   /* First term o
13bb0 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b  n new page */.){
13bc0 0a 20 20 69 6e 74 20 69 48 65 69 67 68 74 3b 0a  .  int iHeight;.
13bd0 20 20 66 6f 72 28 69 48 65 69 67 68 74 3d 31 3b    for(iHeight=1;
13be0 20 31 3b 20 69 48 65 69 67 68 74 2b 2b 29 7b 0a   1; iHeight++){.
13bf0 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69 74      Fts5PageWrit
13c00 65 72 20 2a 70 50 61 67 65 3b 0a 0a 20 20 20 20  er *pPage;..    
13c10 69 66 28 20 69 48 65 69 67 68 74 3e 3d 70 57 72  if( iHeight>=pWr
13c20 69 74 65 72 2d 3e 6e 57 72 69 74 65 72 20 29 7b  iter->nWriter ){
13c30 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
13c40 42 74 72 65 65 47 72 6f 77 28 70 2c 20 70 57 72  BtreeGrow(p, pWr
13c50 69 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  iter);.      if(
13c60 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
13c70 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
13c80 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
13c90 69 74 65 72 5b 69 48 65 69 67 68 74 5d 3b 0a 0a  iter[iHeight];..
13ca0 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74 72      fts5WriteBtr
13cb0 65 65 4e 45 6d 70 74 79 28 70 2c 20 70 57 72 69  eeNEmpty(p, pWri
13cc0 74 65 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 70  ter);..    if( p
13cd0 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e  Page->buf.n>=p->
13ce0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
13cf0 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20  .      /* pPage 
13d00 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20  will be written 
13d10 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 74 65 72  to disk. The ter
13d20 6d 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65  m will be writte
13d30 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  n into the.     
13d40 20 2a 2a 20 70 61 72 65 6e 74 20 6f 66 20 70 50   ** parent of pP
13d50 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  age.  */.      i
13d60 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
13d70 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 0a  _SEGMENT_ROWID(.
13d80 20 20 20 20 20 20 20 20 20 20 70 57 72 69 74 65            pWrite
13d90 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72  r->iIdx, pWriter
13da0 2d 3e 69 53 65 67 69 64 2c 20 69 48 65 69 67 68  ->iSegid, iHeigh
13db0 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  t, pPage->pgno. 
13dc0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74       );.      ft
13dd0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69  s5DataWrite(p, i
13de0 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75  Rowid, pPage->bu
13df0 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  f.p, pPage->buf.
13e00 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  n);.      fts5Bu
13e10 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d  fferZero(&pPage-
13e20 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 66 74 73  >buf);.      fts
13e30 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
13e40 67 65 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 20  ge->term);.     
13e50 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
13e60 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
13e70 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61  &pPage->buf, pPa
13e80 67 65 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20  ge[-1].pgno);.  
13e90 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2b      pPage->pgno+
13ea0 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
13eb0 20 20 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 66      int nPre = f
13ec0 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
13ed0 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c  s(pPage->term.n,
13ee0 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
13ef0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
13f00 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
13f10 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
13f20 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
13f30 20 6e 50 72 65 2b 32 29 3b 0a 20 20 20 20 20 20   nPre+2);.      
13f40 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
13f50 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
13f60 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
13f70 6d 2d 6e 50 72 65 29 3b 0a 20 20 20 20 20 20 66  m-nPre);.      f
13f80 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
13f90 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  lob(&p->rc, &pPa
13fa0 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2d 6e  ge->buf, nTerm-n
13fb0 50 72 65 2c 20 70 54 65 72 6d 2b 6e 50 72 65 29  Pre, pTerm+nPre)
13fc0 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
13fd0 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
13fe0 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72  Page->term, nTer
13ff0 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
14000 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14010 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
14020 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
14030 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  oTerm(.  Fts5Ind
14040 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
14050 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
14060 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
14070 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  */.  Fts5SegWrit
14080 65 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20  er *pWriter     
14090 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f       /* Writer o
140a0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 66  bject */.){.  if
140b0 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
140c0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
140d0 20 20 20 20 2f 2a 20 4e 6f 20 72 6f 77 69 64 73      /* No rowids
140e0 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 20 41   on this page. A
140f0 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79  ppend an 0x00 by
14100 74 65 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  te to the curren
14110 74 20 0a 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73  t .    ** doclis
14120 74 2d 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 73  t-index */.    s
14130 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
14140 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
14150 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 64  >rc, &pWriter->d
14160 6c 69 64 78 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lidx, 0);.  }.  
14170 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b  pWriter->nEmpty+
14180 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69  +;.}../*.** Rowi
14190 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73  d iRowid has jus
141a0 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20  t been appended 
141b0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  to the current l
141c0 65 61 66 20 70 61 67 65 2e 20 41 73 20 69 74 20  eaf page. As it 
141d0 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
141e0 6f 6e 20 69 74 73 20 70 61 67 65 2c 20 61 70 70  on its page, app
141f0 65 6e 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  end an entry to 
14200 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
14210 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ist-index..*/.st
14220 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
14230 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a  iteDlidxAppend(.
14240 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
14250 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
14260 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36   *pWriter, .  i6
14270 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 36  4 iRowid.){.  i6
14280 34 20 69 56 61 6c 3b 0a 20 20 69 66 28 20 70 57  4 iVal;.  if( pW
14290 72 69 74 65 72 2d 3e 62 44 6c 69 64 78 50 72 65  riter->bDlidxPre
142a0 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 69 56  vValid ){.    iV
142b0 61 6c 20 3d 20 70 57 72 69 74 65 72 2d 3e 69 44  al = pWriter->iD
142c0 6c 69 64 78 50 72 65 76 20 2d 20 69 52 6f 77 69  lidxPrev - iRowi
142d0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
142e0 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20  iVal = iRowid;. 
142f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35   }.  sqlite3Fts5
14300 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
14310 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  nt(&p->rc, &pWri
14320 74 65 72 2d 3e 64 6c 69 64 78 2c 20 69 56 61 6c  ter->dlidx, iVal
14330 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 44  );.  pWriter->bD
14340 6c 69 64 78 50 72 65 76 56 61 6c 69 64 20 3d 20  lidxPrevValid = 
14350 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 44  1;.  pWriter->iD
14360 6c 69 64 78 50 72 65 76 20 3d 20 69 52 6f 77 69  lidxPrev = iRowi
14370 64 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  d;.}..static voi
14380 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68  d fts5WriteFlush
14390 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20 2a  Leaf(Fts5Index *
143a0 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72  p, Fts5SegWriter
143b0 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73 74   *pWriter){.  st
143c0 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
143d0 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30  ro[] = { 0x00, 0
143e0 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20  x00, 0x00, 0x00 
143f0 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  };.  Fts5PageWri
14400 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57  ter *pPage = &pW
14410 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
14420 5d 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ];.  i64 iRowid;
14430 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74  ..  if( pPage->t
14440 65 72 6d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  erm.n==0 ){.    
14450 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20 77  /* No term was w
14460 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 70  ritten to this p
14470 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
14480 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31  rt( 0==fts5GetU1
14490 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  6(&pPage->buf.p[
144a0 32 5d 29 20 29 3b 0a 20 20 20 20 66 74 73 35 57  2]) );.    fts5W
144b0 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28  riteBtreeNoTerm(
144c0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d  p, pWriter);.  }
144d0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
144e0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
144f0 20 74 68 65 20 64 62 2e 20 2a 2f 0a 20 20 69 52   the db. */.  iR
14500 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
14510 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65  ENT_ROWID(pWrite
14520 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74 65 72  r->iIdx, pWriter
14530 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 50 61  ->iSegid, 0, pPa
14540 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73  ge->pgno);.  fts
14550 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52  5DataWrite(p, iR
14560 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66  owid, pPage->buf
14570 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  .p, pPage->buf.n
14580 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
14590 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ize the next pag
145a0 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  e. */.  fts5Buff
145b0 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62  erZero(&pPage->b
145c0 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  uf);.  fts5Buffe
145d0 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 74 65  rZero(&pPage->te
145e0 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  rm);.  fts5Buffe
145f0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
14600 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
14610 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61   4, zero);.  pPa
14620 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ge->pgno++;..  /
14630 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6c  * Increase the l
14640 65 61 76 65 73 20 77 72 69 74 74 65 6e 20 63 6f  eaves written co
14650 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72 69 74  unter */.  pWrit
14660 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e  er->nLeafWritten
14670 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ++;.}../*.** App
14680 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e  end term pTerm/n
14690 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d  Term to the segm
146a0 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74 74 65  ent being writte
146b0 6e 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20  n by the writer 
146c0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
146d0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
146e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
146f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
14700 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
14710 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
14720 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
14730 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
14740 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
14750 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
14760 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14770 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
14780 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
14790 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
147a0 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
147b0 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75  t nTerm, const u
147c0 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69  8 *pTerm .){.  i
147d0 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20  nt nPrefix;     
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
147f0 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65 66 69  * Bytes of prefi
14800 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f  x compression fo
14810 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35  r term */.  Fts5
14820 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
14830 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57  e = &pWriter->aW
14840 72 69 74 65 72 5b 30 5d 3b 0a 0a 20 20 61 73 73  riter[0];..  ass
14850 65 72 74 28 20 70 50 61 67 65 3d 3d 30 20 7c 7c  ert( pPage==0 ||
14860 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30   pPage->buf.n==0
14870 20 7c 7c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e   || pPage->buf.n
14880 3e 34 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >4 );.  if( pPag
14890 65 20 26 26 20 70 50 61 67 65 2d 3e 62 75 66 2e  e && pPage->buf.
148a0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 5a  n==0 ){.    /* Z
148b0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 74 65  ero the first te
148c0 72 6d 20 61 6e 64 20 66 69 72 73 74 20 64 6f 63  rm and first doc
148d0 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a 20 20 20  id fields */.   
148e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
148f0 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30   zero[] = { 0x00
14900 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
14910 30 30 20 7d 3b 0a 20 20 20 20 66 74 73 35 42 75  00 };.    fts5Bu
14920 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
14930 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
14940 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20  uf, 4, zero);.  
14950 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
14960 3e 74 65 72 6d 2e 6e 3d 3d 30 20 29 3b 0a 20 20  >term.n==0 );.  
14970 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20  }.  if( p->rc ) 
14980 72 65 74 75 72 6e 3b 0a 20 20 0a 20 20 69 66 28  return;.  .  if(
14990 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 3d 3d   pPage->term.n==
149a0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61  0 ){.    /* Upda
149b0 74 65 20 74 68 65 20 22 66 69 72 73 74 20 74 65  te the "first te
149c0 72 6d 22 20 66 69 65 6c 64 20 6f 66 20 74 68 65  rm" field of the
149d0 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 2a 2f   page header. */
149e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
149f0 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20  ge->buf.p[2]==0 
14a00 26 26 20 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b  && pPage->buf.p[
14a10 33 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74 73  3]==0 );.    fts
14a20 35 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e  5PutU16(&pPage->
14a30 62 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d  buf.p[2], pPage-
14a40 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72  >buf.n);.    nPr
14a50 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66  efix = 0;.    if
14a60 28 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74  ( pWriter->aWrit
14a70 65 72 5b 30 5d 2e 70 67 6e 6f 21 3d 31 20 29 7b  er[0].pgno!=1 ){
14a80 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
14a90 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72  BtreeTerm(p, pWr
14aa0 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65  iter, nTerm, pTe
14ab0 72 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  rm);.      pPage
14ac0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72   = &pWriter->aWr
14ad0 69 74 65 72 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20  iter[0];.    }. 
14ae0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65   }else{.    nPre
14af0 66 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78  fix = fts5Prefix
14b00 43 6f 6d 70 72 65 73 73 28 0a 20 20 20 20 20 20  Compress(.      
14b10 20 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c    pPage->term.n,
14b20 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20   pPage->term.p, 
14b30 6e 54 65 72 6d 2c 20 70 54 65 72 6d 0a 20 20 20  nTerm, pTerm.   
14b40 20 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66   );.    fts5Buff
14b50 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
14b60 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
14b70 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  uf, nPrefix);.  
14b80 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
14b90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
14ba0 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20  es of new data, 
14bb0 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61  then the term da
14bc0 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74  ta itself.  ** t
14bd0 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  o the page. */. 
14be0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
14bf0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
14c00 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
14c10 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20  rm - nPrefix);. 
14c20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
14c30 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
14c40 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
14c50 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65   - nPrefix, &pTe
14c60 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20  rm[nPrefix]);.. 
14c70 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46   /* Update the F
14c80 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65  ts5PageWriter.te
14c90 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66  rm field. */.  f
14ca0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
14cb0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72  >rc, &pPage->ter
14cc0 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
14cd0 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  ;..  pWriter->bF
14ce0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
14cf0 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 0;.  pWriter->
14d00 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
14d10 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  list = 1;..  /* 
14d20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  If the current l
14d30 65 61 66 20 70 61 67 65 20 69 73 20 66 75 6c 6c  eaf page is full
14d40 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69  , flush it to di
14d50 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  sk. */.  if( pPa
14d60 67 65 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43  ge->buf.n>=p->pC
14d70 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
14d80 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
14d90 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
14da0 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  );.    pWriter->
14db0 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
14dc0 65 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 1;.  }.}../*
14dd0 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63  .** Append a doc
14de0 69 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 72  id to the writer
14df0 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74  s output. .*/.st
14e00 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
14e10 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a  iteAppendRowid(.
14e20 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
14e30 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
14e40 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34   *pWriter,.  i64
14e50 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28   iRowid.){.  if(
14e60 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14e70 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  K ){.    Fts5Pag
14e80 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
14e90 20 26 70 57 72 69 74 65 72 2d 3e 61 57 72 69 74   &pWriter->aWrit
14ea0 65 72 5b 30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  er[0];..    /* I
14eb0 66 20 74 68 69 73 20 69 73 20 74 6f 20 62 65 20  f this is to be 
14ec0 74 68 65 20 66 69 72 73 74 20 64 6f 63 69 64 20  the first docid 
14ed0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70  written to the p
14ee0 61 67 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20  age, set the .  
14ef0 20 20 2a 2a 20 64 6f 63 69 64 2d 70 6f 69 6e 74    ** docid-point
14f00 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68  er in the page-h
14f10 65 61 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65  eader. Also appe
14f20 6e 64 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68  nd a value to th
14f30 65 20 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62  e dlidx.    ** b
14f40 75 66 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61  uffer, in case a
14f50 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69   doclist-index i
14f60 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
14f70 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
14f80 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
14f90 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ge ){.      fts5
14fa0 50 75 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75  PutU16(pPage->bu
14fb0 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  f.p, pPage->buf.
14fc0 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72  n);.      fts5Wr
14fd0 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70  iteDlidxAppend(p
14fe0 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69  , pWriter, iRowi
14ff0 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
15000 2a 20 57 72 69 74 65 20 74 68 65 20 64 6f 63 69  * Write the doci
15010 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  d. */.    if( pW
15020 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
15030 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70  idInDoclist || p
15040 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
15050 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
15060 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
15070 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
15080 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69  , &pPage->buf, i
15090 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73  Rowid);.    }els
150a0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
150b0 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64   p->rc || iRowid
150c0 3c 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52  <pWriter->iPrevR
150d0 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74  owid );.      ft
150e0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
150f0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
15100 61 67 65 2d 3e 62 75 66 2c 20 70 57 72 69 74 65  age->buf, pWrite
15110 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 2d 20  r->iPrevRowid - 
15120 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iRowid);.    }. 
15130 20 20 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65     pWriter->iPre
15140 76 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  vRowid = iRowid;
15150 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46  .    pWriter->bF
15160 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
15170 73 74 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69  st = 0;.    pWri
15180 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
15190 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  InPage = 0;..   
151a0 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
151b0 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  n>=p->pConfig->p
151c0 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gsz ){.      fts
151d0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
151e0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
151f0 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
15200 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
15210 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  1;.    }.  }.}..
15220 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
15230 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69  WriteAppendPosli
15240 73 74 49 6e 74 28 0a 20 20 46 74 73 35 49 6e 64  stInt(.  Fts5Ind
15250 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
15260 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
15270 2c 0a 20 20 69 6e 74 20 69 56 61 6c 0a 29 7b 0a  ,.  int iVal.){.
15280 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
15290 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
152a0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50  s5PageWriter *pP
152b0 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
152c0 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 20 20  aWriter[0];.    
152d0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
152e0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
152f0 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 56 61 6c  pPage->buf, iVal
15300 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
15310 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e  ->buf.n>=p->pCon
15320 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
15330 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
15340 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
15350 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  );.      pWriter
15360 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
15370 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  age = 1;.    }. 
15380 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
15390 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
153a0 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20  dPoslistData(.  
153b0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
153c0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
153d0 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73  pWriter, .  cons
153e0 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20  t u8 *aData, .  
153f0 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46  int nData.){.  F
15400 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
15410 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
15420 3e 61 57 72 69 74 65 72 5b 30 5d 3b 0a 20 20 63  >aWriter[0];.  c
15430 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61  onst u8 *a = aDa
15440 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44  ta;.  int n = nD
15450 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ata;.  .  assert
15460 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  ( p->pConfig->pg
15470 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  sz>0 );.  while(
15480 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15490 4b 20 26 26 20 28 70 50 61 67 65 2d 3e 62 75 66  K && (pPage->buf
154a0 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e  .n + n)>=p->pCon
154b0 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
154c0 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70   int nReq = p->p
154d0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70  Config->pgsz - p
154e0 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 20 20 20  Page->buf.n;.   
154f0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a   int nCopy = 0;.
15500 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70 79      while( nCopy
15510 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20 69  <nReq ){.      i
15520 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  64 dummy;.      
15530 6e 43 6f 70 79 20 2b 3d 20 67 65 74 56 61 72 69  nCopy += getVari
15540 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75  nt(&a[nCopy], (u
15550 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20  64*)&dummy);.   
15560 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
15570 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
15580 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
15590 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20   nCopy, a);.    
155a0 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  a += nCopy;.    
155b0 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  n -= nCopy;.    
155c0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
155d0 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
155e0 20 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69      pWriter->bFi
155f0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d  rstRowidInPage =
15600 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e   1;.  }.  if( n>
15610 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  0 ){.    fts5Buf
15620 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
15630 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
15640 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a  f, n, a);.  }.}.
15650 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15660 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72 6f  5WriteAppendZero
15670 62 79 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  byte(Fts5Index *
15680 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72  p, Fts5SegWriter
15690 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 66 74   *pWriter){.  ft
156a0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
156b0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 57  rint(&p->rc, &pW
156c0 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30  riter->aWriter[0
156d0 5d 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  ].buf, 0);.}../*
156e0 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61  .** Flush any da
156f0 74 61 20 63 61 63 68 65 64 20 62 79 20 74 68 65  ta cached by the
15700 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20 74   writer object t
15710 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
15720 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f  Free any.** allo
15730 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74  cations associat
15740 65 64 20 77 69 74 68 20 74 68 65 20 77 72 69 74  ed with the writ
15750 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
15760 69 64 20 66 74 73 35 57 72 69 74 65 46 69 6e 69  id fts5WriteFini
15770 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  sh(.  Fts5Index 
15780 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
15790 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20  iter *pWriter,  
157a0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
157b0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
157c0 20 2a 70 6e 48 65 69 67 68 74 2c 20 20 20 20 20   *pnHeight,     
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
157e0 4f 55 54 3a 20 48 65 69 67 68 74 20 6f 66 20 74  OUT: Height of t
157f0 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69  he b-tree */.  i
15800 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20  nt *pnLeaf      
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15820 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
15830 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e 20 62   leaf pages in b
15840 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  -tree */.){.  in
15850 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  t i;.  if( p->rc
15860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15870 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 57 72     *pnLeaf = pWr
15880 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
15890 2e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 2a  .pgno;.    if( *
158a0 70 6e 4c 65 61 66 3d 3d 31 20 26 26 20 70 57 72  pnLeaf==1 && pWr
158b0 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 30 5d  iter->aWriter[0]
158c0 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  .buf.n==0 ){.   
158d0 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 30 3b 0a     *pnLeaf = 0;.
158e0 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20        *pnHeight 
158f0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
15900 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
15910 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
15920 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
15930 70 57 72 69 74 65 72 2d 3e 6e 57 72 69 74 65 72  pWriter->nWriter
15940 3d 3d 31 20 26 26 20 70 57 72 69 74 65 72 2d 3e  ==1 && pWriter->
15950 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e  nEmpty>=FTS5_MIN
15960 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20  _DLIDX_SIZE ){. 
15970 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
15980 42 74 72 65 65 47 72 6f 77 28 70 2c 20 70 57 72  BtreeGrow(p, pWr
15990 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  iter);.      }. 
159a0 20 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72       if( pWriter
159b0 2d 3e 6e 57 72 69 74 65 72 3e 31 20 29 7b 0a 20  ->nWriter>1 ){. 
159c0 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
159d0 42 74 72 65 65 4e 45 6d 70 74 79 28 70 2c 20 70  BtreeNEmpty(p, p
159e0 57 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Writer);.      }
159f0 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74  .      *pnHeight
15a00 20 3d 20 70 57 72 69 74 65 72 2d 3e 6e 57 72 69   = pWriter->nWri
15a10 74 65 72 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  ter;..      for(
15a20 69 3d 31 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=1; i<pWriter->
15a30 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b 0a 20  nWriter; i++){. 
15a40 20 20 20 20 20 20 20 46 74 73 35 50 61 67 65 57         Fts5PageW
15a50 72 69 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57  riter *pPg = &pW
15a60 72 69 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69  riter->aWriter[i
15a70 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  ];.        fts5D
15a80 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20  ataWrite(p, .   
15a90 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45           FTS5_SE
15aa0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69  GMENT_ROWID(pWri
15ab0 74 65 72 2d 3e 69 49 64 78 2c 20 70 57 72 69 74  ter->iIdx, pWrit
15ac0 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70  er->iSegid, i, p
15ad0 50 67 2d 3e 70 67 6e 6f 29 2c 20 0a 20 20 20 20  Pg->pgno), .    
15ae0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 62 75 66          pPg->buf
15af0 2e 70 2c 20 70 50 67 2d 3e 62 75 66 2e 6e 0a 20  .p, pPg->buf.n. 
15b00 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
15b10 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  }.    }.  }.  fo
15b20 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72  r(i=0; i<pWriter
15b30 2d 3e 6e 57 72 69 74 65 72 3b 20 69 2b 2b 29 7b  ->nWriter; i++){
15b40 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72 69  .    Fts5PageWri
15b50 74 65 72 20 2a 70 50 67 20 3d 20 26 70 57 72 69  ter *pPg = &pWri
15b60 74 65 72 2d 3e 61 57 72 69 74 65 72 5b 69 5d 3b  ter->aWriter[i];
15b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
15b80 20 7c 7c 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54   || p->rc!=SQLIT
15b90 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20  E_OK );.    if( 
15ba0 70 50 67 20 29 7b 0a 20 20 20 20 20 20 66 74 73  pPg ){.      fts
15bb0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 50 67  5BufferFree(&pPg
15bc0 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 20 20 66  ->term);.      f
15bd0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
15be0 50 67 2d 3e 62 75 66 29 3b 0a 20 20 20 20 7d 0a  Pg->buf);.    }.
15bf0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
15c00 65 65 28 70 57 72 69 74 65 72 2d 3e 61 57 72 69  ee(pWriter->aWri
15c10 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ter);.  sqlite3F
15c20 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
15c30 57 72 69 74 65 72 2d 3e 64 6c 69 64 78 29 3b 0a  Writer->dlidx);.
15c40 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
15c50 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20  ts5WriteInit(.  
15c60 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
15c70 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
15c80 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20  pWriter, .  int 
15c90 69 49 64 78 2c 20 69 6e 74 20 69 53 65 67 69 64  iIdx, int iSegid
15ca0 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 57 72  .){.  memset(pWr
15cb0 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  iter, 0, sizeof(
15cc0 46 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b  Fts5SegWriter));
15cd0 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 49 64 78  .  pWriter->iIdx
15ce0 20 3d 20 69 49 64 78 3b 0a 20 20 70 57 72 69 74   = iIdx;.  pWrit
15cf0 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  er->iSegid = iSe
15d00 67 69 64 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d  gid;..  pWriter-
15d10 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74 73 35  >aWriter = (Fts5
15d20 50 61 67 65 57 72 69 74 65 72 2a 29 66 74 73 35  PageWriter*)fts5
15d30 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 73 69 7a 65  IdxMalloc(p,size
15d40 6f 66 28 46 74 73 35 50 61 67 65 57 72 69 74 65  of(Fts5PageWrite
15d50 72 29 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74  r));.  if( pWrit
15d60 65 72 2d 3e 61 57 72 69 74 65 72 3d 3d 30 20 29  er->aWriter==0 )
15d70 20 72 65 74 75 72 6e 3b 0a 20 20 70 57 72 69 74   return;.  pWrit
15d80 65 72 2d 3e 6e 57 72 69 74 65 72 20 3d 20 31 3b  er->nWriter = 1;
15d90 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 57 72 69  .  pWriter->aWri
15da0 74 65 72 5b 30 5d 2e 70 67 6e 6f 20 3d 20 31 3b  ter[0].pgno = 1;
15db0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
15dc0 66 74 73 35 57 72 69 74 65 49 6e 69 74 46 6f 72  fts5WriteInitFor
15dd0 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e  Append(.  Fts5In
15de0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
15df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
15e00 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
15e10 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
15e20 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20  ter *pWriter,   
15e30 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
15e40 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 2a 2f  to initialize */
15e50 0a 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20  .  int iIdx,    
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e70 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 65 67 6d     /* Index segm
15e80 65 6e 74 20 69 73 20 61 20 70 61 72 74 20 6f 66  ent is a part of
15e90 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
15ea0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
15eb0 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74        /* Segment
15ec0 20 6f 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e   object to appen
15ed0 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  d to */.){.  int
15ee0 20 6e 42 79 74 65 20 3d 20 70 53 65 67 2d 3e 6e   nByte = pSeg->n
15ef0 48 65 69 67 68 74 20 2a 20 73 69 7a 65 6f 66 28  Height * sizeof(
15f00 46 74 73 35 50 61 67 65 57 72 69 74 65 72 29 3b  Fts5PageWriter);
15f10 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65  .  memset(pWrite
15f20 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
15f30 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
15f40 70 57 72 69 74 65 72 2d 3e 69 49 64 78 20 3d 20  pWriter->iIdx = 
15f50 69 49 64 78 3b 0a 20 20 70 57 72 69 74 65 72 2d  iIdx;.  pWriter-
15f60 3e 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e  >iSegid = pSeg->
15f70 69 53 65 67 69 64 3b 0a 20 20 70 57 72 69 74 65  iSegid;.  pWrite
15f80 72 2d 3e 61 57 72 69 74 65 72 20 3d 20 28 46 74  r->aWriter = (Ft
15f90 73 35 50 61 67 65 57 72 69 74 65 72 2a 29 66 74  s5PageWriter*)ft
15fa0 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 6e  s5IdxMalloc(p, n
15fb0 42 79 74 65 29 3b 0a 20 20 70 57 72 69 74 65 72  Byte);.  pWriter
15fc0 2d 3e 6e 57 72 69 74 65 72 20 3d 20 70 53 65 67  ->nWriter = pSeg
15fd0 2d 3e 6e 48 65 69 67 68 74 3b 0a 0a 20 20 69 66  ->nHeight;..  if
15fe0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15ff0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 67  OK ){.    int pg
16000 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  no = 1;.    int 
16010 69 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  i;.    pWriter->
16020 61 57 72 69 74 65 72 5b 30 5d 2e 70 67 6e 6f 20  aWriter[0].pgno 
16030 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
16040 2b 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53  +1;.    for(i=pS
16050 65 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 20 69  eg->nHeight-1; i
16060 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
16070 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
16080 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
16090 70 57 72 69 74 65 72 2d 3e 69 49 64 78 2c 20 70  pWriter->iIdx, p
160a0 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
160b0 69 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  i, pgno);.      
160c0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
160d0 70 50 67 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  pPg = &pWriter->
160e0 61 57 72 69 74 65 72 5b 69 5d 3b 0a 20 20 20 20  aWriter[i];.    
160f0 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
16100 6e 6f 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61  no;.      fts5Da
16110 74 61 42 75 66 66 65 72 28 70 2c 20 26 70 50 67  taBuffer(p, &pPg
16120 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a  ->buf, iRowid);.
16130 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
16140 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16150 20 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49 74        Fts5NodeIt
16160 65 72 20 73 73 3b 0a 20 20 20 20 20 20 20 20 66  er ss;.        f
16170 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28  ts5NodeIterInit(
16180 70 50 67 2d 3e 62 75 66 2e 70 2c 20 70 50 67 2d  pPg->buf.p, pPg-
16190 3e 62 75 66 2e 6e 2c 20 26 73 73 29 3b 0a 20 20  >buf.n, &ss);.  
161a0 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 73 2e        while( ss.
161b0 61 44 61 74 61 20 29 20 66 74 73 35 4e 6f 64 65  aData ) fts5Node
161c0 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63 2c  IterNext(&p->rc,
161d0 20 26 73 73 29 3b 0a 20 20 20 20 20 20 20 20 66   &ss);.        f
161e0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
161f0 3e 72 63 2c 20 26 70 50 67 2d 3e 74 65 72 6d 2c  >rc, &pPg->term,
16200 20 73 73 2e 74 65 72 6d 2e 6e 2c 20 73 73 2e 74   ss.term.n, ss.t
16210 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20  erm.p);.        
16220 70 67 6e 6f 20 3d 20 73 73 2e 69 43 68 69 6c 64  pgno = ss.iChild
16230 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4e 6f  ;.        fts5No
16240 64 65 49 74 65 72 46 72 65 65 28 26 73 73 29 3b  deIterFree(&ss);
16250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16260 20 20 20 69 66 28 20 70 53 65 67 2d 3e 6e 48 65     if( pSeg->nHe
16270 69 67 68 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  ight==1 ){.     
16280 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
16290 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
162a0 74 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t-1;.    }.    a
162b0 73 73 65 72 74 28 20 28 70 67 6e 6f 2b 70 57 72  ssert( (pgno+pWr
162c0 69 74 65 72 2d 3e 6e 45 6d 70 74 79 29 3d 3d 70  iter->nEmpty)==p
162d0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 3b  Seg->pgnoLast );
162e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  .  }.}../*.** It
162f0 65 72 61 74 6f 72 20 70 49 74 65 72 20 77 61 73  erator pIter was
16300 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   used to iterate
16310 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70   through the inp
16320 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f  ut segments of o
16330 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e  n an.** incremen
16340 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74  tal merge operat
16350 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ion. This functi
16360 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20  on is called if 
16370 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a  the incremental.
16380 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68 61  ** merge step ha
16390 73 20 66 69 6e 69 73 68 65 64 20 62 75 74 20 74  s finished but t
163a0 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74  he input has not
163b0 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79   been completely
163c0 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73   exhausted..*/.s
163d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54  tatic void fts5T
163e0 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35  rimSegments(Fts5
163f0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 4d 75  Index *p, Fts5Mu
16400 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49 74 65  ltiSegIter *pIte
16410 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46  r){.  int i;.  F
16420 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20  ts5Buffer buf;. 
16430 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
16440 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
16450 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  er));.  for(i=0;
16460 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
16470 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65  i++){.    Fts5Se
16480 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
16490 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20  Iter->aSeg[i];. 
164a0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65     if( pSeg->pSe
164b0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  g==0 ){.      /*
164c0 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65   no-op */.    }e
164d0 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c  lse if( pSeg->pL
164e0 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
164f0 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
16500 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Last = 0;.      
16510 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
16520 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  First = 0;.    }
16530 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
16540 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54 65  iOff = pSeg->iTe
16550 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 20  rmLeafOffset;   
16560 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20 6e    /* Offset on n
16570 65 77 20 66 69 72 73 74 20 6c 65 61 66 20 70 61  ew first leaf pa
16580 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  ge */.      i64 
16590 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20 20  iLeafRowid;.    
165a0 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
165b0 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  a;.      int iId
165c0 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69   = pSeg->pSeg->i
165d0 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38 20  Segid;.      u8 
165e0 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30 2c  aHdr[4] = {0x00,
165f0 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30   0x00, 0x00, 0x0
16600 34 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61 66  4};..      iLeaf
16610 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
16620 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
16630 3e 69 49 64 78 2c 20 69 49 64 2c 20 30 2c 20 70  >iIdx, iId, 0, p
16640 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
16650 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61 74 61  no);.      pData
16660 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
16670 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a  p, iLeafRowid);.
16680 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 20        if( pData 
16690 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
166a0 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29 3b  ufferZero(&buf);
166b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
166c0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
166d0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65  ->rc, &buf, size
166e0 6f 66 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b  of(aHdr), aHdr);
166f0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
16700 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
16710 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
16720 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20  eg->term.n);.   
16730 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
16740 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
16750 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65  , &buf, pSeg->te
16760 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d  rm.n, pSeg->term
16770 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .p);.        fts
16780 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
16790 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  b(&p->rc, &buf, 
167a0 70 44 61 74 61 2d 3e 6e 20 2d 20 69 4f 66 66 2c  pData->n - iOff,
167b0 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d   &pData->p[iOff]
167c0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
167d0 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
167e0 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d  );.        pSeg-
167f0 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
16800 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
16810 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20  afPgno;.        
16820 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
16830 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
16840 4f 57 49 44 28 70 53 65 67 2d 3e 69 49 64 78 2c  OWID(pSeg->iIdx,
16850 20 69 49 64 2c 20 30 2c 20 31 29 2c 69 4c 65 61   iId, 0, 1),iLea
16860 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  fRowid);.       
16870 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
16880 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20 62 75  , iLeafRowid, bu
16890 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
168a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
168b0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
168c0 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  &buf);.}../*.**.
168d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
168e0 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
168f0 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  el(.  Fts5Index 
16900 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
16910 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
16920 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
16930 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16950 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f    /* Index to wo
16960 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53  rk on */.  Fts5S
16970 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
16980 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
16990 2f 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f  /OUT: Stucture o
169a0 66 20 69 6e 64 65 78 20 69 49 64 78 20 2a 2f 0a  f index iIdx */.
169b0 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20    int iLvl,     
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169d0 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65    /* Level to re
169e0 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f  ad input from */
169f0 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20  .  int *pnRem   
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74     /* Write up t
16a20 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70  o this many outp
16a30 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a  ut leaves */.){.
16a40 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
16a50 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
16a60 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
16a70 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
16a80 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
16a90 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73  vel[iLvl];.  Fts
16aa0 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
16ab0 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35  *pLvlOut;.  Fts5
16ac0 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 49  MultiSegIter *pI
16ad0 74 65 72 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  ter = 0;    /* I
16ae0 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20  terator to read 
16af0 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20  input data */.  
16b00 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d  int nRem = pnRem
16b10 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20   ? *pnRem : 0;  
16b20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70  /* Output leaf p
16b30 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
16b40 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  te */.  int nInp
16b50 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
16b60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16b70 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
16b80 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  nts */.  Fts5Seg
16b90 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20  Writer writer;  
16ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
16bb0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  er object */.  F
16bc0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
16bd0 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
16be0 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  * Output segment
16bf0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
16c00 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 52 65   term;.  int bRe
16c10 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d  quireDoclistTerm
16c20 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44 6f 63 6c   = 0;    /* Docl
16c30 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 28  ist terminator (
16c40 30 78 30 30 29 20 72 65 71 75 69 72 65 64 20 2a  0x00) required *
16c50 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b  /.  int bOldest;
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c70 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
16c80 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
16c90 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20  t is the oldest 
16ca0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
16cb0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
16cc0 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
16cd0 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
16ce0 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d  vl->nSeg );..  m
16cf0 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
16d00 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
16d10 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Writer));.  mems
16d20 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
16d30 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
16d40 3b 0a 20 20 77 72 69 74 65 72 2e 69 49 64 78 20  ;.  writer.iIdx 
16d50 3d 20 69 49 64 78 3b 0a 20 20 69 66 28 20 70 4c  = iIdx;.  if( pL
16d60 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20  vl->nMerge ){.  
16d70 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74    pLvlOut = &pSt
16d80 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
16d90 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l+1];.    assert
16da0 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e  ( pLvlOut->nSeg>
16db0 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20  0 );.    nInput 
16dc0 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a  = pLvl->nMerge;.
16dd0 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
16de0 74 46 6f 72 41 70 70 65 6e 64 28 70 2c 20 26 77  tForAppend(p, &w
16df0 72 69 74 65 72 2c 20 69 49 64 78 2c 20 26 70 4c  riter, iIdx, &pL
16e00 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
16e10 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 29 3b 0a 20  Out->nSeg-1]);. 
16e20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f     pSeg = &pLvlO
16e30 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74  ut->aSeg[pLvlOut
16e40 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 20 20 7d 65 6c  ->nSeg-1];.  }el
16e50 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  se{.    int iSeg
16e60 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74  id = fts5Allocat
16e70 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63  eSegid(p, pStruc
16e80 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65  t);..    /* Exte
16e90 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63  nd the Fts5Struc
16ea0 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72  ture object as r
16eb0 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72  equired to ensur
16ec0 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  e the output.   
16ed0 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73   ** segment exis
16ee0 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ts. */.    if( i
16ef0 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c  Lvl==pStruct->nL
16f00 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  evel-1 ){.      
16f10 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
16f20 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70  Level(&p->rc, pp
16f30 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
16f40 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
16f50 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ct;.    }.    ft
16f60 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
16f70 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
16f80 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20  Struct, iLvl+1, 
16f90 31 2c 20 30 29 3b 0a 20 20 20 20 70 4c 76 6c 20  1, 0);.    pLvl 
16fa0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
16fb0 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c  el[iLvl];.    pL
16fc0 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  vlOut = &pStruct
16fd0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d  ->aLevel[iLvl+1]
16fe0 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ;..    fts5Write
16ff0 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c  Init(p, &writer,
17000 20 69 49 64 78 2c 20 69 53 65 67 69 64 29 3b 0a   iIdx, iSegid);.
17010 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
17020 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74  new segment to t
17030 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20  he output level 
17040 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 2b  */.    if( iLvl+
17050 31 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  1==pStruct->nLev
17060 65 6c 20 29 20 70 53 74 72 75 63 74 2d 3e 6e 4c  el ) pStruct->nL
17070 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 70 53 65 67  evel++;.    pSeg
17080 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65   = &pLvlOut->aSe
17090 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d  g[pLvlOut->nSeg]
170a0 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e  ;.    pLvlOut->n
170b0 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d  Seg++;.    pSeg-
170c0 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a  >pgnoFirst = 1;.
170d0 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64      pSeg->iSegid
170e0 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 20 20   = iSegid;..    
170f0 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72  /* Read input fr
17100 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  om all segments 
17110 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76  in the input lev
17120 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74  el */.    nInput
17130 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20   = pLvl->nSeg;. 
17140 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28   }.  bOldest = (
17150 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31  pLvlOut->nSeg==1
17160 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   && pStruct->nLe
17170 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 23  vel==iLvl+2);..#
17180 69 66 20 30 0a 66 70 72 69 6e 74 66 28 73 74 64  if 0.fprintf(std
17190 6f 75 74 2c 20 22 6d 65 72 67 69 6e 67 20 25 64  out, "merging %d
171a0 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 6c   segments from l
171b0 65 76 65 6c 20 25 64 21 22 2c 20 6e 49 6e 70 75  evel %d!", nInpu
171c0 74 2c 20 69 4c 76 6c 29 3b 0a 66 66 6c 75 73 68  t, iLvl);.fflush
171d0 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e 64 69 66  (stdout);.#endif
171e0 0a 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74  ..  for(fts5Mult
171f0 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
17200 75 63 74 2c 20 69 49 64 78 2c 20 30 2c 20 30 2c  uct, iIdx, 0, 0,
17210 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e   0, 0, iLvl, nIn
17220 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20  put, &pIter);.  
17230 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
17240 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d  rEof(p, pIter)==
17250 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  0;.      fts5Mul
17260 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
17270 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a  ter, 0, 0).  ){.
17280 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
17290 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
172a0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
172b0 72 73 74 5b 31 5d 20 5d 3b 0a 20 20 20 20 46 74  rst[1] ];.    Ft
172c0 73 35 43 68 75 6e 6b 49 74 65 72 20 73 50 6f 73  s5ChunkIter sPos
172d0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  ;           /* U
172e0 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
172f0 68 72 6f 75 67 68 20 70 6f 73 69 74 69 6f 6e 20  hrough position 
17300 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  list */..    /* 
17310 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62  If the segment b
17320 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 73 20  eing written is 
17330 74 68 65 20 6f 6c 64 65 73 74 20 69 6e 20 74 68  the oldest in th
17340 65 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 61  e entire index a
17350 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f  nd.    ** the po
17360 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73 20 65  sition list is e
17370 6d 70 74 79 20 28 69 2e 65 2e 20 74 68 65 20 65  mpty (i.e. the e
17380 6e 74 72 79 20 69 73 20 61 20 64 65 6c 65 74 65  ntry is a delete
17390 20 6d 61 72 6b 65 72 29 2c 20 6e 6f 0a 20 20 20   marker), no.   
173a0 20 2a 2a 20 65 6e 74 72 79 20 6e 65 65 64 20 62   ** entry need b
173b0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
173c0 20 6f 75 74 70 75 74 2e 20 20 2a 2f 0a 20 20 20   output.  */.   
173d0 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 49 6e   fts5ChunkIterIn
173e0 69 74 28 70 2c 20 70 53 65 67 2c 20 26 73 50 6f  it(p, pSeg, &sPo
173f0 73 29 3b 0a 20 20 20 20 69 66 28 20 62 4f 6c 64  s);.    if( bOld
17400 65 73 74 3d 3d 30 20 7c 7c 20 73 50 6f 73 2e 6e  est==0 || sPos.n
17410 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Rem>0 ){.      i
17420 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20  nt nTerm;.      
17430 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
17440 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  = fts5MultiIterT
17450 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72  erm(pIter, &nTer
17460 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 54  m);.      if( nT
17470 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d  erm!=term.n || m
17480 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72  emcmp(pTerm, ter
17490 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20  m.p, nTerm) ){. 
174a0 20 20 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d         if( pnRem
174b0 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66   && writer.nLeaf
174c0 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a  Written>nRem ){.
174d0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 43 68            fts5Ch
174e0 75 6e 6b 49 74 65 72 52 65 6c 65 61 73 65 28 26  unkIterRelease(&
174f0 73 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20  sPos);.         
17500 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
17510 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  }..        /* Th
17520 69 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d  is is a new term
17530 2e 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20  . Append a term 
17540 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  to the output se
17550 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  gment. */.      
17560 20 20 69 66 28 20 62 52 65 71 75 69 72 65 44 6f    if( bRequireDo
17570 63 6c 69 73 74 54 65 72 6d 20 29 7b 0a 20 20 20  clistTerm ){.   
17580 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
17590 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65 28 70  AppendZerobyte(p
175a0 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20  , &writer);.    
175b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 74      }.        ft
175c0 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
175d0 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54  m(p, &writer, nT
175e0 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
175f0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
17600 65 74 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d  et(&p->rc, &term
17610 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
17620 0a 20 20 20 20 20 20 20 20 62 52 65 71 75 69 72  .        bRequir
17630 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 3d 20 31  eDoclistTerm = 1
17640 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17650 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72   /* Append the r
17660 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70  owid to the outp
17670 75 74 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35  ut */.      fts5
17680 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64  WriteAppendRowid
17690 28 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73  (p, &writer, fts
176a0 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
176b0 70 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20  pIter));..      
176c0 2f 2a 20 43 6f 70 79 20 74 68 65 20 70 6f 73 69  /* Copy the posi
176d0 74 69 6f 6e 20 6c 69 73 74 20 66 72 6f 6d 20 69  tion list from i
176e0 6e 70 75 74 20 74 6f 20 6f 75 74 70 75 74 20 2a  nput to output *
176f0 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  /.      fts5Writ
17700 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 49 6e  eAppendPoslistIn
17710 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 73 50  t(p, &writer, sP
17720 6f 73 2e 6e 52 65 6d 29 3b 0a 20 20 20 20 20 20  os.nRem);.      
17730 66 6f 72 28 2f 2a 20 6e 6f 6f 70 20 2a 2f 3b 20  for(/* noop */; 
17740 21 66 74 73 35 43 68 75 6e 6b 49 74 65 72 45 6f  !fts5ChunkIterEo
17750 66 28 70 2c 20 26 73 50 6f 73 29 3b 20 66 74 73  f(p, &sPos); fts
17760 35 43 68 75 6e 6b 49 74 65 72 4e 65 78 74 28 70  5ChunkIterNext(p
17770 2c 20 26 73 50 6f 73 29 29 7b 0a 20 20 20 20 20  , &sPos)){.     
17780 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65     fts5WriteAppe
17790 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 70 2c  ndPoslistData(p,
177a0 20 26 77 72 69 74 65 72 2c 20 73 50 6f 73 2e 70   &writer, sPos.p
177b0 2c 20 73 50 6f 73 2e 6e 29 3b 0a 20 20 20 20 20  , sPos.n);.     
177c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74   }.    }..    ft
177d0 73 35 43 68 75 6e 6b 49 74 65 72 52 65 6c 65 61  s5ChunkIterRelea
177e0 73 65 28 26 73 50 6f 73 29 3b 0a 20 20 7d 0a 0a  se(&sPos);.  }..
177f0 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c    /* Flush the l
17800 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f  ast leaf page to
17810 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f   disk. Set the o
17820 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d  utput segment b-
17830 74 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a  tree height.  **
17840 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70   and last leaf p
17850 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68  age number at th
17860 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f  e same time.  */
17870 0a 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69  .  fts5WriteFini
17880 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26  sh(p, &writer, &
17890 70 53 65 67 2d 3e 6e 48 65 69 67 68 74 2c 20 26  pSeg->nHeight, &
178a0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b  pSeg->pgnoLast);
178b0 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74  ..  if( fts5Mult
178c0 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
178d0 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  r) ){.    int i;
178e0 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
178f0 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65  the redundant se
17900 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  gments from the 
17910 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
17920 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
17930 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Input; i++){.   
17940 20 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76     fts5DataRemov
17950 65 53 65 67 6d 65 6e 74 28 70 2c 20 69 49 64 78  eSegment(p, iIdx
17960 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e  , pLvl->aSeg[i].
17970 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iSegid);.    }..
17980 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
17990 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d  e redundant segm
179a0 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  ents from the in
179b0 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  put level */.   
179c0 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21   if( pLvl->nSeg!
179d0 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20  =nInput ){.     
179e0 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c   int nMove = (pL
179f0 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75  vl->nSeg - nInpu
17a00 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  t) * sizeof(Fts5
17a10 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
17a20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  );.      memmove
17a30 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c  (pLvl->aSeg, &pL
17a40 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d  vl->aSeg[nInput]
17a50 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a  , nMove);.    }.
17a60 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d      pLvl->nSeg -
17a70 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c  = nInput;.    pL
17a80 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a  vl->nMerge = 0;.
17a90 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67      if( pSeg->pg
17aa0 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20  noLast==0 ){.   
17ab0 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
17ac0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  --;.    }.  }els
17ad0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
17ae0 53 65 67 2d 3e 6e 48 65 69 67 68 74 3e 30 20 26  Seg->nHeight>0 &
17af0 26 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  & pSeg->pgnoLast
17b00 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72  >0 );.    fts5Tr
17b10 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49  imSegments(p, pI
17b20 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  ter);.    pLvl->
17b30 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b  nMerge = nInput;
17b40 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74  .  }..  fts5Mult
17b50 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 49 74  iIterFree(p, pIt
17b60 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  er);.  fts5Buffe
17b70 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
17b80 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52  if( pnRem ) *pnR
17b90 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65  em -= writer.nLe
17ba0 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a  afWritten;.}../*
17bb0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e  .** A total of n
17bc0 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20  Leaf leaf pages 
17bd0 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74  of data has just
17be0 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f   been flushed to
17bf0 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65   a level-0.** se
17c00 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20  gments in index 
17c10 69 49 64 78 20 77 69 74 68 20 73 74 72 75 63 74  iIdx with struct
17c20 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 69  ure pStruct. Thi
17c30 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64 61 74  s function updat
17c40 65 73 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 2d  es the.** write-
17c50 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e  counter accordin
17c60 67 6c 79 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  gly and, if nece
17c70 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d 73 20  ssary, performs 
17c80 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
17c90 65 0a 2a 2a 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a  e.** work..**.**
17ca0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
17cb0 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
17cc0 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
17cd0 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
17ce0 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
17cf0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
17d00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
17d10 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
17d20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 57 6f  void fts5IndexWo
17d30 72 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  rk(.  Fts5Index 
17d40 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
17d50 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
17d60 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
17d70 20 20 69 6e 74 20 69 49 64 78 2c 20 20 20 20 20    int iIdx,     
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 6f    /* Index to wo
17da0 72 6b 20 6f 6e 20 2a 2f 0a 20 20 46 74 73 35 53  rk on */.  Fts5S
17db0 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
17dc0 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
17dd0 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
17de0 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
17df0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20   */.  int nLeaf 
17e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17e20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65 73  of output leaves
17e30 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f   just written */
17e40 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
17e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
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 20 20 69 36 34 20 6e 57  ruct;.    i64 nW
17e90 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
17ea0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
17eb0 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74  al value of writ
17ec0 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  e-counter */.   
17ed0 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20   int nWork;     
17ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17ef0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b  * Number of work
17f00 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f  -quanta to perfo
17f10 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  rm */.    int nR
17f20 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
17f30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17f40 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
17f50 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
17f60 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
17f70 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65  the write-counte
17f80 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73  r. While doing s
17f90 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f  o, set nWork. */
17fa0 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53  .    nWrite = pS
17fb0 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75  truct->nWriteCou
17fc0 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20  nter;.    nWork 
17fd0 3d 20 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65  = ((nWrite + nLe
17fe0 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  af) / p->nWorkUn
17ff0 69 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20  it) - (nWrite / 
18000 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 3b 0a 20  p->nWorkUnit);. 
18010 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69     pStruct->nWri
18020 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65  teCounter += nLe
18030 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 70  af;.    nRem = p
18040 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57  ->nWorkUnit * nW
18050 6f 72 6b 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e  ork * pStruct->n
18060 4c 65 76 65 6c 3b 0a 0a 20 20 20 20 77 68 69 6c  Level;..    whil
18070 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20  e( nRem>0 ){.   
18080 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20     int iLvl;    
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
180a0 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72  * To iterate thr
180b0 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
180c0 20 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76       int iBestLv
180d0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
180e0 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69   /* Level offeri
180f0 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75  ng the most inpu
18100 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
18110 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20      int nBest = 
18120 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
18130 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
18140 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62  ut segments on b
18150 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20  est level */..  
18160 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74      /* Set iBest
18170 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c  Lvl to the level
18180 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73   to read input s
18190 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f  egments from. */
181a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
181b0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30  Struct->nLevel>0
181c0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c   );.      for(iL
181d0 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
181e0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
181f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73  ++){.        Fts
18200 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
18210 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
18220 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
18230 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
18240 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
18250 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
18260 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a  nMerge>nBest ){.
18270 20 20 20 20 20 20 20 20 20 20 20 20 69 42 65 73              iBes
18280 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
18290 20 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d           nBest =
182a0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20   pLvl->nMerge;. 
182b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
182c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
182d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
182e0 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65  ( pLvl->nSeg>nBe
182f0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
18300 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nBest = pLvl->nS
18310 65 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 42  eg;.          iB
18320 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20  estLvl = iLvl;. 
18330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18340 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 42  ..      /* If nB
18350 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20  est is still 0, 
18360 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d  then the index m
18370 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f  ust be empty. */
18380 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
18390 45 42 55 47 0a 20 20 20 20 20 20 66 6f 72 28 69  EBUG.      for(i
183a0 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20  Lvl=0; nBest==0 
183b0 26 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  && iLvl<pStruct-
183c0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
183d0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
183e0 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ( pStruct->aLeve
183f0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20  l[iLvl].nSeg==0 
18400 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
18410 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 42 65  f..      if( nBe
18420 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  st<p->pConfig->n
18430 41 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20  Automerge .     
18440 20 20 20 20 20 26 26 20 70 53 74 72 75 63 74 2d       && pStruct-
18450 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c  >aLevel[iBestLvl
18460 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20  ].nMerge==0 .   
18470 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
18480 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
18490 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65       fts5IndexMe
184a0 72 67 65 4c 65 76 65 6c 28 70 2c 20 69 49 64 78  rgeLevel(p, iIdx
184b0 2c 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73  , &pStruct, iBes
184c0 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  tLvl, &nRem);.  
184d0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
184e0 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73  ePromote(p, iBes
184f0 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29  tLvl+1, pStruct)
18500 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18510 6e 52 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63  nRem==0 || p->rc
18520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
18530 20 20 20 20 20 2a 70 70 53 74 72 75 63 74 20 3d       *ppStruct =
18540 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a   pStruct;.    }.
18550 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
18560 69 64 20 66 74 73 35 49 6e 64 65 78 43 72 69 73  id fts5IndexCris
18570 69 73 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49  isMerge(.  Fts5I
18580 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
18590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
185a0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
185b0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
185e0 74 6f 20 77 6f 72 6b 20 6f 6e 20 2a 2f 0a 20 20  to work on */.  
185f0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
18600 70 70 53 74 72 75 63 74 20 20 20 20 20 20 20 20  ppStruct        
18610 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65  /* IN/OUT: Curre
18620 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  nt structure of 
18630 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 46 74  index */.){.  Ft
18640 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
18650 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
18660 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30  ;.  int iLvl = 0
18670 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63  ;.  while( p->rc
18680 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
18690 20 20 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75     && iLvl<pStru
186a0 63 74 2d 3e 6e 4c 65 76 65 6c 0a 20 20 20 20 20  ct->nLevel.     
186b0 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
186c0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d  vel[iLvl].nSeg>=
186d0 70 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 20  p->nCrisisMerge 
186e0 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  .  ){.    fts5In
186f0 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
18700 20 69 49 64 78 2c 20 26 70 53 74 72 75 63 74 2c   iIdx, &pStruct,
18710 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20 66   iLvl, 0);.    f
18720 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
18730 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70  ote(p, iLvl+1, p
18740 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c 76  Struct);.    iLv
18750 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74  l++;.  }.  *ppSt
18760 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
18770 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
18780 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 46  t Fts5FlushCtx F
18790 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72  ts5FlushCtx;.str
187a0 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
187b0 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a   {.  Fts5Index *
187c0 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57  pIdx;.  Fts5SegW
187d0 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d  riter writer; .}
187e0 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  ;..static int ft
187f0 73 35 46 6c 75 73 68 4e 65 77 54 65 72 6d 28 76  s5FlushNewTerm(v
18800 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74  oid *pCtx, const
18810 20 63 68 61 72 20 2a 7a 54 65 72 6d 2c 20 69 6e   char *zTerm, in
18820 74 20 6e 54 65 72 6d 29 7b 0a 20 20 46 74 73 35  t nTerm){.  Fts5
18830 46 6c 75 73 68 43 74 78 20 2a 70 20 3d 20 28 46  FlushCtx *p = (F
18840 74 73 35 46 6c 75 73 68 43 74 78 2a 29 70 43 74  ts5FlushCtx*)pCt
18850 78 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  x;.  int rc = SQ
18860 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 74 73 35 57  LITE_OK;.  fts5W
18870 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70  riteAppendTerm(p
18880 2d 3e 70 49 64 78 2c 20 26 70 2d 3e 77 72 69 74  ->pIdx, &p->writ
18890 65 72 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73  er, nTerm, (cons
188a0 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20  t u8*)zTerm);.  
188b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
188c0 61 74 69 63 20 69 6e 74 20 66 74 73 35 46 6c 75  atic int fts5Flu
188d0 73 68 54 65 72 6d 44 6f 6e 65 28 76 6f 69 64 20  shTermDone(void 
188e0 2a 70 43 74 78 29 7b 0a 20 20 46 74 73 35 46 6c  *pCtx){.  Fts5Fl
188f0 75 73 68 43 74 78 20 2a 70 20 3d 20 28 46 74 73  ushCtx *p = (Fts
18900 35 46 6c 75 73 68 43 74 78 2a 29 70 43 74 78 3b  5FlushCtx*)pCtx;
18910 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18920 54 45 5f 4f 4b 3b 0a 20 20 2f 2a 20 57 72 69 74  TE_OK;.  /* Writ
18930 65 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 65  e the doclist te
18940 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 66 74  rminator */.  ft
18950 73 35 57 72 69 74 65 41 70 70 65 6e 64 5a 65 72  s5WriteAppendZer
18960 6f 62 79 74 65 28 70 2d 3e 70 49 64 78 2c 20 26  obyte(p->pIdx, &
18970 70 2d 3e 77 72 69 74 65 72 29 3b 0a 20 20 72 65  p->writer);.  re
18980 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
18990 69 63 20 69 6e 74 20 66 74 73 35 46 6c 75 73 68  ic int fts5Flush
189a0 4e 65 77 45 6e 74 72 79 28 0a 20 20 76 6f 69 64  NewEntry(.  void
189b0 20 2a 70 43 74 78 2c 20 0a 20 20 69 36 34 20 69   *pCtx, .  i64 i
189c0 52 6f 77 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20  Rowid, .  const 
189d0 75 38 20 2a 61 50 6f 73 6c 69 73 74 2c 20 0a 20  u8 *aPoslist, . 
189e0 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 0a 29 7b   int nPoslist.){
189f0 0a 20 20 46 74 73 35 46 6c 75 73 68 43 74 78 20  .  Fts5FlushCtx 
18a00 2a 70 20 3d 20 28 46 74 73 35 46 6c 75 73 68 43  *p = (Fts5FlushC
18a10 74 78 2a 29 70 43 74 78 3b 0a 20 20 46 74 73 35  tx*)pCtx;.  Fts5
18a20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 2d  Index *pIdx = p-
18a30 3e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 41 70 70  >pIdx;..  /* App
18a40 65 6e 64 20 74 68 65 20 72 6f 77 69 64 20 69 74  end the rowid it
18a50 73 65 6c 66 20 2a 2f 0a 20 20 66 74 73 35 57 72  self */.  fts5Wr
18a60 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70  iteAppendRowid(p
18a70 49 64 78 2c 20 26 70 2d 3e 77 72 69 74 65 72 2c  Idx, &p->writer,
18a80 20 69 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20   iRowid);..  /* 
18a90 41 70 70 65 6e 64 20 74 68 65 20 73 69 7a 65 20  Append the size 
18aa0 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
18ab0 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  list in bytes */
18ac0 0a 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65  .  fts5WriteAppe
18ad0 6e 64 50 6f 73 6c 69 73 74 49 6e 74 28 70 49 64  ndPoslistInt(pId
18ae0 78 2c 20 26 70 2d 3e 77 72 69 74 65 72 2c 20 6e  x, &p->writer, n
18af0 50 6f 73 6c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20  Poslist);..  /* 
18b00 41 6e 64 20 74 68 65 20 70 6f 73 6c 69 73 74 20  And the poslist 
18b10 64 61 74 61 20 2a 2f 0a 20 20 66 74 73 35 57 72  data */.  fts5Wr
18b20 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
18b30 44 61 74 61 28 70 49 64 78 2c 20 26 70 2d 3e 77  Data(pIdx, &p->w
18b40 72 69 74 65 72 2c 20 61 50 6f 73 6c 69 73 74 2c  riter, aPoslist,
18b50 20 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65   nPoslist);.  re
18b60 74 75 72 6e 20 70 49 64 78 2d 3e 72 63 3b 0a 7d  turn pIdx->rc;.}
18b70 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68  ../*.** Flush th
18b80 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e  e contents of in
18b90 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
18ba0 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65  le iHash to a ne
18bb0 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65  w level-0 .** se
18bc0 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41  gment on disk. A
18bd0 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63  lso update the c
18be0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72  orresponding str
18bf0 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a  ucture record..*
18c00 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
18c10 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
18c20 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
18c30 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
18c40 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
18c50 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
18c60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
18c70 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
18c80 74 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75  tic void fts5Flu
18c90 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e  shOneHash(Fts5In
18ca0 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 48 61 73  dex *p, int iHas
18cb0 68 2c 20 69 6e 74 20 2a 70 6e 4c 65 61 66 29 7b  h, int *pnLeaf){
18cc0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
18cd0 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74   *pStruct;.  int
18ce0 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70   iSegid;.  int p
18cf0 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20  gnoLast = 0;    
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d10 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
18d20 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
18d30 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e   */..  /* Obtain
18d40 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18d50 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
18d60 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65  ure and allocate
18d70 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69   a new segment-i
18d80 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e  d.  ** for the n
18d90 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65  ew level-0 segme
18da0 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63  nt.  */.  pStruc
18db0 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
18dc0 65 52 65 61 64 28 70 2c 20 69 48 61 73 68 29 3b  eRead(p, iHash);
18dd0 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74 73 35  .  iSegid = fts5
18de0 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c  AllocateSegid(p,
18df0 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69 66   pStruct);..  if
18e00 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20  ( iSegid ){.    
18e10 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
18e20 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
18e30 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74   New segment wit
18e40 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20  hin pStruct */. 
18e50 20 20 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20     int nHeight; 
18e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e70 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 6e 65   /* Height of ne
18e80 77 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  w segment b-tree
18e90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
18ea0 20 20 20 20 46 74 73 35 46 6c 75 73 68 43 74 78      Fts5FlushCtx
18eb0 20 63 74 78 3b 0a 0a 20 20 20 20 66 74 73 35 57   ctx;..    fts5W
18ec0 72 69 74 65 49 6e 69 74 28 70 2c 20 26 63 74 78  riteInit(p, &ctx
18ed0 2e 77 72 69 74 65 72 2c 20 69 48 61 73 68 2c 20  .writer, iHash, 
18ee0 69 53 65 67 69 64 29 3b 0a 20 20 20 20 63 74 78  iSegid);.    ctx
18ef0 2e 70 49 64 78 20 3d 20 70 3b 0a 0a 20 20 20 20  .pIdx = p;..    
18f00 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
18f10 48 61 73 68 49 74 65 72 61 74 65 28 20 70 2d 3e  HashIterate( p->
18f20 61 70 48 61 73 68 5b 69 48 61 73 68 5d 2c 20 28  apHash[iHash], (
18f30 76 6f 69 64 2a 29 26 63 74 78 2c 20 0a 20 20 20  void*)&ctx, .   
18f40 20 20 20 20 20 66 74 73 35 46 6c 75 73 68 4e 65       fts5FlushNe
18f50 77 54 65 72 6d 2c 20 66 74 73 35 46 6c 75 73 68  wTerm, fts5Flush
18f60 4e 65 77 45 6e 74 72 79 2c 20 66 74 73 35 46 6c  NewEntry, fts5Fl
18f70 75 73 68 54 65 72 6d 44 6f 6e 65 0a 20 20 20 20  ushTermDone.    
18f80 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
18f90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  ==SQLITE_OK ) p-
18fa0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 66 74  >rc = rc;.    ft
18fb0 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c  s5WriteFinish(p,
18fc0 20 26 63 74 78 2e 77 72 69 74 65 72 2c 20 26 6e   &ctx.writer, &n
18fd0 48 65 69 67 68 74 2c 20 26 70 67 6e 6f 4c 61 73  Height, &pgnoLas
18fe0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  t);..    /* Upda
18ff0 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75 63  te the Fts5Struc
19000 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69 74  ture. It is writ
19010 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
19020 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 0a  database by the.
19030 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63      ** fts5Struc
19040 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63 61  tureRelease() ca
19050 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ll below.  */.  
19060 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e    if( pStruct->n
19070 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Level==0 ){.    
19080 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41    fts5StructureA
19090 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ddLevel(&p->rc, 
190a0 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d  &pStruct);.    }
190b0 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
190c0 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
190d0 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30  ->rc, pStruct, 0
190e0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
190f0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19100 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20  K ){.      pSeg 
19110 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
19120 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72  el[0].aSeg[ pStr
19130 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e  uct->aLevel[0].n
19140 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70  Seg++ ];.      p
19150 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
19160 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67  egid;.      pSeg
19170 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48 65 69  ->nHeight = nHei
19180 67 68 74 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  ght;.      pSeg-
19190 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a  >pgnoFirst = 1;.
191a0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
191b0 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b  Last = pgnoLast;
191c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
191d0 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  ( p->pConfig->nA
191e0 75 74 6f 6d 65 72 67 65 3e 30 20 29 20 66 74 73  utomerge>0 ) fts
191f0 35 49 6e 64 65 78 57 6f 72 6b 28 70 2c 20 69 48  5IndexWork(p, iH
19200 61 73 68 2c 20 26 70 53 74 72 75 63 74 2c 20 70  ash, &pStruct, p
19210 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35  gnoLast);.  fts5
19220 49 6e 64 65 78 43 72 69 73 69 73 4d 65 72 67 65  IndexCrisisMerge
19230 28 70 2c 20 69 48 61 73 68 2c 20 26 70 53 74 72  (p, iHash, &pStr
19240 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
19250 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 69 48  ctureWrite(p, iH
19260 61 73 68 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  ash, pStruct);. 
19270 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
19280 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
19290 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
192a0 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  ny data stored i
192b0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
192c0 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74  hash tables to t
192d0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
192e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
192f0 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35 49  IndexFlush(Fts5I
19300 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
19310 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
19320 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
19330 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19350 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
19360 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
19370 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  es */.  int nLea
19380 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
19390 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
193a0 72 20 6f 66 20 6c 65 61 76 65 73 20 77 72 69 74  r of leaves writ
193b0 74 65 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ten */..  /* If 
193c0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
193d0 65 61 64 79 20 6f 63 63 75 72 65 64 20 74 68 69  eady occured thi
193e0 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
193f0 70 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  p. */.  if( p->r
19400 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
19410 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
19420 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
19430 73 73 65 72 74 28 20 70 2d 3e 61 70 48 61 73 68  ssert( p->apHash
19440 20 29 3b 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20   );..  /* Flush 
19450 74 68 65 20 74 65 72 6d 73 20 61 6e 64 20 65 61  the terms and ea
19460 63 68 20 70 72 65 66 69 78 20 69 6e 64 65 78 20  ch prefix index 
19470 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 66 6f 72  to disk */.  for
19480 28 69 3d 30 3b 20 69 3c 3d 70 43 6f 6e 66 69 67  (i=0; i<=pConfig
19490 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b  ->nPrefix; i++){
194a0 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e  .    fts5FlushOn
194b0 65 48 61 73 68 28 70 2c 20 69 2c 20 26 6e 4c 65  eHash(p, i, &nLe
194c0 61 66 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 50  af);.  }.  p->nP
194d0 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a  endingData = 0;.
194e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
194f0 61 20 73 69 6d 70 6c 65 20 63 68 65 63 6b 73 75  a simple checksu
19500 6d 20 76 61 6c 75 65 20 62 61 73 65 64 20 6f 6e  m value based on
19510 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a   the arguments..
19520 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20 66 74  */.static u64 ft
19530 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
19540 6d 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  m(.  i64 iRowid,
19550 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20   .  int iCol, . 
19560 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20 63 6f   int iPos, .  co
19570 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c  nst char *pTerm,
19580 20 0a 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b   .  int nTerm.){
19590 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20  .  int i;.  u64 
195a0 72 65 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  ret = iRowid;.  
195b0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
195c0 2b 20 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d  + iCol;.  ret +=
195d0 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73   (ret<<3) + iPos
195e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
195f0 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20 2b  Term; i++) ret +
19600 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 70 54 65  = (ret<<3) + pTe
19610 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e 20  rm[i];.  return 
19620 72 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ret;.}..static v
19630 6f 69 64 20 66 74 73 35 42 74 72 65 65 49 74 65  oid fts5BtreeIte
19640 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
19650 65 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 49  ex *p, .  int iI
19660 64 78 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  dx,.  Fts5Struct
19670 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
19680 2c 20 0a 20 20 46 74 73 35 42 74 72 65 65 49 74  , .  Fts5BtreeIt
19690 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 69  er *pIter.){.  i
196a0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
196b0 69 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  i;.  nByte = siz
196c0 65 6f 66 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  eof(pIter->aLvl[
196d0 30 5d 29 20 2a 20 28 70 53 65 67 2d 3e 6e 48 65  0]) * (pSeg->nHe
196e0 69 67 68 74 2d 31 29 3b 0a 20 20 6d 65 6d 73 65  ight-1);.  memse
196f0 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
19700 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
19710 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20 70 53 65  Iter->nLvl = pSe
19720 67 2d 3e 6e 48 65 69 67 68 74 2d 31 3b 0a 20 20  g->nHeight-1;.  
19730 70 49 74 65 72 2d 3e 69 49 64 78 20 3d 20 69 49  pIter->iIdx = iI
19740 64 78 3b 0a 20 20 70 49 74 65 72 2d 3e 70 20 3d  dx;.  pIter->p =
19750 20 70 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65   p;.  pIter->pSe
19760 67 20 3d 20 70 53 65 67 3b 0a 20 20 69 66 28 20  g = pSeg;.  if( 
19770 6e 42 79 74 65 20 26 26 20 70 2d 3e 72 63 3d 3d  nByte && p->rc==
19780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19790 20 70 49 74 65 72 2d 3e 61 4c 76 6c 20 3d 20 28   pIter->aLvl = (
197a0 46 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76  Fts5BtreeIterLev
197b0 65 6c 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  el*)fts5IdxMallo
197c0 63 28 70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  c(p, nByte);.  }
197d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
197e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
197f0 69 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69  i<pIter->nLvl; i
19800 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  ++){.    i64 iRo
19810 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
19820 4e 54 5f 52 4f 57 49 44 28 69 49 64 78 2c 20 70  NT_ROWID(iIdx, p
19830 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 2b 31  Seg->iSegid, i+1
19840 2c 20 31 29 3b 0a 20 20 20 20 46 74 73 35 44 61  , 1);.    Fts5Da
19850 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  ta *pData;.    p
19860 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70 44  Iter->aLvl[i].pD
19870 61 74 61 20 3d 20 70 44 61 74 61 20 3d 20 66 74  ata = pData = ft
19880 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
19890 6f 77 69 64 29 3b 0a 20 20 20 20 69 66 28 20 70  owid);.    if( p
198a0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74  Data ){.      ft
198b0 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
198c0 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e  Data->p, pData->
198d0 6e 2c 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  n, &pIter->aLvl[
198e0 69 5d 2e 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  i].s);.    }.  }
198f0 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 6e  ..  if( pIter->n
19900 4c 76 6c 3d 3d 30 20 7c 7c 20 70 2d 3e 72 63 20  Lvl==0 || p->rc 
19910 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45  ){.    pIter->bE
19920 6f 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 74 65  of = 1;.    pIte
19930 72 2d 3e 69 4c 65 61 66 20 3d 20 70 53 65 67 2d  r->iLeaf = pSeg-
19940 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 7d 65 6c  >pgnoLast;.  }el
19950 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e  se{.    pIter->n
19960 45 6d 70 74 79 20 3d 20 70 49 74 65 72 2d 3e 61  Empty = pIter->a
19970 4c 76 6c 5b 30 5d 2e 73 2e 6e 45 6d 70 74 79 3b  Lvl[0].s.nEmpty;
19980 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
19990 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
199a0 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 20  0].s.iChild;.   
199b0 20 70 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d   pIter->bDlidx =
199c0 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
199d0 73 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a 7d 0a  s.bDlidx;.  }.}.
199e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
199f0 35 42 74 72 65 65 49 74 65 72 4e 65 78 74 28 46  5BtreeIterNext(F
19a00 74 73 35 42 74 72 65 65 49 74 65 72 20 2a 70 49  ts5BtreeIter *pI
19a10 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  ter){.  Fts5Inde
19a20 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 3b  x *p = pIter->p;
19a30 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
19a40 65 72 74 28 20 70 49 74 65 72 2d 3e 62 45 6f 66  ert( pIter->bEof
19a50 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 61 4c  ==0 && pIter->aL
19a60 76 6c 5b 30 5d 2e 73 2e 61 44 61 74 61 20 29 3b  vl[0].s.aData );
19a70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
19a80 74 65 72 2d 3e 6e 4c 76 6c 20 26 26 20 70 2d 3e  ter->nLvl && p->
19a90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
19aa0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 42 74 72  ++){.    Fts5Btr
19ab0 65 65 49 74 65 72 4c 65 76 65 6c 20 2a 70 4c 76  eeIterLevel *pLv
19ac0 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
19ad0 5b 69 5d 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64  [i];.    fts5Nod
19ae0 65 49 74 65 72 4e 65 78 74 28 26 70 2d 3e 72 63  eIterNext(&p->rc
19af0 2c 20 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20  , &pLvl->s);.   
19b00 20 69 66 28 20 70 4c 76 6c 2d 3e 73 2e 61 44 61   if( pLvl->s.aDa
19b10 74 61 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ta ){.      fts5
19b20 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
19b30 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
19b40 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 6e 2c 20  pLvl->s.term.n, 
19b50 70 4c 76 6c 2d 3e 73 2e 74 65 72 6d 2e 70 29 3b  pLvl->s.term.p);
19b60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19b70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
19b80 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
19b90 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20  &pLvl->s);.     
19ba0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
19bb0 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
19bc0 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
19bd0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
19be0 20 20 69 66 28 20 69 3d 3d 70 49 74 65 72 2d 3e    if( i==pIter->
19bf0 6e 4c 76 6c 20 7c 7c 20 70 2d 3e 72 63 20 29 7b  nLvl || p->rc ){
19c00 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66  .    pIter->bEof
19c10 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
19c20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
19c30 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
19c40 67 69 64 3b 0a 20 20 20 20 66 6f 72 28 69 2d 2d  gid;.    for(i--
19c50 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
19c60 20 20 20 20 46 74 73 35 42 74 72 65 65 49 74 65      Fts5BtreeIte
19c70 72 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  rLevel *pLvl = &
19c80 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  pIter->aLvl[i];.
19c90 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
19ca0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
19cb0 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 49 64  ROWID(pIter->iId
19cc0 78 2c 69 53 65 67 69 64 2c 69 2b 31 2c 70 4c 76  x,iSegid,i+1,pLv
19cd0 6c 5b 31 5d 2e 73 2e 69 43 68 69 6c 64 29 3b 0a  l[1].s.iChild);.
19ce0 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
19cf0 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
19d00 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  (p, iRowid);.   
19d10 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61     if( pLvl->pDa
19d20 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  ta ){.        ft
19d30 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74 28 70  s5NodeIterInit(p
19d40 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 2c 20 70  Lvl->pData->p, p
19d50 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 6e 2c 20 26  Lvl->pData->n, &
19d60 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 20 20  pLvl->s);.      
19d70 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
19d80 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 70  Iter->nEmpty = p
19d90 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 73 2e  Iter->aLvl[0].s.
19da0 6e 45 6d 70 74 79 3b 0a 20 20 70 49 74 65 72 2d  nEmpty;.  pIter-
19db0 3e 62 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  >bDlidx = pIter-
19dc0 3e 61 4c 76 6c 5b 30 5d 2e 73 2e 62 44 6c 69 64  >aLvl[0].s.bDlid
19dd0 78 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  x;.  pIter->iLea
19de0 66 20 3d 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  f = pIter->aLvl[
19df0 30 5d 2e 73 2e 69 43 68 69 6c 64 3b 0a 20 20 61  0].s.iChild;.  a
19e00 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
19e10 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
19e20 2d 3e 62 45 6f 66 20 29 3b 0a 7d 0a 0a 73 74 61  ->bEof );.}..sta
19e30 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 74 72  tic void fts5Btr
19e40 65 65 49 74 65 72 46 72 65 65 28 46 74 73 35 42  eeIterFree(Fts5B
19e50 74 72 65 65 49 74 65 72 20 2a 70 49 74 65 72 29  treeIter *pIter)
19e60 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
19e70 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
19e80 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Lvl; i++){.    F
19e90 74 73 35 42 74 72 65 65 49 74 65 72 4c 65 76 65  ts5BtreeIterLeve
19ea0 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
19eb0 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 66  ->aLvl[i];.    f
19ec0 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28  ts5NodeIterFree(
19ed0 26 70 4c 76 6c 2d 3e 73 29 3b 0a 20 20 20 20 69  &pLvl->s);.    i
19ee0 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29  f( pLvl->pData )
19ef0 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
19f00 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44  Release(pLvl->pD
19f10 61 74 61 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c  ata);.      pLvl
19f20 2d 3e 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->pData = 0;.   
19f30 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
19f40 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 4c 76  _free(pIter->aLv
19f50 6c 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  l);.  fts5Buffer
19f60 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74 65 72  Free(&pIter->ter
19f70 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  m);.}../*.** Thi
19f80 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75  s function is pu
19f90 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
19fa0 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
19fb0 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
19fc0 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
19fd0 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
19fe0 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
19ff0 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
1a000 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  .**.** Instead, 
1a010 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74 68  it tests that th
1a020 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67  e same set of pg
1a030 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61  no/rowid combina
1a040 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69  tions are .** vi
1a050 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73 73  sited regardless
1a060 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
1a070 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64  doclist-index id
1a080 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
1a090 6d 65 74 65 72 73 0a 2a 2a 20 69 49 64 78 2f 69  meters.** iIdx/i
1a0a0 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73 20 69  Segid/iLeaf is i
1a0b0 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72 77 61  terated in forwa
1a0c0 72 64 73 20 6f 72 20 72 65 76 65 72 73 65 20 6f  rds or reverse o
1a0d0 72 64 65 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  rder..*/.#ifdef 
1a0e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
1a0f0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
1a100 64 78 49 74 65 72 54 65 73 74 52 65 76 65 72 73  dxIterTestRevers
1a110 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
1a120 70 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c 20  p, .  int iIdx, 
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a140 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
1a150 6f 20 6c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69  o load doclist-i
1a160 6e 64 65 78 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  ndex from */.  i
1a170 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20  nt iSegid,      
1a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a190 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20  * Segment id to 
1a1a0 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  load from */.  i
1a1b0 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20 20 20  nt iLeaf        
1a1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a1d0 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69  * Load doclist-i
1a1e0 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65  ndex for this le
1a1f0 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  af */.){.  Fts5D
1a200 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
1a210 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 6b 73 75   = 0;.  i64 cksu
1a220 6d 31 20 3d 20 31 33 3b 0a 20 20 69 36 34 20 63  m1 = 13;.  i64 c
1a230 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66  ksum2 = 13;..  f
1a240 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
1a250 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
1a260 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 2c 20   iSegid, iLeaf, 
1a270 26 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  &pDlidx);.      
1a280 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
1a290 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
1a2a0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
1a2b0 74 65 72 4e 65 78 74 28 70 44 6c 69 64 78 29 0a  terNext(pDlidx).
1a2c0 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
1a2d0 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67   pDlidx->iLeafPg
1a2e0 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  no>iLeaf );.    
1a2f0 63 6b 73 75 6d 31 20 3d 20 28 63 6b 73 75 6d 31  cksum1 = (cksum1
1a300 20 5e 20 28 20 28 69 36 34 29 28 70 44 6c 69 64   ^ ( (i64)(pDlid
1a310 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 20 3c 3c  x->iLeafPgno) <<
1a320 20 33 32 20 29 29 3b 0a 20 20 20 20 63 6b 73 75   32 ));.    cksu
1a330 6d 31 20 3d 20 28 63 6b 73 75 6d 31 20 5e 20 70  m1 = (cksum1 ^ p
1a340 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 29 3b 0a  Dlidx->iRowid);.
1a350 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49    }.  fts5DlidxI
1a360 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b  terFree(pDlidx);
1a370 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a  .  pDlidx = 0;..
1a380 20 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 49    for(fts5DlidxI
1a390 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 49  terInit(p, 1, iI
1a3a0 64 78 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61  dx, iSegid, iLea
1a3b0 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20 20 20  f, &pDlidx);.   
1a3c0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1a3d0 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d  Eof(p, pDlidx)==
1a3e0 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  0;.      fts5Dli
1a3f0 64 78 49 74 65 72 50 72 65 76 28 70 44 6c 69 64  dxIterPrev(pDlid
1a400 78 29 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  x).  ){.    asse
1a410 72 74 28 20 70 44 6c 69 64 78 2d 3e 69 4c 65 61  rt( pDlidx->iLea
1a420 66 50 67 6e 6f 3e 69 4c 65 61 66 20 29 3b 0a 20  fPgno>iLeaf );. 
1a430 20 20 20 63 6b 73 75 6d 32 20 3d 20 28 63 6b 73     cksum2 = (cks
1a440 75 6d 32 20 5e 20 28 20 28 69 36 34 29 28 70 44  um2 ^ ( (i64)(pD
1a450 6c 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  lidx->iLeafPgno)
1a460 20 3c 3c 20 33 32 20 29 29 3b 0a 20 20 20 20 63   << 32 ));.    c
1a470 6b 73 75 6d 32 20 3d 20 28 63 6b 73 75 6d 32 20  ksum2 = (cksum2 
1a480 5e 20 70 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64  ^ pDlidx->iRowid
1a490 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69  );.  }.  fts5Dli
1a4a0 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
1a4b0 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30  x);.  pDlidx = 0
1a4c0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
1a4d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
1a4e0 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d  um1!=cksum2 ) p-
1a4f0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1a500 50 54 3b 20 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  PT; .}.#else.# d
1a510 65 66 69 6e 65 20 66 74 73 35 44 6c 69 64 78 49  efine fts5DlidxI
1a520 74 65 72 54 65 73 74 52 65 76 65 72 73 65 28 77  terTestReverse(w
1a530 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  ,x,y,z).#endif..
1a540 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1a550 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
1a560 65 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74  eckSegment(.  Ft
1a570 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a590 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
1a5a0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49  ject */.  int iI
1a5b0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
1a5c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1a5d0 65 78 20 74 68 61 74 20 70 53 65 67 20 69 73 20  ex that pSeg is 
1a5e0 61 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 46  a part of */.  F
1a5f0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1a600 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20 20 2f  ent *pSeg      /
1a610 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65  * Segment to che
1a620 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73  ck internal cons
1a630 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a 20 20  istency */.){.  
1a640 46 74 73 35 42 74 72 65 65 49 74 65 72 20 69 74  Fts5BtreeIter it
1a650 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1a660 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
1a670 74 65 20 74 68 72 6f 75 67 68 20 62 2d 74 72 65  te through b-tre
1a680 65 20 68 69 65 72 61 72 63 68 79 20 2a 2f 0a 0a  e hierarchy */..
1a690 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
1a6a0 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65 20  ough the b-tree 
1a6b0 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20  hierarchy.  */. 
1a6c0 20 66 6f 72 28 66 74 73 35 42 74 72 65 65 49 74   for(fts5BtreeIt
1a6d0 65 72 49 6e 69 74 28 70 2c 20 69 49 64 78 2c 20  erInit(p, iIdx, 
1a6e0 70 53 65 67 2c 20 26 69 74 65 72 29 3b 0a 20 20  pSeg, &iter);.  
1a6f0 20 20 20 20 69 74 65 72 2e 62 45 6f 66 3d 3d 30      iter.bEof==0
1a700 3b 0a 20 20 20 20 20 20 66 74 73 35 42 74 72 65  ;.      fts5Btre
1a710 65 49 74 65 72 4e 65 78 74 28 26 69 74 65 72 29  eIterNext(&iter)
1a720 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
1a730 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
1a740 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
1a750 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
1a760 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
1a770 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  pLeaf;          
1a780 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
1a790 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20  this leaf */.   
1a7a0 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
1a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a7c0 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
1a7d0 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a  t term on leaf *
1a7e0 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a800 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
1a810 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65  terate through e
1a820 6d 70 74 79 20 6c 65 61 76 65 73 20 2a 2f 0a 0a  mpty leaves */..
1a830 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
1a840 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
1a850 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1a860 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
1a870 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
1a880 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
1a890 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
1a8a0 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
1a8b0 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
1a8c0 20 20 20 69 66 28 20 69 74 65 72 2e 69 4c 65 61     if( iter.iLea
1a8d0 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  f<pSeg->pgnoFirs
1a8e0 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1a8f0 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45    iRow = FTS5_SE
1a900 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 78  GMENT_ROWID(iIdx
1a910 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  , pSeg->iSegid, 
1a920 30 2c 20 69 74 65 72 2e 69 4c 65 61 66 29 3b 0a  0, iter.iLeaf);.
1a930 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
1a940 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
1a950 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
1a960 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==0 ) break;..  
1a970 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1a980 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e  the leaf contain
1a990 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74  s at least one t
1a9a0 65 72 6d 2c 20 61 6e 64 20 74 68 61 74 20 69 74  erm, and that it
1a9b0 20 69 73 20 65 71 75 61 6c 0a 20 20 20 20 2a 2a   is equal.    **
1a9c0 20 74 6f 20 6f 72 20 6c 61 72 67 65 72 20 74 68   to or larger th
1a9d0 61 6e 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  an the split-key
1a9e0 20 69 6e 20 69 74 65 72 2e 74 65 72 6d 2e 20 20   in iter.term.  
1a9f0 2a 2f 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74  */.    iOff = ft
1aa00 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
1aa10 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  >p[2]);.    if( 
1aa20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
1aa30 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1aa40 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
1aa50 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  {.      int nTer
1aa60 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1aa70 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1aa80 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62  erm on leaf in b
1aa90 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ytes */.      in
1aaa0 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
1aab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1aac0 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20  parison of term 
1aad0 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f  and split-key */
1aae0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67  .      iOff += g
1aaf0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
1ab00 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
1ab10 6d 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  m);.      res = 
1ab20 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70  memcmp(&pLeaf->p
1ab30 5b 69 4f 66 66 5d 2c 20 69 74 65 72 2e 74 65 72  [iOff], iter.ter
1ab40 6d 2e 70 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20  m.p, MIN(nTerm, 
1ab50 69 74 65 72 2e 74 65 72 6d 2e 6e 29 29 3b 0a 20  iter.term.n));. 
1ab60 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1ab70 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20 2d 20  ) res = nTerm - 
1ab80 69 74 65 72 2e 74 65 72 6d 2e 6e 3b 0a 20 20 20  iter.term.n;.   
1ab90 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
1aba0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
1abb0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
1abc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1abd0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1abe0 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20  pLeaf);.    if( 
1abf0 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
1ac00 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b      /* Now check
1ac10 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
1ac20 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
1ac30 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
1ac40 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28  nt leaf.    ** (
1ac50 61 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29  a) exist and (b)
1ac60 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d   contain no term
1ac70 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  s. */.    for(i=
1ac80 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  1; p->rc==SQLITE
1ac90 5f 4f 4b 20 26 26 20 69 3c 3d 69 74 65 72 2e 6e  _OK && i<=iter.n
1aca0 45 6d 70 74 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  Empty; i++){.   
1acb0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
1acc0 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77 2b  ataRead(p, iRow+
1acd0 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  i);.      if( pL
1ace0 65 61 66 20 26 26 20 30 21 3d 66 74 73 35 47 65  eaf && 0!=fts5Ge
1acf0 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 32  tU16(&pLeaf->p[2
1ad00 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ]) ){.        p-
1ad10 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1ad20 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1ad30 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1ad40 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  e(pLeaf);.    }.
1ad50 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1ad60 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
1ad70 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20  dex, check that 
1ad80 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20  it looks right. 
1ad90 2a 2f 0a 20 20 20 20 69 66 28 20 69 74 65 72 2e  */.    if( iter.
1ada0 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  bDlidx ){.      
1adb0 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
1adc0 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46  Dlidx = 0;  /* F
1add0 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
1ade0 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64  ough doclist ind
1adf0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
1ae00 69 50 72 65 76 4c 65 61 66 20 3d 20 69 74 65 72  iPrevLeaf = iter
1ae10 2e 69 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e  .iLeaf;.      in
1ae20 74 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d  t iSegid = pSeg-
1ae30 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69  >iSegid;.      i
1ae40 6e 74 20 69 50 67 3b 0a 20 20 20 20 20 20 69 36  nt iPg;.      i6
1ae50 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66  4 iKey;..      f
1ae60 6f 72 28 66 74 73 35 44 6c 69 64 78 49 74 65 72  or(fts5DlidxIter
1ae70 49 6e 69 74 28 70 2c 20 30 2c 20 69 49 64 78 2c  Init(p, 0, iIdx,
1ae80 20 69 53 65 67 69 64 2c 20 69 74 65 72 2e 69 4c   iSegid, iter.iL
1ae90 65 61 66 2c 20 26 70 44 6c 69 64 78 29 3b 0a 20  eaf, &pDlidx);. 
1aea0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
1aeb0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
1aec0 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
1aed0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1aee0 4e 65 78 74 28 70 44 6c 69 64 78 29 0a 20 20 20  Next(pDlidx).   
1aef0 20 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f     ){..        /
1af00 2a 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69  * Check any rowi
1af10 64 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  d-less pages tha
1af20 74 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74  t occur before t
1af30 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
1af40 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
1af50 69 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b  iPg=iPrevLeaf+1;
1af60 20 69 50 67 3c 70 44 6c 69 64 78 2d 3e 69 4c 65   iPg<pDlidx->iLe
1af70 61 66 50 67 6e 6f 3b 20 69 50 67 2b 2b 29 7b 0a  afPgno; iPg++){.
1af80 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d            iKey =
1af90 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1afa0 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1afb0 2c 20 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20  , 0, iPg);.     
1afc0 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73       pLeaf = fts
1afd0 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65  5DataRead(p, iKe
1afe0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1aff0 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ( pLeaf ){.     
1b000 20 20 20 20 20 20 20 69 66 28 20 66 74 73 35 47         if( fts5G
1b010 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
1b020 30 5d 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d  0])!=0 ) p->rc =
1b030 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
1b040 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44             fts5D
1b050 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
1b060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1b070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b080 20 69 50 72 65 76 4c 65 61 66 20 3d 20 70 44 6c   iPrevLeaf = pDl
1b090 69 64 78 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  idx->iLeafPgno;.
1b0a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
1b0b0 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
1b0c0 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62  page indicated b
1b0d0 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  y the iterator r
1b0e0 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20  eally does.     
1b0f0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68     ** contain th
1b100 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65  e rowid suggeste
1b110 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a  d by the same. *
1b120 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  /.        iKey =
1b130 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1b140 57 49 44 28 69 49 64 78 2c 20 69 53 65 67 69 64  WID(iIdx, iSegid
1b150 2c 20 30 2c 20 70 44 6c 69 64 78 2d 3e 69 4c 65  , 0, pDlidx->iLe
1b160 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  afPgno);.       
1b170 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1b180 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1b190 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1b1a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1b1b0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
1b1c0 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f       int iRowidO
1b1d0 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
1b1e0 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20  &pLeaf->p[0]);. 
1b1f0 20 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69           getVari
1b200 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
1b210 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
1b220 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1b230 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 70     if( iRowid!=p
1b240 44 6c 69 64 78 2d 3e 69 52 6f 77 69 64 20 29 20  Dlidx->iRowid ) 
1b250 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
1b260 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
1b270 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1b280 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
1b290 7d 0a 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  }..      }..    
1b2a0 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
1b2b0 65 61 66 2b 31 3b 20 69 50 67 3c 3d 28 69 74 65  eaf+1; iPg<=(ite
1b2c0 72 2e 69 4c 65 61 66 20 2b 20 69 74 65 72 2e 6e  r.iLeaf + iter.n
1b2d0 45 6d 70 74 79 29 3b 20 69 50 67 2b 2b 29 7b 0a  Empty); iPg++){.
1b2e0 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
1b2f0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
1b300 44 28 69 49 64 78 2c 20 69 53 65 67 69 64 2c 20  D(iIdx, iSegid, 
1b310 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  0, iPg);.       
1b320 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74   pLeaf = fts5Dat
1b330 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a  aRead(p, iKey);.
1b340 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
1b350 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  f ){.          i
1b360 66 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70  f( fts5GetU16(&p
1b370 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29  Leaf->p[0])!=0 )
1b380 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1b390 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
1b3a0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1b3b0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
1b3c0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
1b3d0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
1b3e0 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  ree(pDlidx);.   
1b3f0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
1b400 54 65 73 74 52 65 76 65 72 73 65 28 70 2c 20 69  TestReverse(p, i
1b410 49 64 78 2c 20 69 53 65 67 69 64 2c 20 69 74 65  Idx, iSegid, ite
1b420 72 2e 69 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a  r.iLeaf);.    }.
1b430 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1b440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
1b450 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d  ter.iLeaf!=pSeg-
1b460 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
1b470 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
1b480 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20 20 66 74  RRUPT;.  }..  ft
1b490 73 35 42 74 72 65 65 49 74 65 72 46 72 65 65 28  s5BtreeIterFree(
1b4a0 26 69 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &iter);.}../*.**
1b4b0 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69   Iterator pMulti
1b4c0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1b4d0 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  s to a valid ent
1b4e0 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68  ry (not EOF). Th
1b4f0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1b500 70 70 65 6e 64 73 20 61 20 63 6f 70 79 20 6f 66  ppends a copy of
1b510 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
1b520 73 74 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20  st of the entry 
1b530 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75 72 72 65  pMulti .** curre
1b540 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
1b550 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  o buffer pBuf..*
1b560 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1b570 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
1b580 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
1b590 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69 73 20 61  n p->rc. It is a
1b5a0 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20 65 72 72  ssumed.** no err
1b5b0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
1b5c0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
1b5d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1b5e0 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
1b5f0 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
1b600 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
1b610 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
1b620 35 4d 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70  5MultiSegIter *p
1b630 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a  Multi,.  int bSz
1b640 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
1b650 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d  pBuf.){.  if( p-
1b660 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1b670 7b 0a 20 20 20 20 46 74 73 35 43 68 75 6e 6b 49  {.    Fts5ChunkI
1b680 74 65 72 20 69 74 65 72 3b 0a 20 20 20 20 46 74  ter iter;.    Ft
1b690 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
1b6a0 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b  = &pMulti->aSeg[
1b6b0 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b   pMulti->aFirst[
1b6c0 31 5d 20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  1] ];.    assert
1b6d0 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
1b6e0 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30  of(p, pMulti)==0
1b6f0 20 29 3b 0a 20 20 20 20 66 74 73 35 43 68 75 6e   );.    fts5Chun
1b700 6b 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  kIterInit(p, pSe
1b710 67 2c 20 26 69 74 65 72 29 3b 0a 20 20 20 20 69  g, &iter);.    i
1b720 66 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  f( fts5ChunkIter
1b730 45 6f 66 28 70 2c 20 26 69 74 65 72 29 3d 3d 30  Eof(p, &iter)==0
1b740 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 53   ){.      if( bS
1b750 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  z ){.        fts
1b760 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1b770 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70 42 75 66  int(&p->rc, pBuf
1b780 2c 20 69 74 65 72 2e 6e 52 65 6d 29 3b 0a 20 20  , iter.nRem);.  
1b790 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
1b7a0 65 28 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72  e( fts5ChunkIter
1b7b0 45 6f 66 28 70 2c 20 26 69 74 65 72 29 3d 3d 30  Eof(p, &iter)==0
1b7c0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
1b7d0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1b7e0 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69  (&p->rc, pBuf, i
1b7f0 74 65 72 2e 6e 2c 20 69 74 65 72 2e 70 29 3b 0a  ter.n, iter.p);.
1b800 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75 6e          fts5Chun
1b810 6b 49 74 65 72 4e 65 78 74 28 70 2c 20 26 69 74  kIterNext(p, &it
1b820 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
1b830 20 7d 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b   }.    fts5Chunk
1b840 49 74 65 72 52 65 6c 65 61 73 65 28 26 69 74 65  IterRelease(&ite
1b850 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
1b860 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
1b870 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35 44  stIterNext(Fts5D
1b880 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
1b890 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d  r){.  if( pIter-
1b8a0 3e 69 3c 70 49 74 65 72 2d 3e 6e 20 29 7b 0a 20  >i<pIter->n ){. 
1b8b0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 20     if( pIter->i 
1b8c0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65  ){.      i64 iDe
1b8d0 6c 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72  lta;.      pIter
1b8e0 2d 3e 69 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ->i += getVarint
1b8f0 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72  (&pIter->a[pIter
1b900 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  ->i], (u64*)&iDe
1b910 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28 20  lta);.      if( 
1b920 70 49 74 65 72 2d 3e 62 41 73 63 20 29 7b 0a 20  pIter->bAsc ){. 
1b930 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
1b940 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
1b950 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b960 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77       pIter->iRow
1b970 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id -= iDelta;.  
1b980 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1b990 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20  .      pIter->i 
1b9a0 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 49  += getVarint(&pI
1b9b0 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d  ter->a[pIter->i]
1b9c0 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
1b9d0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20  iRowid);.    }. 
1b9e0 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 67     pIter->i += g
1b9f0 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
1ba00 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20  r->a[pIter->i], 
1ba10 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 29  pIter->nPoslist)
1ba20 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f  ;.    pIter->aPo
1ba30 73 6c 69 73 74 20 3d 20 26 70 49 74 65 72 2d 3e  slist = &pIter->
1ba40 61 5b 70 49 74 65 72 2d 3e 69 5d 3b 0a 20 20 20  a[pIter->i];.   
1ba50 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 70 49 74   pIter->i += pIt
1ba60 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 20 20  er->nPoslist;.  
1ba70 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
1ba80 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a  ->aPoslist = 0;.
1ba90 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1baa0 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  id fts5DoclistIt
1bab0 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75  erInit(.  Fts5Bu
1bac0 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 69  ffer *pBuf, .  i
1bad0 6e 74 20 62 41 73 63 2c 20 0a 20 20 46 74 73 35  nt bAsc, .  Fts5
1bae0 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
1baf0 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  er.){.  memset(p
1bb00 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
1bb10 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
1bb20 72 2d 3e 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a  r->a = pBuf->p;.
1bb30 20 20 70 49 74 65 72 2d 3e 6e 20 3d 20 70 42 75    pIter->n = pBu
1bb40 66 2d 3e 6e 3b 0a 20 20 70 49 74 65 72 2d 3e 62  f->n;.  pIter->b
1bb50 41 73 63 20 3d 20 62 41 73 63 3b 0a 20 20 66 74  Asc = bAsc;.  ft
1bb60 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
1bb70 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  t(pIter);.}../*.
1bb80 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c  ** Append a docl
1bb90 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70 42  ist to buffer pB
1bba0 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  uf..*/.static vo
1bbb0 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70 65  id fts5MergeAppe
1bbc0 6e 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20 2a  ndDocid(.  int *
1bbd0 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
1bbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
1bbf0 2f 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65  /OUT: Error code
1bc00 20 2a 2f 0a 20 20 69 6e 74 20 62 41 73 63 2c 0a   */.  int bAsc,.
1bc10 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1bc20 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1bc30 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 77    /* Buffer to w
1bc40 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
1bc50 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c 20 20   *piLastRowid,  
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc70 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f 75 73  IN/OUT: Previous
1bc80 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 28   rowid written (
1bc90 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34  if any) */.  i64
1bca0 20 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20   iRowid         
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bcc0 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e 64 20  Rowid to append 
1bcd0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 42 75 66  */.){.  if( pBuf
1bce0 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  ->n==0 ){.    ft
1bcf0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1bd00 72 69 6e 74 28 70 52 63 2c 20 70 42 75 66 2c 20  rint(pRc, pBuf, 
1bd10 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65 6c 73 65  iRowid);.  }else
1bd20 20 69 66 28 20 62 41 73 63 3d 3d 30 20 29 7b 0a   if( bAsc==0 ){.
1bd30 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1bd40 70 65 6e 64 56 61 72 69 6e 74 28 70 52 63 2c 20  pendVarint(pRc, 
1bd50 70 42 75 66 2c 20 2a 70 69 4c 61 73 74 52 6f 77  pBuf, *piLastRow
1bd60 69 64 20 2d 20 69 52 6f 77 69 64 29 3b 0a 20 20  id - iRowid);.  
1bd70 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42  }else{.    fts5B
1bd80 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1bd90 74 28 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f  t(pRc, pBuf, iRo
1bda0 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77  wid - *piLastRow
1bdb0 69 64 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61  id);.  }.  *piLa
1bdc0 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  stRowid = iRowid
1bdd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  ;.}../*.** Buffe
1bde0 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e  rs p1 and p2 con
1bdf0 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54  tain doclists. T
1be00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72  his function mer
1be10 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ges the content.
1be20 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f  ** of the two do
1be30 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20  clists together 
1be40 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20  and sets buffer 
1be50 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  p1 to the result
1be60 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
1be70 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1be80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1be90 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
1bea0 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20   left in p->rc. 
1beb0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a  If an error has.
1bec0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
1bed0 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
1bee0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
1bef0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1bf00 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
1bf10 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ts(.  Fts5Index 
1bf20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1bf30 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1bf40 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1bf50 20 20 69 6e 74 20 62 41 73 63 2c 0a 20 20 46 74    int bAsc,.  Ft
1bf60 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20  s5Buffer *p1,   
1bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bf80 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d   First list to m
1bf90 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  erge */.  Fts5Bu
1bfa0 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20  ffer *p2        
1bfb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
1bfc0 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  ond list to merg
1bfd0 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32  e */.){.  if( p2
1bfe0 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ->n ){.    i64 i
1bff0 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
1c000 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
1c010 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44  er i1;.    Fts5D
1c020 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20  oclistIter i2;. 
1c030 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75     Fts5Buffer ou
1c040 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  t;.    Fts5Buffe
1c050 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65  r tmp;.    memse
1c060 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f  t(&out, 0, sizeo
1c070 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d  f(out));.    mem
1c080 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a  set(&tmp, 0, siz
1c090 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20  eof(tmp));..    
1c0a0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
1c0b0 6e 69 74 28 70 31 2c 20 62 41 73 63 2c 20 26 69  nit(p1, bAsc, &i
1c0c0 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c  1);.    fts5Docl
1c0d0 69 73 74 49 74 65 72 49 6e 69 74 28 70 32 2c 20  istIterInit(p2, 
1c0e0 62 41 73 63 2c 20 26 69 32 29 3b 0a 20 20 20 20  bAsc, &i2);.    
1c0f0 77 68 69 6c 65 28 20 69 31 2e 61 50 6f 73 6c 69  while( i1.aPosli
1c100 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73  st!=0 || i2.aPos
1c110 6c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20  list!=0 ){.     
1c120 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74   if( i2.aPoslist
1c130 3d 3d 30 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c  ==0 || (i1.aPosl
1c140 69 73 74 20 26 26 20 0a 20 20 20 20 20 20 20 20  ist && .        
1c150 20 20 20 28 20 28 21 62 41 73 63 20 26 26 20 69     ( (!bAsc && i
1c160 31 2e 69 52 6f 77 69 64 3e 69 32 2e 69 52 6f 77  1.iRowid>i2.iRow
1c170 69 64 29 20 7c 7c 20 28 62 41 73 63 20 26 26 20  id) || (bAsc && 
1c180 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f  i1.iRowid<i2.iRo
1c190 77 69 64 29 20 29 0a 20 20 20 20 20 20 29 29 7b  wid) ).      )){
1c1a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
1c1b0 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31 20 2a   entry from i1 *
1c1c0 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  /.        fts5Me
1c1d0 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
1c1e0 70 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f 75  p->rc, bAsc, &ou
1c1f0 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20  t, &iLastRowid, 
1c200 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i1.iRowid);.    
1c210 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1c220 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1c230 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73  c, &out, i1.nPos
1c240 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66  list);.        f
1c250 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1c260 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  lob(&p->rc, &out
1c270 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 69  , i1.nPoslist, i
1c280 31 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  1.aPoslist);.   
1c290 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
1c2a0 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20  IterNext(&i1);. 
1c2b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
1c2c0 65 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73  e if( i1.aPoslis
1c2d0 74 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77 69  t==0 || i2.iRowi
1c2e0 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a  d!=i1.iRowid ){.
1c2f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1c300 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f  entry from i2 */
1c310 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
1c320 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70  geAppendDocid(&p
1c330 2d 3e 72 63 2c 20 62 41 73 63 2c 20 26 6f 75 74  ->rc, bAsc, &out
1c340 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  , &iLastRowid, i
1c350 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
1c360 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1c370 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1c380 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c  , &out, i2.nPosl
1c390 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ist);.        ft
1c3a0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1c3b0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ob(&p->rc, &out,
1c3c0 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 32   i2.nPoslist, i2
1c3d0 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
1c3e0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
1c3f0 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20  terNext(&i2);.  
1c400 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
1c410 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  {.        Fts5Po
1c420 73 6c 69 73 74 52 65 61 64 65 72 20 72 31 3b 0a  slistReader r1;.
1c430 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
1c440 69 73 74 52 65 61 64 65 72 20 72 32 3b 0a 20 20  istReader r2;.  
1c450 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
1c460 74 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  tWriter writer;.
1c470 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
1c480 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  &writer, 0, size
1c490 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20 20  of(writer));..  
1c4a0 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74        /* Merge t
1c4b0 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20  he two position 
1c4c0 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20  lists. */ .     
1c4d0 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
1c4e0 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20  ndDocid(&p->rc, 
1c4f0 62 41 73 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61  bAsc, &out, &iLa
1c500 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77  stRowid, i2.iRow
1c510 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
1c520 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70  5BufferZero(&tmp
1c530 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c540 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
1c550 64 65 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e 61  derInit(-1, i1.a
1c560 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73  Poslist, i1.nPos
1c570 6c 69 73 74 2c 20 26 72 31 29 3b 0a 20 20 20 20  list, &r1);.    
1c580 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
1c590 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74  oslistReaderInit
1c5a0 28 2d 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74  (-1, i2.aPoslist
1c5b0 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i2.nPoslist, &
1c5c0 72 32 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69  r2);.        whi
1c5d0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
1c5e0 45 5f 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f 66  E_OK && (r1.bEof
1c5f0 3d 3d 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d 3d  ==0 || r2.bEof==
1c600 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
1c610 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  i64 iNew;.      
1c620 20 20 20 20 69 66 28 20 72 32 2e 62 45 6f 66 20      if( r2.bEof 
1c630 7c 7c 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 26  || (r1.bEof==0 &
1c640 26 20 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50 6f  & r1.iPos<r2.iPo
1c650 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
1c660 20 20 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f 73    iNew = r1.iPos
1c670 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1c680 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
1c690 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b  ReaderNext(&r1);
1c6a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1c6b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e  {.            iN
1c6c0 65 77 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20 20  ew = r2.iPos;.  
1c6d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1c6e0 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
1c6f0 65 72 4e 65 78 74 28 26 72 32 29 3b 0a 20 20 20  erNext(&r2);.   
1c700 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31 2e           if( r1.
1c710 69 50 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29 20  iPos==r2.iPos ) 
1c720 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
1c730 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 31  stReaderNext(&r1
1c740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1c750 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
1c760 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
1c770 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64 28  istWriterAppend(
1c780 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20 69  &tmp, &writer, i
1c790 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  New);.        }.
1c7a0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1c7b0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1c7c0 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d  &p->rc, &out, tm
1c7d0 70 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74  p.n);.        ft
1c7e0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1c7f0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ob(&p->rc, &out,
1c800 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70 29 3b 0a   tmp.n, tmp.p);.
1c810 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
1c820 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31 29  istIterNext(&i1)
1c830 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
1c840 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
1c850 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
1c860 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  }..    fts5Buffe
1c870 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c  rSet(&p->rc, p1,
1c880 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a   out.n, out.p);.
1c890 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
1c8a0 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74  ee(&tmp);.    ft
1c8b0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75  s5BufferFree(&ou
1c8c0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  t);.  }.}..stati
1c8d0 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66 65  c void fts5Buffe
1c8e0 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65 72  rSwap(Fts5Buffer
1c8f0 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65 72   *p1, Fts5Buffer
1c900 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66   *p2){.  Fts5Buf
1c910 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20  fer tmp = *p1;. 
1c920 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70   *p1 = *p2;.  *p
1c930 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74  2 = tmp;.}..stat
1c940 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75  ic void fts5Setu
1c950 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46  pPrefixIter(.  F
1c960 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c980 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20  * Index to read 
1c990 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 41  from */.  int bA
1c9a0 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
1c9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c9c0 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20  e for "ORDER BY 
1c9d0 72 6f 77 69 64 20 41 53 43 22 20 2a 2f 0a 20 20  rowid ASC" */.  
1c9e0 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e  const u8 *pToken
1c9f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ca00 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
1ca10 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d  ning prefix to m
1ca20 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  atch */.  int nT
1ca30 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
1ca40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ca50 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b  e of buffer pTok
1ca60 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  en in bytes */. 
1ca70 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
1ca80 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
1ca90 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
1caa0 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  s object */.){. 
1cab0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1cac0 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 42  pStruct;.  Fts5B
1cad0 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20 63  uffer *aBuf;.  c
1cae0 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d 20  onst int nBuf = 
1caf0 33 32 3b 0a 0a 20 20 61 42 75 66 20 3d 20 28 46  32;..  aBuf = (F
1cb00 74 73 35 42 75 66 66 65 72 2a 29 66 74 73 35 49  ts5Buffer*)fts5I
1cb10 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
1cb20 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 2a 6e  of(Fts5Buffer)*n
1cb30 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63 74 20  Buf);.  pStruct 
1cb40 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
1cb50 65 61 64 28 70 2c 20 30 29 3b 0a 0a 20 20 69 66  ead(p, 0);..  if
1cb60 28 20 61 42 75 66 20 26 26 20 70 53 74 72 75 63  ( aBuf && pStruc
1cb70 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6f 63  t ){.    Fts5Doc
1cb80 6c 69 73 74 49 74 65 72 20 2a 70 44 6f 63 6c 69  listIter *pDocli
1cb90 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  st;.    int i;. 
1cba0 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69     i64 iLastRowi
1cbb0 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 4d  d = 0;.    Fts5M
1cbc0 75 6c 74 69 53 65 67 49 74 65 72 20 2a 70 31 20  ultiSegIter *p1 
1cbd0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72  = 0;     /* Iter
1cbe0 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74  ator used to gat
1cbf0 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e  her data from in
1cc00 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 42  dex */.    Fts5B
1cc10 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 0a  uffer doclist;..
1cc20 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c      memset(&docl
1cc30 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ist, 0, sizeof(d
1cc40 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 6f  oclist));.    fo
1cc50 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
1cc60 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30  ew(p, pStruct, 0
1cc70 2c 20 31 2c 20 31 2c 20 70 54 6f 6b 65 6e 2c 20  , 1, 1, pToken, 
1cc80 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26  nToken, -1, 0, &
1cc90 70 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  p1);.        fts
1cca0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
1ccb0 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20   p1)==0;.       
1ccc0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
1ccd0 78 74 28 70 2c 20 70 31 2c 20 30 2c 20 30 29 0a  xt(p, p1, 0, 0).
1cce0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 36 34      ){.      i64
1ccf0 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
1cd00 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 31 29  ltiIterRowid(p1)
1cd10 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  ;.      int nTer
1cd20 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  m;.      const u
1cd30 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35 4d  8 *pTerm = fts5M
1cd40 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 31 2c  ultiIterTerm(p1,
1cd50 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20   &nTerm);.      
1cd60 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 70  assert( memcmp(p
1cd70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49  Token, pTerm, MI
1cd80 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29  N(nToken, nTerm)
1cd90 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )<=0 );.      if
1cda0 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c  ( nTerm<nToken |
1cdb0 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  | memcmp(pToken,
1cdc0 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20   pTerm, nToken) 
1cdd0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
1cde0 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20  if( doclist.n>0 
1cdf0 0a 20 20 20 20 20 20 20 26 26 20 28 28 21 62 41  .       && ((!bA
1ce00 73 63 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4c  sc && iRowid>=iL
1ce10 61 73 74 52 6f 77 69 64 29 20 7c 7c 20 28 62 41  astRowid) || (bA
1ce20 73 63 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c  sc && iRowid<=iL
1ce30 61 73 74 52 6f 77 69 64 29 29 0a 20 20 20 20 20  astRowid)).     
1ce40 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72   ){..        for
1ce50 28 69 3d 30 3b 20 64 6f 63 6c 69 73 74 2e 6e 20  (i=0; doclist.n 
1ce60 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
1ce70 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  _OK; i++){.     
1ce80 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
1ce90 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Buf );.         
1cea0 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d   if( aBuf[i].n==
1ceb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1cec0 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
1ced0 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
1cee0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
1cef0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
1cf00 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  &doclist);.     
1cf10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cf20 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
1cf30 65 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c 20  ePrefixLists(p, 
1cf40 62 41 73 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20  bAsc, &doclist, 
1cf50 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
1cf60 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1cf70 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b  rZero(&aBuf[i]);
1cf80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1cf90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1cfa0 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74       if( doclist
1cfb0 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
1cfc0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1cfd0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1cfe0 26 64 6f 63 6c 69 73 74 2c 20 69 52 6f 77 69 64  &doclist, iRowid
1cff0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
1d000 66 28 20 62 41 73 63 3d 3d 30 20 29 7b 0a 20 20  f( bAsc==0 ){.  
1d010 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1d020 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1d030 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20 69  >rc, &doclist, i
1d040 4c 61 73 74 52 6f 77 69 64 20 2d 20 69 52 6f 77  LastRowid - iRow
1d050 69 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id);.      }else
1d060 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
1d070 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1d080 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73  (&p->rc, &doclis
1d090 74 2c 20 69 52 6f 77 69 64 20 2d 20 69 4c 61 73  t, iRowid - iLas
1d0a0 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 7d  tRowid);.      }
1d0b0 0a 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69  .      iLastRowi
1d0c0 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  d = iRowid;.    
1d0d0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50    fts5MultiIterP
1d0e0 6f 73 6c 69 73 74 28 70 2c 20 70 31 2c 20 31 2c  oslist(p, p1, 1,
1d0f0 20 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20   &doclist);.    
1d100 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
1d110 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20  i<nBuf; i++){.  
1d120 20 20 20 20 66 74 73 35 4d 65 72 67 65 50 72 65      fts5MergePre
1d130 66 69 78 4c 69 73 74 73 28 70 2c 20 62 41 73 63  fixLists(p, bAsc
1d140 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75  , &doclist, &aBu
1d150 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 66 74 73  f[i]);.      fts
1d160 35 42 75 66 66 65 72 46 72 65 65 28 26 61 42 75  5BufferFree(&aBu
1d170 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  f[i]);.    }.   
1d180 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
1d190 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20  ee(p, p1);..    
1d1a0 70 44 6f 63 6c 69 73 74 20 3d 20 28 46 74 73 35  pDoclist = (Fts5
1d1b0 44 6f 63 6c 69 73 74 49 74 65 72 2a 29 66 74 73  DoclistIter*)fts
1d1c0 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
1d1d0 7a 65 6f 66 28 46 74 73 35 44 6f 63 6c 69 73 74  zeof(Fts5Doclist
1d1e0 49 74 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  Iter));.    if( 
1d1f0 21 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  !pDoclist ){.   
1d200 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
1d210 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20  e(&doclist);.   
1d220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1d230 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 3d 20  ter->pDoclist = 
1d240 70 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20  pDoclist;.      
1d250 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
1d260 6e 69 74 28 26 64 6f 63 6c 69 73 74 2c 20 62 41  nit(&doclist, bA
1d270 73 63 2c 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c  sc, pIter->pDocl
1d280 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ist);.    }.  }.
1d290 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
1d2a0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
1d2b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1d2c0 28 61 42 75 66 29 3b 0a 7d 0a 0a 73 74 61 74 69  (aBuf);.}..stati
1d2d0 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52  c int fts5IndexR
1d2e0 65 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20  eturn(Fts5Index 
1d2f0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
1d300 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d  p->rc;.  p->rc =
1d310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65   SQLITE_OK;.  re
1d320 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d330 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63  * Run internal c
1d340 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20  hecks to ensure 
1d350 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e 64  that the FTS ind
1d360 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e  ex (a) is intern
1d370 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74  ally .** consist
1d380 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ent and (b) cont
1d390 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
1d3a0 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f   which the XOR o
1d3b0 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a  f the checksums.
1d3c0 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64  ** as calculated
1d3d0 20 62 79 20 66 74 73 35 49 6e 64 65 78 45 6e 74   by fts5IndexEnt
1d3e0 72 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73  ryCksum() is cks
1d3f0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  um..**.** Return
1d400 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1d410 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e  if any of the in
1d420 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61  ternal checks fa
1d430 69 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a  il, or if the.**
1d440 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e   checksum does n
1d450 6f 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e  ot match. Return
1d460 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c   SQLITE_OK if al
1d470 6c 20 63 68 65 63 6b 73 20 70 61 73 73 20 77 69  l checks pass wi
1d480 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20  thout.** error, 
1d490 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51  or some other SQ
1d4a0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
1d4b0 69 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72  if another error
1d4c0 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f   (e.g. OOM).** o
1d4d0 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ccurs..*/.int sq
1d4e0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e  lite3Fts5IndexIn
1d4f0 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74 73  tegrityCheck(Fts
1d500 35 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63  5Index *p, u64 c
1d510 6b 73 75 6d 29 7b 0a 20 20 46 74 73 35 43 6f 6e  ksum){.  Fts5Con
1d520 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
1d530 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 69 6e 74  ->pConfig;.  int
1d540 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   iIdx;          
1d550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d560 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
1d570 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20  through indexes 
1d580 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1d5b0 6f 64 65 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  ode */.  u64 cks
1d5c0 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um2 = 0;        
1d5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
1d5e0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
1d5f0 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
1d600 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  s */..  /* Check
1d610 20 74 68 61 74 20 74 68 65 20 63 68 65 63 6b 73   that the checks
1d620 75 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  um of the index 
1d630 6d 61 74 63 68 65 73 20 74 68 65 20 61 72 67 75  matches the argu
1d640 6d 65 6e 74 20 63 68 65 63 6b 73 75 6d 20 2a 2f  ment checksum */
1d650 0a 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69  .  for(iIdx=0; i
1d660 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
1d670 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
1d680 20 20 20 20 46 74 73 35 4d 75 6c 74 69 53 65 67      Fts5MultiSeg
1d690 49 74 65 72 20 2a 70 49 74 65 72 3b 0a 20 20 20  Iter *pIter;.   
1d6a0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1d6b0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
1d6c0 72 75 63 74 75 72 65 52 65 61 64 28 70 2c 20 69  ructureRead(p, i
1d6d0 49 64 78 29 3b 0a 20 20 20 20 66 6f 72 28 66 74  Idx);.    for(ft
1d6e0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
1d6f0 2c 20 70 53 74 72 75 63 74 2c 20 69 49 64 78 2c  , pStruct, iIdx,
1d700 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c   0, 0, 0, 0, -1,
1d710 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20   0, &pIter);.   
1d720 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1d730 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
1d740 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  =0;.        fts5
1d750 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
1d760 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20   pIter, 0, 0).  
1d770 20 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 50    ){.      Fts5P
1d780 6f 73 49 74 65 72 20 73 50 6f 73 3b 20 20 20 20  osIter sPos;    
1d790 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1d7a0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1d7b0 68 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  h position list 
1d7c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 20  */.      int n; 
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1d7f0 74 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  term in bytes */
1d800 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
1d810 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
1d820 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
1d830 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 28       char *z = (
1d840 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69 49  char*)fts5MultiI
1d850 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20 26  terTerm(pIter, &
1d860 6e 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 66  n);..      for(f
1d870 74 73 35 50 6f 73 49 74 65 72 49 6e 69 74 28 70  ts5PosIterInit(p
1d880 2c 20 70 49 74 65 72 2c 20 26 73 50 6f 73 29 3b  , pIter, &sPos);
1d890 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50  .          fts5P
1d8a0 6f 73 49 74 65 72 45 6f 66 28 70 2c 20 26 73 50  osIterEof(p, &sP
1d8b0 6f 73 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  os)==0;.        
1d8c0 20 20 66 74 73 35 50 6f 73 49 74 65 72 4e 65 78    fts5PosIterNex
1d8d0 74 28 70 2c 20 26 73 50 6f 73 29 0a 20 20 20 20  t(p, &sPos).    
1d8e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73    ){.        cks
1d8f0 75 6d 32 20 5e 3d 20 66 74 73 35 49 6e 64 65 78  um2 ^= fts5Index
1d900 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69  EntryCksum(iRowi
1d910 64 2c 20 73 50 6f 73 2e 69 43 6f 6c 2c 20 73 50  d, sPos.iCol, sP
1d920 6f 73 2e 69 50 6f 73 2c 20 7a 2c 20 6e 29 3b 0a  os.iPos, z, n);.
1d930 23 69 66 20 30 0a 20 20 20 20 20 20 20 20 66 70  #if 0.        fp
1d940 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 72  rintf(stdout, "r
1d950 6f 77 69 64 3d 25 64 20 22 2c 20 28 69 6e 74 29  owid=%d ", (int)
1d960 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
1d970 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
1d980 20 22 74 65 72 6d 3d 25 2e 2a 73 20 22 2c 20 6e   "term=%.*s ", n
1d990 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 66 70  , z);.        fp
1d9a0 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 63  rintf(stdout, "c
1d9b0 6f 6c 3d 25 64 20 22 2c 20 73 50 6f 73 2e 69 43  ol=%d ", sPos.iC
1d9c0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  ol);.        fpr
1d9d0 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 6f 66  intf(stdout, "of
1d9e0 66 3d 25 64 5c 6e 22 2c 20 73 50 6f 73 2e 69 50  f=%d\n", sPos.iP
1d9f0 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c  os);.        ffl
1da00 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 23 65 6e  ush(stdout);.#en
1da10 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
1da20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  }.    fts5MultiI
1da30 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72  terFree(p, pIter
1da40 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
1da50 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1da60 75 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  uct);.  }.  rc =
1da70 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 72 63   p->rc;.  if( rc
1da80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
1da90 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 72  ksum!=cksum2 ) r
1daa0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
1dab0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
1dac0 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  at the internal 
1dad0 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65  nodes of each se
1dae0 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20  gment match the 
1daf0 6c 65 61 76 65 73 20 2a 2f 0a 20 20 66 6f 72 28  leaves */.  for(
1db00 69 49 64 78 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  iIdx=0; rc==SQLI
1db10 54 45 5f 4f 4b 20 26 26 20 69 49 64 78 3c 3d 70  TE_OK && iIdx<=p
1db20 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
1db30 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 46 74   iIdx++){.    Ft
1db40 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1db50 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
1db60 74 75 72 65 52 65 61 64 28 70 2c 20 69 49 64 78  tureRead(p, iIdx
1db70 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  );.    if( pStru
1db80 63 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ct ){.      int 
1db90 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
1dba0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
1dbb0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1dbc0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1dbd0 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
1dbe0 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
1dbf0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1dc00 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
1dc10 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
1dc20 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
1dc30 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1dc40 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
1dc50 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 66  eg];.          f
1dc60 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
1dc70 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c  yCheckSegment(p,
1dc80 20 69 49 64 78 2c 20 70 53 65 67 29 3b 0a 20 20   iIdx, pSeg);.  
1dc90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1dca0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
1dcb0 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
1dcc0 53 74 72 75 63 74 29 3b 0a 20 20 20 20 72 63 20  Struct);.    rc 
1dcd0 3d 20 70 2d 3e 72 63 3b 0a 20 20 7d 0a 0a 20 20  = p->rc;.  }..  
1dce0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1dcf0 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
1dd00 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  at all subsequen
1dd10 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
1dd20 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
1dd30 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f  () pertain.** to
1dd40 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
1dd50 74 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e  th rowid iRowid.
1dd60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
1dd70 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69  ts5IndexBeginWri
1dd80 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
1dd90 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20   i64 iRowid){.  
1dda0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
1ddb0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
1ddc0 28 20 69 52 6f 77 69 64 3c 3d 70 2d 3e 69 57 72  ( iRowid<=p->iWr
1ddd0 69 74 65 52 6f 77 69 64 20 7c 7c 20 28 70 2d 3e  iteRowid || (p->
1dde0 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3e 20 70  nPendingData > p
1ddf0 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74  ->nMaxPendingDat
1de00 61 29 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  a) ){.    fts5In
1de10 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d  dexFlush(p);.  }
1de20 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  .  p->iWriteRowi
1de30 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65  d = iRowid;.  re
1de40 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
1de50 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
1de60 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f  * Commit data to
1de70 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
1de80 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 79  lite3Fts5IndexSy
1de90 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  nc(Fts5Index *p,
1dea0 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
1deb0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1dec0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
1ded0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
1dee0 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 20  ;.  if( bCommit 
1def0 29 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65  ) fts5CloseReade
1df00 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  r(p);.  return f
1df10 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
1df20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63  );.}../*.** Disc
1df30 61 72 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f  ard any data sto
1df40 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  red in the in-me
1df50 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73  mory hash tables
1df60 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69  . Do not write i
1df70 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  t.** to the data
1df80 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c  base. Additional
1df90 6c 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ly, assume that 
1dfa0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1dfb0 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61  the %_data.** ta
1dfc0 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68 61  ble may have cha
1dfd0 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f  nged on disk. So
1dfe0 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   any in-memory c
1dff0 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20  aches of %_data 
1e000 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74  .** records must
1e010 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e   be invalidated.
1e020 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
1e030 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b  ts5IndexRollback
1e040 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1e050 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
1e060 72 28 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  r(p);.  fts5Inde
1e070 78 44 69 73 63 61 72 64 44 61 74 61 28 70 29 3b  xDiscardData(p);
1e080 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
1e090 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1e0a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e0b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
1e0c0 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69 73 20  %_data table is 
1e0d0 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
1e0e0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1e0f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  ion is called. T
1e100 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
1e110 70 6f 70 75 6c 61 74 65 73 20 69 74 20 77 69 74  populates it wit
1e120 68 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 74  h the initial st
1e130 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 73 20  ructure objects 
1e140 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2c 0a  for each index,.
1e150 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 69 74 69  ** and the initi
1e160 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  al version of th
1e170 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65 63  e "averages" rec
1e180 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62 79 74 65  ord (a zero-byte
1e190 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73   blob)..*/.int s
1e1a0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
1e1b0 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78 20  einit(Fts5Index 
1e1c0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
1e1d0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73 3b  Fts5Structure s;
1e1e0 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ..  memset(&s, 0
1e1f0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
1e200 75 63 74 75 72 65 29 29 3b 0a 20 20 66 6f 72 28  ucture));.  for(
1e210 69 3d 30 3b 20 69 3c 70 2d 3e 70 43 6f 6e 66 69  i=0; i<p->pConfi
1e220 67 2d 3e 6e 50 72 65 66 69 78 2b 31 3b 20 69 2b  g->nPrefix+1; i+
1e230 2b 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75  +){.    fts5Stru
1e240 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 69 2c  ctureWrite(p, i,
1e250 20 26 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20   &s);.  }.  if( 
1e260 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1e270 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
1e280 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
1e290 53 65 74 41 76 65 72 61 67 65 73 28 70 2c 20 28  SetAverages(p, (
1e2a0 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29  const u8*)"", 0)
1e2b0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1e2c0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
1e2d0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  p);.}../*.** Ope
1e2e0 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65  n a new Fts5Inde
1e2f0 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65  x handle. If the
1e300 20 62 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e   bCreate argumen
1e310 74 20 69 73 20 74 72 75 65 2c 20 63 72 65 61 74  t is true, creat
1e320 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
1e330 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
1e340 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  ng %_data table.
1e350 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1e360 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f  sful, set *pp to
1e370 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
1e380 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  w object and ret
1e390 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
1e3a0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
1e3b0 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   *pp to NULL and
1e3c0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
1e3d0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
1e3e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1e3f0 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73  IndexOpen(.  Fts
1e400 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
1e410 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65  , .  int bCreate
1e420 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  , .  Fts5Index *
1e430 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  *pp,.  char **pz
1e440 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Err.){.  int rc 
1e450 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
1e460 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20  ts5Index *p;    
1e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e480 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
1e490 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74  .  *pp = p = (Ft
1e4a0 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33  s5Index*)sqlite3
1e4b0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 46  _malloc(sizeof(F
1e4c0 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 69 66  ts5Index));.  if
1e4d0 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 53 51  ( !p ) return SQ
1e4e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 6d  LITE_NOMEM;..  m
1e4f0 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
1e500 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a  of(Fts5Index));.
1e510 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70    p->pConfig = p
1e520 43 6f 6e 66 69 67 3b 0a 20 20 70 2d 3e 6e 43 72  Config;.  p->nCr
1e530 69 73 69 73 4d 65 72 67 65 20 3d 20 46 54 53 35  isisMerge = FTS5
1e540 5f 43 52 49 53 49 53 5f 4d 45 52 47 45 3b 0a 20  _CRISIS_MERGE;. 
1e550 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20   p->nWorkUnit = 
1e560 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a  FTS5_WORK_UNIT;.
1e570 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67    p->nMaxPending
1e580 44 61 74 61 20 3d 20 31 30 32 34 2a 31 30 32 34  Data = 1024*1024
1e590 3b 0a 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20  ;.  p->zDataTbl 
1e5a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1e5b0 66 28 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f  f("%s_data", pCo
1e5c0 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  nfig->zName);.  
1e5d0 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 3d  if( p->zDataTbl=
1e5e0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
1e5f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1e600 65 6c 73 65 20 69 66 28 20 62 43 72 65 61 74 65  else if( bCreate
1e610 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1e620 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
1e630 62 6c 65 28 0a 20 20 20 20 20 20 20 20 70 43 6f  ble(.        pCo
1e640 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69  nfig, "data", "i
1e650 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
1e660 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f  Y KEY, block BLO
1e670 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20  B", 0, pzErr.   
1e680 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1e690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e6a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
1e6b0 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70  ts5IndexReinit(p
1e6c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1e6d0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
1e6e0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 21 3d  QLITE_OK || rc!=
1e6f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
1e700 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c  f( rc ){.    sql
1e710 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f  ite3Fts5IndexClo
1e720 73 65 28 70 2c 20 30 29 3b 0a 20 20 20 20 2a 70  se(p, 0);.    *p
1e730 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  p = 0;.  }.  ret
1e740 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e750 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20   Close a handle 
1e760 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72  opened by an ear
1e770 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  lier call to sql
1e780 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
1e790 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n()..*/.int sqli
1e7a0 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73  te3Fts5IndexClos
1e7b0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
1e7c0 69 6e 74 20 62 44 65 73 74 72 6f 79 29 7b 0a 20  int bDestroy){. 
1e7d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e7e0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  _OK;.  if( p ){.
1e7f0 20 20 20 20 69 66 28 20 62 44 65 73 74 72 6f 79      if( bDestroy
1e800 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1e810 71 6c 69 74 65 33 46 74 73 35 44 72 6f 70 54 61  qlite3Fts5DropTa
1e820 62 6c 65 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20  ble(p->pConfig, 
1e830 22 64 61 74 61 22 29 3b 0a 20 20 20 20 7d 0a 20  "data");.    }. 
1e840 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
1e850 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  eader==0 );.    
1e860 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1e870 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
1e880 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1e890 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ze(p->pDeleter);
1e8a0 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 70 48 61  .    if( p->apHa
1e8b0 73 68 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  sh ){.      int 
1e8c0 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  i;.      for(i=0
1e8d0 3b 20 69 3c 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  ; i<=p->pConfig-
1e8e0 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29 7b 0a  >nPrefix; i++){.
1e8f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1e900 74 73 35 48 61 73 68 46 72 65 65 28 70 2d 3e 61  ts5HashFree(p->a
1e910 70 48 61 73 68 5b 69 5d 29 3b 0a 20 20 20 20 20  pHash[i]);.     
1e920 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1e930 5f 66 72 65 65 28 70 2d 3e 61 70 48 61 73 68 29  _free(p->apHash)
1e940 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1e950 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74  te3_free(p->zDat
1e960 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  aTbl);.    sqlit
1e970 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
1e980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e990 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74 65 20  /*.** Calculate 
1e9a0 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
1e9b0 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20 74 68  cksum that is th
1e9c0 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69 6e 64  e XOR of the ind
1e9d0 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68 65 63  ex entry.** chec
1e9e0 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72  ksum of all entr
1e9f0 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20 62  ies that would b
1ea00 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  e generated by t
1ea10 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69 66 69  he token specifi
1ea20 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 69 6e  ed.** by the fin
1ea30 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73 2e 0a  al 5 arguments..
1ea40 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46 74  */.u64 sqlite3Ft
1ea50 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a 20 20  s5IndexCksum(.  
1ea60 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e  Fts5Config *pCon
1ea70 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  fig,            
1ea80 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
1ea90 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34   object */.  i64
1eaa0 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20   iRowid,        
1eab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eac0 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20 61 70  Document term ap
1ead0 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e  pears in */.  in
1eae0 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb00 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61 70 70   Column term app
1eb10 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  ears in */.  int
1eb20 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
1eb30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb40 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20 61 70  Position term ap
1eb50 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 63 6f  pears in */.  co
1eb60 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c  nst char *pTerm,
1eb70 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 2f 2a   int nTerm    /*
1eb80 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20 2a 2f   Term at iPos */
1eb90 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20 3d 20  .){.  u64 ret = 
1eba0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1ebb0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1ebc0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69  value */.  int i
1ebd0 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
1ebe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
1ebf0 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
1ec00 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 0a  ugh indexes */..
1ec10 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49    for(iIdx=0; iI
1ec20 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
1ec30 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
1ec40 20 20 20 69 6e 74 20 6e 20 3d 20 28 28 69 49 64     int n = ((iId
1ec50 78 3d 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  x==pConfig->nPre
1ec60 66 69 78 29 20 3f 20 6e 54 65 72 6d 20 3a 20 70  fix) ? nTerm : p
1ec70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
1ec80 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20  iIdx]);.    if( 
1ec90 6e 3c 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20  n<=nTerm ){.    
1eca0 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64    ret ^= fts5Ind
1ecb0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
1ecc0 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
1ecd0 20 70 54 65 72 6d 2c 20 6e 29 3b 0a 20 20 20 20   pTerm, n);.    
1ece0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1ecf0 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ret;.}../*.** In
1ed00 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64  sert or remove d
1ed10 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ata to or from t
1ed20 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74  he index. Each t
1ed30 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  ime a document i
1ed40 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f  s .** added to o
1ed50 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  r removed from t
1ed60 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66  he index, this f
1ed70 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1ed80 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  d one or more.**
1ed90 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   times..**.** Fo
1eda0 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20  r an insert, it 
1edb0 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f  must be called o
1edc0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b  nce for each tok
1edd0 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f  en in the new do
1ede0 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68  cument..** If th
1edf0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
1ee00 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74   delete, it must
1ee10 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c   be called (at l
1ee20 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65  east) once for e
1ee30 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f  ach.** unique to
1ee40 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  ken in the docum
1ee50 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c  ent with an iCol
1ee60 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e   value less than
1ee70 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a   zero. The iPos.
1ee80 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
1ee90 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c  gnored for a del
1eea0 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ete..*/.int sqli
1eeb0 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
1eec0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
1eed0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1eee0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
1eef0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
1ef00 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ef20 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
1ef30 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
1ef40 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
1ef50 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ef70 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
1ef80 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
1ef90 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
1efa0 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
1efb0 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
1efc0 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
1efd0 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
1efe0 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  x */.){.  int i;
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1f010 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
1f020 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
1f030 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
1f040 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
1f050 69 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ig;.  assert( p-
1f060 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1f070 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1f080 20 68 61 73 68 20 74 61 62 6c 65 73 20 69 66 20   hash tables if 
1f090 74 68 65 79 20 68 61 76 65 20 6e 6f 74 20 61 6c  they have not al
1f0a0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
1f0b0 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
1f0c0 3e 61 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  >apHash==0 ){.  
1f0d0 20 20 69 6e 74 20 6e 48 61 73 68 20 3d 20 70 43    int nHash = pC
1f0e0 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 2b  onfig->nPrefix +
1f0f0 20 31 3b 0a 20 20 20 20 70 2d 3e 61 70 48 61 73   1;.    p->apHas
1f100 68 20 3d 20 28 46 74 73 35 48 61 73 68 2a 2a 29  h = (Fts5Hash**)
1f110 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
1f120 20 73 69 7a 65 6f 66 28 46 74 73 35 48 61 73 68   sizeof(Fts5Hash
1f130 2a 29 20 2a 20 6e 48 61 73 68 29 3b 0a 20 20 20  *) * nHash);.   
1f140 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
1f150 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
1f160 6e 48 61 73 68 3b 20 69 2b 2b 29 7b 0a 20 20 20  nHash; i++){.   
1f170 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1f180 65 33 46 74 73 35 48 61 73 68 4e 65 77 28 26 70  e3Fts5HashNew(&p
1f190 2d 3e 61 70 48 61 73 68 5b 69 5d 2c 20 26 70 2d  ->apHash[i], &p-
1f1a0 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a  >nPendingData);.
1f1b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1f1c0 41 64 64 20 74 68 65 20 6e 65 77 20 74 6f 6b 65  Add the new toke
1f1d0 6e 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65  n to the main te
1f1e0 72 6d 73 20 68 61 73 68 20 74 61 62 6c 65 2e 20  rms hash table. 
1f1f0 41 6e 64 20 74 6f 20 65 61 63 68 20 6f 66 20 74  And to each of t
1f200 68 65 0a 20 20 2a 2a 20 70 72 65 66 69 78 20 68  he.  ** prefix h
1f210 61 73 68 20 74 61 62 6c 65 73 20 74 68 61 74 20  ash tables that 
1f220 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  it is large enou
1f230 67 68 20 66 6f 72 2e 20 2a 2f 0a 20 20 66 74 73  gh for. */.  fts
1f240 35 41 64 64 54 65 72 6d 54 6f 48 61 73 68 28 70  5AddTermToHash(p
1f250 2c 20 30 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  , 0, iCol, iPos,
1f260 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29   pToken, nToken)
1f270 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f280 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
1f290 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e   i++){.    if( n
1f2a0 54 6f 6b 65 6e 3e 3d 70 43 6f 6e 66 69 67 2d 3e  Token>=pConfig->
1f2b0 61 50 72 65 66 69 78 5b 69 5d 20 29 7b 0a 20 20  aPrefix[i] ){.  
1f2c0 20 20 20 20 66 74 73 35 41 64 64 54 65 72 6d 54      fts5AddTermT
1f2d0 6f 48 61 73 68 28 70 2c 20 69 2b 31 2c 20 69 43  oHash(p, i+1, iC
1f2e0 6f 6c 2c 20 69 50 6f 73 2c 20 70 54 6f 6b 65 6e  ol, iPos, pToken
1f2f0 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  , pConfig->aPref
1f300 69 78 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ix[i]);.    }.  
1f310 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  }..  return fts5
1f320 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
1f330 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1f340 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20  new iterator to 
1f350 69 74 65 72 61 74 65 20 74 68 6f 75 67 68 20 61  iterate though a
1f360 6c 6c 20 64 6f 63 69 64 73 20 74 68 61 74 20 6d  ll docids that m
1f370 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70 65  atch the .** spe
1f380 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20  cified token or 
1f390 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f  token prefix..*/
1f3a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
1f3b0 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46 74  IndexQuery(.  Ft
1f3c0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f3e0 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71 75   FTS index to qu
1f3f0 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ery */.  const c
1f400 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74  har *pToken, int
1f410 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65   nToken, /* Toke
1f420 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20 74 6f  n (or prefix) to
1f430 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20   query for */.  
1f440 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f460 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49  /* Mask of FTS5I
1f470 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c 61  NDEX_QUERY_X fla
1f480 67 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  gs */.  Fts5Inde
1f490 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20  xIter **ppIter  
1f4a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1f4b0 4e 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  New iterator obj
1f4c0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ect */.){.  Fts5
1f4d0 49 6e 64 65 78 49 74 65 72 20 2a 70 52 65 74 3b  IndexIter *pRet;
1f4e0 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
1f4f0 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ..  if( flags & 
1f500 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
1f510 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 46 74  PREFIX ){.    Ft
1f520 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
1f530 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
1f540 20 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20      for(iIdx=1; 
1f550 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e  iIdx<=pConfig->n
1f560 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b  Prefix; iIdx++){
1f570 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66  .      if( pConf
1f580 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78  ig->aPrefix[iIdx
1f590 2d 31 5d 3d 3d 6e 54 6f 6b 65 6e 20 29 20 62 72  -1]==nToken ) br
1f5a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
1f5b0 66 28 20 69 49 64 78 3e 70 43 6f 6e 66 69 67 2d  f( iIdx>pConfig-
1f5c0 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20  >nPrefix ){.    
1f5d0 20 20 69 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20    iIdx = -1;.   
1f5e0 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d   }.  }..  pRet =
1f5f0 20 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a   (Fts5IndexIter*
1f600 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
1f610 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 73  ocZero(&p->rc, s
1f620 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49  izeof(Fts5IndexI
1f630 74 65 72 29 29 3b 0a 20 20 69 66 28 20 70 52 65  ter));.  if( pRe
1f640 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t ){.    memset(
1f650 70 52 65 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pRet, 0, sizeof(
1f660 46 74 73 35 49 6e 64 65 78 49 74 65 72 29 29 3b  Fts5IndexIter));
1f670 0a 0a 20 20 20 20 70 52 65 74 2d 3e 70 49 6e 64  ..    pRet->pInd
1f680 65 78 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20  ex = p;.    if( 
1f690 69 49 64 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iIdx>=0 ){.     
1f6a0 20 70 52 65 74 2d 3e 70 53 74 72 75 63 74 20 3d   pRet->pStruct =
1f6b0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1f6c0 61 64 28 70 2c 20 69 49 64 78 29 3b 0a 20 20 20  ad(p, iIdx);.   
1f6d0 20 20 20 69 66 28 20 70 52 65 74 2d 3e 70 53 74     if( pRet->pSt
1f6e0 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ruct ){.        
1f6f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
1f700 28 70 2c 20 70 52 65 74 2d 3e 70 53 74 72 75 63  (p, pRet->pStruc
1f710 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
1f720 69 49 64 78 2c 20 31 2c 20 66 6c 61 67 73 2c 20  iIdx, 1, flags, 
1f730 28 63 6f 6e 73 74 20 75 38 2a 29 70 54 6f 6b 65  (const u8*)pToke
1f740 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30  n, nToken, -1, 0
1f750 2c 20 26 70 52 65 74 2d 3e 70 4d 75 6c 74 69 0a  , &pRet->pMulti.
1f760 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1f770 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1f780 20 20 20 20 69 6e 74 20 62 41 73 63 20 3d 20 28      int bAsc = (
1f790 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
1f7a0 58 5f 51 55 45 52 59 5f 41 53 43 29 21 3d 30 3b  X_QUERY_ASC)!=0;
1f7b0 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75 70  .      fts5Setup
1f7c0 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62 41  PrefixIter(p, bA
1f7d0 73 63 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 70  sc, (const u8*)p
1f7e0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70  Token, nToken, p
1f7f0 52 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Ret);.    }.  }.
1f800 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a  .  if( p->rc ){.
1f810 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
1f820 74 65 72 43 6c 6f 73 65 28 70 52 65 74 29 3b 0a  terClose(pRet);.
1f830 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
1f840 7d 0a 20 20 2a 70 70 49 74 65 72 20 3d 20 70 52  }.  *ppIter = pR
1f850 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  et;.  return fts
1f860 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
1f870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f880 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
1f890 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
1f8a0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
1f8b0 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a  t is at EOF..*/.
1f8c0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1f8d0 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
1f8e0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1f8f0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
1f900 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
1f910 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 70 49  E_OK );.  if( pI
1f920 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b  ter->pDoclist ){
1f930 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 74   .    return pIt
1f940 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50  er->pDoclist->aP
1f950 6f 73 6c 69 73 74 3d 3d 30 3b 20 0a 20 20 7d 65  oslist==0; .  }e
1f960 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1f970 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
1f980 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
1f990 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 29 3b 0a  pIter->pMulti);.
1f9a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76    }.}../*.** Mov
1f9b0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
1f9c0 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a  tching rowid. .*
1f9d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
1f9e0 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  5IterNext(Fts5In
1f9f0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
1fa00 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
1fa10 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
1fa20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
1fa30 20 70 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74   pIter->pDoclist
1fa40 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c   ){.    fts5Docl
1fa50 69 73 74 49 74 65 72 4e 65 78 74 28 70 49 74 65  istIterNext(pIte
1fa60 72 2d 3e 70 44 6f 63 6c 69 73 74 29 3b 0a 20 20  r->pDoclist);.  
1fa70 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42  }else{.    fts5B
1fa80 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
1fa90 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
1faa0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
1fab0 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
1fac0 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74 69 2c 20   pIter->pMulti, 
1fad0 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
1fae0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
1faf0 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
1fb00 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
1fb10 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 74  e the doclist-it
1fb20 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  er passed as the
1fb30 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1fb40 74 6f 20 74 68 65 20 6e 65 78 74 20 0a 2a 2a 20  to the next .** 
1fb50 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74  matching rowid t
1fb60 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72  hat occurs at or
1fb70 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54   after iMatch. T
1fb80 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  he definition of
1fb90 20 22 61 74 20 0a 2a 2a 20 6f 72 20 61 66 74 65   "at .** or afte
1fba0 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  r" depends on wh
1fbb0 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61  ether this itera
1fbc0 74 6f 72 20 69 74 65 72 61 74 65 73 20 69 6e 20  tor iterates in 
1fbd0 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 0a 2a 2a  ascending or .**
1fbe0 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
1fbf0 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  d order..*/.stat
1fc00 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
1fc10 69 73 74 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  istIterNextFrom(
1fc20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
1fc30 2a 70 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b  *p, i64 iMatch){
1fc40 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69  .  do{.    i64 i
1fc50 52 6f 77 69 64 20 3d 20 70 2d 3e 69 52 6f 77 69  Rowid = p->iRowi
1fc60 64 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 41  d;.    if( p->bA
1fc70 73 63 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3e  sc!=0 && iRowid>
1fc80 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
1fc90 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 41 73 63  .    if( p->bAsc
1fca0 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69  ==0 && iRowid<=i
1fcb0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
1fcc0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
1fcd0 65 72 4e 65 78 74 28 70 29 3b 0a 20 20 7d 77 68  erNext(p);.  }wh
1fce0 69 6c 65 28 20 70 2d 3e 61 50 6f 73 6c 69 73 74  ile( p->aPoslist
1fcf0 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76   );.}../*.** Mov
1fd00 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
1fd10 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61  tching rowid tha
1fd20 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61  t occurs at or a
1fd30 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65  fter iMatch. The
1fd40 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  .** definition o
1fd50 66 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20  f "at or after" 
1fd60 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68  depends on wheth
1fd70 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  er this iterator
1fd80 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20   iterates.** in 
1fd90 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73  ascending or des
1fda0 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
1fdb0 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  der..*/.int sqli
1fdc0 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46  te3Fts5IterNextF
1fdd0 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65  rom(Fts5IndexIte
1fde0 72 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69 4d  r *pIter, i64 iM
1fdf0 61 74 63 68 29 7b 0a 20 20 69 66 28 20 70 49 74  atch){.  if( pIt
1fe00 65 72 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a  er->pDoclist ){.
1fe10 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
1fe20 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65  terNextFrom(pIte
1fe30 72 2d 3e 70 44 6f 63 6c 69 73 74 2c 20 69 4d 61  r->pDoclist, iMa
1fe40 74 63 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tch);.  }else{. 
1fe50 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1fe60 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e  NextFrom(pIter->
1fe70 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2d 3e 70  pIndex, pIter->p
1fe80 4d 75 6c 74 69 2c 20 69 4d 61 74 63 68 29 3b 0a  Multi, iMatch);.
1fe90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
1fea0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
1feb0 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
1fec0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1fed0 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a   current rowid..
1fee0 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74  */.i64 sqlite3Ft
1fef0 73 35 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  s5IterRowid(Fts5
1ff00 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1ff10 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ){.  if( pIter->
1ff20 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  pDoclist ){.    
1ff30 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 70 44  return pIter->pD
1ff40 6f 63 6c 69 73 74 2d 3e 69 52 6f 77 69 64 3b 0a  oclist->iRowid;.
1ff50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1ff60 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65  urn fts5MultiIte
1ff70 72 52 6f 77 69 64 28 70 49 74 65 72 2d 3e 70 4d  rRowid(pIter->pM
1ff80 75 6c 74 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ulti);.  }.}.../
1ff90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1ffa0 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
1ffb0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63  r containing a c
1ffc0 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
1ffd0 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20  ion list for.** 
1ffe0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1fff0 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  y. Output variab
20000 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f  le *pn is set to
20010 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20020 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62   buffer .** in b
20030 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75  ytes before retu
20040 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rning..**.** The
20050 20 72 65 74 75 72 6e 65 64 20 62 75 66 66 65 72   returned buffer
20060 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
20070 65 20 74 68 65 20 30 78 30 30 20 74 65 72 6d 69  e the 0x00 termi
20080 6e 61 74 6f 72 20 62 79 74 65 20 73 74 6f 72 65  nator byte store
20090 64 20 6f 6e 0a 2a 2a 20 64 69 73 6b 2e 0a 2a 2f  d on.** disk..*/
200a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
200b0 49 74 65 72 50 6f 73 6c 69 73 74 28 46 74 73 35  IterPoslist(Fts5
200c0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
200d0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c  , const u8 **pp,
200e0 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 61 73 73   int *pn){.  ass
200f0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
20100 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
20110 4b 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 72  K );.  if( pIter
20120 2d 3e 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  ->pDoclist ){.  
20130 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70    *pn = pIter->p
20140 44 6f 63 6c 69 73 74 2d 3e 6e 50 6f 73 6c 69 73  Doclist->nPoslis
20150 74 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74  t;.    *pp = pIt
20160 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e 61 50  er->pDoclist->aP
20170 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  oslist;.  }else{
20180 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
20190 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
201a0 78 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  x;.    fts5Buffe
201b0 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
201c0 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35  slist);.    fts5
201d0 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74  MultiIterPoslist
201e0 28 70 2c 20 70 49 74 65 72 2d 3e 70 4d 75 6c 74  (p, pIter->pMult
201f0 69 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f  i, 0, &pIter->po
20200 73 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 6e 20  slist);.    *pn 
20210 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  = pIter->poslist
20220 2e 6e 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49  .n;.    *pp = pI
20230 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
20240 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
20250 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
20260 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
20270 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69  /*.** Close an i
20280 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62  terator opened b
20290 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
202a0 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  l to sqlite3Fts5
202b0 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f  IndexQuery()..*/
202c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
202d0 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49  5IterClose(Fts5I
202e0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
202f0 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
20300 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
20310 70 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20  pDoclist ){.    
20320 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
20330 49 74 65 72 2d 3e 70 44 6f 63 6c 69 73 74 2d 3e  Iter->pDoclist->
20340 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
20350 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 70 44  3_free(pIter->pD
20360 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c  oclist);.    }el
20370 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  se{.      fts5Mu
20380 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74 65  ltiIterFree(pIte
20390 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
203a0 2d 3e 70 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20  ->pMulti);.     
203b0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
203c0 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74  lease(pIter->pSt
203d0 72 75 63 74 29 3b 0a 20 20 20 20 20 20 66 74 73  ruct);.      fts
203e0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
203f0 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
20400 20 20 7d 0a 20 20 20 20 66 74 73 35 43 6c 6f 73    }.    fts5Clos
20410 65 52 65 61 64 65 72 28 70 49 74 65 72 2d 3e 70  eReader(pIter->p
20420 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Index);.    sqli
20430 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b  te3_free(pIter);
20440 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
20450 61 64 20 74 68 65 20 22 61 76 65 72 61 67 65 73  ad the "averages
20460 22 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  " record into th
20470 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65  e buffer supplie
20480 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
20490 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 52 65  .** argument. Re
204a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
204b0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
204c0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
204d0 20 63 6f 64 65 0a 2a 2a 20 69 66 20 61 6e 20 65   code.** if an e
204e0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
204f0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
20500 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28  ndexGetAverages(
20510 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
20520 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b  s5Buffer *pBuf){
20530 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
20540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
20550 20 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42   fts5DataReadOrB
20560 75 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 46  uffer(p, pBuf, F
20570 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
20580 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ID);.  return ft
20590 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
205a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  ;.}../*.** Repla
205b0 63 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22  ce the current "
205c0 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
205d0 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
205e0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
205f0 20 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73   .** supplied as
20600 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
20610 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
20620 69 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74  ite3Fts5IndexSet
20630 41 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64  Averages(Fts5Ind
20640 65 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20  ex *p, const u8 
20650 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *pData, int nDat
20660 61 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  a){.  assert( p-
20670 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
20680 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74  ;.  fts5DataWrit
20690 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47  e(p, FTS5_AVERAG
206a0 45 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c  ES_ROWID, pData,
206b0 20 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72   nData);.  retur
206c0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
206d0 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
206e0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
206f0 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73  number of blocks
20700 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73   this module has
20710 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25   read from the %
20720 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73  _data.** table s
20730 69 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61  ince it was crea
20740 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
20750 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64  te3Fts5IndexRead
20760 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  s(Fts5Index *p){
20770 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65  .  return p->nRe
20780 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ad;.}../*.** Set
20790 20 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b   the 32-bit cook
207a0 69 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ie value stored 
207b0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
207c0 61 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a  all structure .*
207d0 2a 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  * records to the
207e0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
207f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
20800 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ment..**.** Retu
20810 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
20820 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
20830 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
20840 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a  ode if an error.
20850 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e  ** occurs..*/.in
20860 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
20870 65 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35  exSetCookie(Fts5
20880 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e  Index *p, int iN
20890 65 77 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ew){.  int rc = 
208a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
208b0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
208c0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
208d0 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 0a   u8 aCookie[4];.
208e0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65    int i;..  asse
208f0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
20900 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
20910 33 46 74 73 35 50 75 74 33 32 28 61 43 6f 6f 6b  3Fts5Put32(aCook
20920 69 65 2c 20 69 4e 65 77 29 3b 0a 20 20 66 6f 72  ie, iNew);.  for
20930 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
20940 5f 4f 4b 20 26 26 20 69 3c 3d 70 43 6f 6e 66 69  _OK && i<=pConfi
20950 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 2b 2b 29  g->nPrefix; i++)
20960 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  {.    sqlite3_bl
20970 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 20  ob *pBlob = 0;. 
20980 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
20990 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
209a0 4f 57 49 44 28 69 29 3b 0a 20 20 20 20 72 63 20  OWID(i);.    rc 
209b0 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f  = sqlite3_blob_o
209c0 70 65 6e 28 0a 20 20 20 20 20 20 20 20 70 43 6f  pen(.        pCo
209d0 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69  nfig->db, pConfi
209e0 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
209f0 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52  Tbl, "block", iR
20a00 6f 77 69 64 2c 20 31 2c 20 26 70 42 6c 6f 62 0a  owid, 1, &pBlob.
20a10 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
20a20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
20a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
20a40 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20  ob_write(pBlob, 
20a50 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a  aCookie, 4, 0);.
20a60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20a70 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42  e3_blob_close(pB
20a80 6c 6f 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lob);.    }.  }.
20a90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20aa0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
20ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
20af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
20b30 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
20b40 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
20b50 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
20b60 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
20b70 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20  ode() scalar.** 
20b80 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a  function only..*
20b90 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  /../*.** Decode 
20ba0 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72  a segment-data r
20bb0 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  owid from the %_
20bc0 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73  data table. This
20bd0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
20be0 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20  the opposite of 
20bf0 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45  macro FTS5_SEGME
20c00 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73  NT_ROWID()..*/.s
20c10 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
20c20 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36  ecodeRowid(.  i6
20c30 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20c50 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61   Rowid from %_da
20c60 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ta table */.  in
20c70 74 20 2a 70 69 49 64 78 2c 20 20 20 20 20 20 20  t *piIdx,       
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20c90 20 4f 55 54 3a 20 49 6e 64 65 78 20 2a 2f 0a 20   OUT: Index */. 
20ca0 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20   int *piSegid,  
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74   /* OUT: Segment
20cd0 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69   id */.  int *pi
20ce0 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
20cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
20d00 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74   Height */.  int
20d10 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20 20   *piPgno        
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20d30 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65 72  OUT: Page number
20d40 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f   */.){.  *piPgno
20d50 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
20d60 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
20d70 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20  S5_DATA_PAGE_B) 
20d80 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  - 1));.  iRowid 
20d90 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50 41  >>= FTS5_DATA_PA
20da0 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67  GE_B;..  *piHeig
20db0 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  ht = (int)(iRowi
20dc0 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
20dd0 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
20de0 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
20df0 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
20e00 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a  A_HEIGHT_B;..  *
20e10 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28  piSegid = (int)(
20e20 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
20e30 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
20e40 44 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  D_B) - 1));.  iR
20e50 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
20e60 54 41 5f 49 44 5f 42 3b 0a 0a 20 20 2a 70 69 49  TA_ID_B;..  *piI
20e70 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  dx = (int)(iRowi
20e80 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
20e90 46 54 53 35 5f 44 41 54 41 5f 49 44 58 5f 42 29  FTS5_DATA_IDX_B)
20ea0 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69   - 1));.}..stati
20eb0 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
20ec0 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20  Rowid(int *pRc, 
20ed0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
20ee0 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69  , i64 iKey){.  i
20ef0 6e 74 20 69 49 64 78 2c 69 53 65 67 69 64 2c 69  nt iIdx,iSegid,i
20f00 48 65 69 67 68 74 2c 69 50 67 6e 6f 3b 20 20 2f  Height,iPgno;  /
20f10 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e  * Rowid compenen
20f20 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f  ts */.  fts5Deco
20f30 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69  deRowid(iKey, &i
20f40 49 64 78 2c 20 26 69 53 65 67 69 64 2c 20 26 69  Idx, &iSegid, &i
20f50 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b  Height, &iPgno);
20f60 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d  ..  if( iSegid==
20f70 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65  0 ){.    if( iKe
20f80 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  y==FTS5_AVERAGES
20f90 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
20fa0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
20fb0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
20fc0 63 2c 20 70 42 75 66 2c 20 22 28 61 76 65 72 61  c, pBuf, "(avera
20fd0 67 65 73 29 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ges) ");.    }el
20fe0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
20ff0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
21000 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
21010 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 7b  f, .          "{
21020 73 74 72 75 63 74 75 72 65 20 69 64 78 3d 25 64  structure idx=%d
21030 7d 22 2c 20 28 69 6e 74 29 28 69 4b 65 79 2d 31  }", (int)(iKey-1
21040 30 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  0).      );.    
21050 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  }.  }.  else if(
21060 20 69 48 65 69 67 68 74 3d 3d 46 54 53 35 5f 53   iHeight==FTS5_S
21070 45 47 4d 45 4e 54 5f 4d 41 58 5f 48 45 49 47 48  EGMENT_MAX_HEIGH
21080 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  T ){.    sqlite3
21090 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
210a0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
210b0 2c 20 22 28 64 6c 69 64 78 20 69 64 78 3d 25 64  , "(dlidx idx=%d
210c0 20 73 65 67 69 64 3d 25 64 20 70 67 6e 6f 3d 25   segid=%d pgno=%
210d0 64 29 22 2c 0a 20 20 20 20 20 20 20 20 69 49 64  d)",.        iId
210e0 78 2c 20 69 53 65 67 69 64 2c 20 69 50 67 6e 6f  x, iSegid, iPgno
210f0 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
21100 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
21110 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
21120 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 28  tf(pRc, pBuf, "(
21130 69 64 78 3d 25 64 20 73 65 67 69 64 3d 25 64 20  idx=%d segid=%d 
21140 68 3d 25 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a  h=%d pgno=%d)",.
21150 20 20 20 20 20 20 20 20 69 49 64 78 2c 20 69 53          iIdx, iS
21160 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69  egid, iHeight, i
21170 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  Pgno.    );.  }.
21180 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
21190 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
211a0 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
211d0 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
211e0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
211f0 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
21200 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c  e *p.){.  int iL
21210 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20  vl, iSeg;       
21220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
21230 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
21240 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f  els, segments */
21250 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20  ..  for(iLvl=0; 
21260 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20  iLvl<p->nLevel; 
21270 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73  iLvl++){.    Fts
21280 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
21290 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76  *pLvl = &p->aLev
212a0 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71  el[iLvl];.    sq
212b0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
212c0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
212d0 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20   pBuf, .        
212e0 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65  " {lvl=%d nMerge
212f0 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  =%d", iLvl, pLvl
21300 2d 3e 6e 4d 65 72 67 65 0a 20 20 20 20 29 3b 0a  ->nMerge.    );.
21310 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
21320 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b  iSeg<pLvl->nSeg;
21330 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
21340 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
21350 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c  ment *pSeg = &pL
21360 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl->aSeg[iSeg];.
21370 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
21380 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
21390 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 0a  ntf(pRc, pBuf, .
213a0 20 20 20 20 20 20 20 20 20 20 22 20 7b 69 64 3d            " {id=
213b0 25 64 20 68 3d 25 64 20 6c 65 61 76 65 73 3d 25  %d h=%d leaves=%
213c0 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67 2d 3e 69  d..%d}", pSeg->i
213d0 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 6e 48 65  Segid, pSeg->nHe
213e0 69 67 68 74 2c 20 0a 20 20 20 20 20 20 20 20 20  ight, .         
213f0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
21400 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  , pSeg->pgnoLast
21410 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
21420 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
21430 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
21440 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22  f(pRc, pBuf, "}"
21450 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
21460 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
21470 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
21480 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
21490 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
214a0 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
214b0 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65  tain a serialize
214c0 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  d Fts5Structure 
214d0 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20  object. This.** 
214e0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
214f0 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c   a human-readabl
21500 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  e representation
21510 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a   of the same obj
21520 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75  ect.** to the bu
21530 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74  ffer passed as t
21540 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
21550 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nt. .*/.static v
21560 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74  oid fts5DecodeSt
21570 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a  ructure(.  int *
21580 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
21590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
215a0 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
215b0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
215c0 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20   *pBuf,.  const 
215d0 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  u8 *pBlob, int n
215e0 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Blob.){.  int rc
215f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
21610 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
21620 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d  s5Structure *p =
21630 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
21640 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75   Decoded structu
21650 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  re object */..  
21660 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
21670 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20  reDecode(pBlob, 
21680 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20  nBlob, 0, &p);. 
21690 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
216a0 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d  OK ){.    *pRc =
216b0 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
216c0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75  .  }..  fts5Debu
216d0 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20  gStructure(pRc, 
216e0 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35  pBuf, p);.  fts5
216f0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
21700 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75  (p);.}../*.** Bu
21710 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73  ffer (a/n) is as
21720 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
21730 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61   a list of seria
21740 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52  lized varints. R
21750 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69  ead.** each vari
21760 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74  nt and append it
21770 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  s string represe
21780 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65  ntation to buffe
21790 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a  r pBuf. Return.*
217a0 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20 74  * after either t
217b0 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 20  he input buffer 
217c0 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72 20  is exhausted or 
217d0 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65 61  a 0 value is rea
217e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
217f0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
21800 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
21810 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69   read from the i
21820 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  nput buffer..*/.
21830 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
21840 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74  ecodePoslist(int
21850 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65   *pRc, Fts5Buffe
21860 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75  r *pBuf, const u
21870 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  8 *a, int n){.  
21880 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20  int iOff = 0;.  
21890 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
218a0 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20  .    int iVal;. 
218b0 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74 56 61     iOff += getVa
218c0 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
218d0 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69   iVal);.    sqli
218e0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
218f0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
21900 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61 6c  Buf, " %d", iVal
21910 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
21920 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  iOff;.}../*.** T
21930 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66 66  he start of buff
21940 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e  er (a/n) contain
21950 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  s the start of a
21960 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64 6f   doclist. The do
21970 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20  clist.** may or 
21980 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20 77  may not finish w
21990 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
219a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
219b0 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a 2a  appends a text.*
219c0 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  * representation
219d0 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66 20   of the part of 
219e0 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61 74  the doclist that
219f0 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20 62   is present to b
21a00 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a  uffer.** pBuf. .
21a10 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
21a20 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
21a30 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
21a40 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
21a50 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
21a60 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
21a70 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70  deDoclist(int *p
21a80 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
21a90 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
21aa0 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34  a, int n){.  i64
21ab0 20 69 44 6f 63 69 64 3b 0a 20 20 69 6e 74 20 69   iDocid;.  int i
21ac0 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Off = 0;..  if( 
21ad0 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 4f  iOff<n ){.    iO
21ae0 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 47 65 74  ff += sqlite3Get
21af0 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
21b00 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b   (u64*)&iDocid);
21b10 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
21b20 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
21b30 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
21b40 72 6f 77 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f  rowid=%lld", iDo
21b50 63 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  cid);.  }.  whil
21b60 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  e( iOff<n ){.   
21b70 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69   int nPos;.    i
21b80 4f 66 66 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  Off += getVarint
21b90 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 50 6f  32(&a[iOff], nPo
21ba0 73 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  s);.    iOff += 
21bb0 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
21bc0 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b  t(pRc, pBuf, &a[
21bd0 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66  iOff], MIN(n-iOf
21be0 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69  f, nPos));.    i
21bf0 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
21c00 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
21c10 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
21c20 69 74 65 33 47 65 74 56 61 72 69 6e 74 28 26 61  ite3GetVarint(&a
21c30 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
21c40 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66  Delta);.      if
21c50 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65  ( iDelta==0 ) re
21c60 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20 20  turn iOff;.     
21c70 20 69 44 6f 63 69 64 20 2d 3d 20 69 44 65 6c 74   iDocid -= iDelt
21c80 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
21c90 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
21ca0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
21cb0 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64 22 2c  , " rowid=%lld",
21cc0 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a   iDocid);.    }.
21cd0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f    }..  return iO
21ce0 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ff;.}../*.** The
21cf0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
21d00 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
21d10 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
21d20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a  fts5_decode()..*
21d30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
21d40 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
21d50 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
21d60 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
21d70 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
21d80 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
21d90 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
21da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21db0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21dc0 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
21dd0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
21de0 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
21df0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
21e00 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
21e10 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
21e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e30 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72    /* Rowid for r
21e40 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f  ecord being deco
21e50 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ded */.  int iId
21e60 78 2c 69 53 65 67 69 64 2c 69 48 65 69 67 68 74  x,iSegid,iHeight
21e70 2c 69 50 67 6e 6f 3b 20 20 2f 2a 20 52 6f 77 69  ,iPgno;  /* Rowi
21e80 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a  d components */.
21e90 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 3b 20 69    const u8 *a; i
21ea0 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
21eb0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64    /* Record to d
21ec0 65 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42  ecode */.  Fts5B
21ed0 75 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20  uffer s;        
21ee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
21ef0 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72  ild up text to r
21f00 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20  eturn here */.  
21f10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21f20 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
21f30 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
21f40 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 41 72  /..  assert( nAr
21f50 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74  g==2 );.  memset
21f60 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
21f70 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69  ts5Buffer));.  i
21f80 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 5f  Rowid = sqlite3_
21f90 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56 61  value_int64(apVa
21fa0 6c 5b 30 5d 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  l[0]);.  n = sql
21fb0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
21fc0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 20  (apVal[1]);.  a 
21fd0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
21fe0 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a  blob(apVal[1]);.
21ff0 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
22000 64 28 69 52 6f 77 69 64 2c 20 26 69 49 64 78 2c  d(iRowid, &iIdx,
22010 20 26 69 53 65 67 69 64 2c 20 26 69 48 65 69 67   &iSegid, &iHeig
22020 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
22030 66 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 26  fts5DebugRowid(&
22040 72 63 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b  rc, &s, iRowid);
22050 0a 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d  .  if( iHeight==
22060 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 4d 41 58  FTS5_SEGMENT_MAX
22070 5f 48 45 49 47 48 54 20 29 7b 0a 20 20 20 20 69  _HEIGHT ){.    i
22080 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 36  nt i = 0;.    i6
22090 34 20 69 50 72 65 76 3b 0a 20 20 20 20 69 66 28  4 iPrev;.    if(
220a0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 20   n>0 ){.      i 
220b0 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b 69  = getVarint(&a[i
220c0 5d 2c 20 28 75 36 34 2a 29 26 69 50 72 65 76 29  ], (u64*)&iPrev)
220d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
220e0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
220f0 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 22  rintf(&rc, &s, "
22100 20 25 6c 6c 64 22 2c 20 69 50 72 65 76 29 3b 0a   %lld", iPrev);.
22110 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
22120 20 69 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36   i<n ){.      i6
22130 34 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 20  4 iVal;.      i 
22140 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 61 5b  += getVarint(&a[
22150 69 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29  i], (u64*)&iVal)
22160 3b 0a 20 20 20 20 20 20 69 66 28 20 69 56 61 6c  ;.      if( iVal
22170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
22180 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
22190 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63  AppendPrintf(&rc
221a0 2c 20 26 73 2c 20 22 20 78 22 29 3b 0a 20 20 20  , &s, " x");.   
221b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
221c0 20 20 69 50 72 65 76 20 3d 20 69 50 72 65 76 20    iPrev = iPrev 
221d0 2d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 20 20  - iVal;.        
221e0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
221f0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
22200 63 2c 20 26 73 2c 20 22 20 25 6c 6c 64 22 2c 20  c, &s, " %lld", 
22210 69 50 72 65 76 29 3b 0a 20 20 20 20 20 20 7d 0a  iPrev);.      }.
22220 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 0a 20      }..  }else. 
22230 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
22240 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  {.    if( iRowid
22250 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  ==FTS5_AVERAGES_
22260 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f  ROWID ){.      /
22270 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 7d 65  * todo */.    }e
22280 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44  lse{.      fts5D
22290 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 26  ecodeStructure(&
222a0 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20  rc, &s, a, n);. 
222b0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20     }.  }else{.. 
222c0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65     Fts5Buffer te
222d0 72 6d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  rm;.    memset(&
222e0 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  term, 0, sizeof(
222f0 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20  Fts5Buffer));.. 
22300 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3d 3d     if( iHeight==
22310 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
22320 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 20  TermOff = 0;.   
22330 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
22340 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
22350 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74 20  iOff;.      int 
22360 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20  nKeep = 0;..    
22370 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
22380 73 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b  s5GetU16(&a[0]);
22390 0a 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20  .      iTermOff 
223a0 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
223b0 32 5d 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  2]);..      if( 
223c0 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20  iRowidOff ){.   
223d0 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77       iOff = iRow
223e0 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  idOff;.      }el
223f0 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 20  se if( iTermOff 
22400 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  ){.        iOff 
22410 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20  = iTermOff;.    
22420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22430 20 69 4f 66 66 20 3d 20 6e 3b 0a 20 20 20 20 20   iOff = n;.     
22440 20 7d 0a 20 20 20 20 20 20 66 74 73 35 44 65 63   }.      fts5Dec
22450 6f 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20  odePoslist(&rc, 
22460 26 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d  &s, &a[4], iOff-
22470 34 29 3b 0a 0a 0a 20 20 20 20 20 20 61 73 73 65  4);...      asse
22480 72 74 28 20 69 52 6f 77 69 64 4f 66 66 3d 3d 30  rt( iRowidOff==0
22490 20 7c 7c 20 69 4f 66 66 3d 3d 69 52 6f 77 69 64   || iOff==iRowid
224a0 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Off );.      if(
224b0 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20   iRowidOff ){.  
224c0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
224d0 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28  s5DecodeDoclist(
224e0 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66  &rc, &s, &a[iOff
224f0 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20 20  ], n-iOff);.    
22500 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72    }..      asser
22510 74 28 20 69 54 65 72 6d 4f 66 66 3d 3d 30 20 7c  t( iTermOff==0 |
22520 7c 20 69 4f 66 66 3d 3d 69 54 65 72 6d 4f 66 66  | iOff==iTermOff
22530 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   );.      while(
22540 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
22550 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20     int nByte;.  
22560 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65        iOff += ge
22570 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
22580 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
22590 20 20 20 20 74 65 72 6d 2e 6e 3d 20 6e 4b 65 65      term.n= nKee
225a0 70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  p;.        fts5B
225b0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
225c0 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74  &rc, &term, nByt
225d0 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  e, &a[iOff]);.  
225e0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 42        iOff += nB
225f0 79 74 65 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  yte;..        sq
22600 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
22610 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20  ppendPrintf(.   
22620 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73           &rc, &s
22630 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20  , " term=%.*s", 
22640 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63  term.n, (const c
22650 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20  har*)term.p.    
22660 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
22670 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
22680 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
22690 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 2d 69 4f  , &a[iOff], n-iO
226a0 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ff);.        if(
226b0 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20   iOff<n ){.     
226c0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 67 65 74       iOff += get
226d0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
226e0 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  ], nKeep);.     
226f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22700 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
22710 65 28 26 74 65 72 6d 29 3b 0a 20 20 20 20 7d 65  e(&term);.    }e
22720 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 4e  lse{.      Fts5N
22730 6f 64 65 49 74 65 72 20 73 73 3b 0a 20 20 20 20  odeIter ss;.    
22740 20 20 66 6f 72 28 66 74 73 35 4e 6f 64 65 49 74    for(fts5NodeIt
22750 65 72 49 6e 69 74 28 61 2c 20 6e 2c 20 26 73 73  erInit(a, n, &ss
22760 29 3b 20 73 73 2e 61 44 61 74 61 3b 20 66 74 73  ); ss.aData; fts
22770 35 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 72  5NodeIterNext(&r
22780 63 2c 20 26 73 73 29 29 7b 0a 20 20 20 20 20 20  c, &ss)){.      
22790 20 20 69 66 28 20 73 73 2e 74 65 72 6d 2e 6e 3d    if( ss.term.n=
227a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
227b0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
227c0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
227d0 63 2c 20 26 73 2c 20 22 20 6c 65 66 74 3d 25 64  c, &s, " left=%d
227e0 22 2c 20 73 73 2e 69 43 68 69 6c 64 29 3b 0a 20  ", ss.iChild);. 
227f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
22800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
22810 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
22820 72 69 6e 74 66 28 26 72 63 2c 26 73 2c 20 22 20  rintf(&rc,&s, " 
22830 5c 22 25 2e 2a 73 5c 22 22 2c 20 0a 20 20 20 20  \"%.*s\"", .    
22840 20 20 20 20 20 20 20 20 20 20 73 73 2e 74 65 72            ss.ter
22850 6d 2e 6e 2c 20 73 73 2e 74 65 72 6d 2e 70 0a 20  m.n, ss.term.p. 
22860 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
22870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
22880 28 20 73 73 2e 6e 45 6d 70 74 79 20 29 7b 0a 20  ( ss.nEmpty ){. 
22890 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
228a0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
228b0 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20  Printf(&rc, &s, 
228c0 22 20 65 6d 70 74 79 3d 25 64 25 73 22 2c 20 73  " empty=%d%s", s
228d0 73 2e 6e 45 6d 70 74 79 2c 0a 20 20 20 20 20 20  s.nEmpty,.      
228e0 20 20 20 20 20 20 20 20 73 73 2e 62 44 6c 69 64          ss.bDlid
228f0 78 20 3f 20 22 2a 22 20 3a 20 22 22 0a 20 20 20  x ? "*" : "".   
22900 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
22910 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22920 20 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72    fts5NodeIterFr
22930 65 65 28 26 73 73 29 3b 0a 20 20 20 20 7d 0a 20  ee(&ss);.    }. 
22940 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
22950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22960 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
22970 74 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73  text(pCtx, (cons
22980 74 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e  t char*)s.p, s.n
22990 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
229a0 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NT);.  }else{.  
229b0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
229c0 5f 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78  _error_code(pCtx
229d0 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73  , rc);.  }.  fts
229e0 35 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b  5BufferFree(&s);
229f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
22a00 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72  is called as par
22a10 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e 67  t of registering
22a20 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c 65   the FTS5 module
22a30 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a 2a   with database.*
22a40 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
22a50 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73 65   It registers se
22a60 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69 6e  veral user-defin
22a70 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
22a80 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77 69  ons useful.** wi
22a90 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49  th FTS5..**.** I
22aa0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
22ab0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
22ac0 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ned. If an error
22ad0 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f 74   occurs, some ot
22ae0 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65 72  her.** SQLite er
22af0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
22b00 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  rned instead..*/
22b10 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22b20 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74 65  IndexInit(sqlite
22b30 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
22b40 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
22b50 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20  e_function(.    
22b60 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63 6f    db, "fts5_deco
22b70 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f 55  de", 2, SQLITE_U
22b80 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63 6f  TF8, 0, fts5Deco
22b90 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  deFunction, 0, 0
22ba0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
22bb0 63 3b 0a 7d 0a 0a                                c;.}..